Merge mozilla-central to b2g-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Fri, 13 Mar 2015 14:13:54 +0100
changeset 233516 5ae0352a5efcaadcacf097a7a923e2ba8769d67c
parent 233515 b59df68f319a90332980ed6c43b43fffb2062e8d (current diff)
parent 233496 9dbb2d41bb2ca889db2631f1f0993cd0c1e6165c (diff)
child 233517 1722c4635fac0993dcfdddd1549dab42c491d2ad
push id28414
push userryanvm@gmail.com
push dateFri, 13 Mar 2015 16:15:53 +0000
treeherdermozilla-central@1722c4635fac [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone39.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to b2g-inbound
js/src/jit-test/lib/referencesVia.js
js/src/jit-test/tests/auto-regress/bug687398.js
js/src/jit-test/tests/auto-regress/bug690396.js
js/src/jit-test/tests/collections/Map-clear-gc.js
js/src/jit-test/tests/collections/Map-gc-1.js
js/src/jit-test/tests/collections/Map-gc-2.js
js/src/jit-test/tests/collections/Map-gc-3.js
js/src/jit-test/tests/collections/Set-clear-gc.js
js/src/jit-test/tests/collections/Set-gc-1.js
js/src/jit-test/tests/collections/Set-iterator-gc-1.js
js/src/jit-test/tests/collections/iterator-gc.js
js/src/jit-test/tests/for-of/array-iterator-gc.js
js/src/jit-test/tests/gc/bug-890048.js
js/src/shell/jsheaptools.cpp
js/src/shell/jsheaptools.h
js/src/tests/js1_8/extensions/regress-422269.js
js/src/tests/js1_8_5/extensions/findReferences-01.js
js/src/tests/js1_8_5/extensions/findReferences-02.js
js/src/tests/js1_8_5/extensions/findReferences-03.js
js/src/tests/js1_8_5/extensions/findReferences-04.js
testing/web-platform/meta/html/semantics/embedded-content/the-canvas-element/size.attributes.parse.octal.html.ini
testing/web-platform/meta/html/semantics/embedded-content/the-canvas-element/size.attributes.setAttribute.octal.html.ini
--- a/b2g/chrome/content/devtools/debugger.js
+++ b/b2g/chrome/content/devtools/debugger.js
@@ -54,17 +54,21 @@ let RemoteDebugger = {
       return DebuggerServer.AuthenticationResult.DENY;
     }
     this._listen();
 
     this._promptingForAllow = new Promise(resolve => {
       this._handleAllowResult = detail => {
         this._handleAllowResult = null;
         this._promptingForAllow = null;
-        if (detail.value) {
+        // Newer Gaia supplies |authResult|, which is one of the
+        // AuthenticationResult values.
+        if (detail.authResult) {
+          resolve(detail.authResult);
+        } else if (detail.value) {
           resolve(DebuggerServer.AuthenticationResult.ALLOW);
         } else {
           resolve(DebuggerServer.AuthenticationResult.DENY);
         }
       };
 
       shell.sendChromeEvent({
         type: "remote-debugger-prompt",
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1493,17 +1493,17 @@
 
             // Change the "remote" attribute.
             let parent = aBrowser.parentNode;
             let permanentKey = aBrowser.permanentKey;
             parent.removeChild(aBrowser);
             aBrowser.setAttribute("remote", aShouldBeRemote ? "true" : "false");
             // Tearing down the browser gives a new permanentKey but we want to
             // keep the old one. Re-set it explicitly after unbinding from DOM.
-            aBrowser.permanentKey = permanentKey;
+            aBrowser._permanentKey = permanentKey;
             parent.appendChild(aBrowser);
 
             // Restore the progress listener.
             aBrowser.webProgress.addProgressListener(filter, Ci.nsIWebProgress.NOTIFY_ALL);
 
             if (aShouldBeRemote) {
               tab.setAttribute("remote", "true");
               // Switching the browser to be remote will connect to a new child
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -405,16 +405,17 @@ support-files =
 [browser_subframe_favicons_not_used.js]
 [browser_syncui.js]
 skip-if = e10s # Bug 1137087 - browser_tabopen_reflows.js fails if this was previously run with e10s
 [browser_tabDrop.js]
 skip-if = buildapp == 'mulet' || e10s
 [browser_tabMatchesInAwesomebar.js]
 [browser_tabMatchesInAwesomebar_perwindowpb.js]
 skip-if = e10s || os == 'linux' # Bug 1093373, bug 1104755
+[browser_tab_detach_restore.js]
 [browser_tab_drag_drop_perwindow.js]
 skip-if = buildapp == 'mulet'
 [browser_tab_dragdrop.js]
 skip-if = buildapp == 'mulet'
 [browser_tab_dragdrop2.js]
 skip-if = buildapp == 'mulet'
 [browser_tabbar_big_widgets.js]
 skip-if = os == "linux" || os == "mac" # No tabs in titlebar on linux
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/general/browser_tab_detach_restore.js
@@ -0,0 +1,31 @@
+"use strict";
+
+add_task(function*() {
+  let uri = "http://example.com/browser/browser/base/content/test/general/dummy_page.html";
+
+  // Clear out the closed windows set to start
+  while (SessionStore.getClosedWindowCount() > 0)
+    SessionStore.forgetClosedWindow(0);
+
+  let tab = gBrowser.addTab();
+  tab.linkedBrowser.loadURI(uri);
+  yield BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+
+  let key = tab.linkedBrowser.permanentKey;
+  let win = gBrowser.replaceTabWithWindow(tab);
+  yield new Promise(resolve => whenDelayedStartupFinished(win, resolve));
+
+  is(win.gBrowser.selectedBrowser.permanentKey, key, "Should have properly copied the permanentKey");
+  yield promiseWindowClosed(win);
+
+  is(SessionStore.getClosedWindowCount(), 1, "Should have restore data for the closed window");
+
+  win = SessionStore.undoCloseWindow(0);
+  yield BrowserTestUtils.waitForEvent(win, "load");
+  yield BrowserTestUtils.waitForEvent(win.gBrowser.tabs[0], "SSTabRestored");
+
+  is(win.gBrowser.tabs.length, 1, "Should have restored one tab");
+  is(win.gBrowser.selectedBrowser.currentURI.spec, uri, "Should have restored the right page");
+
+  yield promiseWindowClosed(win);
+});
--- a/browser/components/readinglist/ReadingList.jsm
+++ b/browser/components/readinglist/ReadingList.jsm
@@ -189,16 +189,18 @@ ReadingListImpl.prototype = {
    *         is updated.  Rejected with an Error on error.
    */
   addItem: Task.async(function* (obj) {
     obj = stripNonItemProperties(obj);
     yield this._store.addItem(obj);
     this._invalidateIterators();
     let item = this._itemFromObject(obj);
     this._callListeners("onItemAdded", item);
+    let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
+    mm.broadcastAsyncMessage("Reader:Added", item);
     return item;
   }),
 
   /**
    * Updates the properties of an item that belongs to the list.
    *
    * The passed-in item may have as few or as many properties that you want to
    * set; only the properties that are present are updated.  The item must have
@@ -229,20 +231,34 @@ ReadingListImpl.prototype = {
    *         Error on error.
    */
   deleteItem: Task.async(function* (item) {
     this._ensureItemBelongsToList(item);
     yield this._store.deleteItemByURL(item.url);
     item.list = null;
     this._itemsByURL.delete(item.url);
     this._invalidateIterators();
+    let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
+    mm.broadcastAsyncMessage("Reader:Removed", item);
     this._callListeners("onItemDeleted", item);
   }),
 
   /**
+   * Find any item that matches a given URL - either the item's URL, or its
+   * resolved URL.
+   *
+   * @param {String/nsIURI} uri - URI to match against. This will be normalized.
+   */
+  getItemForURL: Task.async(function* (uri) {
+    let url = this._normalizeURI(uri).spec;
+    let [item] = yield this.iterator({url: url}, {resolvedURL: url}).items(1);
+    return item;
+  }),
+
+  /**
    * Adds a listener that will be notified when the list changes.  Listeners
    * are objects with the following optional methods:
    *
    *   onItemAdded(item)
    *   onItemUpdated(item)
    *   onItemDeleted(item)
    *
    * @param listener A listener object.
@@ -284,16 +300,32 @@ ReadingListImpl.prototype = {
   // A Set containing nsIWeakReferences that refer to valid iterators produced
   // by the list.
   _iterators: null,
 
   // A Set containing listener objects.
   _listeners: null,
 
   /**
+   * Normalize a URI, stripping away extraneous parts we don't want to store
+   * or compare against.
+   *
+   * @param {nsIURI/String} uri - URI to normalize.
+   * @returns {nsIURI} Cloned and normalized version of the input URI.
+   */
+  _normalizeURI(uri) {
+    if (typeof uri == "string") {
+      uri = Services.io.newURI(uri, "", null);
+    }
+    uri = uri.cloneIgnoringRef();
+    uri.userPass = "";
+    return uri;
+  },
+
+  /**
    * Returns the ReadingListItem represented by the given simple object.  If
    * the item doesn't exist yet, it's created first.
    *
    * @param obj A simple object with item properties.
    * @return The ReadingListItem.
    */
   _itemFromObject(obj) {
     let itemWeakRef = this._itemsByURL.get(obj.url);
@@ -344,26 +376,40 @@ ReadingListImpl.prototype = {
 
   _ensureItemBelongsToList(item) {
     if (item.list != this) {
       throw new Error("The item does not belong to this list");
     }
   },
 };
 
+let _unserializable = () => {}; // See comments in the ReadingListItem ctor.
+
 /**
  * An item in a reading list.
  *
  * Each item belongs to a list, and it's an error to use an item with a
  * ReadingList that the item doesn't belong to.
  *
  * @param props The properties of the item, as few or many as you want.
  */
 function ReadingListItem(props={}) {
   this._properties = {};
+
+  // |this._unserializable| works around a problem when sending one of these
+  // items via a message manager. If |this.list| is set, the item can't be
+  // transferred directly, so .toJSON is implicitly called and the object
+  // returned via that is sent. However, once the item is deleted and |this.list|
+  // is null, the item *can* be directly serialized - so the message handler
+  // sees the "raw" object - ie, it sees "_properties" etc.
+  // We work around this problem by *always* having an unserializable property
+  // on the object - this way the implicit .toJSON call is always made, even
+  // when |this.list| is null.
+  this._unserializable = _unserializable;
+
   this.setProperties(props, false);
 }
 
 ReadingListItem.prototype = {
 
   /**
    * Item's unique ID.
    * @type string
@@ -825,17 +871,17 @@ function hash(str) {
                createInstance(Ci.nsICryptoHash);
   hasher.init(Ci.nsICryptoHash.MD5);
   let stream = Cc["@mozilla.org/io/string-input-stream;1"].
                createInstance(Ci.nsIStringInputStream);
   stream.data = str;
   hasher.updateFromStream(stream, -1);
   let binaryStr = hasher.finish(false);
   let hexStr =
-    [("0" + binaryStr.charCodeAt(i).toString(16)).slice(-2) for (i in hash)].
+    [("0" + binaryStr.charCodeAt(i).toString(16)).slice(-2) for (i in binaryStr)].
     join("");
   return hexStr;
 }
 
 function clone(obj) {
   return Cu.cloneInto(obj, {}, { cloneFunctions: false });
 }
 
--- a/browser/components/readinglist/test/xpcshell/test_ReadingList.js
+++ b/browser/components/readinglist/test/xpcshell/test_ReadingList.js
@@ -692,12 +692,12 @@ function hash(str) {
                createInstance(Ci.nsICryptoHash);
   hasher.init(Ci.nsICryptoHash.MD5);
   let stream = Cc["@mozilla.org/io/string-input-stream;1"].
                createInstance(Ci.nsIStringInputStream);
   stream.data = str;
   hasher.updateFromStream(stream, -1);
   let binaryStr = hasher.finish(false);
   let hexStr =
-    [("0" + binaryStr.charCodeAt(i).toString(16)).slice(-2) for (i in hash)].
+    [("0" + binaryStr.charCodeAt(i).toString(16)).slice(-2) for (i in binaryStr)].
     join("");
   return hexStr;
 }
--- a/browser/devtools/debugger/test/browser_dbg_source-maps-01.js
+++ b/browser/devtools/debugger/test/browser_dbg_source-maps-01.js
@@ -74,25 +74,25 @@ function testSetBreakpoint() {
   return deferred.promise;
 }
 
 function testSetBreakpointBlankLine() {
   let deferred = promise.defer();
   let sourceForm = getSourceForm(gSources, COFFEE_URL);
 
   let source = gDebugger.gThreadClient.source(sourceForm);
-  source.setBreakpoint({ line: 3 }, aResponse => {
+  source.setBreakpoint({ line: 7 }, aResponse => {
     ok(!aResponse.error,
       "Should be able to set a breakpoint in a coffee source file on a blank line.");
     ok(aResponse.actualLocation,
       "Because 3 is empty, we should have an actualLocation.");
     is(aResponse.actualLocation.source.url, COFFEE_URL,
       "actualLocation.actor should be source mapped to the coffee file.");
-    is(aResponse.actualLocation.line, 2,
-      "actualLocation.line should be source mapped back to 2.");
+    is(aResponse.actualLocation.line, 8,
+      "actualLocation.line should be source mapped back to 8.");
 
     deferred.resolve();
   });
 
   return deferred.promise;
 }
 
 function testHitBreakpoint() {
@@ -142,17 +142,17 @@ function testStepping() {
       is(aPacket.why.type, "resumeLimit",
         "and the reason we should be paused is because we hit the resume limit.");
 
       // Check that we stopped at the right place, by making sure that the
       // environment is in the state that we expect.
       is(aPacket.frame.environment.bindings.variables.start.value, 0,
          "'start' is 0.");
       is(aPacket.frame.environment.bindings.variables.stop.value, 5,
-         "'stop' hasn't been assigned to yet.");
+         "'stop' is 5.");
       is(aPacket.frame.environment.bindings.variables.pivot.value.type, "undefined",
          "'pivot' hasn't been assigned to yet.");
 
       waitForCaretUpdated(gPanel, 6).then(deferred.resolve);
     });
   });
 
   return deferred.promise;
--- a/browser/devtools/debugger/test/browser_dbg_source-maps-03.js
+++ b/browser/devtools/debugger/test/browser_dbg_source-maps-03.js
@@ -40,21 +40,21 @@ function checkInitialSource() {
     "not the whitespace stripped minified version.");
 }
 
 function testSetBreakpoint() {
   let deferred = promise.defer();
   let sourceForm = getSourceForm(gSources, JS_URL);
   let source = gDebugger.gThreadClient.source(sourceForm);
 
-  source.setBreakpoint({ line: 30, column: 21 }, aResponse => {
+  source.setBreakpoint({ line: 30 }, aResponse => {
     ok(!aResponse.error,
       "Should be able to set a breakpoint in a js file.");
     ok(!aResponse.actualLocation,
-      "Should be able to set a breakpoint on line 30 and column 10.");
+      "Should be able to set a breakpoint on line 30.");
 
     gDebugger.gClient.addOneTimeListener("resumed", () => {
       waitForCaretAndScopes(gPanel, 30).then(() => {
         // Make sure that we have the right stack frames.
         is(gFrames.itemCount, 9,
           "Should have nine frames.");
         is(gFrames.getItemAtIndex(0).attachment.url.indexOf(".min.js"), -1,
           "First frame should not be a minified JS frame.");
--- a/browser/devtools/performance/modules/front.js
+++ b/browser/devtools/performance/modules/front.js
@@ -347,30 +347,32 @@ PerformanceFront.prototype = {
     return memoryEndTime;
   }),
 
   /**
    * At regular intervals, pull allocations from the memory actor, and forward
    * them to consumers.
    */
   _pullAllocationSites: Task.async(function *() {
+    let isDetached = (yield this._request("memory", "getState")) !== "attached";
+    if (isDetached) {
+      return;
+    }
+
     let memoryData = yield this._request("memory", "getAllocations");
-    let isStillAttached = yield this._request("memory", "getState") == "attached";
 
     this.emit("allocations", {
       sites: memoryData.allocations,
       timestamps: memoryData.allocationsTimestamps,
       frames: memoryData.frames,
       counts: memoryData.counts
     });
 
-    if (isStillAttached) {
-      let delay = DEFAULT_ALLOCATION_SITES_PULL_TIMEOUT;
-      this._sitesPullTimeout = setTimeout(this._pullAllocationSites, delay);
-    }
+    let delay = DEFAULT_ALLOCATION_SITES_PULL_TIMEOUT;
+    this._sitesPullTimeout = setTimeout(this._pullAllocationSites, delay);
   }),
 
   /**
    * Overrides the options sent to the built-in profiler module when activating,
    * such as the maximum entries count, the sampling interval etc.
    *
    * Used in tests and for older backend implementations.
    */
--- a/browser/devtools/performance/performance.xul
+++ b/browser/devtools/performance/performance.xul
@@ -193,44 +193,24 @@
               </vbox>
 
               <hbox id="js-flamegraph-view" flex="1">
               </hbox>
 
               <vbox id="memory-calltree-view" flex="1">
                 <hbox class="call-tree-headers-container">
                   <label class="plain call-tree-header"
-                         type="duration"
-                         crop="end"
-                         value="&profilerUI.table.totalDuration2;"/>
-                  <label class="plain call-tree-header"
-                         type="percentage"
-                         crop="end"
-                         value="&profilerUI.table.totalPercentage;"/>
-                  <label class="plain call-tree-header"
                          type="allocations"
                          crop="end"
                          value="&profilerUI.table.totalAlloc;"/>
                   <label class="plain call-tree-header"
-                         type="self-duration"
-                         crop="end"
-                         value="&profilerUI.table.selfDuration2;"/>
-                  <label class="plain call-tree-header"
-                         type="self-percentage"
-                         crop="end"
-                         value="&profilerUI.table.selfPercentage;"/>
-                  <label class="plain call-tree-header"
                          type="self-allocations"
                          crop="end"
                          value="&profilerUI.table.selfAlloc;"/>
                   <label class="plain call-tree-header"
-                         type="samples"
-                         crop="end"
-                         value="&profilerUI.table.samples;"/>
-                  <label class="plain call-tree-header"
                          type="function"
                          crop="end"
                          value="&profilerUI.table.function;"/>
                 </hbox>
                 <vbox class="call-tree-cells-container" flex="1"/>
               </vbox>
 
               <hbox id="memory-flamegraph-view" flex="1">
--- a/browser/devtools/performance/test/browser.ini
+++ b/browser/devtools/performance/test/browser.ini
@@ -11,16 +11,18 @@ support-files =
 [browser_perf-aaa-run-first-leaktest.js]
 [browser_perf-allocations-to-samples.js]
 [browser_perf-compatibility-01.js]
 [browser_perf-compatibility-02.js]
 [browser_perf-compatibility-03.js]
 [browser_perf-compatibility-04.js]
 [browser_perf-clear-01.js]
 [browser_perf-clear-02.js]
+[browser_perf-columns-js-calltree.js]
+[browser_perf-columns-memory-calltree.js]
 [browser_perf-data-massaging-01.js]
 [browser_perf-data-samples.js]
 [browser_perf-details-calltree-render.js]
 [browser_perf-details-flamegraph-render.js]
 [browser_perf-details-memory-calltree-render.js]
 [browser_perf-details-memory-flamegraph-render.js]
 [browser_perf-details-waterfall-render.js]
 [browser_perf-details-01.js]
new file mode 100644
--- /dev/null
+++ b/browser/devtools/performance/test/browser_perf-columns-js-calltree.js
@@ -0,0 +1,53 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests that the js call tree view renders the correct columns.
+ */
+function spawnTest () {
+  let { panel } = yield initPerformance(SIMPLE_URL);
+  let { EVENTS, $, $$, DetailsView, JsCallTreeView } = panel.panelWin;
+
+  // Enable platform data to show the `busyWait` function in the tree.
+  Services.prefs.setBoolPref(PLATFORM_DATA_PREF, true);
+
+  yield DetailsView.selectView("js-calltree");
+  ok(DetailsView.isViewSelected(JsCallTreeView), "The call tree is now selected.");
+
+  yield startRecording(panel);
+  yield busyWait(1000);
+
+  let rendered = once(JsCallTreeView, EVENTS.JS_CALL_TREE_RENDERED);
+  yield stopRecording(panel);
+  yield rendered;
+
+  testCells($, $$, {
+    "duration": true,
+    "percentage": true,
+    "allocations": false,
+    "self-duration": true,
+    "self-percentage": true,
+    "self-allocations": false,
+    "samples": true,
+    "function": true
+  });
+
+  yield teardown(panel);
+  finish();
+}
+
+function testCells($, $$, visibleCells) {
+  for (let cell in visibleCells) {
+    if (visibleCells[cell]) {
+      ok($(`.call-tree-cell[type=${cell}]`),
+        `At least one ${cell} column was visible in the tree.`);
+    } else {
+      ok(!$(`.call-tree-cell[type=${cell}]`),
+        `No ${cell} columns were visible in the tree.`);
+    }
+  }
+
+  is($$(".call-tree-cell", $(".call-tree-item")).length,
+    Object.keys(visibleCells).filter(e => visibleCells[e]).length,
+    "The correct number of cells were found in the tree.");
+}
new file mode 100644
--- /dev/null
+++ b/browser/devtools/performance/test/browser_perf-columns-memory-calltree.js
@@ -0,0 +1,53 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests that the memory call tree view renders the correct columns.
+ */
+function spawnTest () {
+  let { panel } = yield initPerformance(SIMPLE_URL);
+  let { EVENTS, $, $$, DetailsView, MemoryCallTreeView } = panel.panelWin;
+
+  // Enable memory to test.
+  Services.prefs.setBoolPref(MEMORY_PREF, true);
+
+  yield DetailsView.selectView("memory-calltree");
+  ok(DetailsView.isViewSelected(MemoryCallTreeView), "The call tree is now selected.");
+
+  yield startRecording(panel);
+  yield busyWait(1000);
+
+  let rendered = once(MemoryCallTreeView, EVENTS.MEMORY_CALL_TREE_RENDERED);
+  yield stopRecording(panel);
+  yield rendered;
+
+  testCells($, $$, {
+    "duration": false,
+    "percentage": false,
+    "allocations": true,
+    "self-duration": false,
+    "self-percentage": false,
+    "self-allocations": true,
+    "samples": false,
+    "function": true
+  });
+
+  yield teardown(panel);
+  finish();
+}
+
+function testCells($, $$, visibleCells) {
+  for (let cell in visibleCells) {
+    if (visibleCells[cell]) {
+      ok($(`.call-tree-cell[type=${cell}]`),
+        `At least one ${cell} column was visible in the tree.`);
+    } else {
+      ok(!$(`.call-tree-cell[type=${cell}]`),
+        `No ${cell} columns were visible in the tree.`);
+    }
+  }
+
+  is($$(".call-tree-cell", $(".call-tree-item")).length,
+    Object.keys(visibleCells).filter(e => visibleCells[e]).length,
+    "The correct number of cells were found in the tree.");
+}
--- a/browser/devtools/performance/test/browser_perf-front.js
+++ b/browser/devtools/performance/test/browser_perf-front.js
@@ -5,50 +5,65 @@
  * Test basic functionality of PerformanceFront, emitting start and endtime values
  */
 
 let WAIT_TIME = 1000;
 
 function spawnTest () {
   let { target, front } = yield initBackend(SIMPLE_URL);
 
+  let count = 0;
+  let counter = () => count++;
+
   let {
     profilerStartTime,
     timelineStartTime,
     memoryStartTime
   } = yield front.startRecording({
     withAllocations: true
   });
 
   ok(typeof profilerStartTime === "number",
     "The front.startRecording() emits a profiler start time.");
   ok(typeof timelineStartTime === "number",
     "The front.startRecording() emits a timeline start time.");
   ok(typeof memoryStartTime === "number",
     "The front.startRecording() emits a memory start time.");
 
-  yield busyWait(WAIT_TIME);
+  // Record allocation events to ensure it's called more than once
+  // so we know it's polling
+  front.on("allocations", counter);
+
+  yield Promise.all([
+    busyWait(WAIT_TIME),
+    waitUntil(() => count > 1)
+  ]);
 
   let {
     profilerEndTime,
     timelineEndTime,
     memoryEndTime
   } = yield front.stopRecording({
     withAllocations: true
   });
 
+  front.off("allocations", counter);
+
   ok(typeof profilerEndTime === "number",
     "The front.stopRecording() emits a profiler end time.");
   ok(typeof timelineEndTime === "number",
     "The front.stopRecording() emits a timeline end time.");
   ok(typeof memoryEndTime === "number",
     "The front.stopRecording() emits a memory end time.");
 
   ok(profilerEndTime > profilerStartTime,
     "The profilerEndTime is after profilerStartTime.");
   ok(timelineEndTime > timelineStartTime,
     "The timelineEndTime is after timelineStartTime.");
   ok(memoryEndTime > memoryStartTime,
     "The memoryEndTime is after memoryStartTime.");
 
+  is((yield front._request("memory", "getState")), "detached",
+    "memory actor is detached when stopping recording with allocations");
+
   yield removeTab(target.tab);
   finish();
 }
--- a/browser/devtools/performance/test/browser_profiler_tree-view-01.js
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-01.js
@@ -17,59 +17,49 @@ function test() {
   treeRoot.autoExpandDepth = 0;
   treeRoot.attachTo(container);
 
   is(container.childNodes.length, 1,
     "The container node should have one child available.");
   is(container.childNodes[0].className, "call-tree-item",
     "The root node in the tree has the correct class name.");
 
-  is(container.childNodes[0].childNodes.length, 8,
+  is(container.childNodes[0].childNodes.length, 6,
     "The root node in the tree has the correct number of children.");
-  is(container.childNodes[0].querySelectorAll(".call-tree-cell").length, 8,
-    "The root node in the tree has only 'call-tree-cell' children.");
+  is(container.childNodes[0].querySelectorAll(".call-tree-cell").length, 6,
+    "The root node in the tree has only 6 'call-tree-cell' children.");
 
   is(container.childNodes[0].childNodes[0].getAttribute("type"), "duration",
     "The root node in the tree has a duration cell.");
   is(container.childNodes[0].childNodes[0].getAttribute("value"), "15 ms",
     "The root node in the tree has the correct duration cell value.");
 
   is(container.childNodes[0].childNodes[1].getAttribute("type"), "percentage",
     "The root node in the tree has a percentage cell.");
   is(container.childNodes[0].childNodes[1].getAttribute("value"), "100%",
     "The root node in the tree has the correct percentage cell value.");
 
-  is(container.childNodes[0].childNodes[2].getAttribute("type"), "allocations",
+  is(container.childNodes[0].childNodes[2].getAttribute("type"), "self-duration",
     "The root node in the tree has a self-duration cell.");
-  is(container.childNodes[0].childNodes[2].getAttribute("value"), "0",
-    "The root node in the tree has the correct self-duration cell value.");
-
-  is(container.childNodes[0].childNodes[3].getAttribute("type"), "self-duration",
-    "The root node in the tree has a self-duration cell.");
-  is(container.childNodes[0].childNodes[3].getAttribute("value"), "0 ms",
+  is(container.childNodes[0].childNodes[2].getAttribute("value"), "0 ms",
     "The root node in the tree has the correct self-duration cell value.");
 
-  is(container.childNodes[0].childNodes[4].getAttribute("type"), "self-percentage",
+  is(container.childNodes[0].childNodes[3].getAttribute("type"), "self-percentage",
     "The root node in the tree has a self-percentage cell.");
-  is(container.childNodes[0].childNodes[4].getAttribute("value"), "0%",
+  is(container.childNodes[0].childNodes[3].getAttribute("value"), "0%",
     "The root node in the tree has the correct self-percentage cell value.");
 
-  is(container.childNodes[0].childNodes[5].getAttribute("type"), "self-allocations",
-    "The root node in the tree has a self-percentage cell.");
-  is(container.childNodes[0].childNodes[5].getAttribute("value"), "0",
-    "The root node in the tree has the correct self-percentage cell value.");
-
-  is(container.childNodes[0].childNodes[6].getAttribute("type"), "samples",
+  is(container.childNodes[0].childNodes[4].getAttribute("type"), "samples",
     "The root node in the tree has an samples cell.");
-  is(container.childNodes[0].childNodes[6].getAttribute("value"), "4",
+  is(container.childNodes[0].childNodes[4].getAttribute("value"), "4",
     "The root node in the tree has the correct samples cell value.");
 
-  is(container.childNodes[0].childNodes[7].getAttribute("type"), "function",
+  is(container.childNodes[0].childNodes[5].getAttribute("type"), "function",
     "The root node in the tree has a function cell.");
-  is(container.childNodes[0].childNodes[7].style.MozMarginStart, "0px",
+  is(container.childNodes[0].childNodes[5].style.MozMarginStart, "0px",
     "The root node in the tree has the correct indentation.");
 
   finish();
 }
 
 let gSamples = [{
   time: 5,
   frames: [
--- a/browser/devtools/performance/test/browser_profiler_tree-view-04.js
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-04.js
@@ -39,36 +39,32 @@ function test() {
     "The .A.B.D node's 'category' attribute is correct.");
   is(D.target.getAttribute("tooltiptext"), "D (http://foo/bar/baz:78)",
     "The .A.B.D node's 'tooltiptext' attribute is correct.");
   ok(!A.target.querySelector(".call-tree-zoom").hidden,
     "The .A.B.D node's zoom button cell should not be hidden.");
   ok(!A.target.querySelector(".call-tree-category").hidden,
     "The .A.B.D node's category label cell should not be hidden.");
 
-  is(D.target.childNodes.length, 8,
+  is(D.target.childNodes.length, 6,
     "The number of columns displayed for tree items is correct.");
   is(D.target.childNodes[0].getAttribute("type"), "duration",
     "The first column displayed for tree items is correct.");
   is(D.target.childNodes[1].getAttribute("type"), "percentage",
     "The third column displayed for tree items is correct.");
-  is(D.target.childNodes[2].getAttribute("type"), "allocations",
+  is(D.target.childNodes[2].getAttribute("type"), "self-duration",
     "The second column displayed for tree items is correct.");
-  is(D.target.childNodes[3].getAttribute("type"), "self-duration",
-    "The second column displayed for tree items is correct.");
-  is(D.target.childNodes[4].getAttribute("type"), "self-percentage",
+  is(D.target.childNodes[3].getAttribute("type"), "self-percentage",
     "The fourth column displayed for tree items is correct.");
-  is(D.target.childNodes[5].getAttribute("type"), "self-allocations",
-    "The fourth column displayed for tree items is correct.");
-  is(D.target.childNodes[6].getAttribute("type"), "samples",
+  is(D.target.childNodes[4].getAttribute("type"), "samples",
     "The fifth column displayed for tree items is correct.");
-  is(D.target.childNodes[7].getAttribute("type"), "function",
+  is(D.target.childNodes[5].getAttribute("type"), "function",
     "The sixth column displayed for tree items is correct.");
 
-  let functionCell = D.target.childNodes[7];
+  let functionCell = D.target.childNodes[5];
 
   is(functionCell.childNodes.length, 9,
     "The number of columns displayed for function cells is correct.");
   is(functionCell.childNodes[0].className, "arrow theme-twisty",
     "The first node displayed for function cells is correct.");
   is(functionCell.childNodes[1].className, "plain call-tree-name",
     "The second node displayed for function cells is correct.");
   is(functionCell.childNodes[2].className, "plain call-tree-url",
--- a/browser/devtools/performance/views/details-js-call-tree.js
+++ b/browser/devtools/performance/views/details-js-call-tree.js
@@ -98,19 +98,16 @@ let JsCallTreeView = Heritage.extend(Det
     // Pipe "focus" events to the view, mostly for tests
     root.on("focus", () => this.emit("focus"));
 
     // Clear out other call trees.
     let container = $("#js-calltree-view > .call-tree-cells-container");
     container.innerHTML = "";
     root.attachTo(container);
 
-    // Profiler data does not contain memory allocations information.
-    root.toggleAllocations(false);
-
     // When platform data isn't shown, hide the cateogry labels, since they're
     // only available for C++ frames.
     let contentOnly = !PerformanceController.getOption("show-platform-data");
     root.toggleCategories(!contentOnly);
   },
 
   toString: () => "[object JsCallTreeView]"
 });
--- a/browser/devtools/performance/views/details-memory-call-tree.js
+++ b/browser/devtools/performance/views/details-memory-call-tree.js
@@ -84,16 +84,23 @@ let MemoryCallTreeView = Heritage.extend
       inverted: options.inverted,
       // Root nodes are hidden in inverted call trees.
       hidden: options.inverted,
       // Memory call trees should be sorted by allocations.
       sortingPredicate: (a, b) => a.frame.allocations < b.frame.allocations ? 1 : -1,
       // Call trees should only auto-expand when not inverted. Passing undefined
       // will default to the CALL_TREE_AUTO_EXPAND depth.
       autoExpandDepth: options.inverted ? 0 : undefined,
+      // Some cells like the time duration and cost percentage don't make sense
+      // for a memory allocations call tree.
+      visibleCells: {
+        allocations: true,
+        selfAllocations: true,
+        function: true
+      }
     });
 
     // Bind events.
     root.on("link", this._onLink);
 
     // Pipe "focus" events to the view, mostly for tests
     root.on("focus", () => this.emit("focus"));
 
--- a/browser/devtools/profiler/ui-profile.js
+++ b/browser/devtools/profiler/ui-profile.js
@@ -504,17 +504,16 @@ let ProfileView = {
     callTreeRoot.attachTo($(".call-tree-cells-container", panel));
 
     if (!options.skipCallTreeFocus) {
       callTreeRoot.focus();
     }
 
     let contentOnly = !Prefs.showPlatformData;
     callTreeRoot.toggleCategories(!contentOnly);
-    callTreeRoot.toggleAllocations(false);
 
     this._callTreeRootByPanel.set(panel, callTreeRoot);
   },
 
   /**
    * Shortcuts for accessing the recording info or widgets for a <panel>.
    * @param nsIDOMNode panel [optional]
    * @return object
--- a/browser/devtools/shared/profiler/tree-view.js
+++ b/browser/devtools/shared/profiler/tree-view.js
@@ -12,19 +12,30 @@ loader.lazyImporter(this, "Heritage",
   "resource:///modules/devtools/ViewHelpers.jsm");
 loader.lazyImporter(this, "AbstractTreeItem",
   "resource:///modules/devtools/AbstractTreeItem.jsm");
 
 const MILLISECOND_UNITS = L10N.getStr("table.ms");
 const PERCENTAGE_UNITS = L10N.getStr("table.percentage");
 const URL_LABEL_TOOLTIP = L10N.getStr("table.url.tooltiptext");
 const ZOOM_BUTTON_TOOLTIP = L10N.getStr("table.zoom.tooltiptext");
-const CALL_TREE_AUTO_EXPAND = 3; // depth
 const CALL_TREE_INDENTATION = 16; // px
+
 const DEFAULT_SORTING_PREDICATE = (a, b) => a.frame.samples < b.frame.samples ? 1 : -1;
+const DEFAULT_AUTO_EXPAND_DEPTH = 3; // depth
+const DEFAULT_VISIBLE_CELLS = {
+  duration: true,
+  percentage: true,
+  allocations: false,
+  selfDuration: true,
+  selfPercentage: true,
+  selfAllocations: false,
+  samples: true,
+  function: true
+};
 
 const clamp = (val, min, max) => Math.max(min, Math.min(max, val));
 const sum = vals => vals.reduce((a, b) => a + b, 0);
 
 exports.CallView = CallView;
 
 /**
  * An item in a call tree view, which looks like this:
@@ -50,43 +61,50 @@ exports.CallView = CallView;
  * @param boolean hidden [optional]
  *        Whether this node should be hidden and not contribute to depth/level
  *        calculations. Defaults to false.
  * @param boolean inverted [optional]
  *        Whether the call tree has been inverted (bottom up, rather than
  *        top-down). Defaults to false.
  * @param function sortingPredicate [optional]
  *        The predicate used to sort the tree items when created. Defaults to
- *        the caller's sortingPredicate if a caller exists, otherwise defaults
+ *        the caller's `sortingPredicate` if a caller exists, otherwise defaults
  *        to DEFAULT_SORTING_PREDICATE. The two passed arguments are FrameNodes.
  * @param number autoExpandDepth [optional]
  *        The depth to which the tree should automatically expand. Defualts to
  *        the caller's `autoExpandDepth` if a caller exists, otherwise defaults
- *        to CALL_TREE_AUTO_EXPAND.
+ *        to DEFAULT_AUTO_EXPAND_DEPTH.
+ * @param object visibleCells
+ *        An object specifying which cells are visible in the tree. Defaults to
+ *        the caller's `visibleCells` if a caller exists, otherwise defaults
+ *        to DEFAULT_VISIBLE_CELLS.
  */
-function CallView({ caller, frame, level, hidden, inverted, sortingPredicate, autoExpandDepth }) {
-  // Assume no indentation if this tree item's level is not specified.
-  level = level || 0;
-
-  // Don't increase indentation if this tree item is hidden.
-  if (hidden) {
-    level--;
-  }
-
-  AbstractTreeItem.call(this, { parent: caller, level });
+function CallView({
+  caller, frame, level, hidden, inverted,
+  sortingPredicate, autoExpandDepth, visibleCells
+}) {
+  AbstractTreeItem.call(this, {
+    parent: caller,
+    level: level|0 - (hidden ? 1 : 0)
+  });
 
   this.sortingPredicate = sortingPredicate != null
     ? sortingPredicate
     : caller ? caller.sortingPredicate
              : DEFAULT_SORTING_PREDICATE
 
   this.autoExpandDepth = autoExpandDepth != null
     ? autoExpandDepth
     : caller ? caller.autoExpandDepth
-             : CALL_TREE_AUTO_EXPAND;
+             : DEFAULT_AUTO_EXPAND_DEPTH;
+
+  this.visibleCells = visibleCells != null
+    ? visibleCells
+    : caller ? caller.visibleCells
+             : Object.create(DEFAULT_VISIBLE_CELLS);
 
   this.caller = caller;
   this.frame = frame;
   this.hidden = hidden;
   this.inverted = inverted;
 
   this._onUrlClick = this._onUrlClick.bind(this);
   this._onZoomClick = this._onZoomClick.bind(this);
@@ -105,69 +123,110 @@ CallView.prototype = Heritage.extend(Abs
     let frameInfo = this.frame.getInfo();
     let framePercentage = this._getPercentage(this.frame.samples);
 
     let selfPercentage;
     let selfDuration;
     let totalAllocations;
 
     if (!this._getChildCalls().length) {
-      selfPercentage = framePercentage;
-      selfDuration = this.frame.duration;
-      totalAllocations = this.frame.allocations;
+      if (this.visibleCells.selfPercentage) {
+        selfPercentage = framePercentage;
+      }
+      if (this.visibleCells.selfDuration) {
+        selfDuration = this.frame.duration;
+      }
+      if (this.visibleCells.allocations) {
+        totalAllocations = this.frame.allocations;
+      }
     } else {
-      let childrenPercentage = sum(
-        [this._getPercentage(c.samples) for (c of this._getChildCalls())]);
-      let childrenDuration = sum(
-        [c.duration for (c of this._getChildCalls())]);
-      let childrenAllocations = sum(
-        [c.allocations for (c of this._getChildCalls())]);
-
-      selfPercentage = clamp(framePercentage - childrenPercentage, 0, 100);
-      selfDuration = this.frame.duration - childrenDuration;
-      totalAllocations = this.frame.allocations + childrenAllocations;
-
+      // Avoid performing costly computations if the respective columns
+      // won't be shown anyway.
+      if (this.visibleCells.selfPercentage) {
+        let childrenPercentage = sum([this._getPercentage(c.samples) for (c of this._getChildCalls())]);
+        selfPercentage = clamp(framePercentage - childrenPercentage, 0, 100);
+      }
+      if (this.visibleCells.selfDuration) {
+        let childrenDuration = sum([c.duration for (c of this._getChildCalls())]);
+        selfDuration = this.frame.duration - childrenDuration;
+      }
+      if (this.visibleCells.allocations) {
+        let childrenAllocations = sum([c.allocations for (c of this._getChildCalls())]);
+        totalAllocations = this.frame.allocations + childrenAllocations;
+      }
       if (this.inverted) {
         selfPercentage = framePercentage - selfPercentage;
         selfDuration = this.frame.duration - selfDuration;
       }
     }
 
-    let durationCell = this._createTimeCell(this.frame.duration);
-    let selfDurationCell = this._createTimeCell(selfDuration, true);
-    let percentageCell = this._createExecutionCell(framePercentage);
-    let selfPercentageCell = this._createExecutionCell(selfPercentage, true);
-    let allocationsCell = this._createAllocationsCell(totalAllocations);
-    let selfAllocationsCell = this._createAllocationsCell(this.frame.allocations, true);
-    let samplesCell = this._createSamplesCell(this.frame.samples);
-    let functionCell = this._createFunctionCell(arrowNode, frameInfo, this.level);
+    if (this.visibleCells.duration) {
+      var durationCell = this._createTimeCell(this.frame.duration);
+    }
+    if (this.visibleCells.selfDuration) {
+      var selfDurationCell = this._createTimeCell(selfDuration, true);
+    }
+    if (this.visibleCells.percentage) {
+      var percentageCell = this._createExecutionCell(framePercentage);
+    }
+    if (this.visibleCells.selfPercentage) {
+      var selfPercentageCell = this._createExecutionCell(selfPercentage, true);
+    }
+    if (this.visibleCells.allocations) {
+      var allocationsCell = this._createAllocationsCell(totalAllocations);
+    }
+    if (this.visibleCells.selfAllocations) {
+      var selfAllocationsCell = this._createAllocationsCell(this.frame.allocations, true);
+    }
+    if (this.visibleCells.samples) {
+      var samplesCell = this._createSamplesCell(this.frame.samples);
+    }
+    if (this.visibleCells.function) {
+      var functionCell = this._createFunctionCell(arrowNode, frameInfo, this.level);
+    }
 
     let targetNode = document.createElement("hbox");
     targetNode.className = "call-tree-item";
     targetNode.setAttribute("origin", frameInfo.isContent ? "content" : "chrome");
     targetNode.setAttribute("category", frameInfo.categoryData.abbrev || "");
     targetNode.setAttribute("tooltiptext", this.frame.location || "");
     if (this.hidden) {
       targetNode.style.display = "none";
     }
 
     let isRoot = frameInfo.nodeType == "Thread";
     if (isRoot) {
       functionCell.querySelector(".call-tree-zoom").hidden = true;
       functionCell.querySelector(".call-tree-category").hidden = true;
     }
 
-    targetNode.appendChild(durationCell);
-    targetNode.appendChild(percentageCell);
-    targetNode.appendChild(allocationsCell);
-    targetNode.appendChild(selfDurationCell);
-    targetNode.appendChild(selfPercentageCell);
-    targetNode.appendChild(selfAllocationsCell);
-    targetNode.appendChild(samplesCell);
-    targetNode.appendChild(functionCell);
+    if (this.visibleCells.duration) {
+      targetNode.appendChild(durationCell);
+    }
+    if (this.visibleCells.percentage) {
+      targetNode.appendChild(percentageCell);
+    }
+    if (this.visibleCells.allocations) {
+      targetNode.appendChild(allocationsCell);
+    }
+    if (this.visibleCells.selfDuration) {
+      targetNode.appendChild(selfDurationCell);
+    }
+    if (this.visibleCells.selfPercentage) {
+      targetNode.appendChild(selfPercentageCell);
+    }
+    if (this.visibleCells.selfAllocations) {
+      targetNode.appendChild(selfAllocationsCell);
+    }
+    if (this.visibleCells.samples) {
+      targetNode.appendChild(samplesCell);
+    }
+    if (this.visibleCells.function) {
+      targetNode.appendChild(functionCell);
+    }
 
     return targetNode;
   },
 
   /**
    * Calculate what percentage of all samples the given number of samples is.
    */
   _getPercentage: function(samples) {
@@ -297,28 +356,16 @@ CallView.prototype = Heritage.extend(Abs
     if (hasDescendants == false) {
       arrowNode.setAttribute("invisible", "");
     }
 
     return cell;
   },
 
   /**
-   * Toggles the allocations information hidden or visible.
-   * @param boolean visible
-   */
-  toggleAllocations: function(visible) {
-    if (!visible) {
-      this.container.setAttribute("allocations-hidden", "");
-    } else {
-      this.container.removeAttribute("allocations-hidden");
-    }
-  },
-
-  /**
    * Toggles the category information hidden or visible.
    * @param boolean visible
    */
   toggleCategories: function(visible) {
     if (!visible) {
       this.container.setAttribute("categories-hidden", "");
     } else {
       this.container.removeAttribute("categories-hidden");
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/ExternalInterface.jsm
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var EXPORTED_SYMBOLS = ['ExternalInterface'];
+
+Components.utils.import('resource://gre/modules/Services.jsm');
+
+function ExternalInterface(window, embedTag, callback) {
+  this.window = window;
+  this.embedTag = embedTag;
+  this.callback = callback;
+  this.externalComInitialized = false;
+
+  initExternalCom(window, embedTag, callback);
+}
+ExternalInterface.prototype = {
+  processAction: function (data) {
+    var parentWindow = this.window;
+    var embedTag = this.embedTag;
+    switch (data.action) {
+      case 'init':
+        if (this.externalComInitialized)
+          return;
+
+        this.externalComInitialized = true;
+        initExternalCom(parentWindow, embedTag, this.callback);
+        return;
+      case 'getId':
+        return embedTag.id;
+      case 'eval':
+        return parentWindow.__flash__eval(data.expression);
+      case 'call':
+        return parentWindow.__flash__call(data.request);
+      case 'register':
+        return embedTag.__flash__registerCallback(data.functionName);
+      case 'unregister':
+        return embedTag.__flash__unregisterCallback(data.functionName);
+    }
+  }
+};
+
+function getBoolPref(pref, def) {
+  try {
+    return Services.prefs.getBoolPref(pref);
+  } catch (ex) {
+    return def;
+  }
+}
+
+function initExternalCom(wrappedWindow, wrappedObject, onExternalCallback) {
+  var traceExternalInterface = getBoolPref('shumway.externalInterface.trace', false);
+  if (!wrappedWindow.__flash__initialized) {
+    wrappedWindow.__flash__initialized = true;
+    wrappedWindow.__flash__toXML = function __flash__toXML(obj) {
+      switch (typeof obj) {
+        case 'boolean':
+          return obj ? '<true/>' : '<false/>';
+        case 'number':
+          return '<number>' + obj + '</number>';
+        case 'object':
+          if (obj === null) {
+            return '<null/>';
+          }
+          if ('hasOwnProperty' in obj && obj.hasOwnProperty('length')) {
+            // array
+            var xml = '<array>';
+            for (var i = 0; i < obj.length; i++) {
+              xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
+            }
+            return xml + '</array>';
+          }
+          var xml = '<object>';
+          for (var i in obj) {
+            xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
+          }
+          return xml + '</object>';
+        case 'string':
+          return '<string>' + obj.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</string>';
+        case 'undefined':
+          return '<undefined/>';
+      }
+    };
+    wrappedWindow.__flash__eval = function (expr) {
+      traceExternalInterface && this.console.log('__flash__eval: ' + expr);
+      // allowScriptAccess protects page from unwanted swf scripts,
+      // we can execute script in the page context without restrictions.
+      var result = this.eval(expr);
+      traceExternalInterface && this.console.log('__flash__eval (result): ' + result);
+      return result;
+    }.bind(wrappedWindow);
+    wrappedWindow.__flash__call = function (expr) {
+      traceExternalInterface && this.console.log('__flash__call (ignored): ' + expr);
+    };
+  }
+  wrappedObject.__flash__registerCallback = function (functionName) {
+    traceExternalInterface && wrappedWindow.console.log('__flash__registerCallback: ' + functionName);
+    Components.utils.exportFunction(function () {
+      var args = Array.prototype.slice.call(arguments, 0);
+      traceExternalInterface && wrappedWindow.console.log('__flash__callIn: ' + functionName);
+      var result;
+      if (onExternalCallback) {
+        result = onExternalCallback({functionName: functionName, args: args});
+        traceExternalInterface && wrappedWindow.console.log('__flash__callIn (result): ' + result);
+      }
+      return wrappedWindow.eval(result);
+    }, this, { defineAs: functionName });
+  };
+  wrappedObject.__flash__unregisterCallback = function (functionName) {
+    traceExternalInterface && wrappedWindow.console.log('__flash__unregisterCallback: ' + functionName);
+    delete this[functionName];
+  };
+}
new file mode 100644
--- /dev/null
+++ b/browser/extensions/shumway/chrome/FileLoader.jsm
@@ -0,0 +1,261 @@
+/*
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var EXPORTED_SYMBOLS = ['FileLoader'];
+
+Components.utils.import('resource://gre/modules/Services.jsm');
+Components.utils.import('resource://gre/modules/Promise.jsm');
+Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
+Components.utils.import('resource://gre/modules/NetUtil.jsm');
+
+function FileLoader(swfUrl, baseUrl, callback) {
+  this.swfUrl = swfUrl;
+  this.baseUrl = baseUrl;
+  this.callback = callback;
+
+  this.crossdomainRequestsCache = Object.create(null);
+}
+
+FileLoader.prototype = {
+  load: function (data) {
+    function notifyLoadFileListener(data) {
+      if (!onLoadFileCallback) {
+        return;
+      }
+      onLoadFileCallback(data);
+    }
+
+    var onLoadFileCallback = this.callback;
+    var crossdomainRequestsCache = this.crossdomainRequestsCache;
+    var baseUrl = this.baseUrl;
+    var swfUrl = this.swfUrl;
+
+    var url = data.url;
+    var checkPolicyFile = data.checkPolicyFile;
+    var sessionId = data.sessionId;
+    var limit = data.limit || 0;
+    var method = data.method || "GET";
+    var mimeType = data.mimeType;
+    var postData = data.postData || null;
+
+
+    var performXHR = function () {
+      var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+        .createInstance(Components.interfaces.nsIXMLHttpRequest);
+      xhr.open(method, url, true);
+      xhr.responseType = "moz-chunked-arraybuffer";
+
+      if (baseUrl) {
+        // Setting the referer uri, some site doing checks if swf is embedded
+        // on the original page.
+        xhr.setRequestHeader("Referer", baseUrl);
+      }
+
+      // TODO apply range request headers if limit is specified
+
+      var lastPosition = 0;
+      xhr.onprogress = function (e) {
+        var position = e.loaded;
+        var data = new Uint8Array(xhr.response);
+        notifyLoadFileListener({callback:"loadFile", sessionId: sessionId,
+          topic: "progress", array: data, loaded: position, total: e.total});
+        lastPosition = position;
+        if (limit && e.total >= limit) {
+          xhr.abort();
+        }
+      };
+      xhr.onreadystatechange = function(event) {
+        if (xhr.readyState === 4) {
+          if (xhr.status !== 200 && xhr.status !== 0) {
+            notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error", error: xhr.statusText});
+          }
+          notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "close"});
+        }
+      };
+      if (mimeType)
+        xhr.setRequestHeader("Content-Type", mimeType);
+      xhr.send(postData);
+      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "open"});
+    };
+
+    canDownloadFile(url, checkPolicyFile, swfUrl, crossdomainRequestsCache).then(function () {
+      performXHR();
+    }, function (reason) {
+      log("data access is prohibited to " + url + " from " + baseUrl);
+      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error",
+        error: "only original swf file or file from the same origin loading supported"});
+    });
+  }
+};
+
+function log(aMsg) {
+  let msg = 'FileLoader.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
+  Services.console.logStringMessage(msg);
+  dump(msg + '\n');
+}
+
+function getStringPref(pref, def) {
+  try {
+    return Services.prefs.getComplexValue(pref, Components.interfaces.nsISupportsString).data;
+  } catch (ex) {
+    return def;
+  }
+}
+
+function disableXHRRedirect(xhr) {
+  var listener = {
+    asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
+      // TODO perform URL check?
+      callback.onRedirectVerifyCallback(Components.results.NS_ERROR_ABORT);
+    },
+    getInterface: function(iid) {
+      return this.QueryInterface(iid);
+    },
+    QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIChannelEventSink])
+  };
+  xhr.channel.notificationCallbacks = listener;
+}
+
+function canDownloadFile(url, checkPolicyFile, swfUrl, cache) {
+  // TODO flash cross-origin request
+  if (url === swfUrl) {
+    // Allows downloading for the original file.
+    return Promise.resolve(undefined);
+  }
+
+  // Allows downloading from the same origin.
+  var parsedUrl, parsedBaseUrl;
+  try {
+    parsedUrl = NetUtil.newURI(url);
+  } catch (ex) { /* skipping invalid urls */ }
+  try {
+    parsedBaseUrl = NetUtil.newURI(swfUrl);
+  } catch (ex) { /* skipping invalid urls */ }
+
+  if (parsedUrl && parsedBaseUrl &&
+    parsedUrl.prePath === parsedBaseUrl.prePath) {
+    return Promise.resolve(undefined);
+  }
+
+  // Additionally using internal whitelist.
+  var whitelist = getStringPref('shumway.whitelist', '');
+  if (whitelist && parsedUrl) {
+    var whitelisted = whitelist.split(',').some(function (i) {
+      return domainMatches(parsedUrl.host, i);
+    });
+    if (whitelisted) {
+      return Promise.resolve();
+    }
+  }
+
+  if (!parsedUrl || !parsedBaseUrl) {
+    return Promise.reject('Invalid or non-specified URL or Base URL.');
+  }
+
+  if (!checkPolicyFile) {
+    return Promise.reject('Check of the policy file is not allowed.');
+  }
+
+  // We can request crossdomain.xml.
+  return fetchPolicyFile(parsedUrl.prePath + '/crossdomain.xml', cache).
+    then(function (policy) {
+
+      if (policy.siteControl === 'none') {
+        throw 'Site control is set to \"none\"';
+      }
+      // TODO assuming master-only, there are also 'by-content-type', 'all', etc.
+
+      var allowed = policy.allowAccessFrom.some(function (i) {
+        return domainMatches(parsedBaseUrl.host, i.domain) &&
+          (!i.secure || parsedBaseUrl.scheme.toLowerCase() === 'https');
+      });
+      if (!allowed) {
+        throw 'crossdomain.xml does not contain source URL.';
+      }
+      return undefined;
+    });
+}
+
+function domainMatches(host, pattern) {
+  if (!pattern) return false;
+  if (pattern === '*') return true;
+  host = host.toLowerCase();
+  var parts = pattern.toLowerCase().split('*');
+  if (host.indexOf(parts[0]) !== 0) return false;
+  var p = parts[0].length;
+  for (var i = 1; i < parts.length; i++) {
+    var j = host.indexOf(parts[i], p);
+    if (j === -1) return false;
+    p = j + parts[i].length;
+  }
+  return parts[parts.length - 1] === '' || p === host.length;
+}
+
+function fetchPolicyFile(url, cache) {
+  if (url in cache) {
+    return cache[url];
+  }
+
+  var deferred = Promise.defer();
+
+  log('Fetching policy file at ' + url);
+  var MAX_POLICY_SIZE = 8192;
+  var xhr =  Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+    .createInstance(Components.interfaces.nsIXMLHttpRequest);
+  xhr.open('GET', url, true);
+  disableXHRRedirect(xhr);
+  xhr.overrideMimeType('text/xml');
+  xhr.onprogress = function (e) {
+    if (e.loaded >= MAX_POLICY_SIZE) {
+      xhr.abort();
+      cache[url] = false;
+      deferred.reject('Max policy size');
+    }
+  };
+  xhr.onreadystatechange = function(event) {
+    if (xhr.readyState === 4) {
+      // TODO disable redirects
+      var doc = xhr.responseXML;
+      if (xhr.status !== 200 || !doc) {
+        deferred.reject('Invalid HTTP status: ' + xhr.statusText);
+        return;
+      }
+      // parsing params
+      var params = doc.documentElement.childNodes;
+      var policy = { siteControl: null, allowAccessFrom: []};
+      for (var i = 0; i < params.length; i++) {
+        switch (params[i].localName) {
+          case 'site-control':
+            policy.siteControl = params[i].getAttribute('permitted-cross-domain-policies');
+            break;
+          case 'allow-access-from':
+            var access = {
+              domain: params[i].getAttribute('domain'),
+              security: params[i].getAttribute('security') === 'true'
+            };
+            policy.allowAccessFrom.push(access);
+            break;
+          default:
+            // TODO allow-http-request-headers-from and other
+            break;
+        }
+      }
+      deferred.resolve(policy);
+    }
+  };
+  xhr.send(null);
+  return (cache[url] = deferred.promise);
+}
--- a/browser/extensions/shumway/chrome/RtmpUtils.jsm
+++ b/browser/extensions/shumway/chrome/RtmpUtils.jsm
@@ -28,132 +28,132 @@ var RtmpUtils = {
     try {
       return Services.prefs.getBoolPref('shumway.rtmp.enabled');
     } catch (ex) {
       return false;
     }
   },
 
   createSocket: function (sandbox, params) {
-    function genPropDesc(value) {
-      return {
-        enumerable: true, configurable: true, writable: true, value: value
-      };
-    }
-
     var host = params.host, port = params.port, ssl = params.ssl;
 
     var baseSocket = Cc["@mozilla.org/tcp-socket;1"].createInstance(Ci.nsIDOMTCPSocket);
     var socket = baseSocket.open(host, port, {useSecureTransport: ssl, binaryType: 'arraybuffer'});
     if (!socket) {
       return null;
     }
 
     socket.onopen = function () {
-      if (wrapper.onopen) {
-        wrapper.onopen.call(wrapper, new sandbox.Object());
+      if (wrapperOnOpen) {
+        wrapperOnOpen(new sandbox.Object());
       }
     };
     socket.ondata = function (e) {
-      if (wrapper.ondata) {
+      if (wrapperOnData) {
         var wrappedE = new sandbox.Object();
         wrappedE.data = Components.utils.cloneInto(e.data, sandbox);
-        wrapper.ondata.call(wrapper, wrappedE);
+        wrapperOnData(wrappedE);
       }
     };
     socket.ondrain = function () {
-      if (wrapper.ondrain) {
-        wrapper.ondrain.call(wrapper, new sandbox.Object());
+      if (wrapperOnDrain) {
+        wrapperOnDrain(new sandbox.Object());
       }
     };
     socket.onerror = function (e) {
-      if (wrapper.onerror) {
+      if (wrapperOnError) {
         var wrappedE = new sandbox.Object();
         wrappedE.data = Components.utils.cloneInto(e.data, sandbox);
-        wrapper.onerror.call(wrapper, wrappedE);
+        wrapperOnError(wrappedE);
       }
     };
     socket.onclose = function () {
-      if (wrapper.onclose) {
-        wrapper.onclose.call(wrapper, new sandbox.Object());
+      if (wrapperOnClose) {
+        wrapperOnClose(new sandbox.Object());
       }
     };
 
-    var wrapper = Cu.createObjectIn(sandbox);
-    Object.defineProperties(wrapper, {
-      onopen: genPropDesc(null),
-      ondata: genPropDesc(null),
-      ondrain: genPropDesc(null),
-      onerror: genPropDesc(null),
-      onclose: genPropDesc(null),
+    var wrapperOnOpen, wrapperOnData, wrapperOnDrain, wrapperOnError, wrapperOnClose;
+    var wrapper = Components.utils.cloneInto({
+      setOpenCallback: function (callback) {
+        wrapperOnOpen = callback;
+      },
+      setDataCallback: function (callback) {
+        wrapperOnData = callback;
+      },
+      setDrainCallback: function (callback) {
+        wrapperOnDrain = callback;
+      },
+      setErrorCallback: function (callback) {
+        wrapperOnError = callback;
+      },
+      setCloseCallback: function (callback) {
+        wrapperOnClose = callback;
+      },
 
-      send: genPropDesc(function (buffer, offset, count) {
+      send: function (buffer, offset, count) {
         return socket.send(buffer, offset, count);
-      }),
+      },
 
-      close: genPropDesc(function () {
+      close: function () {
         socket.close();
-      })
-    });
-    Components.utils.makeObjectPropsNormal(wrapper);
+      }
+    }, sandbox, {cloneFunctions:true});
     return wrapper;
   },
 
   createXHR: function (sandbox) {
-    function genPropDesc(value) {
-      return {
-        enumerable: true, configurable: true, writable: true, value: value
-      };
-    }
-
     var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
                 .createInstance(Ci.nsIXMLHttpRequest);
 
     xhr.onload = function () {
       wrapper.status = xhr.status;
       wrapper.response = Components.utils.cloneInto(xhr.response, sandbox);
-      if (wrapper.onload) {
-        wrapper.onload.call(wrapper, new sandbox.Object());
+      if (wrapperOnLoad) {
+        wrapperOnLoad(new sandbox.Object());
       }
     };
     xhr.onerror = function () {
       wrapper.status = xhr.status;
-      if (wrapper.onerror) {
-        wrapper.onerror.call(wrapper, new sandbox.Object());
+      if (wrapperOnError) {
+        wrapperOnError(new sandbox.Object());
       }
     };
 
-    var wrapper = Components.utils.createObjectIn(sandbox);
-    Object.defineProperties(wrapper, {
-      status: genPropDesc(0),
-      response: genPropDesc(undefined),
-      responseType: genPropDesc('text'),
+    var wrapperOnLoad, wrapperOnError;
+    var wrapper = Components.utils.cloneInto({
+      status: 0,
+      response: undefined,
+      responseType: 'text',
 
-      onload: genPropDesc(null),
-      onerror: genPropDesc(null),
+      setLoadCallback: function (callback) {
+        wrapperOnLoad = callback;
+      },
+      setErrorCallback: function (callback) {
+        wrapperOnError = callback;
+      },
 
-      open: genPropDesc(function (method, path, async) {
+      open: function (method, path, async) {
         if (method !== 'POST' || !path || (async !== undefined && !async)) {
           throw new Error('invalid open() arguments');
         }
         // TODO check path
         xhr.open('POST', path, true);
         xhr.responseType = 'arraybuffer';
         xhr.setRequestHeader('Content-Type', 'application/x-fcs');
-      }),
+      },
 
-      setRequestHeader: genPropDesc(function (header, value) {
+      setRequestHeader: function (header, value) {
         if (header !== 'Content-Type' || value !== 'application/x-fcs') {
           throw new Error('invalid setRequestHeader() arguments');
         }
-      }),
+      },
 
-      send: genPropDesc(function (data) {
-        if (this.responseType !== 'arraybuffer') {
+      send: function (data) {
+        if (wrapper.responseType !== 'arraybuffer') {
           throw new Error('Invalid responseType.');
         }
         xhr.send(data);
-      })
-    });
-    Components.utils.makeObjectPropsNormal(wrapper);
+      }
+    }, sandbox, {cloneFunctions:true});
     return wrapper;
   }
 };
--- a/browser/extensions/shumway/chrome/ShumwayCom.jsm
+++ b/browser/extensions/shumway/chrome/ShumwayCom.jsm
@@ -14,188 +14,206 @@
  * limitations under the License.
  */
 
 var EXPORTED_SYMBOLS = ['ShumwayCom'];
 
 Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
 Components.utils.import('resource://gre/modules/Services.jsm');
 Components.utils.import('resource://gre/modules/Promise.jsm');
-Components.utils.import('resource://gre/modules/NetUtil.jsm');
 
 Components.utils.import('chrome://shumway/content/SpecialInflate.jsm');
 Components.utils.import('chrome://shumway/content/SpecialStorage.jsm');
 Components.utils.import('chrome://shumway/content/RtmpUtils.jsm');
+Components.utils.import('chrome://shumway/content/ExternalInterface.jsm');
+Components.utils.import('chrome://shumway/content/FileLoader.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
   'resource://shumway/ShumwayTelemetry.jsm');
 
 const MAX_USER_INPUT_TIMEOUT = 250; // ms
 
 function getBoolPref(pref, def) {
   try {
     return Services.prefs.getBoolPref(pref);
   } catch (ex) {
     return def;
   }
 }
 
-function getStringPref(pref, def) {
-  try {
-    return Services.prefs.getComplexValue(pref, Components.interfaces.nsISupportsString).data;
-  } catch (ex) {
-    return def;
-  }
-}
-
 function log(aMsg) {
   let msg = 'ShumwayCom.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
   Services.console.logStringMessage(msg);
   dump(msg + '\n');
 }
 
 var ShumwayCom = {
-  createAdapter: function (content, callbacks) {
-
-    function setupComBridge(playerWindow) {
-      // Creates secondary ShumwayCom adapter and sets up the forwarders from
-      // the callbacks to primary adapter.
-      var playerContent = playerWindow.contentWindow;
-      var secondaryAdapter = ShumwayCom.createAdapter(playerContent, callbacks);
-      shumwayComAdapter.onLoadFileCallback = function (arg) {
-        if (secondaryAdapter.onLoadFileCallback) {
-          secondaryAdapter.onLoadFileCallback(Components.utils.cloneInto(arg, playerContent));
-        }
-      };
-      shumwayComAdapter.onExternalCallback = function (call) {
-        if (secondaryAdapter.onExternalCallback) {
-          return secondaryAdapter.onExternalCallback(Components.utils.cloneInto(call, playerContent));
-        }
-      };
-      shumwayComAdapter.onSystemResourceCallback = function (id, data) {
-        if (secondaryAdapter.onSystemResourceCallback) {
-          secondaryAdapter.onSystemResourceCallback(id, Components.utils.cloneInto(data, playerContent));
-        }
-      };
-      // Sets up the _onSyncMessage helper that is used from postSyncMessage of
-      // the secondary adapter.
-      secondaryAdapter._onSyncMessage = function (msg) {
-        if (shumwayComAdapter.onSyncMessage) {
-          var waivedMsg = Components.utils.waiveXrays(msg); // for cloneInto
-          return shumwayComAdapter.onSyncMessage(Components.utils.cloneInto(waivedMsg, content));
-        }
-      };
-    }
-
-    function genPropDesc(value) {
-      return {
-        enumerable: true, configurable: true, writable: true, value: value
-      };
-    }
-
+  createAdapter: function (content, callbacks, hooks) {
     // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
     // up Xray wrappers.
-    var shumwayComAdapter = Components.utils.createObjectIn(content, {defineAs: 'ShumwayCom'});
-    Object.defineProperties(shumwayComAdapter, {
-      enableDebug: genPropDesc(function enableDebug() {
+    var wrapped = {
+      enableDebug: function enableDebug() {
         callbacks.enableDebug()
-      }),
-      setFullscreen: genPropDesc(function setFullscreen(value) {
+      },
+
+      setFullscreen: function setFullscreen(value) {
         callbacks.sendMessage('setFullscreen', value, false);
-      }),
-      endActivation: genPropDesc(function endActivation() {
+      },
+
+      endActivation: function endActivation() {
         callbacks.sendMessage('endActivation', null, false);
-      }),
-      fallback: genPropDesc(function fallback() {
+      },
+
+      fallback: function fallback() {
         callbacks.sendMessage('fallback', null, false);
-      }),
-      getSettings: genPropDesc(function getSettings() {
+      },
+
+      getSettings: function getSettings() {
         return Components.utils.cloneInto(
           callbacks.sendMessage('getSettings', null, true), content);
-      }),
-      getPluginParams: genPropDesc(function getPluginParams() {
+      },
+
+      getPluginParams: function getPluginParams() {
         return Components.utils.cloneInto(
           callbacks.sendMessage('getPluginParams', null, true), content);
-      }),
-      reportIssue: genPropDesc(function reportIssue() {
+      },
+
+      reportIssue: function reportIssue() {
         callbacks.sendMessage('reportIssue', null, false);
-      }),
-      externalCom: genPropDesc(function externalCom(args) {
+      },
+
+      reportTelemetry: function reportTelemetry(args) {
+        callbacks.sendMessage('reportTelemetry', args, false);
+      },
+
+      userInput: function userInput() {
+        callbacks.sendMessage('userInput', null, true);
+      },
+
+      setupComBridge: function setupComBridge(playerWindow) {
+        // postSyncMessage helper function to relay messages from the secondary
+        // window to the primary one.
+        function postSyncMessage(msg) {
+          if (onSyncMessageCallback) {
+            // the msg came from other content window
+            var reclonedMsg = Components.utils.cloneInto(Components.utils.waiveXrays(msg), content);
+            var result = onSyncMessageCallback(reclonedMsg);
+            // the result will be sent later to other content window
+            var waivedResult = Components.utils.waiveXrays(result);
+            return waivedResult;
+          }
+        }
+
+        // Creates secondary ShumwayCom adapter.
+        var playerContent = playerWindow.contentWindow.wrappedJSObject;
+        ShumwayCom.createPlayerAdapter(playerContent, postSyncMessage, callbacks, hooks);
+      },
+
+      setSyncMessageCallback: function (callback) {
+        onSyncMessageCallback = callback;
+      }
+    };
+
+    var onSyncMessageCallback;
+
+    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
+    content.ShumwayCom = shumwayComAdapter;
+  },
+
+  createPlayerAdapter: function (content, postSyncMessage, callbacks, hooks) {
+    // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
+    // up Xray wrappers.
+    var wrapped = {
+      externalCom: function externalCom(args) {
         var result = String(callbacks.sendMessage('externalCom', args, true));
         return Components.utils.cloneInto(result, content);
-      }),
-      loadFile: genPropDesc(function loadFile(args) {
+      },
+
+      loadFile: function loadFile(args) {
         callbacks.sendMessage('loadFile', args, false);
-      }),
-      reportTelemetry: genPropDesc(function reportTelemetry(args) {
+      },
+
+      reportTelemetry: function reportTelemetry(args) {
         callbacks.sendMessage('reportTelemetry', args, false);
-      }),
-      setClipboard: genPropDesc(function setClipboard(args) {
+      },
+
+      setClipboard: function setClipboard(args) {
         callbacks.sendMessage('setClipboard', args, false);
-      }),
-      navigateTo: genPropDesc(function navigateTo(args) {
+      },
+
+      navigateTo: function navigateTo(args) {
         callbacks.sendMessage('navigateTo', args, false);
-      }),
-      userInput: genPropDesc(function userInput() {
-        callbacks.sendMessage('userInput', null, true);
-      }),
-      loadSystemResource: genPropDesc(function loadSystemResource(id) {
+      },
+
+      loadSystemResource: function loadSystemResource(id) {
         loadShumwaySystemResource(id).then(function (data) {
-          if (shumwayComAdapter.onSystemResourceCallback) {
-            shumwayComAdapter.onSystemResourceCallback(id,
-              Components.utils.cloneInto(data, content));
+          if (onSystemResourceCallback) {
+            onSystemResourceCallback(id, Components.utils.cloneInto(data, content));
           }
         });
-      }),
-      setupComBridge: genPropDesc(setupComBridge),
-      postSyncMessage: genPropDesc(function postSyncMessage(msg) {
-        return Components.utils.cloneInto(shumwayComAdapter._onSyncMessage(msg), content);
-      })
-    });
+      },
 
-    Object.defineProperties(shumwayComAdapter, {
-      onLoadFileCallback: genPropDesc(null),
-      onExternalCallback: genPropDesc(null),
-      onSystemResourceCallback: genPropDesc(null),
-      onSyncMessage: genPropDesc(null)
-    });
+      postSyncMessage: function (msg) {
+        var result = postSyncMessage(msg);
+        return Components.utils.cloneInto(result, content)
+      },
 
-    Object.defineProperties(shumwayComAdapter, {
-      createSpecialStorage: genPropDesc(function () {
+      createSpecialStorage: function () {
         var environment = callbacks.getEnvironment();
         return SpecialStorageUtils.createWrappedSpecialStorage(content,
           environment.swfUrl, environment.privateBrowsing);
-      })
-    });
+      },
+
+      setLoadFileCallback: function (callback) {
+        onLoadFileCallback = callback;
+      },
+      setExternalCallback: function (callback) {
+        onExternalCallback = callback;
+      },
+      setSystemResourceCallback: function (callback) {
+        onSystemResourceCallback = callback;
+      }
+    };
 
     // Exposing createSpecialInflate function for DEFLATE stream decoding using
     // Gecko API.
     if (SpecialInflateUtils.isSpecialInflateEnabled) {
-      Object.defineProperties(shumwayComAdapter, {
-        createSpecialInflate: genPropDesc(function () {
-          return SpecialInflateUtils.createWrappedSpecialInflate(content);
-        })
-      });
+      wrapped.createSpecialInflate = function () {
+        return SpecialInflateUtils.createWrappedSpecialInflate(content);
+      };
     }
 
     // Exposing createRtmpSocket/createRtmpXHR functions to support RTMP stream
     // functionality.
     if (RtmpUtils.isRtmpEnabled) {
-      Object.defineProperties(shumwayComAdapter, {
-        createRtmpSocket: genPropDesc(function (params) {
-          return RtmpUtils.createSocket(content, params);
-        }),
-        createRtmpXHR: genPropDesc(function () {
-          return RtmpUtils.createXHR(content);
-        })
-      });
+      wrapped.createRtmpSocket = function (params) {
+        return RtmpUtils.createSocket(content, params);
+      };
+      wrapped.createRtmpXHR = function () {
+        return RtmpUtils.createXHR(content);
+      };
     }
 
-    Components.utils.makeObjectPropsNormal(shumwayComAdapter);
-    return shumwayComAdapter;
+    var onSystemResourceCallback;
+    var onExternalCallback;
+    var onLoadFileCallback;
+
+    hooks.onLoadFileCallback = function (arg) {
+      if (onLoadFileCallback) {
+        onLoadFileCallback(Components.utils.cloneInto(arg, content));
+      }
+    };
+    hooks.onExternalCallback = function (call) {
+      if (onExternalCallback) {
+        return onExternalCallback(Components.utils.cloneInto(call, content));
+      }
+    };
+
+    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
+    content.ShumwayCom = shumwayComAdapter;
   },
 
   createActions: function (startupInfo, window, document) {
     return new ShumwayChromeActions(startupInfo, window, document);
   }
 };
 
 function loadShumwaySystemResource(id) {
@@ -237,27 +255,30 @@ function ShumwayChromeActions(startupInf
   this.objectParams = startupInfo.objectParams;
   this.movieParams = startupInfo.movieParams;
   this.baseUrl = startupInfo.baseUrl;
   this.isOverlay = startupInfo.isOverlay;
   this.embedTag = startupInfo.embedTag;
   this.isPausedAtStart = startupInfo.isPausedAtStart;
   this.window = window;
   this.document = document;
-  this.externalComInitialized = false;
   this.allowScriptAccess = startupInfo.allowScriptAccess;
   this.lastUserInput = 0;
-  this.crossdomainRequestsCache = Object.create(null);
   this.telemetry = {
     startTime: Date.now(),
     features: [],
     errors: []
   };
 
+  this.fileLoader = new FileLoader(startupInfo.url, startupInfo.baseUrl, function (args) {
+    this.onLoadFileCallback(args);
+  }.bind(this));
   this.onLoadFileCallback = null;
+
+  this.externalInterface = null;
   this.onExternalCallback = null;
 }
 
 ShumwayChromeActions.prototype = {
   // The method is created for convenience of routing messages from the OOP
   // handler or remote debugger adapter. All method calls are originated from
   // the ShumwayCom adapter (see above), or from the debugger adapter.
   // See viewerWrapper.js for these usages near sendMessage calls.
@@ -295,87 +316,37 @@ ShumwayChromeActions.prototype = {
       objectParams: this.objectParams,
       isOverlay: this.isOverlay,
       isPausedAtStart: this.isPausedAtStart,
       isDebuggerEnabled: getBoolPref('shumway.debug.enabled', false)
     };
   },
 
   loadFile: function loadFile(data) {
-    function notifyLoadFileListener(data) {
-      if (!actions.onLoadFileCallback) {
-        return;
-      }
-      actions.onLoadFileCallback(data);
-    }
-
-    var actions = this;
-    var url = data.url;
-    var checkPolicyFile = data.checkPolicyFile;
-    var sessionId = data.sessionId;
-    var limit = data.limit || 0;
-    var method = data.method || "GET";
-    var mimeType = data.mimeType;
-    var postData = data.postData || null;
-
-    var win = this.window;
-    var baseUrl = this.baseUrl;
-
-    var performXHR = function () {
-      var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-                                  .createInstance(Components.interfaces.nsIXMLHttpRequest);
-      xhr.open(method, url, true);
-      xhr.responseType = "moz-chunked-arraybuffer";
-
-      if (baseUrl) {
-        // Setting the referer uri, some site doing checks if swf is embedded
-        // on the original page.
-        xhr.setRequestHeader("Referer", baseUrl);
-      }
-
-      // TODO apply range request headers if limit is specified
-
-      var lastPosition = 0;
-      xhr.onprogress = function (e) {
-        var position = e.loaded;
-        var data = new Uint8Array(xhr.response);
-        notifyLoadFileListener({callback:"loadFile", sessionId: sessionId,
-          topic: "progress", array: data, loaded: position, total: e.total});
-        lastPosition = position;
-        if (limit && e.total >= limit) {
-          xhr.abort();
-        }
-      };
-      xhr.onreadystatechange = function(event) {
-        if (xhr.readyState === 4) {
-          if (xhr.status !== 200 && xhr.status !== 0) {
-            notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error", error: xhr.statusText});
-          }
-          notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "close"});
-        }
-      };
-      if (mimeType)
-        xhr.setRequestHeader("Content-Type", mimeType);
-      xhr.send(postData);
-      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "open"});
-    };
-
-    canDownloadFile(url, checkPolicyFile, this.url, this.crossdomainRequestsCache).then(function () {
-      performXHR();
-    }, function (reason) {
-      log("data access is prohibited to " + url + " from " + baseUrl);
-      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error",
-        error: "only original swf file or file from the same origin loading supported"});
-    });
+    this.fileLoader.load(data);
   },
 
   navigateTo: function (data) {
+    // Our restrictions are a little bit different from Flash's: let's enable
+    // only http(s) and only when script execution is allowed.
+    // See https://helpx.adobe.com/flash/kb/control-access-scripts-host-web.html
+    var url = data.url || 'about:blank';
+    var target = data.target || '_self';
+    var isWhitelistedProtocol = /^(http|https):\/\//i.test(url);
+    if (!isWhitelistedProtocol || !this.allowScriptAccess) {
+      return;
+    }
+    // ...and only when user input is in-progress.
+    if (!this.isUserInputInProgress()) {
+      return;
+    }
+    log('!!navigateTo: ' + url + ' ... ' + target);
     var embedTag = this.embedTag.wrappedJSObject;
     var window = embedTag ? embedTag.ownerDocument.defaultView : this.window;
-    window.open(data.url, data.target || '_self');
+    window.open(url, target);
   },
 
   fallback: function(automatic) {
     automatic = !!automatic;
     var event = this.document.createEvent('CustomEvent');
     event.initCustomEvent('shumwayFallback', true, true, {
       automatic: automatic
     });
@@ -502,186 +473,29 @@ ShumwayChromeActions.prototype = {
       this.window.open(url);
     }.bind(this));
   },
 
   externalCom: function (data) {
     if (!this.allowScriptAccess)
       return;
 
-    // TODO check security ?
-    var parentWindow = this.window.parent.wrappedJSObject;
-    var embedTag = this.embedTag.wrappedJSObject;
-    switch (data.action) {
-      case 'init':
-        if (this.externalComInitialized)
-          return;
+    // TODO check more security stuff ?
+    if (!this.externalInterface) {
+      var parentWindow = this.window.parent.wrappedJSObject;
+      var embedTag = this.embedTag.wrappedJSObject;
+      this.externalInterface = new ExternalInterface(parentWindow, embedTag, function (call) {
+        this.onExternalCallback(call);
+      }.bind(this));
+    }
 
-        this.externalComInitialized = true;
-        initExternalCom(parentWindow, embedTag, this);
-        return;
-      case 'getId':
-        return embedTag.id;
-      case 'eval':
-        return parentWindow.__flash__eval(data.expression);
-      case 'call':
-        return parentWindow.__flash__call(data.request);
-      case 'register':
-        return embedTag.__flash__registerCallback(data.functionName);
-      case 'unregister':
-        return embedTag.__flash__unregisterCallback(data.functionName);
-    }
+    return this.externalInterface.processAction(data);
   }
 };
 
-function disableXHRRedirect(xhr) {
-  var listener = {
-    asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
-      // TODO perform URL check?
-      callback.onRedirectVerifyCallback(Components.results.NS_ERROR_ABORT);
-    },
-    getInterface: function(iid) {
-      return this.QueryInterface(iid);
-    },
-    QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIChannelEventSink])
-  };
-  xhr.channel.notificationCallbacks = listener;
-}
-
-function canDownloadFile(url, checkPolicyFile, swfUrl, cache) {
-  // TODO flash cross-origin request
-  if (url === swfUrl) {
-    // Allows downloading for the original file.
-    return Promise.resolve(undefined);
-  }
-
-  // Allows downloading from the same origin.
-  var parsedUrl, parsedBaseUrl;
-  try {
-    parsedUrl = NetUtil.newURI(url);
-  } catch (ex) { /* skipping invalid urls */ }
-  try {
-    parsedBaseUrl = NetUtil.newURI(swfUrl);
-  } catch (ex) { /* skipping invalid urls */ }
-
-  if (parsedUrl && parsedBaseUrl &&
-    parsedUrl.prePath === parsedBaseUrl.prePath) {
-    return Promise.resolve(undefined);
-  }
-
-  // Additionally using internal whitelist.
-  var whitelist = getStringPref('shumway.whitelist', '');
-  if (whitelist && parsedUrl) {
-    var whitelisted = whitelist.split(',').some(function (i) {
-      return domainMatches(parsedUrl.host, i);
-    });
-    if (whitelisted) {
-      return Promise.resolve();
-    }
-  }
-
-  if (!parsedUrl || !parsedBaseUrl) {
-    return Promise.reject('Invalid or non-specified URL or Base URL.');
-  }
-
-  if (!checkPolicyFile) {
-    return Promise.reject('Check of the policy file is not allowed.');
-  }
-
-  // We can request crossdomain.xml.
-  return fetchPolicyFile(parsedUrl.prePath + '/crossdomain.xml', cache).
-    then(function (policy) {
-
-      if (policy.siteControl === 'none') {
-        throw 'Site control is set to \"none\"';
-      }
-      // TODO assuming master-only, there are also 'by-content-type', 'all', etc.
-
-      var allowed = policy.allowAccessFrom.some(function (i) {
-        return domainMatches(parsedBaseUrl.host, i.domain) &&
-          (!i.secure || parsedBaseUrl.scheme.toLowerCase() === 'https');
-      });
-      if (!allowed) {
-        throw 'crossdomain.xml does not contain source URL.';
-      }
-      return undefined;
-    });
-}
-
-function domainMatches(host, pattern) {
-  if (!pattern) return false;
-  if (pattern === '*') return true;
-  host = host.toLowerCase();
-  var parts = pattern.toLowerCase().split('*');
-  if (host.indexOf(parts[0]) !== 0) return false;
-  var p = parts[0].length;
-  for (var i = 1; i < parts.length; i++) {
-    var j = host.indexOf(parts[i], p);
-    if (j === -1) return false;
-    p = j + parts[i].length;
-  }
-  return parts[parts.length - 1] === '' || p === host.length;
-}
-
-function fetchPolicyFile(url, cache) {
-  if (url in cache) {
-    return cache[url];
-  }
-
-  var deferred = Promise.defer();
-
-  log('Fetching policy file at ' + url);
-  var MAX_POLICY_SIZE = 8192;
-  var xhr =  Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-                               .createInstance(Components.interfaces.nsIXMLHttpRequest);
-  xhr.open('GET', url, true);
-  disableXHRRedirect(xhr);
-  xhr.overrideMimeType('text/xml');
-  xhr.onprogress = function (e) {
-    if (e.loaded >= MAX_POLICY_SIZE) {
-      xhr.abort();
-      cache[url] = false;
-      deferred.reject('Max policy size');
-    }
-  };
-  xhr.onreadystatechange = function(event) {
-    if (xhr.readyState === 4) {
-      // TODO disable redirects
-      var doc = xhr.responseXML;
-      if (xhr.status !== 200 || !doc) {
-        deferred.reject('Invalid HTTP status: ' + xhr.statusText);
-        return;
-      }
-      // parsing params
-      var params = doc.documentElement.childNodes;
-      var policy = { siteControl: null, allowAccessFrom: []};
-      for (var i = 0; i < params.length; i++) {
-        switch (params[i].localName) {
-          case 'site-control':
-            policy.siteControl = params[i].getAttribute('permitted-cross-domain-policies');
-            break;
-          case 'allow-access-from':
-            var access = {
-              domain: params[i].getAttribute('domain'),
-              security: params[i].getAttribute('security') === 'true'
-            };
-            policy.allowAccessFrom.push(access);
-            break;
-          default:
-            // TODO allow-http-request-headers-from and other
-            break;
-        }
-      }
-      deferred.resolve(policy);
-    }
-  };
-  xhr.send(null);
-  return (cache[url] = deferred.promise);
-}
-
 function getVersionInfo() {
   var deferred = Promise.defer();
   var versionInfo = {
     geckoVersion: 'unknown',
     geckoBuildID: 'unknown',
     shumwayVersion: 'unknown'
   };
   try {
@@ -711,72 +525,8 @@ function getVersionInfo() {
   xhr.onerror = function () {
     log('Error while reading version info: ' + xhr.error);
     deferred.resolve(versionInfo);
   };
   xhr.send();
 
   return deferred.promise;
 }
-
-function initExternalCom(wrappedWindow, wrappedObject, actions) {
-  var traceExternalInterface = getBoolPref('shumway.externalInterface.trace', false);
-  if (!wrappedWindow.__flash__initialized) {
-    wrappedWindow.__flash__initialized = true;
-    wrappedWindow.__flash__toXML = function __flash__toXML(obj) {
-      switch (typeof obj) {
-        case 'boolean':
-          return obj ? '<true/>' : '<false/>';
-        case 'number':
-          return '<number>' + obj + '</number>';
-        case 'object':
-          if (obj === null) {
-            return '<null/>';
-          }
-          if ('hasOwnProperty' in obj && obj.hasOwnProperty('length')) {
-            // array
-            var xml = '<array>';
-            for (var i = 0; i < obj.length; i++) {
-              xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
-            }
-            return xml + '</array>';
-          }
-          var xml = '<object>';
-          for (var i in obj) {
-            xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
-          }
-          return xml + '</object>';
-        case 'string':
-          return '<string>' + obj.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</string>';
-        case 'undefined':
-          return '<undefined/>';
-      }
-    };
-    wrappedWindow.__flash__eval = function (expr) {
-      traceExternalInterface && this.console.log('__flash__eval: ' + expr);
-      // allowScriptAccess protects page from unwanted swf scripts,
-      // we can execute script in the page context without restrictions.
-      var result = this.eval(expr);
-      traceExternalInterface && this.console.log('__flash__eval (result): ' + result);
-      return result;
-    }.bind(wrappedWindow);
-    wrappedWindow.__flash__call = function (expr) {
-      traceExternalInterface && this.console.log('__flash__call (ignored): ' + expr);
-    };
-  }
-  wrappedObject.__flash__registerCallback = function (functionName) {
-    traceExternalInterface && wrappedWindow.console.log('__flash__registerCallback: ' + functionName);
-    Components.utils.exportFunction(function () {
-      var args = Array.prototype.slice.call(arguments, 0);
-      traceExternalInterface && wrappedWindow.console.log('__flash__callIn: ' + functionName);
-      var result;
-      if (actions.onExternalCallback) {
-        result = actions.onExternalCallback({functionName: functionName, args: args});
-        traceExternalInterface && wrappedWindow.console.log('__flash__callIn (result): ' + result);
-      }
-      return wrappedWindow.eval(result);
-    }, this, { defineAs: functionName });
-  };
-  wrappedObject.__flash__unregisterCallback = function (functionName) {
-    traceExternalInterface && wrappedWindow.console.log('__flash__unregisterCallback: ' + functionName);
-    delete this[functionName];
-  };
-}
--- a/browser/extensions/shumway/chrome/SpecialInflate.jsm
+++ b/browser/extensions/shumway/chrome/SpecialInflate.jsm
@@ -91,41 +91,37 @@ var SpecialInflateUtils = {
     try {
       return Services.prefs.getBoolPref('shumway.specialInflate');
     } catch (ex) {
       return false; // TODO true;
     }
   },
 
   createWrappedSpecialInflate: function (sandbox) {
-    function genPropDesc(value) {
-      return {
-        enumerable: true, configurable: true, writable: true, value: value
-      };
-    }
-
     var wrapped = new SpecialInflate();
+    var wrapperOnData;
     wrapped.onData = function(data) {
-      if (wrapper.onData) {
-        wrapper.onData.call(wrapper, Components.utils.cloneInto(data, sandbox));
+      if (wrapperOnData) {
+        wrapperOnData(Components.utils.cloneInto(data, sandbox));
       }
     };
 
+
     // We will return object created in the sandbox/content, with some exposed
     // properties/methods, so we can send data between wrapped object and
     // and sandbox/content.
-    var wrapper = Components.utils.createObjectIn(sandbox);
-    Object.defineProperties(wrapper, {
-      onData: genPropDesc(null),
+    var wrapper = Components.utils.cloneInto({
+      setDataCallback: function (callback) {
+        wrapperOnData = callback;
+      },
 
-      push: genPropDesc(function (data) {
+      push: function (data) {
         // Uint8Array is expected in the data parameter.
         // SpecialInflate.push() fails with other argument types.
         return wrapped.push(data);
-      }),
-      close: genPropDesc(function () {
+      },
+      close: function () {
         return wrapped.close();
-      })
-    });
-    Components.utils.makeObjectPropsNormal(wrapper);
+      }
+    }, sandbox, {cloneFunctions:true});
     return wrapper;
   }
 };
--- a/browser/extensions/shumway/chrome/SpecialStorage.jsm
+++ b/browser/extensions/shumway/chrome/SpecialStorage.jsm
@@ -12,46 +12,37 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 var EXPORTED_SYMBOLS = ['SpecialStorageUtils'];
 
 Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/Services.jsm');
 
 var SpecialStorageUtils = {
   createWrappedSpecialStorage: function (sandbox, swfUrl, privateBrowsing) {
-    function genPropDesc(value) {
-      return {
-        enumerable: true, configurable: true, writable: true, value: value
-      };
-    }
-
     // Creating internal localStorage object based on url and privateBrowsing setting.
     var uri = Services.io.newURI(swfUrl, null, null);
     var principal = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
                               .getService(Components.interfaces.nsIScriptSecurityManager)
                               .getNoAppCodebasePrincipal(uri);
     var dsm = Components.classes["@mozilla.org/dom/localStorage-manager;1"]
                                 .getService(Components.interfaces.nsIDOMStorageManager);
     var storage = dsm.createStorage(null, principal, privateBrowsing);
 
     // We will return object created in the sandbox/content, with some exposed
     // properties/methods, so we can send data between wrapped object and
     // and sandbox/content.
-    var wrapper = Components.utils.createObjectIn(sandbox);
-    Object.defineProperties(wrapper, {
-      getItem: genPropDesc(function (key) {
+    var wrapper = Components.utils.cloneInto({
+      getItem: function (key) {
         return storage.getItem(key);
-      }),
-      setItem: genPropDesc(function (key, value) {
+      },
+      setItem: function (key, value) {
         storage.setItem(key, value);
-      }),
-      removeItem: genPropDesc(function (key) {
+      },
+      removeItem: function (key) {
         storage.removeItem(key);
-      })
-    });
-    Components.utils.makeObjectPropsNormal(wrapper);
+      }
+    }, sandbox, {cloneFunctions:true});
     return wrapper;
   }
 };
--- a/browser/extensions/shumway/chrome/content.js
+++ b/browser/extensions/shumway/chrome/content.js
@@ -14,27 +14,25 @@
  * limitations under the License.
  */
 
 Components.utils.import('resource://gre/modules/Services.jsm');
 Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
 
 var externalInterfaceWrapper = {
   callback: function (call) {
-    if (!shumwayComAdapter.onExternalCallback) {
+    if (!shumwayComAdapterHooks.onExternalCallback) {
       return undefined;
     }
-    return shumwayComAdapter.onExternalCallback(
+    return shumwayComAdapterHooks.onExternalCallback(
       Components.utils.cloneInto(JSON.parse(call), content));
   }
 };
 
-// The object allows resending of external interface, clipboard and other
-// control messages between unprivileged content and ShumwayStreamConverter.
-var shumwayComAdapter;
+var shumwayComAdapterHooks = {};
 
 function sendMessage(action, data, sync) {
   var detail = {action: action, data: data, sync: sync};
   if (!sync) {
     sendAsyncMessage('Shumway:message', detail);
     return;
   }
   var result = String(sendSyncMessage('Shumway:message', detail));
@@ -48,23 +46,23 @@ function enableDebug() {
 
 addMessageListener('Shumway:init', function (message) {
   var environment = message.data;
 
   sendAsyncMessage('Shumway:running', {}, {
     externalInterface: externalInterfaceWrapper
   });
 
-  shumwayComAdapter = ShumwayCom.createAdapter(content, {
+  ShumwayCom.createAdapter(content.wrappedJSObject, {
     sendMessage: sendMessage,
     enableDebug: enableDebug,
     getEnvironment: function () { return environment; }
-  });
+  }, shumwayComAdapterHooks);
 
   content.wrappedJSObject.runViewer();
 });
 
 addMessageListener('Shumway:loadFile', function (message) {
-  if (!shumwayComAdapter.onLoadFileCallback) {
+  if (!shumwayComAdapterHooks.onLoadFileCallback) {
     return;
   }
-  shumwayComAdapter.onLoadFileCallback(Components.utils.cloneInto(message.data, content));
+  shumwayComAdapterHooks.onLoadFileCallback(Components.utils.cloneInto(message.data, content));
 });
--- a/browser/extensions/shumway/chrome/viewerWrapper.js
+++ b/browser/extensions/shumway/chrome/viewerWrapper.js
@@ -31,28 +31,29 @@ function runViewer() {
   function handler() {
     function sendMessage(action, data, sync) {
       var result = shumwayActions.invoke(action, data);
       return Components.utils.cloneInto(result, childWindow);
     }
 
     var childWindow = viewer.contentWindow.wrappedJSObject;
 
-    var shumwayComAdapter = ShumwayCom.createAdapter(childWindow, {
+    var shumwayComAdapterHooks = {};
+    ShumwayCom.createAdapter(childWindow, {
       sendMessage: sendMessage,
       enableDebug: enableDebug,
       getEnvironment: getEnvironment,
-    });
+    }, shumwayComAdapterHooks);
 
     shumwayActions.onExternalCallback = function (call) {
-      return shumwayComAdapter.onExternalCallback(Components.utils.cloneInto(call, childWindow));
+      return shumwayComAdapterHooks.onExternalCallback(Components.utils.cloneInto(call, childWindow));
     };
 
     shumwayActions.onLoadFileCallback = function (args) {
-      shumwayComAdapter.onLoadFileCallback(Components.utils.cloneInto(args, childWindow));
+      shumwayComAdapterHooks.onLoadFileCallback(Components.utils.cloneInto(args, childWindow));
     };
 
     childWindow.runViewer();
   }
 
   function handlerOOP() {
     var frameLoader = viewer.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
     var messageManager = frameLoader.messageManager;
--- a/browser/extensions/shumway/content/ShumwayStreamConverter.jsm
+++ b/browser/extensions/shumway/content/ShumwayStreamConverter.jsm
@@ -27,17 +27,16 @@ const SHUMWAY_CONTENT_TYPE = 'applicatio
 const EXPECTED_PLAYPREVIEW_URI_PREFIX = 'data:application/x-moz-playpreview;,' +
                                         SHUMWAY_CONTENT_TYPE;
 
 const FIREFOX_ID = '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}';
 const SEAMONKEY_ID = '{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}';
 
 Cu.import('resource://gre/modules/XPCOMUtils.jsm');
 Cu.import('resource://gre/modules/Services.jsm');
-Cu.import('resource://gre/modules/NetUtil.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
   'resource://gre/modules/PrivateBrowsingUtils.jsm');
 
 XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
   'resource://shumway/ShumwayTelemetry.jsm');
 
 function getBoolPref(pref, def) {
@@ -412,35 +411,17 @@ ShumwayStreamConverterBase.prototype = {
       var queryStringParams = parseQueryString(queryStringMatch[1]);
       for (var i in queryStringParams) {
         if (!(i in movieParams)) {
           movieParams[i] = queryStringParams[i];
         }
       }
     }
 
-    var allowScriptAccess = false;
-    switch (objectParams.allowscriptaccess || 'sameDomain') {
-    case 'always':
-      allowScriptAccess = true;
-      break;
-    case 'never':
-      allowScriptAccess = false;
-      break;
-    default:
-      if (!pageUrl)
-        break;
-      try {
-        // checking if page is in same domain (? same protocol and port)
-        allowScriptAccess =
-          Services.io.newURI('/', null, Services.io.newURI(pageUrl, null, null)).spec ==
-          Services.io.newURI('/', null, Services.io.newURI(url, null, null)).spec;
-      } catch (ex) {}
-      break;
-    }
+    var allowScriptAccess = isScriptAllowed(objectParams.allowscriptaccess, url, pageUrl);
 
     var startupInfo = {};
     startupInfo.window = window;
     startupInfo.url = url;
     startupInfo.privateBrowsing = isContentWindowPrivate(window);
     startupInfo.objectParams = objectParams;
     startupInfo.movieParams = movieParams;
     startupInfo.baseUrl = baseUrl || url;
@@ -477,17 +458,27 @@ ShumwayStreamConverterBase.prototype = {
 
     // TODO For now suspending request, however we can continue fetching data
     aRequest.suspend();
 
     var originalURI = aRequest.URI;
 
     // Create a new channel that loads the viewer as a chrome resource.
     var viewerUrl = 'chrome://shumway/content/viewer.wrapper.html';
-    var channel = Services.io.newChannel(viewerUrl, null, null);
+    // TODO use only newChannel2 after FF37 is released.
+    var channel = Services.io.newChannel2 ?
+                  Services.io.newChannel2(viewerUrl,
+                                          null,
+                                          null,
+                                          null, // aLoadingNode
+                                          Services.scriptSecurityManager.getSystemPrincipal(),
+                                          null, // aTriggeringPrincipal
+                                          Ci.nsILoadInfo.SEC_NORMAL,
+                                          Ci.nsIContentPolicy.TYPE_OTHER) :
+                  Services.io.newChannel(viewerUrl, null, null);
 
     var converter = this;
     var listener = this.listener;
     // Proxy all the request observer calls, when it gets to onStopRequest
     // we can get the dom window.
     var proxy = {
       onStartRequest: function(request, context) {
         listener.onStartRequest(aRequest, context);
@@ -543,16 +534,42 @@ ShumwayStreamConverterBase.prototype = {
   },
 
   // nsIRequestObserver::onStopRequest
   onStopRequest: function(aRequest, aContext, aStatusCode) {
     // Do nothing.
   }
 };
 
+function isScriptAllowed(allowScriptAccessParameter, url, pageUrl) {
+  if (!allowScriptAccessParameter) {
+    allowScriptAccessParameter = 'sameDomain';
+  }
+  var allowScriptAccess = false;
+  switch (allowScriptAccessParameter.toLowerCase()) { // ignoring case here
+    case 'always':
+      allowScriptAccess = true;
+      break;
+    case 'never':
+      allowScriptAccess = false;
+      break;
+    default: // 'samedomain'
+      if (!pageUrl)
+        break;
+      try {
+        // checking if page is in same domain (? same protocol and port)
+        allowScriptAccess =
+          Services.io.newURI('/', null, Services.io.newURI(pageUrl, null, null)).spec ==
+          Services.io.newURI('/', null, Services.io.newURI(url, null, null)).spec;
+      } catch (ex) {}
+      break;
+  }
+  return allowScriptAccess;
+}
+
 // properties required for XPCOM registration:
 function copyProperties(obj, template) {
   for (var prop in template) {
     obj[prop] = template[prop];
   }
 }
 
 function ShumwayStreamConverter() {}
--- a/browser/extensions/shumway/content/shumway.gfx.js
+++ b/browser/extensions/shumway/content/shumway.gfx.js
@@ -11,38 +11,38 @@
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
 */
 console.time("Load Shared Dependencies");
 var Shumway, Shumway$$inline_0 = Shumway || (Shumway = {});
-Shumway$$inline_0.version = "0.10.225";
-Shumway$$inline_0.build = "510390b";
+Shumway$$inline_0.version = "0.10.268";
+Shumway$$inline_0.build = "02fd13d";
 var jsGlobal = function() {
   return this || (0,eval)("this//# sourceURL=jsGlobal-getter");
 }(), inBrowser = "undefined" !== typeof window && "document" in window && "plugins" in window.document, inFirefox = "undefined" !== typeof navigator && 0 <= navigator.userAgent.indexOf("Firefox");
 function dumpLine(k) {
 }
 jsGlobal.performance || (jsGlobal.performance = {});
 jsGlobal.performance.now || (jsGlobal.performance.now = "undefined" !== typeof dateNow ? dateNow : Date.now);
-function lazyInitializer(k, r, f) {
+function lazyInitializer(k, r, g) {
   Object.defineProperty(k, r, {get:function() {
-    var c = f();
+    var c = g();
     Object.defineProperty(k, r, {value:c, configurable:!0, enumerable:!0});
     return c;
   }, configurable:!0, enumerable:!0});
 }
 var START_TIME = performance.now();
 (function(k) {
   function r(d) {
     return(d | 0) === d;
   }
-  function f(d) {
+  function g(d) {
     return "object" === typeof d || "function" === typeof d;
   }
   function c(d) {
     return String(Number(d)) === d;
   }
   function t(d) {
     var e = 0;
     if ("number" === typeof d) {
@@ -56,29 +56,29 @@ var START_TIME = performance.now();
       return!1;
     }
     if ("0" === d) {
       return!0;
     }
     if (b > k.UINT32_CHAR_BUFFER_LENGTH) {
       return!1;
     }
-    var g = 0, e = d.charCodeAt(g++) - 48;
+    var f = 0, e = d.charCodeAt(f++) - 48;
     if (1 > e || 9 < e) {
       return!1;
     }
-    for (var p = 0, u = 0;g < b;) {
-      u = d.charCodeAt(g++) - 48;
-      if (0 > u || 9 < u) {
+    for (var q = 0, w = 0;f < b;) {
+      w = d.charCodeAt(f++) - 48;
+      if (0 > w || 9 < w) {
         return!1;
       }
-      p = e;
-      e = 10 * e + u;
+      q = e;
+      e = 10 * e + w;
     }
-    return p < k.UINT32_MAX_DIV_10 || p === k.UINT32_MAX_DIV_10 && u <= k.UINT32_MAX_MOD_10 ? !0 : !1;
+    return q < k.UINT32_MAX_DIV_10 || q === k.UINT32_MAX_DIV_10 && w <= k.UINT32_MAX_MOD_10 ? !0 : !1;
   }
   (function(d) {
     d[d._0 = 48] = "_0";
     d[d._1 = 49] = "_1";
     d[d._2 = 50] = "_2";
     d[d._3 = 51] = "_3";
     d[d._4 = 52] = "_4";
     d[d._5 = 53] = "_5";
@@ -102,17 +102,17 @@ var START_TIME = performance.now();
   };
   k.isInteger = r;
   k.isArray = function(d) {
     return d instanceof Array;
   };
   k.isNumberOrString = function(d) {
     return "number" === typeof d || "string" === typeof d;
   };
-  k.isObject = f;
+  k.isObject = g;
   k.toNumber = function(d) {
     return+d;
   };
   k.isNumericString = c;
   k.isNumeric = function(d) {
     if ("number" === typeof d) {
       return!0;
     }
@@ -127,33 +127,33 @@ var START_TIME = performance.now();
     return void 0 == d;
   };
   var n;
   (function(d) {
     d.error = function(b) {
       console.error(b);
       throw Error(b);
     };
-    d.assert = function(b, g) {
-      void 0 === g && (g = "assertion failed");
+    d.assert = function(b, f) {
+      void 0 === f && (f = "assertion failed");
       "" === b && (b = !0);
       if (!b) {
         if ("undefined" !== typeof console && "assert" in console) {
-          throw console.assert(!1, g), Error(g);
-        }
-        d.error(g.toString());
+          throw console.assert(!1, f), Error(f);
+        }
+        d.error(f.toString());
       }
     };
     d.assertUnreachable = function(b) {
       throw Error("Reached unreachable location " + Error().stack.split("\n")[1] + b);
     };
-    d.assertNotImplemented = function(b, g) {
-      b || d.error("notImplemented: " + g);
-    };
-    d.warning = function(b, g, p) {
+    d.assertNotImplemented = function(b, f) {
+      b || d.error("notImplemented: " + f);
+    };
+    d.warning = function(b, f, q) {
     };
     d.notUsed = function(b) {
     };
     d.notImplemented = function(b) {
     };
     d.dummyConstructor = function(b) {
     };
     d.abstractMethod = function(b) {
@@ -168,198 +168,204 @@ var START_TIME = performance.now();
     d.unexpectedCase = function(b) {
       d.assert(!1, "Unexpected Case: " + b);
     };
   })(n = k.Debug || (k.Debug = {}));
   k.getTicks = function() {
     return performance.now();
   };
   (function(d) {
-    function e(g, p) {
-      for (var b = 0, e = g.length;b < e;b++) {
-        if (g[b] === p) {
+    function e(f, q) {
+      for (var b = 0, e = f.length;b < e;b++) {
+        if (f[b] === q) {
           return b;
         }
       }
-      g.push(p);
-      return g.length - 1;
+      f.push(q);
+      return f.length - 1;
     }
-    d.popManyInto = function(g, b, u) {
-      for (var e = b - 1;0 <= e;e--) {
-        u[e] = g.pop();
-      }
-      u.length = b;
-    };
-    d.popMany = function(g, b) {
-      var u = g.length - b, e = g.slice(u, this.length);
-      g.length = u;
+    d.popManyInto = function(f, q, b) {
+      for (var e = q - 1;0 <= e;e--) {
+        b[e] = f.pop();
+      }
+      b.length = q;
+    };
+    d.popMany = function(f, b) {
+      var w = f.length - b, e = f.slice(w, this.length);
+      f.length = w;
       return e;
     };
-    d.popManyIntoVoid = function(g, b) {
-      g.length -= b;
-    };
-    d.pushMany = function(g, b) {
-      for (var u = 0;u < b.length;u++) {
-        g.push(b[u]);
-      }
-    };
-    d.top = function(g) {
-      return g.length && g[g.length - 1];
-    };
-    d.last = function(g) {
-      return g.length && g[g.length - 1];
-    };
-    d.peek = function(g) {
-      return g[g.length - 1];
-    };
-    d.indexOf = function(g, b) {
-      for (var u = 0, e = g.length;u < e;u++) {
-        if (g[u] === b) {
-          return u;
+    d.popManyIntoVoid = function(f, b) {
+      f.length -= b;
+    };
+    d.pushMany = function(f, b) {
+      for (var w = 0;w < b.length;w++) {
+        f.push(b[w]);
+      }
+    };
+    d.top = function(f) {
+      return f.length && f[f.length - 1];
+    };
+    d.last = function(f) {
+      return f.length && f[f.length - 1];
+    };
+    d.peek = function(f) {
+      return f[f.length - 1];
+    };
+    d.indexOf = function(f, b) {
+      for (var w = 0, e = f.length;w < e;w++) {
+        if (f[w] === b) {
+          return w;
         }
       }
       return-1;
     };
-    d.equals = function(g, b) {
-      if (g.length !== b.length) {
+    d.equals = function(f, b) {
+      if (f.length !== b.length) {
         return!1;
       }
-      for (var u = 0;u < g.length;u++) {
-        if (g[u] !== b[u]) {
+      for (var w = 0;w < f.length;w++) {
+        if (f[w] !== b[w]) {
           return!1;
         }
       }
       return!0;
     };
     d.pushUnique = e;
-    d.unique = function(g) {
-      for (var b = [], u = 0;u < g.length;u++) {
-        e(b, g[u]);
+    d.unique = function(f) {
+      for (var b = [], w = 0;w < f.length;w++) {
+        e(b, f[w]);
       }
       return b;
     };
-    d.copyFrom = function(g, b) {
-      g.length = 0;
-      d.pushMany(g, b);
-    };
-    d.ensureTypedArrayCapacity = function(g, b) {
-      if (g.length < b) {
-        var u = g;
-        g = new g.constructor(k.IntegerUtilities.nearestPowerOfTwo(b));
-        g.set(u, 0);
-      }
-      return g;
+    d.copyFrom = function(f, b) {
+      f.length = 0;
+      d.pushMany(f, b);
+    };
+    d.ensureTypedArrayCapacity = function(f, b) {
+      if (f.length < b) {
+        var w = f;
+        f = new f.constructor(k.IntegerUtilities.nearestPowerOfTwo(b));
+        f.set(w, 0);
+      }
+      return f;
+    };
+    d.memCopy = function(f, b, w, e, d) {
+      void 0 === w && (w = 0);
+      void 0 === e && (e = 0);
+      void 0 === d && (d = 0);
+      0 < e || 0 < d && d < b.length ? (0 >= d && (d = b.length - e), f.set(b.subarray(e, e + d), w)) : f.set(b, w);
     };
     var b = function() {
-      function b(g) {
-        void 0 === g && (g = 16);
+      function f(f) {
+        void 0 === f && (f = 16);
         this._f32 = this._i32 = this._u16 = this._u8 = null;
         this._offset = 0;
-        this.ensureCapacity(g);
-      }
-      b.prototype.reset = function() {
+        this.ensureCapacity(f);
+      }
+      f.prototype.reset = function() {
         this._offset = 0;
       };
-      Object.defineProperty(b.prototype, "offset", {get:function() {
+      Object.defineProperty(f.prototype, "offset", {get:function() {
         return this._offset;
       }, enumerable:!0, configurable:!0});
-      b.prototype.getIndex = function(b) {
-        return this._offset / b;
-      };
-      b.prototype.ensureAdditionalCapacity = function() {
+      f.prototype.getIndex = function(f) {
+        return this._offset / f;
+      };
+      f.prototype.ensureAdditionalCapacity = function() {
         this.ensureCapacity(this._offset + 68);
       };
-      b.prototype.ensureCapacity = function(b) {
+      f.prototype.ensureCapacity = function(f) {
         if (!this._u8) {
-          this._u8 = new Uint8Array(b);
+          this._u8 = new Uint8Array(f);
         } else {
-          if (this._u8.length > b) {
+          if (this._u8.length > f) {
             return;
           }
         }
-        var g = 2 * this._u8.length;
-        g < b && (g = b);
-        b = new Uint8Array(g);
-        b.set(this._u8, 0);
-        this._u8 = b;
-        this._u16 = new Uint16Array(b.buffer);
-        this._i32 = new Int32Array(b.buffer);
-        this._f32 = new Float32Array(b.buffer);
-      };
-      b.prototype.writeInt = function(b) {
+        var b = 2 * this._u8.length;
+        b < f && (b = f);
+        f = new Uint8Array(b);
+        f.set(this._u8, 0);
+        this._u8 = f;
+        this._u16 = new Uint16Array(f.buffer);
+        this._i32 = new Int32Array(f.buffer);
+        this._f32 = new Float32Array(f.buffer);
+      };
+      f.prototype.writeInt = function(f) {
         this.ensureCapacity(this._offset + 4);
-        this.writeIntUnsafe(b);
-      };
-      b.prototype.writeIntAt = function(b, g) {
-        this.ensureCapacity(g + 4);
-        this._i32[g >> 2] = b;
-      };
-      b.prototype.writeIntUnsafe = function(b) {
-        this._i32[this._offset >> 2] = b;
+        this.writeIntUnsafe(f);
+      };
+      f.prototype.writeIntAt = function(f, b) {
+        this.ensureCapacity(b + 4);
+        this._i32[b >> 2] = f;
+      };
+      f.prototype.writeIntUnsafe = function(f) {
+        this._i32[this._offset >> 2] = f;
         this._offset += 4;
       };
-      b.prototype.writeFloat = function(b) {
+      f.prototype.writeFloat = function(f) {
         this.ensureCapacity(this._offset + 4);
-        this.writeFloatUnsafe(b);
-      };
-      b.prototype.writeFloatUnsafe = function(b) {
-        this._f32[this._offset >> 2] = b;
+        this.writeFloatUnsafe(f);
+      };
+      f.prototype.writeFloatUnsafe = function(f) {
+        this._f32[this._offset >> 2] = f;
         this._offset += 4;
       };
-      b.prototype.write4Floats = function(b, g, e, d) {
+      f.prototype.write4Floats = function(f, b, e, d) {
         this.ensureCapacity(this._offset + 16);
-        this.write4FloatsUnsafe(b, g, e, d);
-      };
-      b.prototype.write4FloatsUnsafe = function(b, g, e, d) {
+        this.write4FloatsUnsafe(f, b, e, d);
+      };
+      f.prototype.write4FloatsUnsafe = function(f, b, e, d) {
         var a = this._offset >> 2;
-        this._f32[a + 0] = b;
-        this._f32[a + 1] = g;
+        this._f32[a + 0] = f;
+        this._f32[a + 1] = b;
         this._f32[a + 2] = e;
         this._f32[a + 3] = d;
         this._offset += 16;
       };
-      b.prototype.write6Floats = function(b, g, e, d, a, h) {
+      f.prototype.write6Floats = function(f, b, e, d, a, h) {
         this.ensureCapacity(this._offset + 24);
-        this.write6FloatsUnsafe(b, g, e, d, a, h);
-      };
-      b.prototype.write6FloatsUnsafe = function(b, g, e, d, a, h) {
-        var q = this._offset >> 2;
-        this._f32[q + 0] = b;
-        this._f32[q + 1] = g;
-        this._f32[q + 2] = e;
-        this._f32[q + 3] = d;
-        this._f32[q + 4] = a;
-        this._f32[q + 5] = h;
+        this.write6FloatsUnsafe(f, b, e, d, a, h);
+      };
+      f.prototype.write6FloatsUnsafe = function(f, b, e, d, a, h) {
+        var p = this._offset >> 2;
+        this._f32[p + 0] = f;
+        this._f32[p + 1] = b;
+        this._f32[p + 2] = e;
+        this._f32[p + 3] = d;
+        this._f32[p + 4] = a;
+        this._f32[p + 5] = h;
         this._offset += 24;
       };
-      b.prototype.subF32View = function() {
+      f.prototype.subF32View = function() {
         return this._f32.subarray(0, this._offset >> 2);
       };
-      b.prototype.subI32View = function() {
+      f.prototype.subI32View = function() {
         return this._i32.subarray(0, this._offset >> 2);
       };
-      b.prototype.subU16View = function() {
+      f.prototype.subU16View = function() {
         return this._u16.subarray(0, this._offset >> 1);
       };
-      b.prototype.subU8View = function() {
+      f.prototype.subU8View = function() {
         return this._u8.subarray(0, this._offset);
       };
-      b.prototype.hashWords = function(b, g, e) {
-        g = this._i32;
+      f.prototype.hashWords = function(f, b, e) {
+        b = this._i32;
         for (var d = 0;d < e;d++) {
-          b = (31 * b | 0) + g[d] | 0;
-        }
-        return b;
-      };
-      b.prototype.reserve = function(b) {
-        b = b + 3 & -4;
-        this.ensureCapacity(this._offset + b);
-        this._offset += b;
-      };
-      return b;
+          f = (31 * f | 0) + b[d] | 0;
+        }
+        return f;
+      };
+      f.prototype.reserve = function(f) {
+        f = f + 3 & -4;
+        this.ensureCapacity(this._offset + f);
+        this._offset += f;
+      };
+      return f;
     }();
     d.ArrayWriter = b;
   })(k.ArrayUtilities || (k.ArrayUtilities = {}));
   var a = function() {
     function d(e) {
       this._u8 = new Uint8Array(e);
       this._u16 = new Uint16Array(e);
       this._i32 = new Int32Array(e);
@@ -381,252 +387,252 @@ var START_TIME = performance.now();
       var e = this._f32[this._offset >> 2];
       this._offset += 4;
       return e;
     };
     return d;
   }();
   k.ArrayReader = a;
   (function(d) {
-    function e(b, p) {
-      return Object.prototype.hasOwnProperty.call(b, p);
+    function e(f, b) {
+      return Object.prototype.hasOwnProperty.call(f, b);
     }
-    function b(b, p) {
-      for (var u in p) {
-        e(p, u) && (b[u] = p[u]);
+    function b(f, b) {
+      for (var w in b) {
+        e(b, w) && (f[w] = b[w]);
       }
     }
-    d.boxValue = function(b) {
-      return void 0 == b || f(b) ? b : Object(b);
-    };
-    d.toKeyValueArray = function(b) {
-      var p = Object.prototype.hasOwnProperty, u = [], e;
-      for (e in b) {
-        p.call(b, e) && u.push([e, b[e]]);
-      }
-      return u;
-    };
-    d.isPrototypeWriteable = function(b) {
-      return Object.getOwnPropertyDescriptor(b, "prototype").writable;
+    d.boxValue = function(f) {
+      return void 0 == f || g(f) ? f : Object(f);
+    };
+    d.toKeyValueArray = function(f) {
+      var b = Object.prototype.hasOwnProperty, e = [], d;
+      for (d in f) {
+        b.call(f, d) && e.push([d, f[d]]);
+      }
+      return e;
+    };
+    d.isPrototypeWriteable = function(f) {
+      return Object.getOwnPropertyDescriptor(f, "prototype").writable;
     };
     d.hasOwnProperty = e;
-    d.propertyIsEnumerable = function(b, p) {
-      return Object.prototype.propertyIsEnumerable.call(b, p);
-    };
-    d.getOwnPropertyDescriptor = function(b, p) {
-      return Object.getOwnPropertyDescriptor(b, p);
-    };
-    d.hasOwnGetter = function(b, p) {
-      var e = Object.getOwnPropertyDescriptor(b, p);
+    d.propertyIsEnumerable = function(f, b) {
+      return Object.prototype.propertyIsEnumerable.call(f, b);
+    };
+    d.getOwnPropertyDescriptor = function(f, b) {
+      return Object.getOwnPropertyDescriptor(f, b);
+    };
+    d.hasOwnGetter = function(f, b) {
+      var e = Object.getOwnPropertyDescriptor(f, b);
       return!(!e || !e.get);
     };
-    d.getOwnGetter = function(b, p) {
-      var e = Object.getOwnPropertyDescriptor(b, p);
+    d.getOwnGetter = function(f, b) {
+      var e = Object.getOwnPropertyDescriptor(f, b);
       return e ? e.get : null;
     };
-    d.hasOwnSetter = function(b, p) {
-      var e = Object.getOwnPropertyDescriptor(b, p);
+    d.hasOwnSetter = function(f, b) {
+      var e = Object.getOwnPropertyDescriptor(f, b);
       return!(!e || !e.set);
     };
     d.createMap = function() {
       return Object.create(null);
     };
     d.createArrayMap = function() {
       return[];
     };
-    d.defineReadOnlyProperty = function(b, p, e) {
-      Object.defineProperty(b, p, {value:e, writable:!1, configurable:!0, enumerable:!1});
-    };
-    d.getOwnPropertyDescriptors = function(b) {
-      for (var p = d.createMap(), e = Object.getOwnPropertyNames(b), a = 0;a < e.length;a++) {
-        p[e[a]] = Object.getOwnPropertyDescriptor(b, e[a]);
-      }
-      return p;
-    };
-    d.cloneObject = function(g) {
-      var p = Object.create(Object.getPrototypeOf(g));
-      b(p, g);
-      return p;
-    };
-    d.copyProperties = function(b, p) {
-      for (var e in p) {
-        b[e] = p[e];
+    d.defineReadOnlyProperty = function(f, b, e) {
+      Object.defineProperty(f, b, {value:e, writable:!1, configurable:!0, enumerable:!1});
+    };
+    d.getOwnPropertyDescriptors = function(f) {
+      for (var b = d.createMap(), e = Object.getOwnPropertyNames(f), a = 0;a < e.length;a++) {
+        b[e[a]] = Object.getOwnPropertyDescriptor(f, e[a]);
+      }
+      return b;
+    };
+    d.cloneObject = function(f) {
+      var q = Object.create(Object.getPrototypeOf(f));
+      b(q, f);
+      return q;
+    };
+    d.copyProperties = function(f, b) {
+      for (var e in b) {
+        f[e] = b[e];
       }
     };
     d.copyOwnProperties = b;
-    d.copyOwnPropertyDescriptors = function(b, p, u) {
-      void 0 === u && (u = !0);
-      for (var d in p) {
-        if (e(p, d)) {
-          var a = Object.getOwnPropertyDescriptor(p, d);
-          if (u || !e(b, d)) {
+    d.copyOwnPropertyDescriptors = function(f, b, w) {
+      void 0 === w && (w = !0);
+      for (var d in b) {
+        if (e(b, d)) {
+          var a = Object.getOwnPropertyDescriptor(b, d);
+          if (w || !e(f, d)) {
             try {
-              Object.defineProperty(b, d, a);
+              Object.defineProperty(f, d, a);
             } catch (h) {
             }
           }
         }
       }
     };
-    d.getLatestGetterOrSetterPropertyDescriptor = function(b, p) {
+    d.getLatestGetterOrSetterPropertyDescriptor = function(b, q) {
       for (var e = {};b;) {
-        var d = Object.getOwnPropertyDescriptor(b, p);
+        var d = Object.getOwnPropertyDescriptor(b, q);
         d && (e.get = e.get || d.get, e.set = e.set || d.set);
         if (e.get && e.set) {
           break;
         }
         b = Object.getPrototypeOf(b);
       }
       return e;
     };
-    d.defineNonEnumerableGetterOrSetter = function(b, p, e, a) {
-      var h = d.getLatestGetterOrSetterPropertyDescriptor(b, p);
+    d.defineNonEnumerableGetterOrSetter = function(b, q, e, a) {
+      var h = d.getLatestGetterOrSetterPropertyDescriptor(b, q);
       h.configurable = !0;
       h.enumerable = !1;
       a ? h.get = e : h.set = e;
-      Object.defineProperty(b, p, h);
-    };
-    d.defineNonEnumerableGetter = function(b, p, e) {
-      Object.defineProperty(b, p, {get:e, configurable:!0, enumerable:!1});
-    };
-    d.defineNonEnumerableSetter = function(b, p, e) {
-      Object.defineProperty(b, p, {set:e, configurable:!0, enumerable:!1});
-    };
-    d.defineNonEnumerableProperty = function(b, p, e) {
-      Object.defineProperty(b, p, {value:e, writable:!0, configurable:!0, enumerable:!1});
-    };
-    d.defineNonEnumerableForwardingProperty = function(b, p, e) {
-      Object.defineProperty(b, p, {get:h.makeForwardingGetter(e), set:h.makeForwardingSetter(e), writable:!0, configurable:!0, enumerable:!1});
-    };
-    d.defineNewNonEnumerableProperty = function(b, p, e) {
-      d.defineNonEnumerableProperty(b, p, e);
-    };
-    d.createPublicAliases = function(b, p) {
-      for (var e = {value:null, writable:!0, configurable:!0, enumerable:!1}, d = 0;d < p.length;d++) {
-        var a = p[d];
+      Object.defineProperty(b, q, h);
+    };
+    d.defineNonEnumerableGetter = function(b, q, e) {
+      Object.defineProperty(b, q, {get:e, configurable:!0, enumerable:!1});
+    };
+    d.defineNonEnumerableSetter = function(b, q, e) {
+      Object.defineProperty(b, q, {set:e, configurable:!0, enumerable:!1});
+    };
+    d.defineNonEnumerableProperty = function(b, q, e) {
+      Object.defineProperty(b, q, {value:e, writable:!0, configurable:!0, enumerable:!1});
+    };
+    d.defineNonEnumerableForwardingProperty = function(b, q, e) {
+      Object.defineProperty(b, q, {get:h.makeForwardingGetter(e), set:h.makeForwardingSetter(e), writable:!0, configurable:!0, enumerable:!1});
+    };
+    d.defineNewNonEnumerableProperty = function(b, q, e) {
+      d.defineNonEnumerableProperty(b, q, e);
+    };
+    d.createPublicAliases = function(b, q) {
+      for (var e = {value:null, writable:!0, configurable:!0, enumerable:!1}, d = 0;d < q.length;d++) {
+        var a = q[d];
         e.value = b[a];
         Object.defineProperty(b, "$Bg" + a, e);
       }
     };
   })(k.ObjectUtilities || (k.ObjectUtilities = {}));
   var h;
   (function(d) {
     d.makeForwardingGetter = function(e) {
       return new Function('return this["' + e + '"]//# sourceURL=fwd-get-' + e + ".as");
     };
     d.makeForwardingSetter = function(e) {
       return new Function("value", 'this["' + e + '"] = value;//# sourceURL=fwd-set-' + e + ".as");
     };
     d.bindSafely = function(e, b) {
-      function g() {
+      function f() {
         return e.apply(b, arguments);
       }
-      g.boundTo = b;
-      return g;
+      f.boundTo = b;
+      return f;
     };
   })(h = k.FunctionUtilities || (k.FunctionUtilities = {}));
   (function(d) {
     function e(b) {
       return "string" === typeof b ? '"' + b + '"' : "number" === typeof b || "boolean" === typeof b ? String(b) : b instanceof Array ? "[] " + b.length : typeof b;
     }
-    d.repeatString = function(b, g) {
-      for (var p = "", e = 0;e < g;e++) {
-        p += b;
-      }
-      return p;
+    d.repeatString = function(b, f) {
+      for (var q = "", e = 0;e < f;e++) {
+        q += b;
+      }
+      return q;
     };
     d.memorySizeToString = function(b) {
       b |= 0;
       return 1024 > b ? b + " B" : 1048576 > b ? (b / 1024).toFixed(2) + "KB" : (b / 1048576).toFixed(2) + "MB";
     };
     d.toSafeString = e;
     d.toSafeArrayString = function(b) {
-      for (var g = [], p = 0;p < b.length;p++) {
-        g.push(e(b[p]));
-      }
-      return g.join(", ");
+      for (var f = [], q = 0;q < b.length;q++) {
+        f.push(e(b[q]));
+      }
+      return f.join(", ");
     };
     d.utf8decode = function(b) {
-      for (var g = new Uint8Array(4 * b.length), p = 0, e = 0, u = b.length;e < u;e++) {
+      for (var f = new Uint8Array(4 * b.length), q = 0, e = 0, w = b.length;e < w;e++) {
         var d = b.charCodeAt(e);
         if (127 >= d) {
-          g[p++] = d;
+          f[q++] = d;
         } else {
           if (55296 <= d && 56319 >= d) {
             var a = b.charCodeAt(e + 1);
             56320 <= a && 57343 >= a && (d = ((d & 1023) << 10) + (a & 1023) + 65536, ++e);
           }
-          0 !== (d & 4292870144) ? (g[p++] = 248 | d >>> 24 & 3, g[p++] = 128 | d >>> 18 & 63, g[p++] = 128 | d >>> 12 & 63, g[p++] = 128 | d >>> 6 & 63) : 0 !== (d & 4294901760) ? (g[p++] = 240 | d >>> 18 & 7, g[p++] = 128 | d >>> 12 & 63, g[p++] = 128 | d >>> 6 & 63) : 0 !== (d & 4294965248) ? (g[p++] = 224 | d >>> 12 & 15, g[p++] = 128 | d >>> 6 & 63) : g[p++] = 192 | d >>> 6 & 31;
-          g[p++] = 128 | d & 63;
-        }
-      }
-      return g.subarray(0, p);
+          0 !== (d & 4292870144) ? (f[q++] = 248 | d >>> 24 & 3, f[q++] = 128 | d >>> 18 & 63, f[q++] = 128 | d >>> 12 & 63, f[q++] = 128 | d >>> 6 & 63) : 0 !== (d & 4294901760) ? (f[q++] = 240 | d >>> 18 & 7, f[q++] = 128 | d >>> 12 & 63, f[q++] = 128 | d >>> 6 & 63) : 0 !== (d & 4294965248) ? (f[q++] = 224 | d >>> 12 & 15, f[q++] = 128 | d >>> 6 & 63) : f[q++] = 192 | d >>> 6 & 31;
+          f[q++] = 128 | d & 63;
+        }
+      }
+      return f.subarray(0, q);
     };
     d.utf8encode = function(b) {
-      for (var g = 0, p = "";g < b.length;) {
-        var e = b[g++] & 255;
+      for (var f = 0, q = "";f < b.length;) {
+        var e = b[f++] & 255;
         if (127 >= e) {
-          p += String.fromCharCode(e);
+          q += String.fromCharCode(e);
         } else {
-          var u = 192, d = 5;
+          var d = 192, w = 5;
           do {
-            if ((e & (u >> 1 | 128)) === u) {
+            if ((e & (d >> 1 | 128)) === d) {
               break;
             }
-            u = u >> 1 | 128;
-            --d;
-          } while (0 <= d);
-          if (0 >= d) {
-            p += String.fromCharCode(e);
+            d = d >> 1 | 128;
+            --w;
+          } while (0 <= w);
+          if (0 >= w) {
+            q += String.fromCharCode(e);
           } else {
-            for (var e = e & (1 << d) - 1, u = !1, a = 5;a >= d;--a) {
-              var h = b[g++];
+            for (var e = e & (1 << w) - 1, d = !1, a = 5;a >= w;--a) {
+              var h = b[f++];
               if (128 != (h & 192)) {
-                u = !0;
+                d = !0;
                 break;
               }
               e = e << 6 | h & 63;
             }
-            if (u) {
-              for (d = g - (7 - a);d < g;++d) {
-                p += String.fromCharCode(b[d] & 255);
+            if (d) {
+              for (w = f - (7 - a);w < f;++w) {
+                q += String.fromCharCode(b[w] & 255);
               }
             } else {
-              p = 65536 <= e ? p + String.fromCharCode(e - 65536 >> 10 & 1023 | 55296, e & 1023 | 56320) : p + String.fromCharCode(e);
-            }
-          }
-        }
-      }
-      return p;
+              q = 65536 <= e ? q + String.fromCharCode(e - 65536 >> 10 & 1023 | 55296, e & 1023 | 56320) : q + String.fromCharCode(e);
+            }
+          }
+        }
+      }
+      return q;
     };
     d.base64ArrayBuffer = function(b) {
-      var g = "";
+      var f = "";
       b = new Uint8Array(b);
-      for (var p = b.byteLength, e = p % 3, p = p - e, d, u, a, h, G = 0;G < p;G += 3) {
-        h = b[G] << 16 | b[G + 1] << 8 | b[G + 2], d = (h & 16515072) >> 18, u = (h & 258048) >> 12, a = (h & 4032) >> 6, h &= 63, g += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[u] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h];
-      }
-      1 == e ? (h = b[p], g += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 252) >> 2] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 3) << 4] + "==") : 2 == e && (h = b[p] << 8 | b[p + 1], g += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 64512) >> 10] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 1008) >> 4] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 15) << 
+      for (var q = b.byteLength, e = q % 3, q = q - e, d, w, a, h, G = 0;G < q;G += 3) {
+        h = b[G] << 16 | b[G + 1] << 8 | b[G + 2], d = (h & 16515072) >> 18, w = (h & 258048) >> 12, a = (h & 4032) >> 6, h &= 63, f += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[d] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[w] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h];
+      }
+      1 == e ? (h = b[q], f += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 252) >> 2] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 3) << 4] + "==") : 2 == e && (h = b[q] << 8 | b[q + 1], f += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 64512) >> 10] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 1008) >> 4] + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h & 15) << 
       2] + "=");
-      return g;
+      return f;
     };
     d.escapeString = function(b) {
       void 0 !== b && (b = b.replace(/[^\w$]/gi, "$"), /^\d/.test(b) && (b = "$" + b));
       return b;
     };
     d.fromCharCodeArray = function(b) {
-      for (var g = "", p = 0;p < b.length;p += 16384) {
-        var e = Math.min(b.length - p, 16384), g = g + String.fromCharCode.apply(null, b.subarray(p, p + e))
-      }
-      return g;
+      for (var f = "", q = 0;q < b.length;q += 16384) {
+        var e = Math.min(b.length - q, 16384), f = f + String.fromCharCode.apply(null, b.subarray(q, q + e))
+      }
+      return f;
     };
     d.variableLengthEncodeInt32 = function(b) {
-      for (var g = 32 - Math.clz32(b), p = Math.ceil(g / 6), g = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[p], p = p - 1;0 <= p;p--) {
-        g += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[b >> 6 * p & 63];
-      }
-      return g;
+      for (var f = 32 - Math.clz32(b), q = Math.ceil(f / 6), f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[q], q = q - 1;0 <= q;q--) {
+        f += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[b >> 6 * q & 63];
+      }
+      return f;
     };
     d.toEncoding = function(b) {
       return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[b];
     };
     d.fromEncoding = function(b) {
       if (65 <= b && 90 >= b) {
         return b - 65;
       }
@@ -639,193 +645,193 @@ var START_TIME = performance.now();
       if (36 === b) {
         return 62;
       }
       if (95 === b) {
         return 63;
       }
     };
     d.variableLengthDecodeInt32 = function(b) {
-      for (var g = d.fromEncoding(b.charCodeAt(0)), p = 0, e = 0;e < g;e++) {
-        var u = 6 * (g - e - 1), p = p | d.fromEncoding(b.charCodeAt(1 + e)) << u
-      }
-      return p;
-    };
-    d.trimMiddle = function(b, g) {
-      if (b.length <= g) {
+      for (var f = d.fromEncoding(b.charCodeAt(0)), q = 0, e = 0;e < f;e++) {
+        var w = 6 * (f - e - 1), q = q | d.fromEncoding(b.charCodeAt(1 + e)) << w
+      }
+      return q;
+    };
+    d.trimMiddle = function(b, f) {
+      if (b.length <= f) {
         return b;
       }
-      var p = g >> 1, e = g - p - 1;
-      return b.substr(0, p) + "\u2026" + b.substr(b.length - e, e);
-    };
-    d.multiple = function(b, g) {
-      for (var p = "", e = 0;e < g;e++) {
-        p += b;
-      }
-      return p;
-    };
-    d.indexOfAny = function(b, g, p) {
-      for (var e = b.length, u = 0;u < g.length;u++) {
-        var d = b.indexOf(g[u], p);
-        0 <= d && (e = Math.min(e, d));
+      var q = f >> 1, e = f - q - 1;
+      return b.substr(0, q) + "\u2026" + b.substr(b.length - e, e);
+    };
+    d.multiple = function(b, f) {
+      for (var q = "", e = 0;e < f;e++) {
+        q += b;
+      }
+      return q;
+    };
+    d.indexOfAny = function(b, f, q) {
+      for (var e = b.length, d = 0;d < f.length;d++) {
+        var w = b.indexOf(f[d], q);
+        0 <= w && (e = Math.min(e, w));
       }
       return e === b.length ? -1 : e;
     };
-    var b = Array(3), g = Array(4), p = Array(5), u = Array(6), a = Array(7), h = Array(8), q = Array(9);
-    d.concat3 = function(g, p, e) {
-      b[0] = g;
-      b[1] = p;
+    var b = Array(3), f = Array(4), q = Array(5), w = Array(6), a = Array(7), h = Array(8), p = Array(9);
+    d.concat3 = function(f, q, e) {
+      b[0] = f;
+      b[1] = q;
       b[2] = e;
       return b.join("");
     };
-    d.concat4 = function(b, p, e, u) {
-      g[0] = b;
-      g[1] = p;
-      g[2] = e;
-      g[3] = u;
-      return g.join("");
-    };
-    d.concat5 = function(b, g, e, u, d) {
-      p[0] = b;
-      p[1] = g;
-      p[2] = e;
-      p[3] = u;
-      p[4] = d;
-      return p.join("");
-    };
-    d.concat6 = function(b, g, p, e, d, a) {
-      u[0] = b;
-      u[1] = g;
-      u[2] = p;
-      u[3] = e;
-      u[4] = d;
-      u[5] = a;
-      return u.join("");
-    };
-    d.concat7 = function(b, g, p, e, u, d, h) {
+    d.concat4 = function(b, q, e, d) {
+      f[0] = b;
+      f[1] = q;
+      f[2] = e;
+      f[3] = d;
+      return f.join("");
+    };
+    d.concat5 = function(b, f, e, d, w) {
+      q[0] = b;
+      q[1] = f;
+      q[2] = e;
+      q[3] = d;
+      q[4] = w;
+      return q.join("");
+    };
+    d.concat6 = function(b, f, q, e, d, a) {
+      w[0] = b;
+      w[1] = f;
+      w[2] = q;
+      w[3] = e;
+      w[4] = d;
+      w[5] = a;
+      return w.join("");
+    };
+    d.concat7 = function(b, f, q, e, d, w, h) {
       a[0] = b;
-      a[1] = g;
-      a[2] = p;
+      a[1] = f;
+      a[2] = q;
       a[3] = e;
-      a[4] = u;
-      a[5] = d;
+      a[4] = d;
+      a[5] = w;
       a[6] = h;
       return a.join("");
     };
-    d.concat8 = function(b, g, p, e, u, d, a, G) {
+    d.concat8 = function(b, f, q, e, d, w, a, G) {
       h[0] = b;
-      h[1] = g;
-      h[2] = p;
+      h[1] = f;
+      h[2] = q;
       h[3] = e;
-      h[4] = u;
-      h[5] = d;
+      h[4] = d;
+      h[5] = w;
       h[6] = a;
       h[7] = G;
       return h.join("");
     };
-    d.concat9 = function(b, g, p, e, u, d, a, h, G) {
-      q[0] = b;
-      q[1] = g;
-      q[2] = p;
-      q[3] = e;
-      q[4] = u;
-      q[5] = d;
-      q[6] = a;
-      q[7] = h;
-      q[8] = G;
-      return q.join("");
+    d.concat9 = function(b, f, q, e, d, w, a, h, G) {
+      p[0] = b;
+      p[1] = f;
+      p[2] = q;
+      p[3] = e;
+      p[4] = d;
+      p[5] = w;
+      p[6] = a;
+      p[7] = h;
+      p[8] = G;
+      return p.join("");
     };
   })(k.StringUtilities || (k.StringUtilities = {}));
   (function(d) {
     var e = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]), b = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 
     643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 
     -145523070, -1120210379, 718787259, -343485551]);
-    d.hashBytesTo32BitsMD5 = function(g, p, u) {
-      var d = 1732584193, a = -271733879, h = -1732584194, q = 271733878, c = u + 72 & -64, m = new Uint8Array(c), l;
-      for (l = 0;l < u;++l) {
-        m[l] = g[p++];
-      }
-      m[l++] = 128;
-      for (g = c - 8;l < g;) {
-        m[l++] = 0;
-      }
-      m[l++] = u << 3 & 255;
-      m[l++] = u >> 5 & 255;
-      m[l++] = u >> 13 & 255;
-      m[l++] = u >> 21 & 255;
-      m[l++] = u >>> 29 & 255;
-      m[l++] = 0;
-      m[l++] = 0;
-      m[l++] = 0;
-      g = new Int32Array(16);
-      for (l = 0;l < c;) {
-        for (u = 0;16 > u;++u, l += 4) {
-          g[u] = m[l] | m[l + 1] << 8 | m[l + 2] << 16 | m[l + 3] << 24;
-        }
-        var n = d;
-        p = a;
-        var s = h, v = q, w, f;
-        for (u = 0;64 > u;++u) {
-          16 > u ? (w = p & s | ~p & v, f = u) : 32 > u ? (w = v & p | ~v & s, f = 5 * u + 1 & 15) : 48 > u ? (w = p ^ s ^ v, f = 3 * u + 5 & 15) : (w = s ^ (p | ~v), f = 7 * u & 15);
-          var k = v, n = n + w + b[u] + g[f] | 0;
-          w = e[u];
-          v = s;
-          s = p;
-          p = p + (n << w | n >>> 32 - w) | 0;
-          n = k;
-        }
-        d = d + n | 0;
-        a = a + p | 0;
-        h = h + s | 0;
-        q = q + v | 0;
-      }
-      return d;
-    };
-    d.hashBytesTo32BitsAdler = function(b, p, e) {
+    d.hashBytesTo32BitsMD5 = function(f, q, d) {
+      var a = 1732584193, h = -271733879, p = -1732584194, m = 271733878, c = d + 72 & -64, l = new Uint8Array(c), n;
+      for (n = 0;n < d;++n) {
+        l[n] = f[q++];
+      }
+      l[n++] = 128;
+      for (f = c - 8;n < f;) {
+        l[n++] = 0;
+      }
+      l[n++] = d << 3 & 255;
+      l[n++] = d >> 5 & 255;
+      l[n++] = d >> 13 & 255;
+      l[n++] = d >> 21 & 255;
+      l[n++] = d >>> 29 & 255;
+      l[n++] = 0;
+      l[n++] = 0;
+      l[n++] = 0;
+      f = new Int32Array(16);
+      for (n = 0;n < c;) {
+        for (d = 0;16 > d;++d, n += 4) {
+          f[d] = l[n] | l[n + 1] << 8 | l[n + 2] << 16 | l[n + 3] << 24;
+        }
+        var s = a;
+        q = h;
+        var u = p, v = m, g, k;
+        for (d = 0;64 > d;++d) {
+          16 > d ? (g = q & u | ~q & v, k = d) : 32 > d ? (g = v & q | ~v & u, k = 5 * d + 1 & 15) : 48 > d ? (g = q ^ u ^ v, k = 3 * d + 5 & 15) : (g = u ^ (q | ~v), k = 7 * d & 15);
+          var r = v, s = s + g + b[d] + f[k] | 0;
+          g = e[d];
+          v = u;
+          u = q;
+          q = q + (s << g | s >>> 32 - g) | 0;
+          s = r;
+        }
+        a = a + s | 0;
+        h = h + q | 0;
+        p = p + u | 0;
+        m = m + v | 0;
+      }
+      return a;
+    };
+    d.hashBytesTo32BitsAdler = function(b, q, e) {
       var d = 1, a = 0;
-      for (e = p + e;p < e;++p) {
-        d = (d + (b[p] & 255)) % 65521, a = (a + d) % 65521;
+      for (e = q + e;q < e;++q) {
+        d = (d + (b[q] & 255)) % 65521, a = (a + d) % 65521;
       }
       return a << 16 | d;
     };
   })(k.HashUtilities || (k.HashUtilities = {}));
-  var q = function() {
+  var p = function() {
     function d() {
     }
     d.seed = function(e) {
       d._state[0] = e;
       d._state[1] = e;
     };
     d.next = function() {
       var e = this._state, b = Math.imul(18273, e[0] & 65535) + (e[0] >>> 16) | 0;
       e[0] = b;
-      var g = Math.imul(36969, e[1] & 65535) + (e[1] >>> 16) | 0;
-      e[1] = g;
-      e = (b << 16) + (g & 65535) | 0;
+      var f = Math.imul(36969, e[1] & 65535) + (e[1] >>> 16) | 0;
+      e[1] = f;
+      e = (b << 16) + (f & 65535) | 0;
       return 2.3283064365386963E-10 * (0 > e ? e + 4294967296 : e);
     };
     d._state = new Uint32Array([57005, 48879]);
     return d;
   }();
-  k.Random = q;
+  k.Random = p;
   Math.random = function() {
-    return q.next();
+    return p.next();
   };
   (function() {
     function d() {
       this.id = "$weakmap" + e++;
     }
     if ("function" !== typeof jsGlobal.WeakMap) {
       var e = 0;
       d.prototype = {has:function(b) {
         return b.hasOwnProperty(this.id);
-      }, get:function(b, g) {
-        return b.hasOwnProperty(this.id) ? b[this.id] : g;
-      }, set:function(b, g) {
-        Object.defineProperty(b, this.id, {value:g, enumerable:!1, configurable:!0});
+      }, get:function(b, f) {
+        return b.hasOwnProperty(this.id) ? b[this.id] : f;
+      }, set:function(b, f) {
+        Object.defineProperty(b, this.id, {value:f, enumerable:!1, configurable:!0});
       }, delete:function(b) {
         delete b[this.id];
       }};
       jsGlobal.WeakMap = d;
     }
   })();
   a = function() {
     function d() {
@@ -841,42 +847,42 @@ var START_TIME = performance.now();
       this._map ? this._map.delete(e) : this._list[this._list.indexOf(e)] = null;
     };
     d.prototype.forEach = function(e) {
       if (this._map) {
         "undefined" !== typeof netscape && netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"), Components.utils.nondeterministicGetWeakMapKeys(this._map).forEach(function(b) {
           0 !== b._referenceCount && e(b);
         });
       } else {
-        for (var b = this._list, g = 0, p = 0;p < b.length;p++) {
-          var d = b[p];
-          d && (0 === d._referenceCount ? (b[p] = null, g++) : e(d));
-        }
-        if (16 < g && g > b.length >> 2) {
-          g = [];
-          for (p = 0;p < b.length;p++) {
-            (d = b[p]) && 0 < d._referenceCount && g.push(d);
-          }
-          this._list = g;
+        for (var b = this._list, f = 0, q = 0;q < b.length;q++) {
+          var d = b[q];
+          d && (0 === d._referenceCount ? (b[q] = null, f++) : e(d));
+        }
+        if (16 < f && f > b.length >> 2) {
+          f = [];
+          for (q = 0;q < b.length;q++) {
+            (d = b[q]) && 0 < d._referenceCount && f.push(d);
+          }
+          this._list = f;
         }
       }
     };
     Object.defineProperty(d.prototype, "length", {get:function() {
       return this._map ? -1 : this._list.length;
     }, enumerable:!0, configurable:!0});
     return d;
   }();
   k.WeakList = a;
   var l;
   (function(d) {
     d.pow2 = function(e) {
       return e === (e | 0) ? 0 > e ? 1 / (1 << -e) : 1 << e : Math.pow(2, e);
     };
-    d.clamp = function(e, b, g) {
-      return Math.max(b, Math.min(g, e));
+    d.clamp = function(e, b, f) {
+      return Math.max(b, Math.min(f, e));
     };
     d.roundHalfEven = function(e) {
       if (.5 === Math.abs(e % 1)) {
         var b = Math.floor(e);
         return 0 === b % 2 ? b : Math.ceil(e);
       }
       return Math.round(e);
     };
@@ -887,17 +893,17 @@ var START_TIME = performance.now();
       return 1E-7 > Math.abs(e - b);
     };
   })(l = k.NumberUtilities || (k.NumberUtilities = {}));
   (function(d) {
     d[d.MaxU16 = 65535] = "MaxU16";
     d[d.MaxI16 = 32767] = "MaxI16";
     d[d.MinI16 = -32768] = "MinI16";
   })(k.Numbers || (k.Numbers = {}));
-  var v;
+  var u;
   (function(d) {
     function e(b) {
       return 256 * b << 16 >> 16;
     }
     var b = new ArrayBuffer(8);
     d.i8 = new Int8Array(b);
     d.u8 = new Uint8Array(b);
     d.i32 = new Int32Array(b);
@@ -936,20 +942,20 @@ var START_TIME = performance.now();
     d.ones = function(b) {
       b -= b >> 1 & 1431655765;
       b = (b & 858993459) + (b >> 2 & 858993459);
       return 16843009 * (b + (b >> 4) & 252645135) >> 24;
     };
     d.trailingZeros = function(b) {
       return d.ones((b & -b) - 1);
     };
-    d.getFlags = function(b, p) {
+    d.getFlags = function(b, q) {
       var e = "";
-      for (b = 0;b < p.length;b++) {
-        b & 1 << b && (e += p[b] + " ");
+      for (b = 0;b < q.length;b++) {
+        b & 1 << b && (e += q[b] + " ");
       }
       return 0 === e.length ? "" : e.trim();
     };
     d.isPowerOfTwo = function(b) {
       return b && 0 === (b & b - 1);
     };
     d.roundToMultipleOfFour = function(b) {
       return b + 3 & -4;
@@ -959,56 +965,56 @@ var START_TIME = performance.now();
       b |= b >> 1;
       b |= b >> 2;
       b |= b >> 4;
       b |= b >> 8;
       b |= b >> 16;
       b++;
       return b;
     };
-    d.roundToMultipleOfPowerOfTwo = function(b, p) {
-      var e = (1 << p) - 1;
+    d.roundToMultipleOfPowerOfTwo = function(b, q) {
+      var e = (1 << q) - 1;
       return b + e & ~e;
     };
-    Math.imul || (Math.imul = function(b, p) {
-      var e = b & 65535, d = p & 65535;
-      return e * d + ((b >>> 16 & 65535) * d + e * (p >>> 16 & 65535) << 16 >>> 0) | 0;
+    Math.imul || (Math.imul = function(b, q) {
+      var e = b & 65535, d = q & 65535;
+      return e * d + ((b >>> 16 & 65535) * d + e * (q >>> 16 & 65535) << 16 >>> 0) | 0;
     });
     Math.clz32 || (Math.clz32 = function(b) {
       b |= b >> 1;
       b |= b >> 2;
       b |= b >> 4;
       b |= b >> 8;
       return 32 - d.ones(b | b >> 16);
     });
-  })(v = k.IntegerUtilities || (k.IntegerUtilities = {}));
+  })(u = k.IntegerUtilities || (k.IntegerUtilities = {}));
   (function(d) {
-    function e(b, g, p, e, d, a) {
-      return(p - b) * (a - g) - (e - g) * (d - b);
+    function e(b, f, q, e, d, a) {
+      return(q - b) * (a - f) - (e - f) * (d - b);
     }
-    d.pointInPolygon = function(b, g, p) {
-      for (var e = 0, d = p.length - 2, a = 0;a < d;a += 2) {
-        var h = p[a + 0], q = p[a + 1], m = p[a + 2], c = p[a + 3];
-        (q <= g && c > g || q > g && c <= g) && b < h + (g - q) / (c - q) * (m - h) && e++;
+    d.pointInPolygon = function(b, f, q) {
+      for (var e = 0, d = q.length - 2, a = 0;a < d;a += 2) {
+        var h = q[a + 0], p = q[a + 1], m = q[a + 2], l = q[a + 3];
+        (p <= f && l > f || p > f && l <= f) && b < h + (f - p) / (l - p) * (m - h) && e++;
       }
       return 1 === (e & 1);
     };
     d.signedArea = e;
-    d.counterClockwise = function(b, g, p, d, a, h) {
-      return 0 < e(b, g, p, d, a, h);
-    };
-    d.clockwise = function(b, g, p, d, a, h) {
-      return 0 > e(b, g, p, d, a, h);
-    };
-    d.pointInPolygonInt32 = function(b, g, p) {
+    d.counterClockwise = function(b, f, q, d, a, h) {
+      return 0 < e(b, f, q, d, a, h);
+    };
+    d.clockwise = function(b, f, q, d, a, h) {
+      return 0 > e(b, f, q, d, a, h);
+    };
+    d.pointInPolygonInt32 = function(b, f, q) {
       b |= 0;
-      g |= 0;
-      for (var e = 0, d = p.length - 2, a = 0;a < d;a += 2) {
-        var h = p[a + 0], q = p[a + 1], m = p[a + 2], c = p[a + 3];
-        (q <= g && c > g || q > g && c <= g) && b < h + (g - q) / (c - q) * (m - h) && e++;
+      f |= 0;
+      for (var e = 0, d = q.length - 2, a = 0;a < d;a += 2) {
+        var h = q[a + 0], p = q[a + 1], m = q[a + 2], l = q[a + 3];
+        (p <= f && l > f || p > f && l <= f) && b < h + (f - p) / (l - p) * (m - h) && e++;
       }
       return 1 === (e & 1);
     };
   })(k.GeometricUtilities || (k.GeometricUtilities = {}));
   (function(d) {
     d[d.Error = 1] = "Error";
     d[d.Warn = 2] = "Warn";
     d[d.Debug = 4] = "Debug";
@@ -1092,18 +1098,18 @@ var START_TIME = performance.now();
     };
     d.prototype.colorLn = function(e, b) {
       this._suppressOutput || (inBrowser ? this._out(this._padding + b) : this._out(this._padding + e + b + d.ENDC));
     };
     d.prototype.redLns = function(e) {
       this.colorLns(d.RED, e);
     };
     d.prototype.colorLns = function(e, b) {
-      for (var g = b.split("\n"), p = 0;p < g.length;p++) {
-        this.colorLn(e, g[p]);
+      for (var f = b.split("\n"), q = 0;q < f.length;q++) {
+        this.colorLn(e, f[q]);
       }
     };
     d.prototype.enter = function(e) {
       this._suppressOutput || this._out(this._padding + e);
       this.indent();
     };
     d.prototype.leaveAndEnter = function(e) {
       this.leave(e);
@@ -1114,25 +1120,25 @@ var START_TIME = performance.now();
       !this._suppressOutput && e && this._out(this._padding + e);
     };
     d.prototype.indent = function() {
       this._padding += this._tab;
     };
     d.prototype.outdent = function() {
       0 < this._padding.length && (this._padding = this._padding.substring(0, this._padding.length - this._tab.length));
     };
-    d.prototype.writeArray = function(e, b, g) {
+    d.prototype.writeArray = function(e, b, f) {
       void 0 === b && (b = !1);
-      void 0 === g && (g = !1);
+      void 0 === f && (f = !1);
       b = b || !1;
-      for (var p = 0, d = e.length;p < d;p++) {
+      for (var q = 0, d = e.length;q < d;q++) {
         var a = "";
-        b && (a = null === e[p] ? "null" : void 0 === e[p] ? "undefined" : e[p].constructor.name, a += " ");
-        var h = g ? "" : ("" + p).padRight(" ", 4);
-        this.writeLn(h + a + e[p]);
+        b && (a = null === e[q] ? "null" : void 0 === e[q] ? "undefined" : e[q].constructor.name, a += " ");
+        var h = f ? "" : ("" + q).padRight(" ", 4);
+        this.writeLn(h + a + e[q]);
       }
     };
     d.PURPLE = "\u001b[94m";
     d.YELLOW = "\u001b[93m";
     d.GREEN = "\u001b[92m";
     d.RED = "\u001b[91m";
     d.BOLD_RED = "\u001b[1;91m";
     d.ENDC = "\u001b[0m";
@@ -1151,38 +1157,38 @@ var START_TIME = performance.now();
     function d(e) {
       this._compare = e;
       this._head = null;
       this._length = 0;
     }
     d.prototype.push = function(e) {
       this._length++;
       if (this._head) {
-        var b = this._head, g = null;
+        var b = this._head, f = null;
         e = new m(e, null);
-        for (var p = this._compare;b;) {
-          if (0 < p(b.value, e.value)) {
-            g ? (e.next = b, g.next = e) : (e.next = this._head, this._head = e);
+        for (var q = this._compare;b;) {
+          if (0 < q(b.value, e.value)) {
+            f ? (e.next = b, f.next = e) : (e.next = this._head, this._head = e);
             return;
           }
-          g = b;
+          f = b;
           b = b.next;
         }
-        g.next = e;
+        f.next = e;
       } else {
         this._head = new m(e, null);
       }
     };
     d.prototype.forEach = function(e) {
-      for (var b = this._head, g = null;b;) {
-        var p = e(b.value);
-        if (p === d.RETURN) {
+      for (var b = this._head, f = null;b;) {
+        var q = e(b.value);
+        if (q === d.RETURN) {
           break;
         } else {
-          p === d.DELETE ? b = g ? g.next = b.next : this._head = this._head.next : (g = b, b = b.next);
+          q === d.DELETE ? b = f ? f.next = b.next : this._head = this._head.next : (f = b, b = b.next);
         }
       }
     };
     d.prototype.isEmpty = function() {
       return!this._head;
     };
     d.prototype.pop = function() {
       if (this._head) {
@@ -1220,17 +1226,17 @@ var START_TIME = performance.now();
       this._mask = this._size - 1;
       this.array = new e(this._size);
     }
     d.prototype.get = function(e) {
       return this.array[e];
     };
     d.prototype.forEachInReverse = function(e) {
       if (!this.isEmpty()) {
-        for (var b = 0 === this.index ? this._size - 1 : this.index - 1, g = this.start - 1 & this._mask;b !== g && !e(this.array[b], b);) {
+        for (var b = 0 === this.index ? this._size - 1 : this.index - 1, f = this.start - 1 & this._mask;b !== f && !e(this.array[b], b);) {
           b = 0 === b ? this._size - 1 : b - 1;
         }
       }
     };
     d.prototype.write = function(e) {
       this.array[this.index] = e;
       this.index = this.index + 1 & this._mask;
       this.index === this.start && (this.start = this.start + 1 & this._mask);
@@ -1246,288 +1252,288 @@ var START_TIME = performance.now();
     };
     return d;
   }();
   k.CircularBuffer = a;
   (function(d) {
     function e(b) {
       return b + (d.BITS_PER_WORD - 1) >> d.ADDRESS_BITS_PER_WORD << d.ADDRESS_BITS_PER_WORD;
     }
-    function b(b, p) {
+    function b(b, f) {
       b = b || "1";
-      p = p || "0";
-      for (var g = "", e = 0;e < length;e++) {
-        g += this.get(e) ? b : p;
-      }
-      return g;
+      f = f || "0";
+      for (var q = "", e = 0;e < length;e++) {
+        q += this.get(e) ? b : f;
+      }
+      return q;
     }
-    function g(b) {
-      for (var p = [], g = 0;g < length;g++) {
-        this.get(g) && p.push(b ? b[g] : g);
-      }
-      return p.join(", ");
+    function f(b) {
+      for (var f = [], q = 0;q < length;q++) {
+        this.get(q) && f.push(b ? b[q] : q);
+      }
+      return f.join(", ");
     }
     d.ADDRESS_BITS_PER_WORD = 5;
     d.BITS_PER_WORD = 1 << d.ADDRESS_BITS_PER_WORD;
     d.BIT_INDEX_MASK = d.BITS_PER_WORD - 1;
-    var p = function() {
-      function b(p) {
-        this.size = e(p);
+    var q = function() {
+      function b(f) {
+        this.size = e(f);
         this.dirty = this.count = 0;
-        this.length = p;
+        this.length = f;
         this.bits = new Uint32Array(this.size >> d.ADDRESS_BITS_PER_WORD);
       }
       b.prototype.recount = function() {
         if (this.dirty) {
-          for (var b = this.bits, p = 0, g = 0, e = b.length;g < e;g++) {
-            var d = b[g], d = d - (d >> 1 & 1431655765), d = (d & 858993459) + (d >> 2 & 858993459), p = p + (16843009 * (d + (d >> 4) & 252645135) >> 24)
-          }
-          this.count = p;
+          for (var b = this.bits, f = 0, q = 0, e = b.length;q < e;q++) {
+            var d = b[q], d = d - (d >> 1 & 1431655765), d = (d & 858993459) + (d >> 2 & 858993459), f = f + (16843009 * (d + (d >> 4) & 252645135) >> 24)
+          }
+          this.count = f;
           this.dirty = 0;
         }
       };
       b.prototype.set = function(b) {
-        var p = b >> d.ADDRESS_BITS_PER_WORD, g = this.bits[p];
-        b = g | 1 << (b & d.BIT_INDEX_MASK);
-        this.bits[p] = b;
-        this.dirty |= g ^ b;
+        var f = b >> d.ADDRESS_BITS_PER_WORD, q = this.bits[f];
+        b = q | 1 << (b & d.BIT_INDEX_MASK);
+        this.bits[f] = b;
+        this.dirty |= q ^ b;
       };
       b.prototype.setAll = function() {
-        for (var b = this.bits, p = 0, g = b.length;p < g;p++) {
-          b[p] = 4294967295;
+        for (var b = this.bits, f = 0, q = b.length;f < q;f++) {
+          b[f] = 4294967295;
         }
         this.count = this.size;
         this.dirty = 0;
       };
       b.prototype.assign = function(b) {
         this.count = b.count;
         this.dirty = b.dirty;
         this.size = b.size;
-        for (var p = 0, g = this.bits.length;p < g;p++) {
-          this.bits[p] = b.bits[p];
+        for (var f = 0, q = this.bits.length;f < q;f++) {
+          this.bits[f] = b.bits[f];
         }
       };
       b.prototype.clear = function(b) {
-        var p = b >> d.ADDRESS_BITS_PER_WORD, g = this.bits[p];
-        b = g & ~(1 << (b & d.BIT_INDEX_MASK));
-        this.bits[p] = b;
-        this.dirty |= g ^ b;
+        var f = b >> d.ADDRESS_BITS_PER_WORD, q = this.bits[f];
+        b = q & ~(1 << (b & d.BIT_INDEX_MASK));
+        this.bits[f] = b;
+        this.dirty |= q ^ b;
       };
       b.prototype.get = function(b) {
         return 0 !== (this.bits[b >> d.ADDRESS_BITS_PER_WORD] & 1 << (b & d.BIT_INDEX_MASK));
       };
       b.prototype.clearAll = function() {
-        for (var b = this.bits, p = 0, g = b.length;p < g;p++) {
-          b[p] = 0;
+        for (var b = this.bits, f = 0, q = b.length;f < q;f++) {
+          b[f] = 0;
         }
         this.dirty = this.count = 0;
       };
       b.prototype._union = function(b) {
-        var p = this.dirty, g = this.bits;
+        var f = this.dirty, q = this.bits;
         b = b.bits;
-        for (var e = 0, d = g.length;e < d;e++) {
-          var a = g[e], u = a | b[e];
-          g[e] = u;
-          p |= a ^ u;
-        }
-        this.dirty = p;
+        for (var e = 0, d = q.length;e < d;e++) {
+          var a = q[e], w = a | b[e];
+          q[e] = w;
+          f |= a ^ w;
+        }
+        this.dirty = f;
       };
       b.prototype.intersect = function(b) {
-        var p = this.dirty, g = this.bits;
+        var f = this.dirty, q = this.bits;
         b = b.bits;
-        for (var e = 0, d = g.length;e < d;e++) {
-          var a = g[e], u = a & b[e];
-          g[e] = u;
-          p |= a ^ u;
-        }
-        this.dirty = p;
+        for (var e = 0, d = q.length;e < d;e++) {
+          var a = q[e], w = a & b[e];
+          q[e] = w;
+          f |= a ^ w;
+        }
+        this.dirty = f;
       };
       b.prototype.subtract = function(b) {
-        var p = this.dirty, g = this.bits;
+        var f = this.dirty, q = this.bits;
         b = b.bits;
-        for (var e = 0, d = g.length;e < d;e++) {
-          var a = g[e], u = a & ~b[e];
-          g[e] = u;
-          p |= a ^ u;
-        }
-        this.dirty = p;
+        for (var e = 0, d = q.length;e < d;e++) {
+          var a = q[e], w = a & ~b[e];
+          q[e] = w;
+          f |= a ^ w;
+        }
+        this.dirty = f;
       };
       b.prototype.negate = function() {
-        for (var b = this.dirty, p = this.bits, g = 0, e = p.length;g < e;g++) {
-          var d = p[g], a = ~d;
-          p[g] = a;
+        for (var b = this.dirty, f = this.bits, q = 0, e = f.length;q < e;q++) {
+          var d = f[q], a = ~d;
+          f[q] = a;
           b |= d ^ a;
         }
         this.dirty = b;
       };
       b.prototype.forEach = function(b) {
-        for (var p = this.bits, g = 0, e = p.length;g < e;g++) {
-          var a = p[g];
+        for (var f = this.bits, q = 0, e = f.length;q < e;q++) {
+          var a = f[q];
           if (a) {
-            for (var u = 0;u < d.BITS_PER_WORD;u++) {
-              a & 1 << u && b(g * d.BITS_PER_WORD + u);
+            for (var w = 0;w < d.BITS_PER_WORD;w++) {
+              a & 1 << w && b(q * d.BITS_PER_WORD + w);
             }
           }
         }
       };
       b.prototype.toArray = function() {
-        for (var b = [], p = this.bits, g = 0, e = p.length;g < e;g++) {
-          var a = p[g];
+        for (var b = [], f = this.bits, q = 0, e = f.length;q < e;q++) {
+          var a = f[q];
           if (a) {
-            for (var u = 0;u < d.BITS_PER_WORD;u++) {
-              a & 1 << u && b.push(g * d.BITS_PER_WORD + u);
+            for (var w = 0;w < d.BITS_PER_WORD;w++) {
+              a & 1 << w && b.push(q * d.BITS_PER_WORD + w);
             }
           }
         }
         return b;
       };
       b.prototype.equals = function(b) {
         if (this.size !== b.size) {
           return!1;
         }
-        var p = this.bits;
+        var f = this.bits;
         b = b.bits;
-        for (var g = 0, e = p.length;g < e;g++) {
-          if (p[g] !== b[g]) {
+        for (var q = 0, e = f.length;q < e;q++) {
+          if (f[q] !== b[q]) {
             return!1;
           }
         }
         return!0;
       };
       b.prototype.contains = function(b) {
         if (this.size !== b.size) {
           return!1;
         }
-        var p = this.bits;
+        var f = this.bits;
         b = b.bits;
-        for (var g = 0, e = p.length;g < e;g++) {
-          if ((p[g] | b[g]) !== p[g]) {
+        for (var q = 0, e = f.length;q < e;q++) {
+          if ((f[q] | b[q]) !== f[q]) {
             return!1;
           }
         }
         return!0;
       };
       b.prototype.isEmpty = function() {
         this.recount();
         return 0 === this.count;
       };
       b.prototype.clone = function() {
-        var p = new b(this.length);
-        p._union(this);
-        return p;
+        var f = new b(this.length);
+        f._union(this);
+        return f;
       };
       return b;
     }();
-    d.Uint32ArrayBitSet = p;
+    d.Uint32ArrayBitSet = q;
     var a = function() {
-      function b(p) {
+      function b(f) {
         this.dirty = this.count = 0;
-        this.size = e(p);
+        this.size = e(f);
         this.bits = 0;
         this.singleWord = !0;
-        this.length = p;
+        this.length = f;
       }
       b.prototype.recount = function() {
         if (this.dirty) {
           var b = this.bits, b = b - (b >> 1 & 1431655765), b = (b & 858993459) + (b >> 2 & 858993459);
           this.count = 0 + (16843009 * (b + (b >> 4) & 252645135) >> 24);
           this.dirty = 0;
         }
       };
       b.prototype.set = function(b) {
-        var p = this.bits;
-        this.bits = b = p | 1 << (b & d.BIT_INDEX_MASK);
-        this.dirty |= p ^ b;
+        var f = this.bits;
+        this.bits = b = f | 1 << (b & d.BIT_INDEX_MASK);
+        this.dirty |= f ^ b;
       };
       b.prototype.setAll = function() {
         this.bits = 4294967295;
         this.count = this.size;
         this.dirty = 0;
       };
       b.prototype.assign = function(b) {
         this.count = b.count;
         this.dirty = b.dirty;
         this.size = b.size;
         this.bits = b.bits;
       };
       b.prototype.clear = function(b) {
-        var p = this.bits;
-        this.bits = b = p & ~(1 << (b & d.BIT_INDEX_MASK));
-        this.dirty |= p ^ b;
+        var f = this.bits;
+        this.bits = b = f & ~(1 << (b & d.BIT_INDEX_MASK));
+        this.dirty |= f ^ b;
       };
       b.prototype.get = function(b) {
         return 0 !== (this.bits & 1 << (b & d.BIT_INDEX_MASK));
       };
       b.prototype.clearAll = function() {
         this.dirty = this.count = this.bits = 0;
       };
       b.prototype._union = function(b) {
-        var p = this.bits;
-        this.bits = b = p | b.bits;
-        this.dirty = p ^ b;
+        var f = this.bits;
+        this.bits = b = f | b.bits;
+        this.dirty = f ^ b;
       };
       b.prototype.intersect = function(b) {
-        var p = this.bits;
-        this.bits = b = p & b.bits;
-        this.dirty = p ^ b;
+        var f = this.bits;
+        this.bits = b = f & b.bits;
+        this.dirty = f ^ b;
       };
       b.prototype.subtract = function(b) {
-        var p = this.bits;
-        this.bits = b = p & ~b.bits;
-        this.dirty = p ^ b;
+        var f = this.bits;
+        this.bits = b = f & ~b.bits;
+        this.dirty = f ^ b;
       };
       b.prototype.negate = function() {
-        var b = this.bits, p = ~b;
-        this.bits = p;
-        this.dirty = b ^ p;
+        var b = this.bits, f = ~b;
+        this.bits = f;
+        this.dirty = b ^ f;
       };
       b.prototype.forEach = function(b) {
-        var p = this.bits;
-        if (p) {
-          for (var g = 0;g < d.BITS_PER_WORD;g++) {
-            p & 1 << g && b(g);
+        var f = this.bits;
+        if (f) {
+          for (var q = 0;q < d.BITS_PER_WORD;q++) {
+            f & 1 << q && b(q);
           }
         }
       };
       b.prototype.toArray = function() {
-        var b = [], p = this.bits;
-        if (p) {
-          for (var g = 0;g < d.BITS_PER_WORD;g++) {
-            p & 1 << g && b.push(g);
+        var b = [], f = this.bits;
+        if (f) {
+          for (var q = 0;q < d.BITS_PER_WORD;q++) {
+            f & 1 << q && b.push(q);
           }
         }
         return b;
       };
       b.prototype.equals = function(b) {
         return this.bits === b.bits;
       };
       b.prototype.contains = function(b) {
-        var p = this.bits;
-        return(p | b.bits) === p;
+        var f = this.bits;
+        return(f | b.bits) === f;
       };
       b.prototype.isEmpty = function() {
         this.recount();
         return 0 === this.count;
       };
       b.prototype.clone = function() {
-        var p = new b(this.length);
-        p._union(this);
-        return p;
+        var f = new b(this.length);
+        f._union(this);
+        return f;
       };
       return b;
     }();
     d.Uint32BitSet = a;
-    a.prototype.toString = g;
+    a.prototype.toString = f;
     a.prototype.toBitString = b;
-    p.prototype.toString = g;
-    p.prototype.toBitString = b;
+    q.prototype.toString = f;
+    q.prototype.toBitString = b;
     d.BitSetFunctor = function(b) {
-      var g = 1 === e(b) >> d.ADDRESS_BITS_PER_WORD ? a : p;
+      var f = 1 === e(b) >> d.ADDRESS_BITS_PER_WORD ? a : q;
       return function() {
-        return new g(b);
+        return new f(b);
       };
     };
   })(k.BitSets || (k.BitSets = {}));
   a = function() {
     function d() {
     }
     d.randomStyle = function() {
       d._randomStyleCache || (d._randomStyleCache = "#ff5e3a #ff9500 #ffdb4c #87fc70 #52edc7 #1ad6fd #c644fc #ef4db6 #4a4a4a #dbddde #ff3b30 #ff9500 #ffcc00 #4cd964 #34aadc #007aff #5856d6 #ff2d55 #8e8e93 #c7c7cc #5ad427 #c86edf #d1eefc #e0f8d8 #fb2b69 #f7f7f7 #1d77ef #d6cec3 #55efcb #ff4981 #ffd3e0 #f7f7f7 #ff1300 #1f1f21 #bdbec2 #ff3a2d".split(" "));
@@ -1563,33 +1569,33 @@ var START_TIME = performance.now();
     d.Green = "#70bf53";
     d.BlueGrey = "#5e88b0";
     d._nextStyle = 0;
     d._gradient = "#FF0000 #FF1100 #FF2300 #FF3400 #FF4600 #FF5700 #FF6900 #FF7B00 #FF8C00 #FF9E00 #FFAF00 #FFC100 #FFD300 #FFE400 #FFF600 #F7FF00 #E5FF00 #D4FF00 #C2FF00 #B0FF00 #9FFF00 #8DFF00 #7CFF00 #6AFF00 #58FF00 #47FF00 #35FF00 #24FF00 #12FF00 #00FF00".split(" ");
     return d;
   }();
   k.ColorStyle = a;
   a = function() {
-    function d(e, b, g, p) {
+    function d(e, b, f, q) {
       this.xMin = e | 0;
       this.yMin = b | 0;
-      this.xMax = g | 0;
-      this.yMax = p | 0;
+      this.xMax = f | 0;
+      this.yMax = q | 0;
     }
     d.FromUntyped = function(e) {
       return new d(e.xMin, e.yMin, e.xMax, e.yMax);
     };
     d.FromRectangle = function(e) {
       return new d(20 * e.x | 0, 20 * e.y | 0, 20 * (e.x + e.width) | 0, 20 * (e.y + e.height) | 0);
     };
-    d.prototype.setElements = function(e, b, g, p) {
+    d.prototype.setElements = function(e, b, f, q) {
       this.xMin = e;
       this.yMin = b;
-      this.xMax = g;
-      this.yMax = p;
+      this.xMax = f;
+      this.yMax = q;
     };
     d.prototype.copyFrom = function(e) {
       this.setElements(e.xMin, e.yMin, e.xMax, e.yMax);
     };
     d.prototype.contains = function(e, b) {
       return e < this.xMin !== e < this.xMax && b < this.yMin !== b < this.yMax;
     };
     d.prototype.unionInPlace = function(e) {
@@ -1638,37 +1644,37 @@ var START_TIME = performance.now();
     };
     d.prototype.toString = function() {
       return "{ xMin: " + this.xMin + ", xMin: " + this.yMin + ", xMax: " + this.xMax + ", xMax: " + this.yMax + " }";
     };
     return d;
   }();
   k.Bounds = a;
   a = function() {
-    function d(e, b, g, p) {
+    function d(e, b, f, q) {
       n.assert(r(e));
       n.assert(r(b));
-      n.assert(r(g));
-      n.assert(r(p));
+      n.assert(r(f));
+      n.assert(r(q));
       this._xMin = e | 0;
       this._yMin = b | 0;
-      this._xMax = g | 0;
-      this._yMax = p | 0;
+      this._xMax = f | 0;
+      this._yMax = q | 0;
     }
     d.FromUntyped = function(e) {
       return new d(e.xMin, e.yMin, e.xMax, e.yMax);
     };
     d.FromRectangle = function(e) {
       return new d(20 * e.x | 0, 20 * e.y | 0, 20 * (e.x + e.width) | 0, 20 * (e.y + e.height) | 0);
     };
-    d.prototype.setElements = function(e, b, g, p) {
+    d.prototype.setElements = function(e, b, f, q) {
       this.xMin = e;
       this.yMin = b;
-      this.xMax = g;
-      this.yMax = p;
+      this.xMax = f;
+      this.yMax = q;
     };
     d.prototype.copyFrom = function(e) {
       this.setElements(e.xMin, e.yMin, e.xMax, e.yMax);
     };
     d.prototype.contains = function(e, b) {
       return e < this.xMin !== e < this.xMax && b < this.yMin !== b < this.yMax;
     };
     d.prototype.unionInPlace = function(e) {
@@ -1736,21 +1742,21 @@ var START_TIME = performance.now();
       return "{ xMin: " + this._xMin + ", xMin: " + this._yMin + ", xMax: " + this._xMax + ", yMax: " + this._yMax + " }";
     };
     d.prototype.assertValid = function() {
     };
     return d;
   }();
   k.DebugBounds = a;
   a = function() {
-    function d(e, b, g, p) {
+    function d(e, b, f, q) {
       this.r = e;
       this.g = b;
-      this.b = g;
-      this.a = p;
+      this.b = f;
+      this.a = q;
     }
     d.FromARGB = function(e) {
       return new d((e >> 16 & 255) / 255, (e >> 8 & 255) / 255, (e >> 0 & 255) / 255, (e >> 24 & 255) / 255);
     };
     d.FromRGBA = function(e) {
       return d.FromARGB(s.RGBAToARGB(e));
     };
     d.prototype.toRGBA = function() {
@@ -1773,44 +1779,44 @@ var START_TIME = performance.now();
     d.parseColor = function(e) {
       d.colorCache || (d.colorCache = Object.create(null));
       if (d.colorCache[e]) {
         return d.colorCache[e];
       }
       var b = document.createElement("span");
       document.body.appendChild(b);
       b.style.backgroundColor = e;
-      var g = getComputedStyle(b).backgroundColor;
+      var f = getComputedStyle(b).backgroundColor;
       document.body.removeChild(b);
-      (b = /^rgb\((\d+), (\d+), (\d+)\)$/.exec(g)) || (b = /^rgba\((\d+), (\d+), (\d+), ([\d.]+)\)$/.exec(g));
-      g = new d(0, 0, 0, 0);
-      g.r = parseFloat(b[1]) / 255;
-      g.g = parseFloat(b[2]) / 255;
-      g.b = parseFloat(b[3]) / 255;
-      g.a = b[4] ? parseFloat(b[4]) / 255 : 1;
-      return d.colorCache[e] = g;
+      (b = /^rgb\((\d+), (\d+), (\d+)\)$/.exec(f)) || (b = /^rgba\((\d+), (\d+), (\d+), ([\d.]+)\)$/.exec(f));
+      f = new d(0, 0, 0, 0);
+      f.r = parseFloat(b[1]) / 255;
+      f.g = parseFloat(b[2]) / 255;
+      f.b = parseFloat(b[3]) / 255;
+      f.a = b[4] ? parseFloat(b[4]) / 255 : 1;
+      return d.colorCache[e] = f;
     };
     d.Red = new d(1, 0, 0, 1);
     d.Green = new d(0, 1, 0, 1);
     d.Blue = new d(0, 0, 1, 1);
     d.None = new d(0, 0, 0, 0);
     d.White = new d(1, 1, 1, 1);
     d.Black = new d(0, 0, 0, 1);
     d.colorCache = {};
     return d;
   }();
   k.Color = a;
   var s;
   (function(d) {
     function e(b) {
-      var g, e, d = b >> 24 & 255;
+      var f, e, d = b >> 24 & 255;
       e = (Math.imul(b >> 16 & 255, d) + 127) / 255 | 0;
-      g = (Math.imul(b >> 8 & 255, d) + 127) / 255 | 0;
+      f = (Math.imul(b >> 8 & 255, d) + 127) / 255 | 0;
       b = (Math.imul(b >> 0 & 255, d) + 127) / 255 | 0;
-      return d << 24 | e << 16 | g << 8 | b;
+      return d << 24 | e << 16 | f << 8 | b;
     }
     d.RGBAToARGB = function(b) {
       return b >> 8 & 16777215 | (b & 255) << 24;
     };
     d.ARGBToRGBA = function(b) {
       return b << 8 | b >> 24 & 255;
     };
     d.rgbaToCSSStyle = function(b) {
@@ -1836,142 +1842,142 @@ var START_TIME = performance.now();
     };
     d.isValidHexColor = function(b) {
       return/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(b);
     };
     d.clampByte = function(b) {
       return Math.max(0, Math.min(255, b));
     };
     d.unpremultiplyARGB = function(b) {
-      var g, e, d = b >> 24 & 255;
+      var f, e, d = b >> 24 & 255;
       e = Math.imul(255, b >> 16 & 255) / d & 255;
-      g = Math.imul(255, b >> 8 & 255) / d & 255;
+      f = Math.imul(255, b >> 8 & 255) / d & 255;
       b = Math.imul(255, b >> 0 & 255) / d & 255;
-      return d << 24 | e << 16 | g << 8 | b;
+      return d << 24 | e << 16 | f << 8 | b;
     };
     d.premultiplyARGB = e;
     var b;
     d.ensureUnpremultiplyTable = function() {
       if (!b) {
         b = new Uint8Array(65536);
-        for (var p = 0;256 > p;p++) {
-          for (var g = 0;256 > g;g++) {
-            b[(g << 8) + p] = Math.imul(255, p) / g;
-          }
-        }
-      }
-    };
-    d.tableLookupUnpremultiplyARGB = function(p) {
-      p |= 0;
-      var g = p >> 24 & 255;
-      if (0 === g) {
+        for (var f = 0;256 > f;f++) {
+          for (var e = 0;256 > e;e++) {
+            b[(e << 8) + f] = Math.imul(255, f) / e;
+          }
+        }
+      }
+    };
+    d.tableLookupUnpremultiplyARGB = function(f) {
+      f |= 0;
+      var e = f >> 24 & 255;
+      if (0 === e) {
         return 0;
       }
-      if (255 === g) {
-        return p;
-      }
-      var e, d, a = g << 8, h = b;
-      d = h[a + (p >> 16 & 255)];
-      e = h[a + (p >> 8 & 255)];
-      p = h[a + (p >> 0 & 255)];
-      return g << 24 | d << 16 | e << 8 | p;
-    };
-    d.blendPremultipliedBGRA = function(b, g) {
+      if (255 === e) {
+        return f;
+      }
+      var d, a, h = e << 8, p = b;
+      a = p[h + (f >> 16 & 255)];
+      d = p[h + (f >> 8 & 255)];
+      f = p[h + (f >> 0 & 255)];
+      return e << 24 | a << 16 | d << 8 | f;
+    };
+    d.blendPremultipliedBGRA = function(b, f) {
       var e, d;
-      d = 256 - (g & 255);
+      d = 256 - (f & 255);
       e = Math.imul(b & 16711935, d) >> 8;
       d = Math.imul(b >> 8 & 16711935, d) >> 8;
-      return((g >> 8 & 16711935) + d & 16711935) << 8 | (g & 16711935) + e & 16711935;
-    };
-    var g = v.swap32;
-    d.convertImage = function(p, d, a, h) {
-      var q = a.length;
-      if (p === d) {
+      return((f >> 8 & 16711935) + d & 16711935) << 8 | (f & 16711935) + e & 16711935;
+    };
+    var f = u.swap32;
+    d.convertImage = function(q, d, a, h) {
+      var p = a.length;
+      if (q === d) {
         if (a !== h) {
-          for (p = 0;p < q;p++) {
-            h[p] = a[p];
+          for (q = 0;q < p;q++) {
+            h[q] = a[q];
           }
         }
       } else {
-        if (1 === p && 3 === d) {
-          for (k.ColorUtilities.ensureUnpremultiplyTable(), p = 0;p < q;p++) {
-            var m = a[p];
+        if (1 === q && 3 === d) {
+          for (k.ColorUtilities.ensureUnpremultiplyTable(), q = 0;q < p;q++) {
+            var m = a[q];
             d = m & 255;
             if (0 === d) {
-              h[p] = 0;
+              h[q] = 0;
             } else {
               if (255 === d) {
-                h[p] = 4278190080 | m >> 8 & 16777215;
+                h[q] = 4278190080 | m >> 8 & 16777215;
               } else {
-                var c = m >> 24 & 255, l = m >> 16 & 255, m = m >> 8 & 255, s = d << 8, v = b, m = v[s + m], l = v[s + l], c = v[s + c];
-                h[p] = d << 24 | c << 16 | l << 8 | m;
+                var l = m >> 24 & 255, c = m >> 16 & 255, m = m >> 8 & 255, s = d << 8, u = b, m = u[s + m], c = u[s + c], l = u[s + l];
+                h[q] = d << 24 | l << 16 | c << 8 | m;
               }
             }
           }
         } else {
-          if (2 === p && 3 === d) {
-            for (p = 0;p < q;p++) {
-              h[p] = g(a[p]);
+          if (2 === q && 3 === d) {
+            for (q = 0;q < p;q++) {
+              h[q] = f(a[q]);
             }
           } else {
-            if (3 === p && 1 === d) {
-              for (p = 0;p < q;p++) {
-                d = a[p], h[p] = g(e(d & 4278255360 | d >> 16 & 255 | (d & 255) << 16));
+            if (3 === q && 1 === d) {
+              for (q = 0;q < p;q++) {
+                d = a[q], h[q] = f(e(d & 4278255360 | d >> 16 & 255 | (d & 255) << 16));
               }
             } else {
-              for (n.somewhatImplemented("Image Format Conversion: " + w[p] + " -> " + w[d]), p = 0;p < q;p++) {
-                h[p] = a[p];
+              for (n.somewhatImplemented("Image Format Conversion: " + v[q] + " -> " + v[d]), q = 0;q < p;q++) {
+                h[q] = a[q];
               }
             }
           }
         }
       }
     };
   })(s = k.ColorUtilities || (k.ColorUtilities = {}));
   a = function() {
     function d(e) {
       void 0 === e && (e = 32);
       this._list = [];
       this._maxSize = e;
     }
     d.prototype.acquire = function(e) {
       if (d._enabled) {
-        for (var b = this._list, g = 0;g < b.length;g++) {
-          var p = b[g];
-          if (p.byteLength >= e) {
-            return b.splice(g, 1), p;
+        for (var b = this._list, f = 0;f < b.length;f++) {
+          var q = b[f];
+          if (q.byteLength >= e) {
+            return b.splice(f, 1), q;
           }
         }
       }
       return new ArrayBuffer(e);
     };
     d.prototype.release = function(e) {
       if (d._enabled) {
         var b = this._list;
         b.length === this._maxSize && b.shift();
         b.push(e);
       }
     };
     d.prototype.ensureUint8ArrayLength = function(e, b) {
       if (e.length >= b) {
         return e;
       }
-      var g = Math.max(e.length + b, (3 * e.length >> 1) + 1), g = new Uint8Array(this.acquire(g), 0, g);
-      g.set(e);
+      var f = Math.max(e.length + b, (3 * e.length >> 1) + 1), f = new Uint8Array(this.acquire(f), 0, f);
+      f.set(e);
       this.release(e.buffer);
-      return g;
+      return f;
     };
     d.prototype.ensureFloat64ArrayLength = function(e, b) {
       if (e.length >= b) {
         return e;
       }
-      var g = Math.max(e.length + b, (3 * e.length >> 1) + 1), g = new Float64Array(this.acquire(g * Float64Array.BYTES_PER_ELEMENT), 0, g);
-      g.set(e);
+      var f = Math.max(e.length + b, (3 * e.length >> 1) + 1), f = new Float64Array(this.acquire(f * Float64Array.BYTES_PER_ELEMENT), 0, f);
+      f.set(e);
       this.release(e.buffer);
-      return g;
+      return f;
     };
     d._enabled = !0;
     return d;
   }();
   k.ArrayBufferPool = a;
   (function(d) {
     (function(e) {
       e[e.EXTERNAL_INTERFACE_FEATURE = 1] = "EXTERNAL_INTERFACE_FEATURE";
@@ -1996,21 +2002,21 @@ var START_TIME = performance.now();
     d[d.PlayerglobalManifest = 2] = "PlayerglobalManifest";
     d[d.ShellAbc = 3] = "ShellAbc";
   })(k.SystemResourceId || (k.SystemResourceId = {}));
   (function(d) {
     d.instance;
   })(k.SystemResourcesLoadingService || (k.SystemResourcesLoadingService = {}));
   k.registerCSSFont = function(d, e, b) {
     if (inBrowser) {
-      var g = document.head;
-      g.insertBefore(document.createElement("style"), g.firstChild);
-      g = document.styleSheets[0];
+      var f = document.head;
+      f.insertBefore(document.createElement("style"), f.firstChild);
+      f = document.styleSheets[0];
       e = "@font-face{font-family:swffont" + d + ";src:url(data:font/opentype;base64," + k.StringUtilities.base64ArrayBuffer(e) + ")}";
-      g.insertRule(e, g.cssRules.length);
+      f.insertRule(e, f.cssRules.length);
       b && (b = document.createElement("div"), b.style.fontFamily = "swffont" + d, b.innerHTML = "hello", document.body.appendChild(b), document.body.removeChild(b));
     }
   };
   (function(d) {
     d.instance = {enabled:!1, initJS:function(e) {
     }, registerCallback:function(e) {
     }, unregisterCallback:function(e) {
     }, eval:function(e) {
@@ -2025,67 +2031,67 @@ var START_TIME = performance.now();
   })(k.ClipboardService || (k.ClipboardService = {}));
   a = function() {
     function d() {
       this._queues = {};
     }
     d.prototype.register = function(e, b) {
       n.assert(e);
       n.assert(b);
-      var g = this._queues[e];
-      if (g) {
-        if (-1 < g.indexOf(b)) {
+      var f = this._queues[e];
+      if (f) {
+        if (-1 < f.indexOf(b)) {
           return;
         }
       } else {
-        g = this._queues[e] = [];
-      }
-      g.push(b);
+        f = this._queues[e] = [];
+      }
+      f.push(b);
     };
     d.prototype.unregister = function(e, b) {
       n.assert(e);
       n.assert(b);
-      var g = this._queues[e];
-      if (g) {
-        var p = g.indexOf(b);
-        -1 !== p && g.splice(p, 1);
-        0 === g.length && (this._queues[e] = null);
+      var f = this._queues[e];
+      if (f) {
+        var q = f.indexOf(b);
+        -1 !== q && f.splice(q, 1);
+        0 === f.length && (this._queues[e] = null);
       }
     };
     d.prototype.notify = function(e, b) {
-      var g = this._queues[e];
-      if (g) {
-        g = g.slice();
+      var f = this._queues[e];
+      if (f) {
+        f = f.slice();
         b = Array.prototype.slice.call(arguments, 0);
-        for (var p = 0;p < g.length;p++) {
-          g[p].apply(null, b);
+        for (var q = 0;q < f.length;q++) {
+          f[q].apply(null, b);
         }
       }
     };
     d.prototype.notify1 = function(e, b) {
-      var g = this._queues[e];
-      if (g) {
-        for (var g = g.slice(), p = 0;p < g.length;p++) {
-          (0,g[p])(e, b);
+      var f = this._queues[e];
+      if (f) {
+        for (var f = f.slice(), q = 0;q < f.length;q++) {
+          (0,f[q])(e, b);
         }
       }
     };
     return d;
   }();
   k.Callback = a;
   (function(d) {
     d[d.None = 0] = "None";
     d[d.PremultipliedAlphaARGB = 1] = "PremultipliedAlphaARGB";
     d[d.StraightAlphaARGB = 2] = "StraightAlphaARGB";
     d[d.StraightAlphaRGBA = 3] = "StraightAlphaRGBA";
     d[d.JPEG = 4] = "JPEG";
     d[d.PNG = 5] = "PNG";
     d[d.GIF = 6] = "GIF";
   })(k.ImageType || (k.ImageType = {}));
-  var w = k.ImageType;
+  var v = k.ImageType;
   k.getMIMETypeForImageType = function(d) {
     switch(d) {
       case 4:
         return "image/jpeg";
       case 5:
         return "image/png";
       case 6:
         return "image/gif";
@@ -2123,226 +2129,226 @@ var START_TIME = performance.now();
   }();
   k.PromiseWrapper = a;
 })(Shumway || (Shumway = {}));
 (function() {
   function k(b) {
     if ("function" !== typeof b) {
       throw new TypeError("Invalid deferred constructor");
     }
-    var g = s();
-    b = new b(g);
-    var e = g.resolve;
+    var f = s();
+    b = new b(f);
+    var e = f.resolve;
     if ("function" !== typeof e) {
       throw new TypeError("Invalid resolve construction function");
     }
-    g = g.reject;
-    if ("function" !== typeof g) {
+    f = f.reject;
+    if ("function" !== typeof f) {
       throw new TypeError("Invalid reject construction function");
     }
-    return{promise:b, resolve:e, reject:g};
+    return{promise:b, resolve:e, reject:f};
   }
-  function r(b, g) {
+  function r(b, f) {
     if ("object" !== typeof b || null === b) {
       return!1;
     }
     try {
       var e = b.then;
       if ("function" !== typeof e) {
         return!1;
       }
-      e.call(b, g.resolve, g.reject);
+      e.call(b, f.resolve, f.reject);
     } catch (d) {
-      e = g.reject, e(d);
+      e = f.reject, e(d);
     }
     return!0;
   }
-  function f(b) {
+  function g(b) {
     return "object" === typeof b && null !== b && "undefined" !== typeof b.promiseStatus;
   }
-  function c(b, g) {
+  function c(b, f) {
     if ("unresolved" === b.promiseStatus) {
       var e = b.rejectReactions;
-      b.result = g;
+      b.result = f;
       b.resolveReactions = void 0;
       b.rejectReactions = void 0;
       b.promiseStatus = "has-rejection";
-      t(e, g);
+      t(e, f);
     }
   }
-  function t(b, g) {
+  function t(b, f) {
     for (var e = 0;e < b.length;e++) {
-      n({reaction:b[e], argument:g});
+      n({reaction:b[e], argument:f});
     }
   }
   function n(b) {
-    0 === g.length && setTimeout(h, 0);
-    g.push(b);
+    0 === f.length && setTimeout(h, 0);
+    f.push(b);
   }
-  function a(b, g) {
+  function a(b, f) {
     var e = b.deferred, d = b.handler, a, h;
     try {
-      a = d(g);
-    } catch (q) {
-      return e = e.reject, e(q);
+      a = d(f);
+    } catch (p) {
+      return e = e.reject, e(p);
     }
     if (a === e.promise) {
       return e = e.reject, e(new TypeError("Self resolution"));
     }
     try {
       if (h = r(a, e), !h) {
         var m = e.resolve;
         return m(a);
       }
-    } catch (c) {
-      return e = e.reject, e(c);
+    } catch (l) {
+      return e = e.reject, e(l);
     }
   }
   function h() {
-    for (;0 < g.length;) {
-      var b = g[0];
+    for (;0 < f.length;) {
+      var b = f[0];
       try {
         a(b.reaction, b.argument);
       } catch (d) {
         if ("function" === typeof e.onerror) {
           e.onerror(d);
         }
       }
-      g.shift();
+      f.shift();
     }
   }
-  function q(b) {
+  function p(b) {
     throw b;
   }
   function l(b) {
     return b;
   }
-  function v(b) {
-    return function(g) {
-      c(b, g);
+  function u(b) {
+    return function(f) {
+      c(b, f);
     };
   }
   function m(b) {
-    return function(g) {
+    return function(f) {
       if ("unresolved" === b.promiseStatus) {
         var e = b.resolveReactions;
-        b.result = g;
+        b.result = f;
         b.resolveReactions = void 0;
         b.rejectReactions = void 0;
         b.promiseStatus = "has-resolution";
-        t(e, g);
+        t(e, f);
       }
     };
   }
   function s() {
-    function b(g, e) {
-      b.resolve = g;
+    function b(f, e) {
+      b.resolve = f;
       b.reject = e;
     }
     return b;
   }
-  function w(b, g, e) {
+  function v(b, f, e) {
     return function(d) {
       if (d === b) {
         return e(new TypeError("Self resolution"));
       }
       var a = b.promiseConstructor;
-      if (f(d) && d.promiseConstructor === a) {
-        return d.then(g, e);
+      if (g(d) && d.promiseConstructor === a) {
+        return d.then(f, e);
       }
       a = k(a);
-      return r(d, a) ? a.promise.then(g, e) : g(d);
+      return r(d, a) ? a.promise.then(f, e) : f(d);
     };
   }
-  function d(b, g, e, d) {
+  function d(b, f, e, d) {
     return function(a) {
-      g[b] = a;
+      f[b] = a;
       d.countdown--;
-      0 === d.countdown && e.resolve(g);
+      0 === d.countdown && e.resolve(f);
     };
   }
   function e(b) {
     if ("function" !== typeof b) {
       throw new TypeError("resolver is not a function");
     }
     if ("object" !== typeof this) {
       throw new TypeError("Promise to initialize is not an object");
     }
     this.promiseStatus = "unresolved";
     this.resolveReactions = [];
     this.rejectReactions = [];
     this.result = void 0;
-    var g = m(this), d = v(this);
+    var f = m(this), d = u(this);
     try {
-      b(g, d);
+      b(f, d);
     } catch (a) {
       c(this, a);
     }
     this.promiseConstructor = e;
     return this;
   }
   var b = Function("return this")();
   if (b.Promise) {
-    "function" !== typeof b.Promise.all && (b.Promise.all = function(g) {
-      var e = 0, d = [], a, h, q = new b.Promise(function(b, g) {
+    "function" !== typeof b.Promise.all && (b.Promise.all = function(f) {
+      var e = 0, d = [], a, h, p = new b.Promise(function(b, f) {
         a = b;
-        h = g;
+        h = f;
       });
-      g.forEach(function(b, g) {
+      f.forEach(function(b, f) {
         e++;
         b.then(function(b) {
-          d[g] = b;
+          d[f] = b;
           e--;
           0 === e && a(d);
         }, h);
       });
       0 === e && a(d);
-      return q;
-    }), "function" !== typeof b.Promise.resolve && (b.Promise.resolve = function(g) {
+      return p;
+    }), "function" !== typeof b.Promise.resolve && (b.Promise.resolve = function(f) {
       return new b.Promise(function(b) {
-        b(g);
+        b(f);
       });
     });
   } else {
-    var g = [];
+    var f = [];
     e.all = function(b) {
-      var g = k(this), e = [], a = {countdown:0}, h = 0;
+      var f = k(this), e = [], a = {countdown:0}, h = 0;
       b.forEach(function(b) {
-        this.cast(b).then(d(h, e, g, a), g.reject);
+        this.cast(b).then(d(h, e, f, a), f.reject);
         h++;
         a.countdown++;
       }, this);
-      0 === h && g.resolve(e);
-      return g.promise;
+      0 === h && f.resolve(e);
+      return f.promise;
     };
     e.cast = function(b) {
-      if (f(b)) {
+      if (g(b)) {
         return b;
       }
-      var g = k(this);
-      g.resolve(b);
-      return g.promise;
+      var f = k(this);
+      f.resolve(b);
+      return f.promise;
     };
     e.reject = function(b) {
-      var g = k(this);
-      g.reject(b);
-      return g.promise;
+      var f = k(this);
+      f.reject(b);
+      return f.promise;
     };
     e.resolve = function(b) {
-      var g = k(this);
-      g.resolve(b);
-      return g.promise;
+      var f = k(this);
+      f.resolve(b);
+      return f.promise;
     };
     e.prototype = {"catch":function(b) {
       this.then(void 0, b);
-    }, then:function(b, g) {
-      if (!f(this)) {
+    }, then:function(b, f) {
+      if (!g(this)) {
         throw new TypeError("this is not a Promises");
       }
-      var e = k(this.promiseConstructor), d = "function" === typeof g ? g : q, a = {deferred:e, handler:w(this, "function" === typeof b ? b : l, d)}, d = {deferred:e, handler:d};
+      var e = k(this.promiseConstructor), d = "function" === typeof f ? f : p, a = {deferred:e, handler:v(this, "function" === typeof b ? b : l, d)}, d = {deferred:e, handler:d};
       switch(this.promiseStatus) {
         case "unresolved":
           this.resolveReactions.push(a);
           this.rejectReactions.push(d);
           break;
         case "has-resolution":
           n({reaction:a, argument:this.result});
           break;
@@ -2351,151 +2357,151 @@ var START_TIME = performance.now();
       }
       return e.promise;
     }};
     b.Promise = e;
   }
 })();
 "undefined" !== typeof exports && (exports.Shumway = Shumway);
 (function() {
-  function k(k, f, c) {
-    k[f] || Object.defineProperty(k, f, {value:c, writable:!0, configurable:!0, enumerable:!1});
+  function k(k, g, c) {
+    k[g] || Object.defineProperty(k, g, {value:c, writable:!0, configurable:!0, enumerable:!1});
   }
-  k(String.prototype, "padRight", function(k, f) {
+  k(String.prototype, "padRight", function(k, g) {
     var c = this, t = c.replace(/\033\[[0-9]*m/g, "").length;
-    if (!k || t >= f) {
+    if (!k || t >= g) {
       return c;
     }
-    for (var t = (f - t) / k.length, n = 0;n < t;n++) {
+    for (var t = (g - t) / k.length, n = 0;n < t;n++) {
       c += k;
     }
     return c;
   });
-  k(String.prototype, "padLeft", function(k, f) {
+  k(String.prototype, "padLeft", function(k, g) {
     var c = this, t = c.length;
-    if (!k || t >= f) {
+    if (!k || t >= g) {
       return c;
     }
-    for (var t = (f - t) / k.length, n = 0;n < t;n++) {
+    for (var t = (g - t) / k.length, n = 0;n < t;n++) {
       c = k + c;
     }
     return c;
   });
   k(String.prototype, "trim", function() {
     return this.replace(/^\s+|\s+$/g, "");
   });
   k(String.prototype, "endsWith", function(k) {
     return-1 !== this.indexOf(k, this.length - k.length);
   });
-  k(Array.prototype, "replace", function(k, f) {
-    if (k === f) {
+  k(Array.prototype, "replace", function(k, g) {
+    if (k === g) {
       return 0;
     }
     for (var c = 0, t = 0;t < this.length;t++) {
-      this[t] === k && (this[t] = f, c++);
+      this[t] === k && (this[t] = g, c++);
     }
     return c;
   });
 })();
 (function(k) {
   (function(r) {
-    var f = k.isObject, c = function() {
-      function a(a, q, c, n) {
+    var g = k.isObject, c = function() {
+      function a(a, p, l, c) {
         this.shortName = a;
-        this.longName = q;
-        this.type = c;
-        n = n || {};
-        this.positional = n.positional;
-        this.parseFn = n.parse;
-        this.value = n.defaultValue;
+        this.longName = p;
+        this.type = l;
+        c = c || {};
+        this.positional = c.positional;
+        this.parseFn = c.parse;
+        this.value = c.defaultValue;
       }
       a.prototype.parse = function(a) {
         this.value = "boolean" === this.type ? a : "number" === this.type ? parseInt(a, 10) : a;
         this.parseFn && this.parseFn(this.value);
       };
       return a;
     }();
     r.Argument = c;
     var t = function() {
       function a() {
         this.args = [];
       }
-      a.prototype.addArgument = function(a, q, l, n) {
-        a = new c(a, q, l, n);
+      a.prototype.addArgument = function(a, p, l, n) {
+        a = new c(a, p, l, n);
         this.args.push(a);
         return a;
       };
       a.prototype.addBoundOption = function(a) {
-        this.args.push(new c(a.shortName, a.longName, a.type, {parse:function(q) {
-          a.value = q;
+        this.args.push(new c(a.shortName, a.longName, a.type, {parse:function(p) {
+          a.value = p;
         }}));
       };
       a.prototype.addBoundOptionSet = function(a) {
-        var q = this;
+        var p = this;
         a.options.forEach(function(a) {
-          a instanceof n ? q.addBoundOptionSet(a) : q.addBoundOption(a);
+          a instanceof n ? p.addBoundOptionSet(a) : p.addBoundOption(a);
         });
       };
       a.prototype.getUsage = function() {
         var a = "";
-        this.args.forEach(function(q) {
-          a = q.positional ? a + q.longName : a + ("[-" + q.shortName + "|--" + q.longName + ("boolean" === q.type ? "" : " " + q.type[0].toUpperCase()) + "]");
+        this.args.forEach(function(p) {
+          a = p.positional ? a + p.longName : a + ("[-" + p.shortName + "|--" + p.longName + ("boolean" === p.type ? "" : " " + p.type[0].toUpperCase()) + "]");
           a += " ";
         });
         return a;
       };
       a.prototype.parse = function(a) {
-        var q = {}, c = [];
+        var p = {}, l = [];
         this.args.forEach(function(d) {
-          d.positional ? c.push(d) : (q["-" + d.shortName] = d, q["--" + d.longName] = d);
+          d.positional ? l.push(d) : (p["-" + d.shortName] = d, p["--" + d.longName] = d);
         });
-        for (var n = [];a.length;) {
-          var m = a.shift(), s = null, w = m;
+        for (var c = [];a.length;) {
+          var m = a.shift(), n = null, v = m;
           if ("--" == m) {
-            n = n.concat(a);
+            c = c.concat(a);
             break;
           } else {
             if ("-" == m.slice(0, 1) || "--" == m.slice(0, 2)) {
-              s = q[m];
-              if (!s) {
+              n = p[m];
+              if (!n) {
                 continue;
               }
-              w = "boolean" !== s.type ? a.shift() : !0;
+              v = "boolean" !== n.type ? a.shift() : !0;
             } else {
-              c.length ? s = c.shift() : n.push(w);
-            }
-          }
-          s && s.parse(w);
-        }
-        return n;
+              l.length ? n = l.shift() : c.push(v);
+            }
+          }
+          n && n.parse(v);
+        }
+        return c;
       };
       return a;
     }();
     r.ArgumentParser = t;
     var n = function() {
-      function a(a, q) {
-        void 0 === q && (q = null);
+      function a(a, p) {
+        void 0 === p && (p = null);
         this.open = !1;
         this.name = a;
-        this.settings = q || {};
+        this.settings = p || {};
         this.options = [];
       }
       a.prototype.register = function(h) {
         if (h instanceof a) {
-          for (var q = 0;q < this.options.length;q++) {
-            var c = this.options[q];
+          for (var p = 0;p < this.options.length;p++) {
+            var c = this.options[p];
             if (c instanceof a && c.name === h.name) {
               return c;
             }
           }
         }
         this.options.push(h);
         if (this.settings) {
           if (h instanceof a) {
-            q = this.settings[h.name], f(q) && (h.settings = q.settings, h.open = q.open);
+            p = this.settings[h.name], g(p) && (h.settings = p.settings, h.open = p.open);
           } else {
             if ("undefined" !== typeof this.settings[h.longName]) {
               switch(h.type) {
                 case "boolean":
                   h.value = !!this.settings[h.longName];
                   break;
                 case "number":
                   h.value = +this.settings[h.longName];
@@ -2505,40 +2511,40 @@ var START_TIME = performance.now();
               }
             }
           }
         }
         return h;
       };
       a.prototype.trace = function(a) {
         a.enter(this.name + " {");
-        this.options.forEach(function(q) {
-          q.trace(a);
+        this.options.forEach(function(p) {
+          p.trace(a);
         });
         a.leave("}");
       };
       a.prototype.getSettings = function() {
         var h = {};
-        this.options.forEach(function(q) {
-          q instanceof a ? h[q.name] = {settings:q.getSettings(), open:q.open} : h[q.longName] = q.value;
+        this.options.forEach(function(p) {
+          p instanceof a ? h[p.name] = {settings:p.getSettings(), open:p.open} : h[p.longName] = p.value;
         });
         return h;
       };
       a.prototype.setSettings = function(h) {
-        h && this.options.forEach(function(q) {
-          q instanceof a ? q.name in h && q.setSettings(h[q.name].settings) : q.longName in h && (q.value = h[q.longName]);
+        h && this.options.forEach(function(p) {
+          p instanceof a ? p.name in h && p.setSettings(h[p.name].settings) : p.longName in h && (p.value = h[p.longName]);
         });
       };
       return a;
     }();
     r.OptionSet = n;
     t = function() {
-      function a(a, q, c, n, m, s) {
+      function a(a, p, c, n, m, s) {
         void 0 === s && (s = null);
-        this.longName = q;
+        this.longName = p;
         this.shortName = a;
         this.type = c;
         this.value = this.defaultValue = n;
         this.description = m;
         this.config = s;
       }
       a.prototype.parse = function(a) {
         this.value = a;
@@ -2548,84 +2554,55 @@ var START_TIME = performance.now();
       };
       return a;
     }();
     r.Option = t;
   })(k.Options || (k.Options = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    function f() {
-      try {
-        return "undefined" !== typeof window && "localStorage" in window && null !== window.localStorage;
-      } catch (c) {
-        return!1;
-      }
-    }
     r.ROOT = "Shumway Options";
     r.shumwayOptions = new k.Options.OptionSet(r.ROOT);
-    r.isStorageSupported = f;
-    r.load = function(c) {
-      void 0 === c && (c = r.ROOT);
-      var k = {};
-      if (f() && (c = window.localStorage[c])) {
-        try {
-          k = JSON.parse(c);
-        } catch (n) {
-        }
-      }
-      return k;
-    };
-    r.save = function(c, k) {
-      void 0 === c && (c = null);
-      void 0 === k && (k = r.ROOT);
-      if (f()) {
-        try {
-          window.localStorage[k] = JSON.stringify(c ? c : r.shumwayOptions.getSettings());
-        } catch (n) {
-        }
-      }
-    };
-    r.setSettings = function(c) {
-      r.shumwayOptions.setSettings(c);
-    };
-    r.getSettings = function(c) {
+    r.setSettings = function(g) {
+      r.shumwayOptions.setSettings(g);
+    };
+    r.getSettings = function() {
       return r.shumwayOptions.getSettings();
     };
   })(k.Settings || (k.Settings = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    var f = function() {
+    var g = function() {
       function c(c, n) {
         this._parent = c;
         this._timers = k.ObjectUtilities.createMap();
         this._name = n;
         this._count = this._total = this._last = this._begin = 0;
       }
-      c.time = function(f, n) {
-        c.start(f);
+      c.time = function(g, n) {
+        c.start(g);
         n();
         c.stop();
       };
-      c.start = function(f) {
-        c._top = c._top._timers[f] || (c._top._timers[f] = new c(c._top, f));
+      c.start = function(g) {
+        c._top = c._top._timers[g] || (c._top._timers[g] = new c(c._top, g));
         c._top.start();
-        f = c._flat._timers[f] || (c._flat._timers[f] = new c(c._flat, f));
-        f.start();
-        c._flatStack.push(f);
+        g = c._flat._timers[g] || (c._flat._timers[g] = new c(c._flat, g));
+        g.start();
+        c._flatStack.push(g);
       };
       c.stop = function() {
         c._top.stop();
         c._top = c._top._parent;
         c._flatStack.pop().stop();
       };
-      c.stopStart = function(f) {
+      c.stopStart = function(g) {
         c.stop();
-        c.start(f);
+        c.start(g);
       };
       c.prototype.start = function() {
         this._begin = k.getTicks();
       };
       c.prototype.stop = function() {
         this._last = k.getTicks() - this._begin;
         this._total += this._last;
         this._count += 1;
@@ -2635,28 +2612,28 @@ var START_TIME = performance.now();
       };
       c.prototype.trace = function(c) {
         c.enter(this._name + ": " + this._total.toFixed(2) + " ms, count: " + this._count + ", average: " + (this._total / this._count).toFixed(2) + " ms");
         for (var n in this._timers) {
           this._timers[n].trace(c);
         }
         c.outdent();
       };
-      c.trace = function(f) {
-        c._base.trace(f);
-        c._flat.trace(f);
+      c.trace = function(g) {
+        c._base.trace(g);
+        c._flat.trace(g);
       };
       c._base = new c(null, "Total");
       c._top = c._base;
       c._flat = new c(null, "Flat");
       c._flatStack = [];
       return c;
     }();
-    r.Timer = f;
-    f = function() {
+    r.Timer = g;
+    g = function() {
       function c(c) {
         this._enabled = c;
         this.clear();
       }
       Object.defineProperty(c.prototype, "counts", {get:function() {
         return this._counts;
       }, enumerable:!0, configurable:!0});
       c.prototype.setEnabled = function(c) {
@@ -2677,52 +2654,52 @@ var START_TIME = performance.now();
         }
       };
       c.prototype.trace = function(c) {
         for (var n in this._counts) {
           c.writeLn(n + ": " + this._counts[n]);
         }
       };
       c.prototype._pairToString = function(c, n) {
-        var a = n[0], h = n[1], q = c[a], a = a + ": " + h;
-        q && (a += ", " + q.toFixed(4), 1 < h && (a += " (" + (q / h).toFixed(4) + ")"));
+        var a = n[0], h = n[1], p = c[a], a = a + ": " + h;
+        p && (a += ", " + p.toFixed(4), 1 < h && (a += " (" + (p / h).toFixed(4) + ")"));
         return a;
       };
       c.prototype.toStringSorted = function() {
         var c = this, n = this._times, a = [], h;
         for (h in this._counts) {
           a.push([h, this._counts[h]]);
         }
         a.sort(function(a, h) {
           return h[1] - a[1];
         });
         return a.map(function(a) {
           return c._pairToString(n, a);
         }).join(", ");
       };
       c.prototype.traceSorted = function(c, n) {
         void 0 === n && (n = !1);
-        var a = this, h = this._times, q = [], l;
+        var a = this, h = this._times, p = [], l;
         for (l in this._counts) {
-          q.push([l, this._counts[l]]);
-        }
-        q.sort(function(a, h) {
+          p.push([l, this._counts[l]]);
+        }
+        p.sort(function(a, h) {
           return h[1] - a[1];
         });
-        n ? c.writeLn(q.map(function(q) {
-          return a._pairToString(h, q);
-        }).join(", ")) : q.forEach(function(q) {
-          c.writeLn(a._pairToString(h, q));
+        n ? c.writeLn(p.map(function(p) {
+          return a._pairToString(h, p);
+        }).join(", ")) : p.forEach(function(p) {
+          c.writeLn(a._pairToString(h, p));
         });
       };
       c.instance = new c(!0);
       return c;
     }();
-    r.Counter = f;
-    f = function() {
+    r.Counter = g;
+    g = function() {
       function c(c) {
         this._samples = new Float64Array(c);
         this._index = this._count = 0;
       }
       c.prototype.push = function(c) {
         this._count < this._samples.length && this._count++;
         this._index++;
         this._samples[this._index % this._samples.length] = c;
@@ -2730,49 +2707,49 @@ var START_TIME = performance.now();
       c.prototype.average = function() {
         for (var c = 0, n = 0;n < this._count;n++) {
           c += this._samples[n];
         }
         return c / this._count;
       };
       return c;
     }();
-    r.Average = f;
+    r.Average = g;
   })(k.Metrics || (k.Metrics = {}));
 })(Shumway || (Shumway = {}));
 var __extends = this.__extends || function(k, r) {
-  function f() {
+  function g() {
     this.constructor = k;
   }
   for (var c in r) {
     r.hasOwnProperty(c) && (k[c] = r[c]);
   }
-  f.prototype = r.prototype;
-  k.prototype = new f;
+  g.prototype = r.prototype;
+  k.prototype = new g;
 };
 (function(k) {
   (function(k) {
-    function f(b) {
-      for (var g = Math.max.apply(null, b), p = b.length, e = 1 << g, d = new Uint32Array(e), a = g << 16 | 65535, h = 0;h < e;h++) {
+    function g(b) {
+      for (var f = Math.max.apply(null, b), q = b.length, e = 1 << f, d = new Uint32Array(e), a = f << 16 | 65535, h = 0;h < e;h++) {
         d[h] = a;
       }
-      for (var a = 0, h = 1, q = 2;h <= g;a <<= 1, ++h, q <<= 1) {
-        for (var c = 0;c < p;++c) {
+      for (var a = 0, h = 1, p = 2;h <= f;a <<= 1, ++h, p <<= 1) {
+        for (var c = 0;c < q;++c) {
           if (b[c] === h) {
             for (var m = 0, l = 0;l < h;++l) {
               m = 2 * m + (a >> l & 1);
             }
-            for (l = m;l < e;l += q) {
+            for (l = m;l < e;l += p) {
               d[l] = h << 16 | c;
             }
             ++a;
           }
         }
       }
-      return{codes:d, maxBits:g};
+      return{codes:d, maxBits:f};
     }
     var c;
     (function(b) {
       b[b.INIT = 0] = "INIT";
       b[b.BLOCK_0 = 1] = "BLOCK_0";
       b[b.BLOCK_1 = 2] = "BLOCK_1";
       b[b.BLOCK_2_PRE = 3] = "BLOCK_2_PRE";
       b[b.BLOCK_2 = 4] = "BLOCK_2";
@@ -2783,98 +2760,102 @@ var __extends = this.__extends || functi
     c = function() {
       function b(b) {
       }
       b.prototype.push = function(b) {
       };
       b.prototype.close = function() {
       };
       b.create = function(b) {
-        return "undefined" !== typeof ShumwayCom && ShumwayCom.createSpecialInflate ? new w(b, ShumwayCom.createSpecialInflate) : new t(b);
-      };
-      b.prototype._processZLibHeader = function(b, p, e) {
-        if (p + 2 > e) {
+        return "undefined" !== typeof ShumwayCom && ShumwayCom.createSpecialInflate ? new v(b, ShumwayCom.createSpecialInflate) : new t(b);
+      };
+      b.prototype._processZLibHeader = function(b, q, e) {
+        if (q + 2 > e) {
           return 0;
         }
-        b = b[p] << 8 | b[p + 1];
-        p = null;
-        2048 !== (b & 3840) ? p = "inflate: unknown compression method" : 0 !== b % 31 ? p = "inflate: bad FCHECK" : 0 !== (b & 32) && (p = "inflate: FDICT bit set");
-        if (p) {
+        b = b[q] << 8 | b[q + 1];
+        q = null;
+        2048 !== (b & 3840) ? q = "inflate: unknown compression method" : 0 !== b % 31 ? q = "inflate: bad FCHECK" : 0 !== (b & 32) && (q = "inflate: FDICT bit set");
+        if (q) {
           if (this.onError) {
-            this.onError(p);
+            this.onError(q);
           }
           return-1;
         }
         return 2;
       };
-      b.inflate = function(g, p, e) {
-        var d = new Uint8Array(p), a = 0;
-        p = b.create(e);
-        p.onData = function(b) {
-          d.set(b, a);
-          a += b.length;
-        };
-        p.push(g);
-        p.close();
+      b.inflate = function(f, q, e) {
+        var d = new Uint8Array(q), a = 0;
+        q = b.create(e);
+        q.onData = function(b) {
+          var f = Math.min(b.length, d.length - a);
+          f && k.memCopy(d, b, a, 0, f);
+          a += f;
+        };
+        q.onError = function(b) {
+          throw Error(b);
+        };
+        q.push(f);
+        q.close();
         return d;
       };
       return b;
     }();
     k.Inflate = c;
     var t = function(b) {
-      function g(g) {
-        b.call(this, g);
+      function f(f) {
+        b.call(this, f);
         this._buffer = null;
         this._bitLength = this._bitBuffer = this._bufferPosition = this._bufferSize = 0;
         this._window = new Uint8Array(65794);
         this._windowPosition = 0;
-        this._state = g ? 7 : 0;
+        this._state = f ? 7 : 0;
         this._isFinalBlock = !1;
         this._distanceTable = this._literalTable = null;
         this._block0Read = 0;
         this._block2State = null;
         this._copyState = {state:0, len:0, lenBits:0, dist:0, distBits:0};
         if (!s) {
           n = new Uint8Array([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
           a = new Uint16Array(30);
           h = new Uint8Array(30);
-          for (var e = g = 0, d = 1;30 > g;++g) {
-            a[g] = d, d += 1 << (h[g] = ~~((e += 2 < g ? 1 : 0) / 2));
+          for (var e = f = 0, d = 1;30 > f;++f) {
+            a[f] = d, d += 1 << (h[f] = ~~((e += 2 < f ? 1 : 0) / 2));
           }
           var c = new Uint8Array(288);
-          for (g = 0;32 > g;++g) {
-            c[g] = 5;
-          }
-          q = f(c.subarray(0, 32));
+          for (f = 0;32 > f;++f) {
+            c[f] = 5;
+          }
+          p = g(c.subarray(0, 32));
           l = new Uint16Array(29);
-          v = new Uint8Array(29);
-          e = g = 0;
-          for (d = 3;29 > g;++g) {
-            l[g] = d - (28 == g ? 1 : 0), d += 1 << (v[g] = ~~((e += 4 < g ? 1 : 0) / 4 % 6));
-          }
-          for (g = 0;288 > g;++g) {
-            c[g] = 144 > g || 279 < g ? 8 : 256 > g ? 9 : 7;
-          }
-          m = f(c);
+          u = new Uint8Array(29);
+          e = f = 0;
+          for (d = 3;29 > f;++f) {
+            l[f] = d - (28 == f ? 1 : 0), d += 1 << (u[f] = ~~((e += 4 < f ? 1 : 0) / 4 % 6));
+          }
+          for (f = 0;288 > f;++f) {
+            c[f] = 144 > f || 279 < f ? 8 : 256 > f ? 9 : 7;
+          }
+          m = g(c);
           s = !0;
         }
       }
-      __extends(g, b);
-      g.prototype.push = function(b) {
+      __extends(f, b);
+      f.prototype.push = function(b) {
         if (!this._buffer || this._buffer.length < this._bufferSize + b.length) {
-          var g = new Uint8Array(this._bufferSize + b.length);
-          this._buffer && g.set(this._buffer);
-          this._buffer = g;
+          var f = new Uint8Array(this._bufferSize + b.length);
+          this._buffer && f.set(this._buffer);
+          this._buffer = f;
         }
         this._buffer.set(b, this._bufferSize);
         this._bufferSize += b.length;
         this._bufferPosition = 0;
         b = !1;
         do {
-          g = this._windowPosition;
+          f = this._windowPosition;
           if (0 === this._state && (b = this._decodeInitState())) {
             break;
           }
           switch(this._state) {
             case 1:
               b = this._decodeBlock0();
               break;
             case 3:
@@ -2891,217 +2872,217 @@ var __extends = this.__extends || functi
             ;
             case 5:
               this._bufferPosition = this._bufferSize;
               break;
             case 7:
               var e = this._processZLibHeader(this._buffer, this._bufferPosition, this._bufferSize);
               0 < e ? (this._bufferPosition += e, this._state = 0) : 0 === e ? b = !0 : this._state = 6;
           }
-          if (0 < this._windowPosition - g) {
-            this.onData(this._window.subarray(g, this._windowPosition));
+          if (0 < this._windowPosition - f) {
+            this.onData(this._window.subarray(f, this._windowPosition));
           }
           65536 <= this._windowPosition && ("copyWithin" in this._buffer ? this._window.copyWithin(0, this._windowPosition - 32768, this._windowPosition) : this._window.set(this._window.subarray(this._windowPosition - 32768, this._windowPosition)), this._windowPosition = 32768);
         } while (!b && this._bufferPosition < this._bufferSize);
         this._bufferPosition < this._bufferSize ? ("copyWithin" in this._buffer ? this._buffer.copyWithin(0, this._bufferPosition, this._bufferSize) : this._buffer.set(this._buffer.subarray(this._bufferPosition, this._bufferSize)), this._bufferSize -= this._bufferPosition) : this._bufferSize = 0;
       };
-      g.prototype._decodeInitState = function() {
+      f.prototype._decodeInitState = function() {
         if (this._isFinalBlock) {
           return this._state = 5, !1;
         }
-        var b = this._buffer, g = this._bufferSize, e = this._bitBuffer, d = this._bitLength, a = this._bufferPosition;
-        if (3 > (g - a << 3) + d) {
+        var b = this._buffer, f = this._bufferSize, e = this._bitBuffer, d = this._bitLength, a = this._bufferPosition;
+        if (3 > (f - a << 3) + d) {
           return!0;
         }
         3 > d && (e |= b[a++] << d, d += 8);
         var h = e & 7, e = e >> 3, d = d - 3;
         switch(h >> 1) {
           case 0:
             d = e = 0;
-            if (4 > g - a) {
+            if (4 > f - a) {
               return!0;
             }
             var c = b[a] | b[a + 1] << 8, b = b[a + 2] | b[a + 3] << 8, a = a + 4;
             if (65535 !== (c ^ b)) {
               this._error("inflate: invalid block 0 length");
               b = 6;
               break;
             }
             0 === c ? b = 0 : (this._block0Read = c, b = 1);
             break;
           case 1:
             b = 2;
             this._literalTable = m;
-            this._distanceTable = q;
+            this._distanceTable = p;
             break;
           case 2:
-            if (26 > (g - a << 3) + d) {
+            if (26 > (f - a << 3) + d) {
               return!0;
             }
             for (;14 > d;) {
               e |= b[a++] << d, d += 8;
             }
             c = (e >> 10 & 15) + 4;
-            if ((g - a << 3) + d < 14 + 3 * c) {
+            if ((f - a << 3) + d < 14 + 3 * c) {
               return!0;
             }
-            for (var g = {numLiteralCodes:(e & 31) + 257, numDistanceCodes:(e >> 5 & 31) + 1, codeLengthTable:void 0, bitLengths:void 0, codesRead:0, dupBits:0}, e = e >> 14, d = d - 14, l = new Uint8Array(19), s = 0;s < c;++s) {
+            for (var f = {numLiteralCodes:(e & 31) + 257, numDistanceCodes:(e >> 5 & 31) + 1, codeLengthTable:void 0, bitLengths:void 0, codesRead:0, dupBits:0}, e = e >> 14, d = d - 14, l = new Uint8Array(19), s = 0;s < c;++s) {
               3 > d && (e |= b[a++] << d, d += 8), l[n[s]] = e & 7, e >>= 3, d -= 3;
             }
             for (;19 > s;s++) {
               l[n[s]] = 0;
             }
-            g.bitLengths = new Uint8Array(g.numLiteralCodes + g.numDistanceCodes);
-            g.codeLengthTable = f(l);
-            this._block2State = g;
+            f.bitLengths = new Uint8Array(f.numLiteralCodes + f.numDistanceCodes);
+            f.codeLengthTable = g(l);
+            this._block2State = f;
             b = 3;
             break;
           default:
             return this._error("inflate: unsupported block type"), !1;
         }
         this._isFinalBlock = !!(h & 1);
         this._state = b;
         this._bufferPosition = a;
         this._bitBuffer = e;
         this._bitLength = d;
         return!1;
       };
-      g.prototype._error = function(b) {
+      f.prototype._error = function(b) {
         if (this.onError) {
           this.onError(b);
         }
       };
-      g.prototype._decodeBlock0 = function() {
-        var b = this._bufferPosition, g = this._windowPosition, e = this._block0Read, d = 65794 - g, a = this._bufferSize - b, h = a < e, q = Math.min(d, a, e);
-        this._window.set(this._buffer.subarray(b, b + q), g);
-        this._windowPosition = g + q;
-        this._bufferPosition = b + q;
-        this._block0Read = e - q;
-        return e === q ? (this._state = 0, !1) : h && d < a;
-      };
-      g.prototype._readBits = function(b) {
-        var g = this._bitBuffer, e = this._bitLength;
+      f.prototype._decodeBlock0 = function() {
+        var b = this._bufferPosition, f = this._windowPosition, e = this._block0Read, d = 65794 - f, a = this._bufferSize - b, h = a < e, p = Math.min(d, a, e);
+        this._window.set(this._buffer.subarray(b, b + p), f);
+        this._windowPosition = f + p;
+        this._bufferPosition = b + p;
+        this._block0Read = e - p;
+        return e === p ? (this._state = 0, !1) : h && d < a;
+      };
+      f.prototype._readBits = function(b) {
+        var f = this._bitBuffer, e = this._bitLength;
         if (b > e) {
           var d = this._bufferPosition, a = this._bufferSize;
           do {
             if (d >= a) {
-              return this._bufferPosition = d, this._bitBuffer = g, this._bitLength = e, -1;
-            }
-            g |= this._buffer[d++] << e;
+              return this._bufferPosition = d, this._bitBuffer = f, this._bitLength = e, -1;
+            }
+            f |= this._buffer[d++] << e;
             e += 8;
           } while (b > e);
           this._bufferPosition = d;
         }
-        this._bitBuffer = g >> b;
+        this._bitBuffer = f >> b;
         this._bitLength = e - b;
-        return g & (1 << b) - 1;
-      };
-      g.prototype._readCode = function(b) {
-        var g = this._bitBuffer, e = this._bitLength, d = b.maxBits;
+        return f & (1 << b) - 1;
+      };
+      f.prototype._readCode = function(b) {
+        var f = this._bitBuffer, e = this._bitLength, d = b.maxBits;
         if (d > e) {
           var a = this._bufferPosition, h = this._bufferSize;
           do {
             if (a >= h) {
-              return this._bufferPosition = a, this._bitBuffer = g, this._bitLength = e, -1;
-            }
-            g |= this._buffer[a++] << e;
+              return this._bufferPosition = a, this._bitBuffer = f, this._bitLength = e, -1;
+            }
+            f |= this._buffer[a++] << e;
             e += 8;
           } while (d > e);
           this._bufferPosition = a;
         }
-        b = b.codes[g & (1 << d) - 1];
+        b = b.codes[f & (1 << d) - 1];
         d = b >> 16;
         if (b & 32768) {
           return this._error("inflate: invalid encoding"), this._state = 6, -1;
         }
-        this._bitBuffer = g >> d;
+        this._bitBuffer = f >> d;
         this._bitLength = e - d;
         return b & 65535;
       };
-      g.prototype._decodeBlock2Pre = function() {
-        var b = this._block2State, g = b.numLiteralCodes + b.numDistanceCodes, e = b.bitLengths, d = b.codesRead, a = 0 < d ? e[d - 1] : 0, h = b.codeLengthTable, q;
+      f.prototype._decodeBlock2Pre = function() {
+        var b = this._block2State, f = b.numLiteralCodes + b.numDistanceCodes, e = b.bitLengths, d = b.codesRead, a = 0 < d ? e[d - 1] : 0, h = b.codeLengthTable, p;
         if (0 < b.dupBits) {
-          q = this._readBits(b.dupBits);
-          if (0 > q) {
+          p = this._readBits(b.dupBits);
+          if (0 > p) {
             return!0;
           }
-          for (;q--;) {
+          for (;p--;) {
             e[d++] = a;
           }
           b.dupBits = 0;
         }
-        for (;d < g;) {
+        for (;d < f;) {
           var c = this._readCode(h);
           if (0 > c) {
             return b.codesRead = d, !0;
           }
           if (16 > c) {
             e[d++] = a = c;
           } else {
             var m;
             switch(c) {
               case 16:
                 m = 2;
-                q = 3;
+                p = 3;
                 c = a;
                 break;
               case 17:
-                q = m = 3;
+                p = m = 3;
                 c = 0;
                 break;
               case 18:
-                m = 7, q = 11, c = 0;
-            }
-            for (;q--;) {
+                m = 7, p = 11, c = 0;
+            }
+            for (;p--;) {
               e[d++] = c;
             }
-            q = this._readBits(m);
-            if (0 > q) {
+            p = this._readBits(m);
+            if (0 > p) {
               return b.codesRead = d, b.dupBits = m, !0;
             }
-            for (;q--;) {
+            for (;p--;) {
               e[d++] = c;
             }
             a = c;
           }
         }
-        this._literalTable = f(e.subarray(0, b.numLiteralCodes));
-        this._distanceTable = f(e.subarray(b.numLiteralCodes));
+        this._literalTable = g(e.subarray(0, b.numLiteralCodes));
+        this._distanceTable = g(e.subarray(b.numLiteralCodes));
         this._state = 4;
         this._block2State = null;
         return!1;
       };
-      g.prototype._decodeBlock = function() {
-        var b = this._literalTable, g = this._distanceTable, e = this._window, d = this._windowPosition, q = this._copyState, c, m, n, s;
-        if (0 !== q.state) {
-          switch(q.state) {
+      f.prototype._decodeBlock = function() {
+        var b = this._literalTable, f = this._distanceTable, e = this._window, d = this._windowPosition, p = this._copyState, c, m, n, s;
+        if (0 !== p.state) {
+          switch(p.state) {
             case 1:
-              if (0 > (c = this._readBits(q.lenBits))) {
+              if (0 > (c = this._readBits(p.lenBits))) {
                 return!0;
               }
-              q.len += c;
-              q.state = 2;
+              p.len += c;
+              p.state = 2;
             case 2:
-              if (0 > (c = this._readCode(g))) {
+              if (0 > (c = this._readCode(f))) {
                 return!0;
               }
-              q.distBits = h[c];
-              q.dist = a[c];
-              q.state = 3;
+              p.distBits = h[c];
+              p.dist = a[c];
+              p.state = 3;
             case 3:
               c = 0;
-              if (0 < q.distBits && 0 > (c = this._readBits(q.distBits))) {
+              if (0 < p.distBits && 0 > (c = this._readBits(p.distBits))) {
                 return!0;
               }
-              s = q.dist + c;
-              m = q.len;
+              s = p.dist + c;
+              m = p.len;
               for (c = d - s;m--;) {
                 e[d++] = e[c++];
               }
-              q.state = 0;
+              p.state = 0;
               if (65536 <= d) {
                 return this._windowPosition = d, !1;
               }
               break;
           }
         }
         do {
           c = this._readCode(b);
@@ -3109,75 +3090,75 @@ var __extends = this.__extends || functi
             return this._windowPosition = d, !0;
           }
           if (256 > c) {
             e[d++] = c;
           } else {
             if (256 < c) {
               this._windowPosition = d;
               c -= 257;
-              n = v[c];
+              n = u[c];
               m = l[c];
               c = 0 === n ? 0 : this._readBits(n);
               if (0 > c) {
-                return q.state = 1, q.len = m, q.lenBits = n, !0;
+                return p.state = 1, p.len = m, p.lenBits = n, !0;
               }
               m += c;
-              c = this._readCode(g);
+              c = this._readCode(f);
               if (0 > c) {
-                return q.state = 2, q.len = m, !0;
+                return p.state = 2, p.len = m, !0;
               }
               n = h[c];
               s = a[c];
               c = 0 === n ? 0 : this._readBits(n);
               if (0 > c) {
-                return q.state = 3, q.len = m, q.dist = s, q.distBits = n, !0;
+                return p.state = 3, p.len = m, p.dist = s, p.distBits = n, !0;
               }
               s += c;
               for (c = d - s;m--;) {
                 e[d++] = e[c++];
               }
             } else {
               this._state = 0;
               break;
             }
           }
         } while (65536 > d);
         this._windowPosition = d;
         return!1;
       };
-      return g;
-    }(c), n, a, h, q, l, v, m, s = !1, w = function(b) {
-      function g(g, e) {
-        b.call(this, g);
-        this._verifyHeader = g;
+      return f;
+    }(c), n, a, h, p, l, u, m, s = !1, v = function(b) {
+      function f(f, e) {
+        b.call(this, f);
+        this._verifyHeader = f;
         this._specialInflate = e();
-        this._specialInflate.onData = function(b) {
+        this._specialInflate.setDataCallback(function(b) {
           this.onData(b);
-        }.bind(this);
-      }
-      __extends(g, b);
-      g.prototype.push = function(b) {
+        }.bind(this));
+      }
+      __extends(f, b);
+      f.prototype.push = function(b) {
         if (this._verifyHeader) {
-          var g;
-          this._buffer ? (g = new Uint8Array(this._buffer.length + b.length), g.set(this._buffer), g.set(b, this._buffer.length), this._buffer = null) : g = new Uint8Array(b);
-          var e = this._processZLibHeader(g, 0, g.length);
+          var f;
+          this._buffer ? (f = new Uint8Array(this._buffer.length + b.length), f.set(this._buffer), f.set(b, this._buffer.length), this._buffer = null) : f = new Uint8Array(b);
+          var e = this._processZLibHeader(f, 0, f.length);
           if (0 === e) {
-            this._buffer = g;
+            this._buffer = f;
             return;
           }
           this._verifyHeader = !0;
-          0 < e && (b = g.subarray(e));
+          0 < e && (b = f.subarray(e));
         }
         this._specialInflate.push(b);
       };
-      g.prototype.close = function() {
+      f.prototype.close = function() {
         this._specialInflate && (this._specialInflate.close(), this._specialInflate = null);
       };
-      return g;
+      return f;
     }(c), d;
     (function(b) {
       b[b.WRITE = 0] = "WRITE";
       b[b.DONE = 1] = "DONE";
       b[b.ZLIB_HEADER = 2] = "ZLIB_HEADER";
     })(d || (d = {}));
     var e = function() {
       function b() {
@@ -3222,78 +3203,78 @@ var __extends = this.__extends || functi
       };
       return b;
     }();
     k.Deflate = d;
   })(k.ArrayUtilities || (k.ArrayUtilities = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    function f(b) {
+    function g(b) {
       for (var e = new Uint16Array(b), d = 0;d < b;d++) {
         e[d] = 1024;
       }
       return e;
     }
     function c(b, e, d, a) {
-      for (var h = 1, q = 0, c = 0;c < d;c++) {
-        var m = a.decodeBit(b, h + e), h = (h << 1) + m, q = q | m << c
-      }
-      return q;
+      for (var h = 1, p = 0, c = 0;c < d;c++) {
+        var m = a.decodeBit(b, h + e), h = (h << 1) + m, p = p | m << c
+      }
+      return p;
     }
     function t(b, e) {
       var d = [];
       d.length = e;
       for (var a = 0;a < e;a++) {
         d[a] = new l(b);
       }
       return d;
     }
     var n = function() {
       function b() {
         this.pos = this.available = 0;
         this.buffer = new Uint8Array(2E3);
       }
       b.prototype.append = function(b) {
-        var g = this.pos + this.available, e = g + b.length;
+        var f = this.pos + this.available, e = f + b.length;
         if (e > this.buffer.length) {
           for (var d = 2 * this.buffer.length;d < e;) {
             d *= 2;
           }
           e = new Uint8Array(d);
           e.set(this.buffer);
           this.buffer = e;
         }
-        this.buffer.set(b, g);
+        this.buffer.set(b, f);
         this.available += b.length;
       };
       b.prototype.compact = function() {
         0 !== this.available && (this.buffer.set(this.buffer.subarray(this.pos, this.pos + this.available), 0), this.pos = 0);
       };
       b.prototype.readByte = function() {
         if (0 >= this.available) {
           throw Error("Unexpected end of file");
         }
         this.available--;
         return this.buffer[this.pos++];
       };
       return b;
     }(), a = function() {
-      function b(g) {
-        this.onData = g;
+      function b(f) {
+        this.onData = f;
         this.processed = 0;
       }
       b.prototype.writeBytes = function(b) {
         this.onData.call(null, b);
         this.processed += b.length;
       };
       return b;
     }(), h = function() {
-      function b(g) {
-        this.outStream = g;
+      function b(f) {
+        this.outStream = f;
         this.buf = null;
         this.size = this.pos = 0;
         this.isFull = !1;
         this.totalPos = this.writePos = 0;
       }
       b.prototype.create = function(b) {
         this.buf = new Uint8Array(b);
         this.pos = 0;
@@ -3307,348 +3288,370 @@ var __extends = this.__extends || functi
         this.pos === this.size && (this.flush(), this.pos = 0, this.isFull = !0);
       };
       b.prototype.getByte = function(b) {
         return this.buf[b <= this.pos ? this.pos - b : this.size - b + this.pos];
       };
       b.prototype.flush = function() {
         this.writePos < this.pos && (this.outStream.writeBytes(this.buf.subarray(this.writePos, this.pos)), this.writePos = this.pos === this.size ? 0 : this.pos);
       };
-      b.prototype.copyMatch = function(b, g) {
-        for (var e = this.pos, d = this.size, a = this.buf, h = b <= e ? e - b : d - b + e, q = g;0 < q;) {
-          for (var c = Math.min(Math.min(q, d - e), d - h), m = 0;m < c;m++) {
+      b.prototype.copyMatch = function(b, f) {
+        for (var e = this.pos, d = this.size, a = this.buf, h = b <= e ? e - b : d - b + e, p = f;0 < p;) {
+          for (var c = Math.min(Math.min(p, d - e), d - h), m = 0;m < c;m++) {
             var l = a[h++];
             a[e++] = l;
           }
           e === d && (this.pos = e, this.flush(), e = 0, this.isFull = !0);
           h === d && (h = 0);
-          q -= c;
+          p -= c;
         }
         this.pos = e;
-        this.totalPos += g;
+        this.totalPos += f;
       };
       b.prototype.checkDistance = function(b) {
         return b <= this.pos || this.isFull;
       };
       b.prototype.isEmpty = function() {
         return 0 === this.pos && !this.isFull;
       };
       return b;
-    }(), q = function() {
-      function b(g) {
-        this.inStream = g;
+    }(), p = function() {
+      function b(f) {
+        this.inStream = f;
         this.code = this.range = 0;
         this.corrupted = !1;
       }
       b.prototype.init = function() {
         0 !== this.inStream.readByte() && (this.corrupted = !0);
         this.range = -1;
-        for (var b = 0, g = 0;4 > g;g++) {
+        for (var b = 0, f = 0;4 > f;f++) {
           b = b << 8 | this.inStream.readByte();
         }
         b === this.range && (this.corrupted = !0);
         this.code = b;
       };
       b.prototype.isFinishedOK = function() {
         return 0 === this.code;
       };
       b.prototype.decodeDirectBits = function(b) {
-        var g = 0, e = this.range, d = this.code;
+        var f = 0, e = this.range, d = this.code;
         do {
           var e = e >>> 1 | 0, d = d - e | 0, a = d >> 31, d = d + (e & a) | 0;
           d === e && (this.corrupted = !0);
           0 <= e && 16777216 > e && (e <<= 8, d = d << 8 | this.inStream.readByte());
-          g = (g << 1) + a + 1 | 0;
+          f = (f << 1) + a + 1 | 0;
         } while (--b);
         this.range = e;
         this.code = d;
-        return g;
-      };
-      b.prototype.decodeBit = function(b, g) {
-        var e = this.range, d = this.code, a = b[g], h = (e >>> 11) * a;
+        return f;
+      };
+      b.prototype.decodeBit = function(b, f) {
+        var e = this.range, d = this.code, a = b[f], h = (e >>> 11) * a;
         d >>> 0 < h ? (a = a + (2048 - a >> 5) | 0, e = h | 0, h = 0) : (a = a - (a >> 5) | 0, d = d - h | 0, e = e - h | 0, h = 1);
-        b[g] = a & 65535;
+        b[f] = a & 65535;
         0 <= e && 16777216 > e && (e <<= 8, d = d << 8 | this.inStream.readByte());
         this.range = e;
         this.code = d;
         return h;
       };
       return b;
     }(), l = function() {
-      function b(g) {
-        this.numBits = g;
-        this.probs = f(1 << g);
+      function b(f) {
+        this.numBits = f;
+        this.probs = g(1 << f);
       }
       b.prototype.decode = function(b) {
-        for (var g = 1, e = 0;e < this.numBits;e++) {
-          g = (g << 1) + b.decodeBit(this.probs, g);
-        }
-        return g - (1 << this.numBits);
+        for (var f = 1, e = 0;e < this.numBits;e++) {
+          f = (f << 1) + b.decodeBit(this.probs, f);
+        }
+        return f - (1 << this.numBits);
       };
       b.prototype.reverseDecode = function(b) {
         return c(this.probs, 0, this.numBits, b);
       };
       return b;
-    }(), v = function() {
+    }(), u = function() {
       function b() {
-        this.choice = f(2);
+        this.choice = g(2);
         this.lowCoder = t(3, 16);
         this.midCoder = t(3, 16);
         this.highCoder = new l(8);
       }
-      b.prototype.decode = function(b, g) {
-        return 0 === b.decodeBit(this.choice, 0) ? this.lowCoder[g].decode(b) : 0 === b.decodeBit(this.choice, 1) ? 8 + this.midCoder[g].decode(b) : 16 + this.highCoder.decode(b);
+      b.prototype.decode = function(b, f) {
+        return 0 === b.decodeBit(this.choice, 0) ? this.lowCoder[f].decode(b) : 0 === b.decodeBit(this.choice, 1) ? 8 + this.midCoder[f].decode(b) : 16 + this.highCoder.decode(b);
       };
       return b;
     }(), m = function() {
-      function b(g, e) {
-        this.rangeDec = new q(g);
+      function b(f, e) {
+        this.rangeDec = new p(f);
         this.outWindow = new h(e);
         this.markerIsMandatory = !1;
         this.dictSizeInProperties = this.dictSize = this.lp = this.pb = this.lc = 0;
         this.leftToUnpack = this.unpackSize = void 0;
         this.reps = new Int32Array(4);
         this.state = 0;
       }
       b.prototype.decodeProperties = function(b) {
-        var g = b[0];
-        if (225 <= g) {
+        var f = b[0];
+        if (225 <= f) {
           throw Error("Incorrect LZMA properties");
         }
-        this.lc = g % 9;
-        g = g / 9 | 0;
-        this.pb = g / 5 | 0;
-        this.lp = g % 5;
-        for (g = this.dictSizeInProperties = 0;4 > g;g++) {
-          this.dictSizeInProperties |= b[g + 1] << 8 * g;
+        this.lc = f % 9;
+        f = f / 9 | 0;
+        this.pb = f / 5 | 0;
+        this.lp = f % 5;
+        for (f = this.dictSizeInProperties = 0;4 > f;f++) {
+          this.dictSizeInProperties |= b[f + 1] << 8 * f;
         }
         this.dictSize = this.dictSizeInProperties;
         4096 > this.dictSize && (this.dictSize = 4096);
       };
       b.prototype.create = function() {
         this.outWindow.create(this.dictSize);
         this.init();
         this.rangeDec.init();
         this.reps[0] = 0;
         this.reps[1] = 0;
         this.reps[2] = 0;
         this.state = this.reps[3] = 0;
         this.leftToUnpack = this.unpackSize;
       };
-      b.prototype.decodeLiteral = function(b, g) {
+      b.prototype.decodeLiteral = function(b, f) {
         var e = this.outWindow, d = this.rangeDec, a = 0;
         e.isEmpty() || (a = e.getByte(1));
         var h = 1, a = 768 * (((e.totalPos & (1 << this.lp) - 1) << this.lc) + (a >> 8 - this.lc));
         if (7 <= b) {
-          e = e.getByte(g + 1);
+          e = e.getByte(f + 1);
           do {
-            var q = e >> 7 & 1, e = e << 1, c = d.decodeBit(this.litProbs, a + ((1 + q << 8) + h)), h = h << 1 | c;
-            if (q !== c) {
+            var p = e >> 7 & 1, e = e << 1, c = d.decodeBit(this.litProbs, a + ((1 + p << 8) + h)), h = h << 1 | c;
+            if (p !== c) {
               break;
             }
           } while (256 > h);
         }
         for (;256 > h;) {
           h = h << 1 | d.decodeBit(this.litProbs, a + h);
         }
         return h - 256 & 255;
       };
       b.prototype.decodeDistance = function(b) {
-        var g = b;
-        3 < g && (g = 3);
+        var f = b;
+        3 < f && (f = 3);
         b = this.rangeDec;
-        g = this.posSlotDecoder[g].decode(b);
-        if (4 > g) {
-          return g;
-        }
-        var e = (g >> 1) - 1, d = (2 | g & 1) << e;
-        14 > g ? d = d + c(this.posDecoders, d - g, e, b) | 0 : (d = d + (b.decodeDirectBits(e - 4) << 4) | 0, d = d + this.alignDecoder.reverseDecode(b) | 0);
+        f = this.posSlotDecoder[f].decode(b);
+        if (4 > f) {
+          return f;
+        }
+        var e = (f >> 1) - 1, d = (2 | f & 1) << e;
+        14 > f ? d = d + c(this.posDecoders, d - f, e, b) | 0 : (d = d + (b.decodeDirectBits(e - 4) << 4) | 0, d = d + this.alignDecoder.reverseDecode(b) | 0);
         return d;
       };
       b.prototype.init = function() {
-        this.litProbs = f(768 << this.lc + this.lp);
+        this.litProbs = g(768 << this.lc + this.lp);
         this.posSlotDecoder = t(6, 4);
         this.alignDecoder = new l(4);
-        this.posDecoders = f(115);
-        this.isMatch = f(192);
-        this.isRep = f(12);
-        this.isRepG0 = f(12);
-        this.isRepG1 = f(12);
-        this.isRepG2 = f(12);
-        this.isRep0Long = f(192);
-        this.lenDecoder = new v;
-        this.repLenDecoder = new v;
+        this.posDecoders = g(115);
+        this.isMatch = g(192);
+        this.isRep = g(12);
+        this.isRepG0 = g(12);
+        this.isRepG1 = g(12);
+        this.isRepG2 = g(12);
+        this.isRep0Long = g(192);
+        this.lenDecoder = new u;
+        this.repLenDecoder = new u;
       };
       b.prototype.decode = function(b) {
-        for (var g = this.rangeDec, a = this.outWindow, h = this.pb, q = this.dictSize, c = this.markerIsMandatory, m = this.leftToUnpack, l = this.isMatch, n = this.isRep, v = this.isRepG0, f = this.isRepG1, k = this.isRepG2, r = this.isRep0Long, t = this.lenDecoder, y = this.repLenDecoder, z = this.reps[0], C = this.reps[1], x = this.reps[2], E = this.reps[3], B = this.state;;) {
-          if (b && 48 > g.inStream.available) {
+        for (var f = this.rangeDec, a = this.outWindow, h = this.pb, p = this.dictSize, c = this.markerIsMandatory, m = this.leftToUnpack, l = this.isMatch, n = this.isRep, u = this.isRepG0, g = this.isRepG1, k = this.isRepG2, r = this.isRep0Long, t = this.lenDecoder, y = this.repLenDecoder, z = this.reps[0], B = this.reps[1], x = this.reps[2], E = this.reps[3], A = this.state;;) {
+          if (b && 48 > f.inStream.available) {
             this.outWindow.flush();
             break;
           }
-          if (0 === m && !c && (this.outWindow.flush(), g.isFinishedOK())) {
+          if (0 === m && !c && (this.outWindow.flush(), f.isFinishedOK())) {
             return d;
           }
           var D = a.totalPos & (1 << h) - 1;
-          if (0 === g.decodeBit(l, (B << 4) + D)) {
+          if (0 === f.decodeBit(l, (A << 4) + D)) {
             if (0 === m) {
               return s;
             }
-            a.putByte(this.decodeLiteral(B, z));
-            B = 4 > B ? 0 : 10 > B ? B - 3 : B - 6;
+            a.putByte(this.decodeLiteral(A, z));
+            A = 4 > A ? 0 : 10 > A ? A - 3 : A - 6;
             m--;
           } else {
-            if (0 !== g.decodeBit(n, B)) {
+            if (0 !== f.decodeBit(n, A)) {
               if (0 === m || a.isEmpty()) {
                 return s;
               }
-              if (0 === g.decodeBit(v, B)) {
-                if (0 === g.decodeBit(r, (B << 4) + D)) {
-                  B = 7 > B ? 9 : 11;
+              if (0 === f.decodeBit(u, A)) {
+                if (0 === f.decodeBit(r, (A << 4) + D)) {
+                  A = 7 > A ? 9 : 11;
                   a.putByte(a.getByte(z + 1));
                   m--;
                   continue;
                 }
               } else {
                 var F;
-                0 === g.decodeBit(f, B) ? F = C : (0 === g.decodeBit(k, B) ? F = x : (F = E, E = x), x = C);
-                C = z;
+                0 === f.decodeBit(g, A) ? F = B : (0 === f.decodeBit(k, A) ? F = x : (F = E, E = x), x = B);
+                B = z;
                 z = F;
               }
-              D = y.decode(g, D);
-              B = 7 > B ? 8 : 11;
+              D = y.decode(f, D);
+              A = 7 > A ? 8 : 11;
             } else {
               E = x;
-              x = C;
-              C = z;
-              D = t.decode(g, D);
-              B = 7 > B ? 7 : 10;
+              x = B;
+              B = z;
+              D = t.decode(f, D);
+              A = 7 > A ? 7 : 10;
               z = this.decodeDistance(D);
               if (-1 === z) {
-                return this.outWindow.flush(), g.isFinishedOK() ? w : s;
+                return this.outWindow.flush(), f.isFinishedOK() ? v : s;
               }
-              if (0 === m || z >= q || !a.checkDistance(z)) {
+              if (0 === m || z >= p || !a.checkDistance(z)) {
                 return s;
               }
             }
             D += 2;
             F = !1;
             void 0 !== m && m < D && (D = m, F = !0);
             a.copyMatch(z + 1, D);
             m -= D;
             if (F) {
               return s;
             }
           }
         }
-        this.state = B;
+        this.state = A;
         this.reps[0] = z;
-        this.reps[1] = C;
+        this.reps[1] = B;
         this.reps[2] = x;
         this.reps[3] = E;
         this.leftToUnpack = m;
         return e;
       };
+      b.prototype.flushOutput = function() {
+        this.outWindow.flush();
+      };
       return b;
-    }(), s = 0, w = 1, d = 2, e = 3, b;
+    }(), s = 0, v = 1, d = 2, e = 3, b;
     (function(b) {
       b[b.WAIT_FOR_LZMA_HEADER = 0] = "WAIT_FOR_LZMA_HEADER";
       b[b.WAIT_FOR_SWF_HEADER = 1] = "WAIT_FOR_SWF_HEADER";
       b[b.PROCESS_DATA = 2] = "PROCESS_DATA";
       b[b.CLOSED = 3] = "CLOSED";
+      b[b.ERROR = 4] = "ERROR";
     })(b || (b = {}));
     b = function() {
-      function b(g) {
-        void 0 === g && (g = !1);
-        this._state = g ? 1 : 0;
+      function b(f) {
+        void 0 === f && (f = !1);
+        this._state = f ? 1 : 0;
         this.buffer = null;
       }
       b.prototype.push = function(b) {
         if (2 > this._state) {
-          var g = this.buffer ? this.buffer.length : 0, d = (1 === this._state ? 17 : 13) + 5;
-          if (g + b.length < d) {
-            d = new Uint8Array(g + b.length);
-            0 < g && d.set(this.buffer);
-            d.set(b, g);
+          var f = this.buffer ? this.buffer.length : 0, d = (1 === this._state ? 17 : 13) + 5;
+          if (f + b.length < d) {
+            d = new Uint8Array(f + b.length);
+            0 < f && d.set(this.buffer);
+            d.set(b, f);
             this.buffer = d;
             return;
           }
           var h = new Uint8Array(d);
-          0 < g && h.set(this.buffer);
-          h.set(b.subarray(0, d - g), g);
+          0 < f && h.set(this.buffer);
+          h.set(b.subarray(0, d - f), f);
           this._inStream = new n;
           this._inStream.append(h.subarray(d - 5));
           this._outStream = new a(function(b) {
             this.onData.call(null, b);
           }.bind(this));
           this._decoder = new m(this._inStream, this._outStream);
           if (1 === this._state) {
             this._decoder.decodeProperties(h.subarray(12, 17)), this._decoder.markerIsMandatory = !1, this._decoder.unpackSize = ((h[4] | h[5] << 8 | h[6] << 16 | h[7] << 24) >>> 0) - 8;
           } else {
             this._decoder.decodeProperties(h.subarray(0, 5));
-            for (var g = 0, q = !1, c = 0;8 > c;c++) {
+            for (var f = 0, p = !1, c = 0;8 > c;c++) {
               var l = h[5 + c];
-              255 !== l && (q = !0);
-              g |= l << 8 * c;
-            }
-            this._decoder.markerIsMandatory = !q;
-            this._decoder.unpackSize = q ? g : void 0;
+              255 !== l && (p = !0);
+              f |= l << 8 * c;
+            }
+            this._decoder.markerIsMandatory = !p;
+            this._decoder.unpackSize = p ? f : void 0;
           }
           this._decoder.create();
           b = b.subarray(d);
           this._state = 2;
-        }
-        this._inStream.append(b);
-        b = this._decoder.decode(!0);
-        this._inStream.compact();
-        b !== e && this._checkError(b);
+        } else {
+          if (2 !== this._state) {
+            return;
+          }
+        }
+        try {
+          this._inStream.append(b);
+          var s = this._decoder.decode(!0);
+          this._inStream.compact();
+          s !== e && this._checkError(s);
+        } catch (u) {
+          this._decoder.flushOutput(), this._decoder = null, this._error(u);
+        }
       };
       b.prototype.close = function() {
-        this._state = 3;
-        var b = this._decoder.decode(!1);
-        this._checkError(b);
-        this._decoder = null;
+        if (2 === this._state) {
+          this._state = 3;
+          try {
+            var b = this._decoder.decode(!1);
+            this._checkError(b);
+          } catch (f) {
+            this._decoder.flushOutput(), this._error(f);
+          }
+          this._decoder = null;
+        }
+      };
+      b.prototype._error = function(b) {
+        this._state = 4;
+        if (this.onError) {
+          this.onError(b);
+        }
       };
       b.prototype._checkError = function(b) {
-        var g;
-        b === s ? g = "LZMA decoding error" : b === e ? g = "Decoding is not complete" : b === w ? void 0 !== this._decoder.unpackSize && this._decoder.unpackSize !== this._outStream.processed && (g = "Finished with end marker before than specified size") : g = "Internal LZMA Error";
-        if (g && this.onError) {
-          this.onError(g);
-        }
+        var f;
+        b === s ? f = "LZMA decoding error" : b === e ? f = "Decoding is not complete" : b === v ? void 0 !== this._decoder.unpackSize && this._decoder.unpackSize !== this._outStream.processed && (f = "Finished with end marker before than specified size") : f = "Internal LZMA Error";
+        f && this._error(f);
       };
       return b;
     }();
     k.LzmaDecoder = b;
   })(k.ArrayUtilities || (k.ArrayUtilities = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    function f(a, d) {
+    function g(a, d) {
       a !== h(a, 0, d) && throwError("RangeError", Errors.ParamRangeError);
     }
     function c(a) {
       return "string" === typeof a ? a : void 0 == a ? null : a + "";
     }
-    var t = k.Debug.notImplemented, n = k.StringUtilities.utf8decode, a = k.StringUtilities.utf8encode, h = k.NumberUtilities.clamp, q = function() {
+    var t = k.Debug.notImplemented, n = k.StringUtilities.utf8decode, a = k.StringUtilities.utf8encode, h = k.NumberUtilities.clamp, p = function() {
       return function(a, d, e) {
         this.buffer = a;
         this.length = d;
         this.littleEndian = e;
       };
     }();
-    r.PlainObjectDataBuffer = q;
-    for (var l = new Uint32Array(33), v = 1, m = 0;32 >= v;v++) {
-      l[v] = m = m << 1 | 1;
+    r.PlainObjectDataBuffer = p;
+    for (var l = new Uint32Array(33), u = 1, m = 0;32 >= u;u++) {
+      l[u] = m = m << 1 | 1;
     }
     var s;
     (function(a) {
       a[a.U8 = 1] = "U8";
       a[a.I32 = 2] = "I32";
       a[a.F32 = 4] = "F32";
     })(s || (s = {}));
-    v = function() {
+    u = function() {
       function m(d) {
         void 0 === d && (d = m.INITIAL_SIZE);
         this._buffer || (this._buffer = new ArrayBuffer(d), this._position = this._length = 0, this._resetViews(), this._littleEndian = m._nativeLittleEndian, this._bitLength = this._bitBuffer = 0);
       }
       m.FromArrayBuffer = function(d, e) {
         void 0 === e && (e = -1);
         var b = Object.create(m.prototype);
         b._buffer = d;
@@ -3661,17 +3664,17 @@ var __extends = this.__extends || functi
         return b;
       };
       m.FromPlainObject = function(d) {
         var e = m.FromArrayBuffer(d.buffer, d.length);
         e._littleEndian = d.littleEndian;
         return e;
       };
       m.prototype.toPlainObject = function() {
-        return new q(this._buffer, this._length, this._littleEndian);
+        return new p(this._buffer, this._length, this._littleEndian);
       };
       m.prototype._resetViews = function() {
         this._u8 = new Uint8Array(this._buffer);
         this._f32 = this._i32 = null;
       };
       m.prototype._requestViews = function(d) {
         0 === (this._buffer.byteLength & 3) && (null === this._i32 && d & 2 && (this._i32 = new Int32Array(this._buffer)), null === this._f32 && d & 4 && (this._f32 = new Float32Array(this._buffer)));
       };
@@ -3704,40 +3707,40 @@ var __extends = this.__extends || functi
       m.prototype.readUnsignedByte = function() {
         this._position + 1 > this._length && throwError("EOFError", Errors.EOFError);
         return this._u8[this._position++];
       };
       m.prototype.readBytes = function(d, e) {
         var b = 0;
         void 0 === b && (b = 0);
         void 0 === e && (e = 0);
-        var g = this._position;
+        var f = this._position;
         b || (b = 0);
-        e || (e = this._length - g);
-        g + e > this._length && throwError("EOFError", Errors.EOFError);
+        e || (e = this._length - f);
+        f + e > this._length && throwError("EOFError", Errors.EOFError);
         d.length < b + e && (d._ensureCapacity(b + e), d.length = b + e);
-        d._u8.set(new Uint8Array(this._buffer, g, e), b);
+        d._u8.set(new Uint8Array(this._buffer, f, e), b);
         this._position += e;
       };
       m.prototype.readShort = function() {
         return this.readUnsignedShort() << 16 >> 16;
       };
       m.prototype.readUnsignedShort = function() {
         var d = this._u8, e = this._position;
         e + 2 > this._length && throwError("EOFError", Errors.EOFError);
         var b = d[e + 0], d = d[e + 1];
         this._position = e + 2;
         return this._littleEndian ? d << 8 | b : b << 8 | d;
       };
       m.prototype.readInt = function() {
         var d = this._u8, e = this._position;
         e + 4 > this._length && throwError("EOFError", Errors.EOFError);
-        var b = d[e + 0], g = d[e + 1], p = d[e + 2], d = d[e + 3];
+        var b = d[e + 0], f = d[e + 1], a = d[e + 2], d = d[e + 3];
         this._position = e + 4;
-        return this._littleEndian ? d << 24 | p << 16 | g << 8 | b : b << 24 | g << 16 | p << 8 | d;
+        return this._littleEndian ? d << 24 | a << 16 | f << 8 | b : b << 24 | f << 16 | a << 8 | d;
       };
       m.prototype.readUnsignedInt = function() {
         return this.readInt() >>> 0;
       };
       m.prototype.readFloat = function() {
         var d = this._position;
         d + 4 > this._length && throwError("EOFError", Errors.EOFError);
         this._position = d + 4;
@@ -3780,18 +3783,18 @@ var __extends = this.__extends || functi
         e > this._length && (this._length = e);
       };
       m.prototype.writeBytes = function(d, e, b) {
         void 0 === e && (e = 0);
         void 0 === b && (b = 0);
         k.isNullOrUndefined(d) && throwError("TypeError", Errors.NullPointerError, "bytes");
         2 > arguments.length && (e = 0);
         3 > arguments.length && (b = 0);
-        f(e, d.length);
-        f(e + b, d.length);
+        g(e, d.length);
+        g(e + b, d.length);
         0 === b && (b = d.length - e);
         this.writeRawBytes(new Int8Array(d._buffer, e, b));
       };
       m.prototype.writeShort = function(d) {
         this.writeUnsignedShort(d);
       };
       m.prototype.writeUnsignedShort = function(d) {
         var e = this._position;
@@ -3802,18 +3805,18 @@ var __extends = this.__extends || functi
         e > this._length && (this._length = e);
       };
       m.prototype.writeInt = function(d) {
         this.writeUnsignedInt(d);
       };
       m.prototype.write2Ints = function(d, e) {
         this.write2UnsignedInts(d, e);
       };
-      m.prototype.write4Ints = function(d, e, b, g) {
-        this.write4UnsignedInts(d, e, b, g);
+      m.prototype.write4Ints = function(d, e, b, f) {
+        this.write4UnsignedInts(d, e, b, f);
       };
       m.prototype.writeUnsignedInt = function(d) {
         var e = this._position;
         this._ensureCapacity(e + 4);
         this._requestViews(2);
         if (this._littleEndian === m._nativeLittleEndian && 0 === (e & 3) && this._i32) {
           this._i32[e >> 2] = d;
         } else {
@@ -3824,42 +3827,42 @@ var __extends = this.__extends || functi
         e > this._length && (this._length = e);
       };
       m.prototype.write2UnsignedInts = function(d, e) {
         var b = this._position;
         this._ensureCapacity(b + 8);
         this._requestViews(2);
         this._littleEndian === m._nativeLittleEndian && 0 === (b & 3) && this._i32 ? (this._i32[(b >> 2) + 0] = d, this._i32[(b >> 2) + 1] = e, this._position = b += 8, b > this._length && (this._length = b)) : (this.writeUnsignedInt(d), this.writeUnsignedInt(e));
       };
-      m.prototype.write4UnsignedInts = function(d, e, b, g) {
-        var p = this._position;
-        this._ensureCapacity(p + 16);
+      m.prototype.write4UnsignedInts = function(d, e, b, f) {
+        var a = this._position;
+        this._ensureCapacity(a + 16);
         this._requestViews(2);
-        this._littleEndian === m._nativeLittleEndian && 0 === (p & 3) && this._i32 ? (this._i32[(p >> 2) + 0] = d, this._i32[(p >> 2) + 1] = e, this._i32[(p >> 2) + 2] = b, this._i32[(p >> 2) + 3] = g, this._position = p += 16, p > this._length && (this._length = p)) : (this.writeUnsignedInt(d), this.writeUnsignedInt(e), this.writeUnsignedInt(b), this.writeUnsignedInt(g));
+        this._littleEndian === m._nativeLittleEndian && 0 === (a & 3) && this._i32 ? (this._i32[(a >> 2) + 0] = d, this._i32[(a >> 2) + 1] = e, this._i32[(a >> 2) + 2] = b, this._i32[(a >> 2) + 3] = f, this._position = a += 16, a > this._length && (this._length = a)) : (this.writeUnsignedInt(d), this.writeUnsignedInt(e), this.writeUnsignedInt(b), this.writeUnsignedInt(f));
       };
       m.prototype.writeFloat = function(d) {
         var e = this._position;
         this._ensureCapacity(e + 4);
         this._requestViews(4);
         if (this._littleEndian === m._nativeLittleEndian && 0 === (e & 3) && this._f32) {
           this._f32[e >> 2] = d;
         } else {
           var b = this._u8;
           k.IntegerUtilities.f32[0] = d;
           d = k.IntegerUtilities.u8;
           this._littleEndian ? (b[e + 0] = d[0], b[e + 1] = d[1], b[e + 2] = d[2], b[e + 3] = d[3]) : (b[e + 0] = d[3], b[e + 1] = d[2], b[e + 2] = d[1], b[e + 3] = d[0]);
         }
         this._position = e += 4;
         e > this._length && (this._length = e);
       };
-      m.prototype.write6Floats = function(d, e, b, g, p, a) {
-        var h = this._position;
-        this._ensureCapacity(h + 24);
+      m.prototype.write6Floats = function(d, e, b, f, a, h) {
+        var p = this._position;
+        this._ensureCapacity(p + 24);
         this._requestViews(4);
-        this._littleEndian === m._nativeLittleEndian && 0 === (h & 3) && this._f32 ? (this._f32[(h >> 2) + 0] = d, this._f32[(h >> 2) + 1] = e, this._f32[(h >> 2) + 2] = b, this._f32[(h >> 2) + 3] = g, this._f32[(h >> 2) + 4] = p, this._f32[(h >> 2) + 5] = a, this._position = h += 24, h > this._length && (this._length = h)) : (this.writeFloat(d), this.writeFloat(e), this.writeFloat(b), this.writeFloat(g), this.writeFloat(p), this.writeFloat(a));
+        this._littleEndian === m._nativeLittleEndian && 0 === (p & 3) && this._f32 ? (this._f32[(p >> 2) + 0] = d, this._f32[(p >> 2) + 1] = e, this._f32[(p >> 2) + 2] = b, this._f32[(p >> 2) + 3] = f, this._f32[(p >> 2) + 4] = a, this._f32[(p >> 2) + 5] = h, this._position = p += 24, p > this._length && (this._length = p)) : (this.writeFloat(d), this.writeFloat(e), this.writeFloat(b), this.writeFloat(f), this.writeFloat(a), this.writeFloat(h));
       };
       m.prototype.writeDouble = function(d) {
         var e = this._position;
         this._ensureCapacity(e + 8);
         var b = this._u8;
         k.IntegerUtilities.f64[0] = d;
         d = k.IntegerUtilities.u8;
         this._littleEndian ? (b[e + 0] = d[0], b[e + 1] = d[1], b[e + 2] = d[2], b[e + 3] = d[3], b[e + 4] = d[4], b[e + 5] = d[5], b[e + 6] = d[6], b[e + 7] = d[7]) : (b[e + 0] = d[7], b[e + 1] = d[6], b[e + 2] = d[5], b[e + 3] = d[4], b[e + 4] = d[3], b[e + 5] = d[2], b[e + 6] = d[1], b[e + 7] = d[0]);
@@ -4047,39 +4050,39 @@ var __extends = this.__extends || functi
             e = r.Inflate.create(!1);
             break;
           case "lzma":
             e = new r.LzmaDecoder(!1);
             break;
           default:
             return;
         }
-        var b = new m, g;
+        var b = new m, f;
         e.onData = b.writeRawBytes.bind(b);
         e.onError = function(b) {
-          return g = b;
+          return f = b;
         };
         e.push(this._u8.subarray(0, this._length));
-        g && throwError("IOError", Errors.CompressedDataError);
+        f && throwError("IOError", Errors.CompressedDataError);
         e.close();
         this._ensureCapacity(b._u8.length);
         this._u8.set(b._u8);
         this.length = b.length;
         this._position = 0;
       };
       m._nativeLittleEndian = 1 === (new Int8Array((new Int32Array([1])).buffer))[0];
       m.INITIAL_SIZE = 128;
       m._arrayBufferPool = new k.ArrayBufferPool;
       return m;
     }();
-    r.DataBuffer = v;
+    r.DataBuffer = u;
   })(k.ArrayUtilities || (k.ArrayUtilities = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
-  var r = k.ArrayUtilities.DataBuffer, f = k.ArrayUtilities.ensureTypedArrayCapacity;
+  var r = k.ArrayUtilities.DataBuffer, g = k.ArrayUtilities.ensureTypedArrayCapacity;
   (function(c) {
     c[c.BeginSolidFill = 1] = "BeginSolidFill";
     c[c.BeginGradientFill = 2] = "BeginGradientFill";
     c[c.BeginBitmapFill = 3] = "BeginBitmapFill";
     c[c.EndFill = 4] = "EndFill";
     c[c.LineStyleSolid = 5] = "LineStyleSolid";
     c[c.LineStyleGradient = 6] = "LineStyleGradient";
     c[c.LineStyleBitmap = 7] = "LineStyleBitmap";
@@ -4104,26 +4107,26 @@ var __extends = this.__extends || functi
   })(k.GradientInterpolationMethod || (k.GradientInterpolationMethod = {}));
   (function(c) {
     c[c.None = 0] = "None";
     c[c.Normal = 1] = "Normal";
     c[c.Vertical = 2] = "Vertical";
     c[c.Horizontal = 3] = "Horizontal";
   })(k.LineScaleMode || (k.LineScaleMode = {}));
   var c = function() {
-    return function(c, a, h, q, l, v, m, s, f, d, e) {
+    return function(c, a, h, p, l, u, m, s, g, d, e) {
       this.commands = c;
       this.commandsPosition = a;
       this.coordinates = h;
-      this.morphCoordinates = q;
+      this.morphCoordinates = p;
       this.coordinatesPosition = l;
-      this.styles = v;
+      this.styles = u;
       this.stylesLength = m;
       this.morphStyles = s;
-      this.morphStylesLength = f;
+      this.morphStylesLength = g;
       this.hasFills = d;
       this.hasLines = e;
     };
   }();
   k.PlainObjectShapeData = c;
   var t;
   (function(c) {
     c[c.Commands = 32] = "Commands";
@@ -4156,31 +4159,31 @@ var __extends = this.__extends || functi
       this.coordinates[this.coordinatesPosition++] = h;
     };
     n.prototype.lineTo = function(a, h) {
       this.ensurePathCapacities(1, 2);
       this.commands[this.commandsPosition++] = 10;
       this.coordinates[this.coordinatesPosition++] = a;
       this.coordinates[this.coordinatesPosition++] = h;
     };
-    n.prototype.curveTo = function(a, h, c, l) {
+    n.prototype.curveTo = function(a, h, p, c) {
       this.ensurePathCapacities(1, 4);
       this.commands[this.commandsPosition++] = 11;
       this.coordinates[this.coordinatesPosition++] = a;
       this.coordinates[this.coordinatesPosition++] = h;
+      this.coordinates[this.coordinatesPosition++] = p;
       this.coordinates[this.coordinatesPosition++] = c;
-      this.coordinates[this.coordinatesPosition++] = l;
-    };
-    n.prototype.cubicCurveTo = function(a, h, c, l, n, m) {
+    };
+    n.prototype.cubicCurveTo = function(a, h, p, c, n, m) {
       this.ensurePathCapacities(1, 6);
       this.commands[this.commandsPosition++] = 12;
       this.coordinates[this.coordinatesPosition++] = a;
       this.coordinates[this.coordinatesPosition++] = h;
+      this.coordinates[this.coordinatesPosition++] = p;
       this.coordinates[this.coordinatesPosition++] = c;
-      this.coordinates[this.coordinatesPosition++] = l;
       this.coordinates[this.coordinatesPosition++] = n;
       this.coordinates[this.coordinatesPosition++] = m;
     };
     n.prototype.beginFill = function(a) {
       this.ensurePathCapacities(1, 0);
       this.commands[this.commandsPosition++] = 1;
       this.styles.writeUnsignedInt(a);
       this.hasFills = !0;
@@ -4191,82 +4194,82 @@ var __extends = this.__extends || functi
     n.prototype.endFill = function() {
       this.ensurePathCapacities(1, 0);
       this.commands[this.commandsPosition++] = 4;
     };
     n.prototype.endLine = function() {
       this.ensurePathCapacities(1, 0);
       this.commands[this.commandsPosition++] = 8;
     };
-    n.prototype.lineStyle = function(a, h, c, l, n, m, s) {
+    n.prototype.lineStyle = function(a, h, p, c, n, m, s) {
       this.ensurePathCapacities(2, 0);
       this.commands[this.commandsPosition++] = 5;
       this.coordinates[this.coordinatesPosition++] = a;
       a = this.styles;
       a.writeUnsignedInt(h);
-      a.writeBoolean(c);
-      a.writeUnsignedByte(l);
+      a.writeBoolean(p);
+      a.writeUnsignedByte(c);
       a.writeUnsignedByte(n);
       a.writeUnsignedByte(m);
       a.writeUnsignedByte(s);
       this.hasLines = !0;
     };
     n.prototype.writeMorphLineStyle = function(a, h) {
       this.morphCoordinates[this.coordinatesPosition - 1] = a;
       this.morphStyles.writeUnsignedInt(h);
     };
-    n.prototype.beginBitmap = function(a, h, c, l, n) {
+    n.prototype.beginBitmap = function(a, h, p, c, n) {
       this.ensurePathCapacities(1, 0);
       this.commands[this.commandsPosition++] = a;
       a = this.styles;
       a.writeUnsignedInt(h);
-      this._writeStyleMatrix(c, !1);
-      a.writeBoolean(l);
+      this._writeStyleMatrix(p, !1);
+      a.writeBoolean(c);
       a.writeBoolean(n);
       this.hasFills = !0;
     };
     n.prototype.writeMorphBitmap = function(a) {
       this._writeStyleMatrix(a, !0);
     };
-    n.prototype.beginGradient = function(a, h, c, l, n, m, s, f) {
+    n.prototype.beginGradient = function(a, h, p, c, n, m, s, g) {
       this.ensurePathCapacities(1, 0);
       this.commands[this.commandsPosition++] = a;
       a = this.styles;
-      a.writeUnsignedByte(l);
-      a.writeShort(f);
+      a.writeUnsignedByte(c);
+      a.writeShort(g);
       this._writeStyleMatrix(n, !1);
-      l = h.length;
-      a.writeByte(l);
-      for (n = 0;n < l;n++) {
-        a.writeUnsignedByte(c[n]), a.writeUnsignedInt(h[n]);
+      c = h.length;
+      a.writeByte(c);
+      for (n = 0;n < c;n++) {
+        a.writeUnsignedByte(p[n]), a.writeUnsignedInt(h[n]);
       }
       a.writeUnsignedByte(m);
       a.writeUnsignedByte(s);
       this.hasFills = !0;
     };
-    n.prototype.writeMorphGradient = function(a, h, c) {
-      this._writeStyleMatrix(c, !0);
-      c = this.morphStyles;
-      for (var l = 0;l < a.length;l++) {
-        c.writeUnsignedByte(h[l]), c.writeUnsignedInt(a[l]);
+    n.prototype.writeMorphGradient = function(a, h, p) {
+      this._writeStyleMatrix(p, !0);
+      p = this.morphStyles;
+      for (var c = 0;c < a.length;c++) {
+        p.writeUnsignedByte(h[c]), p.writeUnsignedInt(a[c]);
       }
     };
     n.prototype.writeCommandAndCoordinates = function(a, h, c) {
       this.ensurePathCapacities(1, 2);
       this.commands[this.commandsPosition++] = a;
       this.coordinates[this.coordinatesPosition++] = h;
       this.coordinates[this.coordinatesPosition++] = c;
     };
     n.prototype.writeCoordinates = function(a, h) {
       this.ensurePathCapacities(0, 2);
       this.coordinates[this.coordinatesPosition++] = a;
       this.coordinates[this.coordinatesPosition++] = h;
     };
     n.prototype.writeMorphCoordinates = function(a, h) {
-      this.morphCoordinates = f(this.morphCoordinates, this.coordinatesPosition);
+      this.morphCoordinates = g(this.morphCoordinates, this.coordinatesPosition);
       this.morphCoordinates[this.coordinatesPosition - 2] = a;
       this.morphCoordinates[this.coordinatesPosition - 1] = h;
     };
     n.prototype.clear = function() {
       this.commandsPosition = this.coordinatesPosition = 0;
       this.commands = new Uint8Array(32);
       this.coordinates = new Int32Array(128);
       this.styles = new r(16);
@@ -4297,26 +4300,26 @@ var __extends = this.__extends || functi
       this.morphCoordinates && a.push(this.morphCoordinates.buffer);
       this.morphStyles && a.push(this.morphStyles.buffer);
       return a;
     }, enumerable:!0, configurable:!0});
     n.prototype._writeStyleMatrix = function(a, h) {
       (h ? this.morphStyles : this.styles).write6Floats(a.a, a.b, a.c, a.d, a.tx, a.ty);
     };
     n.prototype.ensurePathCapacities = function(a, h) {
-      this.commands = f(this.commands, this.commandsPosition + a);
-      this.coordinates = f(this.coordinates, this.coordinatesPosition + h);
+      this.commands = g(this.commands, this.commandsPosition + a);
+      this.coordinates = g(this.coordinates, this.coordinatesPosition + h);
     };
     return n;
   }();
   k.ShapeData = t;
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       (function(c) {
         c[c.CODE_END = 0] = "CODE_END";
         c[c.CODE_SHOW_FRAME = 1] = "CODE_SHOW_FRAME";
         c[c.CODE_DEFINE_SHAPE = 2] = "CODE_DEFINE_SHAPE";
         c[c.CODE_FREE_CHARACTER = 3] = "CODE_FREE_CHARACTER";
         c[c.CODE_PLACE_OBJECT = 4] = "CODE_PLACE_OBJECT";
         c[c.CODE_REMOVE_OBJECT = 5] = "CODE_REMOVE_OBJECT";
         c[c.CODE_DEFINE_BITS = 6] = "CODE_DEFINE_BITS";
@@ -4392,17 +4395,17 @@ var __extends = this.__extends || functi
         c[c.CODE_DEFINE_SHAPE4 = 83] = "CODE_DEFINE_SHAPE4";
         c[c.CODE_DEFINE_MORPH_SHAPE2 = 84] = "CODE_DEFINE_MORPH_SHAPE2";
         c[c.CODE_DEFINE_SCENE_AND_FRAME_LABEL_DATA = 86] = "CODE_DEFINE_SCENE_AND_FRAME_LABEL_DATA";
         c[c.CODE_DEFINE_BINARY_DATA = 87] = "CODE_DEFINE_BINARY_DATA";
         c[c.CODE_DEFINE_FONT_NAME = 88] = "CODE_DEFINE_FONT_NAME";
         c[c.CODE_START_SOUND2 = 89] = "CODE_START_SOUND2";
         c[c.CODE_DEFINE_BITS_JPEG4 = 90] = "CODE_DEFINE_BITS_JPEG4";
         c[c.CODE_DEFINE_FONT4 = 91] = "CODE_DEFINE_FONT4";
-      })(f.SwfTag || (f.SwfTag = {}));
+      })(g.SwfTag || (g.SwfTag = {}));
       (function(c) {
         c[c.CODE_DEFINE_SHAPE = 2] = "CODE_DEFINE_SHAPE";
         c[c.CODE_DEFINE_BITS = 6] = "CODE_DEFINE_BITS";
         c[c.CODE_DEFINE_BUTTON = 7] = "CODE_DEFINE_BUTTON";
         c[c.CODE_DEFINE_FONT = 10] = "CODE_DEFINE_FONT";
         c[c.CODE_DEFINE_TEXT = 11] = "CODE_DEFINE_TEXT";
         c[c.CODE_DEFINE_SOUND = 14] = "CODE_DEFINE_SOUND";
         c[c.CODE_DEFINE_BITS_LOSSLESS = 20] = "CODE_DEFINE_BITS_LOSSLESS";
@@ -4412,46 +4415,45 @@ var __extends = this.__extends || functi
         c[c.CODE_DEFINE_TEXT2 = 33] = "CODE_DEFINE_TEXT2";
         c[c.CODE_DEFINE_BUTTON2 = 34] = "CODE_DEFINE_BUTTON2";
         c[c.CODE_DEFINE_BITS_JPEG3 = 35] = "CODE_DEFINE_BITS_JPEG3";
         c[c.CODE_DEFINE_BITS_LOSSLESS2 = 36] = "CODE_DEFINE_BITS_LOSSLESS2";
         c[c.CODE_DEFINE_EDIT_TEXT = 37] = "CODE_DEFINE_EDIT_TEXT";
         c[c.CODE_DEFINE_SPRITE = 39] = "CODE_DEFINE_SPRITE";
         c[c.CODE_DEFINE_MORPH_SHAPE = 46] = "CODE_DEFINE_MORPH_SHAPE";
         c[c.CODE_DEFINE_FONT2 = 48] = "CODE_DEFINE_FONT2";
-        c[c.CODE_DEFINE_VIDEO_STREAM = 60] = "CODE_DEFINE_VIDEO_STREAM";
         c[c.CODE_DEFINE_FONT3 = 75] = "CODE_DEFINE_FONT3";
         c[c.CODE_DEFINE_SHAPE4 = 83] = "CODE_DEFINE_SHAPE4";
         c[c.CODE_DEFINE_MORPH_SHAPE2 = 84] = "CODE_DEFINE_MORPH_SHAPE2";
         c[c.CODE_DEFINE_BINARY_DATA = 87] = "CODE_DEFINE_BINARY_DATA";
         c[c.CODE_DEFINE_BITS_JPEG4 = 90] = "CODE_DEFINE_BITS_JPEG4";
         c[c.CODE_DEFINE_FONT4 = 91] = "CODE_DEFINE_FONT4";
-      })(f.DefinitionTags || (f.DefinitionTags = {}));
+      })(g.DefinitionTags || (g.DefinitionTags = {}));
       (function(c) {
         c[c.CODE_DEFINE_BITS = 6] = "CODE_DEFINE_BITS";
         c[c.CODE_DEFINE_BITS_JPEG2 = 21] = "CODE_DEFINE_BITS_JPEG2";
         c[c.CODE_DEFINE_BITS_JPEG3 = 35] = "CODE_DEFINE_BITS_JPEG3";
         c[c.CODE_DEFINE_BITS_JPEG4 = 90] = "CODE_DEFINE_BITS_JPEG4";
-      })(f.ImageDefinitionTags || (f.ImageDefinitionTags = {}));
+      })(g.ImageDefinitionTags || (g.ImageDefinitionTags = {}));
       (function(c) {
         c[c.CODE_DEFINE_FONT = 10] = "CODE_DEFINE_FONT";
         c[c.CODE_DEFINE_FONT2 = 48] = "CODE_DEFINE_FONT2";
         c[c.CODE_DEFINE_FONT3 = 75] = "CODE_DEFINE_FONT3";
         c[c.CODE_DEFINE_FONT4 = 91] = "CODE_DEFINE_FONT4";
-      })(f.FontDefinitionTags || (f.FontDefinitionTags = {}));
+      })(g.FontDefinitionTags || (g.FontDefinitionTags = {}));
       (function(c) {
         c[c.CODE_PLACE_OBJECT = 4] = "CODE_PLACE_OBJECT";
         c[c.CODE_PLACE_OBJECT2 = 26] = "CODE_PLACE_OBJECT2";
         c[c.CODE_PLACE_OBJECT3 = 70] = "CODE_PLACE_OBJECT3";
         c[c.CODE_REMOVE_OBJECT = 5] = "CODE_REMOVE_OBJECT";
         c[c.CODE_REMOVE_OBJECT2 = 28] = "CODE_REMOVE_OBJECT2";
         c[c.CODE_START_SOUND = 15] = "CODE_START_SOUND";
         c[c.CODE_START_SOUND2 = 89] = "CODE_START_SOUND2";
         c[c.CODE_VIDEO_FRAME = 61] = "CODE_VIDEO_FRAME";
-      })(f.ControlTags || (f.ControlTags = {}));
+      })(g.ControlTags || (g.ControlTags = {}));
       (function(c) {
         c[c.Move = 1] = "Move";
         c[c.HasCharacter = 2] = "HasCharacter";
         c[c.HasMatrix = 4] = "HasMatrix";
         c[c.HasColorTransform = 8] = "HasColorTransform";
         c[c.HasRatio = 16] = "HasRatio";
         c[c.HasName = 32] = "HasName";
         c[c.HasClipDepth = 64] = "HasClipDepth";
@@ -4459,17 +4461,17 @@ var __extends = this.__extends || functi
         c[c.HasFilterList = 256] = "HasFilterList";
         c[c.HasBlendMode = 512] = "HasBlendMode";
         c[c.HasCacheAsBitmap = 1024] = "HasCacheAsBitmap";
         c[c.HasClassName = 2048] = "HasClassName";
         c[c.HasImage = 4096] = "HasImage";
         c[c.HasVisible = 8192] = "HasVisible";
         c[c.OpaqueBackground = 16384] = "OpaqueBackground";
         c[c.Reserved = 32768] = "Reserved";
-      })(f.PlaceObjectFlags || (f.PlaceObjectFlags = {}));
+      })(g.PlaceObjectFlags || (g.PlaceObjectFlags = {}));
       (function(c) {
         c[c.Load = 1] = "Load";
         c[c.EnterFrame = 2] = "EnterFrame";
         c[c.Unload = 4] = "Unload";
         c[c.MouseMove = 8] = "MouseMove";
         c[c.MouseDown = 16] = "MouseDown";
         c[c.MouseUp = 32] = "MouseUp";
         c[c.KeyDown = 64] = "KeyDown";
@@ -4480,22 +4482,22 @@ var __extends = this.__extends || functi
         c[c.Release = 2048] = "Release";
         c[c.ReleaseOutside = 4096] = "ReleaseOutside";
         c[c.RollOver = 8192] = "RollOver";
         c[c.RollOut = 16384] = "RollOut";
         c[c.DragOver = 32768] = "DragOver";
         c[c.DragOut = 65536] = "DragOut";
         c[c.KeyPress = 131072] = "KeyPress";
         c[c.Construct = 262144] = "Construct";
-      })(f.AVM1ClipEvents || (f.AVM1ClipEvents = {}));
+      })(g.AVM1ClipEvents || (g.AVM1ClipEvents = {}));
     })(k.Parser || (k.Parser = {}));
   })(k.SWF || (k.SWF = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
-  var r = k.Debug.unexpected, f = function() {
+  var r = k.Debug.unexpected, g = function() {
     function c(c, n, a, h) {
       this.url = c;
       this.method = n;
       this.mimeType = a;
       this.data = h;
     }
     c.prototype.readAll = function(c, n) {
       var a = this.url, h = new XMLHttpRequest({mozSystem:!0});
@@ -4505,175 +4507,175 @@ var __extends = this.__extends || functi
         c(h.response, a.loaded, a.total);
       });
       h.onreadystatechange = function(c) {
         4 === h.readyState && (200 !== h.status && 0 !== h.status || null === h.response ? (r("Path: " + a + " not found."), n(null, h.statusText)) : n(h.response));
       };
       this.mimeType && h.setRequestHeader("Content-Type", this.mimeType);
       h.send(this.data || null);
     };
-    c.prototype.readChunked = function(c, n, a, h, q, l) {
+    c.prototype.readChunked = function(c, n, a, h, p, l) {
       if (0 >= c) {
-        this.readAsync(n, a, h, q, l);
+        this.readAsync(n, a, h, p, l);
       } else {
-        var f = 0, m = new Uint8Array(c), s = 0, k;
+        var g = 0, m = new Uint8Array(c), s = 0, k;
         this.readAsync(function(d, e) {
           k = e.total;
-          for (var b = d.length, g = 0;f + b >= c;) {
-            var p = c - f;
-            m.set(d.subarray(g, g + p), f);
-            g += p;
-            b -= p;
+          for (var b = d.length, f = 0;g + b >= c;) {
+            var a = c - g;
+            m.set(d.subarray(f, f + a), g);
+            f += a;
+            b -= a;
             s += c;
             n(m, {loaded:s, total:k});
-            f = 0;
-          }
-          m.set(d.subarray(g), f);
-          f += b;
+            g = 0;
+          }
+          m.set(d.subarray(f), g);
+          g += b;
         }, a, h, function() {
-          0 < f && (s += f, n(m.subarray(0, f), {loaded:s, total:k}), f = 0);
-          q && q();
+          0 < g && (s += g, n(m.subarray(0, g), {loaded:s, total:k}), g = 0);
+          p && p();
         }, l);
       }
     };
-    c.prototype.readAsync = function(c, n, a, h, q) {
-      var l = new XMLHttpRequest({mozSystem:!0}), f = this.url, m = 0, s = 0;
-      l.open(this.method || "GET", f, !0);
+    c.prototype.readAsync = function(c, n, a, h, p) {
+      var l = new XMLHttpRequest({mozSystem:!0}), g = this.url, m = 0, s = 0;
+      l.open(this.method || "GET", g, !0);
       l.responseType = "moz-chunked-arraybuffer";
       var k = "moz-chunked-arraybuffer" !== l.responseType;
       k && (l.responseType = "arraybuffer");
       l.onprogress = function(d) {
         k || (m = d.loaded, s = d.total, c(new Uint8Array(l.response), {loaded:m, total:s}));
       };
       l.onreadystatechange = function(d) {
-        2 === l.readyState && q && q(f, l.status, l.getAllResponseHeaders());
+        2 === l.readyState && p && p(g, l.status, l.getAllResponseHeaders());
         4 === l.readyState && (200 !== l.status && 0 !== l.status || null === l.response && (0 === s || m !== s) ? n(l.statusText) : (k && (d = l.response, c(new Uint8Array(d), {loaded:0, total:d.byteLength})), h && h()));
       };
       this.mimeType && l.setRequestHeader("Content-Type", this.mimeType);
       l.send(this.data || null);
       a && a();
     };
     return c;
   }();
-  k.BinaryFileReader = f;
+  k.BinaryFileReader = g;
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
-      f[f.Objects = 0] = "Objects";
-      f[f.References = 1] = "References";
+    (function(g) {
+      g[g.Objects = 0] = "Objects";
+      g[g.References = 1] = "References";
     })(k.RemotingPhase || (k.RemotingPhase = {}));
-    (function(f) {
-      f[f.HasMatrix = 1] = "HasMatrix";
-      f[f.HasBounds = 2] = "HasBounds";
-      f[f.HasChildren = 4] = "HasChildren";
-      f[f.HasColorTransform = 8] = "HasColorTransform";
-      f[f.HasClipRect = 16] = "HasClipRect";
-      f[f.HasMiscellaneousProperties = 32] = "HasMiscellaneousProperties";
-      f[f.HasMask = 64] = "HasMask";
-      f[f.HasClip = 128] = "HasClip";
+    (function(g) {
+      g[g.HasMatrix = 1] = "HasMatrix";
+      g[g.HasBounds = 2] = "HasBounds";
+      g[g.HasChildren = 4] = "HasChildren";
+      g[g.HasColorTransform = 8] = "HasColorTransform";
+      g[g.HasClipRect = 16] = "HasClipRect";
+      g[g.HasMiscellaneousProperties = 32] = "HasMiscellaneousProperties";
+      g[g.HasMask = 64] = "HasMask";
+      g[g.HasClip = 128] = "HasClip";
     })(k.MessageBits || (k.MessageBits = {}));
-    (function(f) {
-      f[f.None = 0] = "None";
-      f[f.Asset = 134217728] = "Asset";
+    (function(g) {
+      g[g.None = 0] = "None";
+      g[g.Asset = 134217728] = "Asset";
     })(k.IDMask || (k.IDMask = {}));
-    (function(f) {
-      f[f.EOF = 0] = "EOF";
-      f[f.UpdateFrame = 100] = "UpdateFrame";
-      f[f.UpdateGraphics = 101] = "UpdateGraphics";
-      f[f.UpdateBitmapData = 102] = "UpdateBitmapData";
-      f[f.UpdateTextContent = 103] = "UpdateTextContent";
-      f[f.UpdateStage = 104] = "UpdateStage";
-      f[f.UpdateNetStream = 105] = "UpdateNetStream";
-      f[f.RequestBitmapData = 106] = "RequestBitmapData";
-      f[f.DrawToBitmap = 200] = "DrawToBitmap";
-      f[f.MouseEvent = 300] = "MouseEvent";
-      f[f.KeyboardEvent = 301] = "KeyboardEvent";
-      f[f.FocusEvent = 302] = "FocusEvent";
+    (function(g) {
+      g[g.EOF = 0] = "EOF";
+      g[g.UpdateFrame = 100] = "UpdateFrame";
+      g[g.UpdateGraphics = 101] = "UpdateGraphics";
+      g[g.UpdateBitmapData = 102] = "UpdateBitmapData";
+      g[g.UpdateTextContent = 103] = "UpdateTextContent";
+      g[g.UpdateStage = 104] = "UpdateStage";
+      g[g.UpdateNetStream = 105] = "UpdateNetStream";
+      g[g.RequestBitmapData = 106] = "RequestBitmapData";
+      g[g.DrawToBitmap = 200] = "DrawToBitmap";
+      g[g.MouseEvent = 300] = "MouseEvent";
+      g[g.KeyboardEvent = 301] = "KeyboardEvent";
+      g[g.FocusEvent = 302] = "FocusEvent";
     })(k.MessageTag || (k.MessageTag = {}));
-    (function(f) {
-      f[f.Blur = 0] = "Blur";
-      f[f.DropShadow = 1] = "DropShadow";
+    (function(g) {
+      g[g.Blur = 0] = "Blur";
+      g[g.DropShadow = 1] = "DropShadow";
     })(k.FilterType || (k.FilterType = {}));
-    (function(f) {
-      f[f.Identity = 0] = "Identity";
-      f[f.AlphaMultiplierOnly = 1] = "AlphaMultiplierOnly";
-      f[f.All = 2] = "All";
+    (function(g) {
+      g[g.Identity = 0] = "Identity";
+      g[g.AlphaMultiplierOnly = 1] = "AlphaMultiplierOnly";
+      g[g.All = 2] = "All";
     })(k.ColorTransformEncoding || (k.ColorTransformEncoding = {}));
-    (function(f) {
-      f[f.Initialized = 0] = "Initialized";
-      f[f.Metadata = 1] = "Metadata";
-      f[f.PlayStart = 2] = "PlayStart";
-      f[f.PlayStop = 3] = "PlayStop";
-      f[f.BufferEmpty = 4] = "BufferEmpty";
-      f[f.BufferFull = 5] = "BufferFull";
-      f[f.Pause = 6] = "Pause";
-      f[f.Unpause = 7] = "Unpause";
-      f[f.Seeking = 8] = "Seeking";
-      f[f.Seeked = 9] = "Seeked";
-      f[f.Progress = 10] = "Progress";
-      f[f.Error = 11] = "Error";
+    (function(g) {
+      g[g.Initialized = 0] = "Initialized";
+      g[g.Metadata = 1] = "Metadata";
+      g[g.PlayStart = 2] = "PlayStart";
+      g[g.PlayStop = 3] = "PlayStop";
+      g[g.BufferEmpty = 4] = "BufferEmpty";
+      g[g.BufferFull = 5] = "BufferFull";
+      g[g.Pause = 6] = "Pause";
+      g[g.Unpause = 7] = "Unpause";
+      g[g.Seeking = 8] = "Seeking";
+      g[g.Seeked = 9] = "Seeked";
+      g[g.Progress = 10] = "Progress";
+      g[g.Error = 11] = "Error";
     })(k.VideoPlaybackEvent || (k.VideoPlaybackEvent = {}));
-    (function(f) {
-      f[f.Init = 1] = "Init";
-      f[f.Pause = 2] = "Pause";
-      f[f.Seek = 3] = "Seek";
-      f[f.GetTime = 4] = "GetTime";
-      f[f.GetBufferLength = 5] = "GetBufferLength";
-      f[f.SetSoundLevels = 6] = "SetSoundLevels";
-      f[f.GetBytesLoaded = 7] = "GetBytesLoaded";
-      f[f.GetBytesTotal = 8] = "GetBytesTotal";
-      f[f.EnsurePlaying = 9] = "EnsurePlaying";
+    (function(g) {
+      g[g.Init = 1] = "Init";
+      g[g.Pause = 2] = "Pause";
+      g[g.Seek = 3] = "Seek";
+      g[g.GetTime = 4] = "GetTime";
+      g[g.GetBufferLength = 5] = "GetBufferLength";
+      g[g.SetSoundLevels = 6] = "SetSoundLevels";
+      g[g.GetBytesLoaded = 7] = "GetBytesLoaded";
+      g[g.GetBytesTotal = 8] = "GetBytesTotal";
+      g[g.EnsurePlaying = 9] = "EnsurePlaying";
     })(k.VideoControlEvent || (k.VideoControlEvent = {}));
-    (function(f) {
-      f[f.ShowAll = 0] = "ShowAll";
-      f[f.ExactFit = 1] = "ExactFit";
-      f[f.NoBorder = 2] = "NoBorder";
-      f[f.NoScale = 4] = "NoScale";
+    (function(g) {
+      g[g.ShowAll = 0] = "ShowAll";
+      g[g.ExactFit = 1] = "ExactFit";
+      g[g.NoBorder = 2] = "NoBorder";
+      g[g.NoScale = 4] = "NoScale";
     })(k.StageScaleMode || (k.StageScaleMode = {}));
-    (function(f) {
-      f[f.None = 0] = "None";
-      f[f.Top = 1] = "Top";
-      f[f.Bottom = 2] = "Bottom";
-      f[f.Left = 4] = "Left";
-      f[f.Right = 8] = "Right";
-      f[f.TopLeft = f.Top | f.Left] = "TopLeft";
-      f[f.BottomLeft = f.Bottom | f.Left] = "BottomLeft";
-      f[f.BottomRight = f.Bottom | f.Right] = "BottomRight";
-      f[f.TopRight = f.Top | f.Right] = "TopRight";
+    (function(g) {
+      g[g.None = 0] = "None";
+      g[g.Top = 1] = "Top";
+      g[g.Bottom = 2] = "Bottom";
+      g[g.Left = 4] = "Left";
+      g[g.Right = 8] = "Right";
+      g[g.TopLeft = g.Top | g.Left] = "TopLeft";
+      g[g.BottomLeft = g.Bottom | g.Left] = "BottomLeft";
+      g[g.BottomRight = g.Bottom | g.Right] = "BottomRight";
+      g[g.TopRight = g.Top | g.Right] = "TopRight";
     })(k.StageAlignFlags || (k.StageAlignFlags = {}));
     k.MouseEventNames = "click dblclick mousedown mousemove mouseup mouseover mouseout".split(" ");
     k.KeyboardEventNames = ["keydown", "keypress", "keyup"];
-    (function(f) {
-      f[f.CtrlKey = 1] = "CtrlKey";
-      f[f.AltKey = 2] = "AltKey";
-      f[f.ShiftKey = 4] = "ShiftKey";
+    (function(g) {
+      g[g.CtrlKey = 1] = "CtrlKey";
+      g[g.AltKey = 2] = "AltKey";
+      g[g.ShiftKey = 4] = "ShiftKey";
     })(k.KeyboardEventFlags || (k.KeyboardEventFlags = {}));
-    (function(f) {
-      f[f.DocumentHidden = 0] = "DocumentHidden";
-      f[f.DocumentVisible = 1] = "DocumentVisible";
-      f[f.WindowBlur = 2] = "WindowBlur";
-      f[f.WindowFocus = 3] = "WindowFocus";
+    (function(g) {
+      g[g.DocumentHidden = 0] = "DocumentHidden";
+      g[g.DocumentVisible = 1] = "DocumentVisible";
+      g[g.WindowBlur = 2] = "WindowBlur";
+      g[g.WindowFocus = 3] = "WindowFocus";
     })(k.FocusEventType || (k.FocusEventType = {}));
   })(k.Remoting || (k.Remoting = {}));
 })(Shumway || (Shumway = {}));
 var throwError, Errors;
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       var c = function() {
         function c() {
         }
         c.toRGBA = function(a, h, c, l) {
           void 0 === l && (l = 1);
           return "rgba(" + a + "," + h + "," + c + "," + l + ")";
         };
         return c;
       }();
-      f.UI = c;
+      g.UI = c;
       var k = function() {
         function n() {
         }
         n.prototype.tabToolbar = function(a) {
           void 0 === a && (a = 1);
           return c.toRGBA(37, 44, 51, a);
         };
         n.prototype.toolbars = function(a) {
@@ -4753,17 +4755,17 @@ var throwError, Errors;
           return c.toRGBA(112, 191, 83, a);
         };
         n.prototype.blueGreyHighlight = function(a) {
           void 0 === a && (a = 1);
           return c.toRGBA(94, 136, 176, a);
         };
         return n;
       }();
-      f.UIThemeDark = k;
+      g.UIThemeDark = k;
       k = function() {
         function n() {
         }
         n.prototype.tabToolbar = function(a) {
           void 0 === a && (a = 1);
           return c.toRGBA(235, 236, 237, a);
         };
         n.prototype.toolbars = function(a) {
@@ -4843,23 +4845,23 @@ var throwError, Errors;
           return c.toRGBA(44, 187, 15, a);
         };
         n.prototype.blueGreyHighlight = function(a) {
           void 0 === a && (a = 1);
           return c.toRGBA(95, 136, 176, a);
         };
         return n;
       }();
-      f.UIThemeLight = k;
+      g.UIThemeLight = k;
     })(k.Theme || (k.Theme = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       var c = function() {
         function c(n, a) {
           this._buffers = n || [];
           this._snapshots = [];
           this._windowStart = this._startTime = a;
           this._maxDepth = 0;
         }
         c.prototype.addBuffer = function(c) {
@@ -4920,40 +4922,40 @@ var throwError, Errors;
           this._windowStart = c;
           this._windowEnd = a;
         };
         c.prototype.moveWindowTo = function(c) {
           this.setWindow(c - this.windowLength / 2, c + this.windowLength / 2);
         };
         return c;
       }();
-      f.Profile = c;
+      g.Profile = c;
     })(k.Profiler || (k.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 __extends = this.__extends || function(k, r) {
-  function f() {
+  function g() {
     this.constructor = k;
   }
   for (var c in r) {
     r.hasOwnProperty(c) && (k[c] = r[c]);
   }
-  f.prototype = r.prototype;
-  k.prototype = new f;
+  g.prototype = r.prototype;
+  k.prototype = new g;
 };
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       var c = function() {
         return function(c) {
           this.kind = c;
           this.totalTime = this.selfTime = this.count = 0;
         };
       }();
-      f.TimelineFrameStatistics = c;
+      g.TimelineFrameStatistics = c;
       var k = function() {
         function n(a, h, c, l, n, m) {
           this.parent = a;
           this.kind = h;
           this.startData = c;
           this.endData = l;
           this.startTime = n;
           this.endTime = m;
@@ -5058,24 +5060,24 @@ var throwError, Errors;
         };
         n.prototype.getDepth = function() {
           for (var a = 0, h = this;h;) {
             a++, h = h.parent;
           }
           return a;
         };
         n.prototype.calculateStatistics = function() {
-          function a(q) {
-            if (q.kind) {
-              var l = h[q.kind.id] || (h[q.kind.id] = new c(q.kind));
+          function a(p) {
+            if (p.kind) {
+              var l = h[p.kind.id] || (h[p.kind.id] = new c(p.kind));
               l.count++;
-              l.selfTime += q.selfTime;
-              l.totalTime += q.totalTime;
-            }
-            q.children && q.children.forEach(a);
+              l.selfTime += p.selfTime;
+              l.totalTime += p.totalTime;
+            }
+            p.children && p.children.forEach(a);
           }
           var h = this.statistics = [];
           a(this);
         };
         n.prototype.trace = function(a) {
           var h = (this.kind ? this.kind.name + ": " : "Profile: ") + (this.endTime - this.startTime).toFixed(2);
           if (this.children && this.children.length) {
             a.enter(h);
@@ -5084,32 +5086,32 @@ var throwError, Errors;
             }
             a.outdent();
           } else {
             a.writeLn(h);
           }
         };
         return n;
       }();
-      f.TimelineFrame = k;
+      g.TimelineFrame = k;
       k = function(c) {
         function a(a) {
           c.call(this, null, null, null, null, NaN, NaN);
           this.name = a;
         }
         __extends(a, c);
         return a;
       }(k);
-      f.TimelineBufferSnapshot = k;
+      g.TimelineBufferSnapshot = k;
     })(k.Profiler || (k.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = function() {
         function c(n, a) {
           void 0 === n && (n = "");
           this.name = n || "";
           this._startTime = k.isNullOrUndefined(a) ? jsGlobal.START_TIME : a;
         }
         c.prototype.getKind = function(c) {
           return this._kinds[c];
@@ -5140,60 +5142,60 @@ var throwError, Errors;
               a = c.MAX_KINDID;
             }
           } else {
             a = this._kindNameMap[n].id;
           }
           return a;
         };
         c.prototype._getMark = function(n, a, h) {
-          var q = c.MAX_DATAID;
-          k.isNullOrUndefined(h) || a === c.MAX_KINDID || (q = this._data.length, q < c.MAX_DATAID ? this._data.push(h) : q = c.MAX_DATAID);
-          return n | q << 16 | a;
+          var p = c.MAX_DATAID;
+          k.isNullOrUndefined(h) || a === c.MAX_KINDID || (p = this._data.length, p < c.MAX_DATAID ? this._data.push(h) : p = c.MAX_DATAID);
+          return n | p << 16 | a;
         };
         c.prototype.enter = function(n, a, h) {
           h = (k.isNullOrUndefined(h) ? performance.now() : h) - this._startTime;
           this._marks || this._initialize();
           this._depth++;
           n = this._getKindId(n);
           this._marks.write(this._getMark(c.ENTER, n, a));
           this._times.write(h);
           this._stack.push(n);
         };
         c.prototype.leave = function(n, a, h) {
           h = (k.isNullOrUndefined(h) ? performance.now() : h) - this._startTime;
-          var q = this._stack.pop();
-          n && (q = this._getKindId(n));
-          this._marks.write(this._getMark(c.LEAVE, q, a));
+          var p = this._stack.pop();
+          n && (p = this._getKindId(n));
+          this._marks.write(this._getMark(c.LEAVE, p, a));
           this._times.write(h);
           this._depth--;
         };
         c.prototype.count = function(c, a, h) {
         };
         c.prototype.createSnapshot = function() {
           var n;
           void 0 === n && (n = Number.MAX_VALUE);
           if (!this._marks) {
             return null;
           }
-          var a = this._times, h = this._kinds, q = this._data, l = new f.TimelineBufferSnapshot(this.name), v = [l], m = 0;
+          var a = this._times, h = this._kinds, p = this._data, l = new g.TimelineBufferSnapshot(this.name), u = [l], m = 0;
           this._marks || this._initialize();
-          this._marks.forEachInReverse(function(l, w) {
-            var d = q[l >>> 16 & c.MAX_DATAID], e = h[l & c.MAX_KINDID];
+          this._marks.forEachInReverse(function(l, v) {
+            var d = p[l >>> 16 & c.MAX_DATAID], e = h[l & c.MAX_KINDID];
             if (k.isNullOrUndefined(e) || e.visible) {
-              var b = l & 2147483648, g = a.get(w), p = v.length;
+              var b = l & 2147483648, f = a.get(v), q = u.length;
               if (b === c.LEAVE) {
-                if (1 === p && (m++, m > n)) {
+                if (1 === q && (m++, m > n)) {
                   return!0;
                 }
-                v.push(new f.TimelineFrame(v[p - 1], e, null, d, NaN, g));
+                u.push(new g.TimelineFrame(u[q - 1], e, null, d, NaN, f));
               } else {
                 if (b === c.ENTER) {
-                  if (e = v.pop(), b = v[v.length - 1]) {
-                    for (b.children ? b.children.unshift(e) : b.children = [e], b = v.length, e.depth = b, e.startData = d, e.startTime = g;e;) {
+                  if (e = u.pop(), b = u[u.length - 1]) {
+                    for (b.children ? b.children.unshift(e) : b.children = [e], b = u.length, e.depth = b, e.startData = d, e.startTime = f;e;) {
                       if (e.maxDepth < b) {
                         e.maxDepth = b, e = e.parent;
                       } else {
                         break;
                       }
                     }
                   } else {
                     return!0;
@@ -5205,56 +5207,56 @@ var throwError, Errors;
           l.children && l.children.length && (l.startTime = l.children[0].startTime, l.endTime = l.children[l.children.length - 1].endTime);
           return l;
         };
         c.prototype.reset = function(c) {
           this._startTime = k.isNullOrUndefined(c) ? performance.now() : c;
           this._marks ? (this._depth = 0, this._data = [], this._marks.reset(), this._times.reset()) : this._initialize();
         };
         c.FromFirefoxProfile = function(n, a) {
-          for (var h = n.profile.threads[0].samples, q = new c(a, h[0].time), l = [], f, m = 0;m < h.length;m++) {
-            f = h[m];
-            var s = f.time, k = f.frames, d = 0;
-            for (f = Math.min(k.length, l.length);d < f && k[d].location === l[d].location;) {
+          for (var h = n.profile.threads[0].samples, p = new c(a, h[0].time), l = [], g, m = 0;m < h.length;m++) {
+            g = h[m];
+            var s = g.time, k = g.frames, d = 0;
+            for (g = Math.min(k.length, l.length);d < g && k[d].location === l[d].location;) {
               d++;
             }
             for (var e = l.length - d, b = 0;b < e;b++) {
-              f = l.pop(), q.leave(f.location, null, s);
+              g = l.pop(), p.leave(g.location, null, s);
             }
             for (;d < k.length;) {
-              f = k[d++], q.enter(f.location, null, s);
+              g = k[d++], p.enter(g.location, null, s);
             }
             l = k;
           }
-          for (;f = l.pop();) {
-            q.leave(f.location, null, s);
-          }
-          return q;
+          for (;g = l.pop();) {
+            p.leave(g.location, null, s);
+          }
+          return p;
         };
         c.FromChromeProfile = function(n, a) {
-          var h = n.timestamps, q = n.samples, l = new c(a, h[0] / 1E3), f = [], m = {}, s;
+          var h = n.timestamps, p = n.samples, l = new c(a, h[0] / 1E3), g = [], m = {}, s;
           c._resolveIds(n.head, m);
           for (var k = 0;k < h.length;k++) {
             var d = h[k] / 1E3, e = [];
-            for (s = m[q[k]];s;) {
+            for (s = m[p[k]];s;) {
               e.unshift(s), s = s.parent;
             }
             var b = 0;
-            for (s = Math.min(e.length, f.length);b < s && e[b] === f[b];) {
+            for (s = Math.min(e.length, g.length);b < s && e[b] === g[b];) {
               b++;
             }
-            for (var g = f.length - b, p = 0;p < g;p++) {
-              s = f.pop(), l.leave(s.functionName, null, d);
+            for (var f = g.length - b, q = 0;q < f;q++) {
+              s = g.pop(), l.leave(s.functionName, null, d);
             }
             for (;b < e.length;) {
               s = e[b++], l.enter(s.functionName, null, d);
             }
-            f = e;
-          }
-          for (;s = f.pop();) {
+            g = e;
+          }
+          for (;s = g.pop();) {
             l.leave(s.functionName, null, d);
           }
           return l;
         };
         c._resolveIds = function(n, a) {
           a[n.id] = n;
           if (n.children) {
             for (var h = 0;h < n.children.length;h++) {
@@ -5263,40 +5265,40 @@ var throwError, Errors;
           }
         };
         c.ENTER = 0;
         c.LEAVE = -2147483648;
         c.MAX_KINDID = 65535;
         c.MAX_DATAID = 32767;
         return c;
       }();
-      f.TimelineBuffer = c;
+      g.TimelineBuffer = c;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       (function(c) {
         c[c.DARK = 0] = "DARK";
         c[c.LIGHT = 1] = "LIGHT";
-      })(f.UIThemeType || (f.UIThemeType = {}));
+      })(g.UIThemeType || (g.UIThemeType = {}));
       var c = function() {
         function c(n, a) {
           void 0 === a && (a = 0);
           this._container = n;
           this._headers = [];
           this._charts = [];
           this._profiles = [];
           this._activeProfile = null;
           this.themeType = a;
           this._tooltip = this._createTooltip();
         }
         c.prototype.createProfile = function(c, a) {
-          var h = new f.Profile(c, a);
+          var h = new g.Profile(c, a);
           h.createSnapshots();
           this._profiles.push(h);
           this.activateProfile(h);
           return h;
         };
         c.prototype.activateProfile = function(c) {
           this.deactivateProfile();
           this._activeProfile = c;
@@ -5339,21 +5341,21 @@ var throwError, Errors;
           return this._theme;
         }, enumerable:!0, configurable:!0});
         c.prototype.getSnapshotAt = function(c) {
           return this._activeProfile.getSnapshotAt(c);
         };
         c.prototype._createViews = function() {
           if (this._activeProfile) {
             var c = this;
-            this._overviewHeader = new f.FlameChartHeader(this, 0);
-            this._overview = new f.FlameChartOverview(this, 0);
+            this._overviewHeader = new g.FlameChartHeader(this, 0);
+            this._overview = new g.FlameChartOverview(this, 0);
             this._activeProfile.forEachSnapshot(function(a, h) {
-              c._headers.push(new f.FlameChartHeader(c, 1));
-              c._charts.push(new f.FlameChart(c, a));
+              c._headers.push(new g.FlameChartHeader(c, 1));
+              c._charts.push(new g.FlameChart(c, a));
             });
             window.addEventListener("resize", this._onResize.bind(this));
           }
         };
         c.prototype._destroyViews = function() {
           if (this._activeProfile) {
             this._overviewHeader.destroy();
             for (this._overview.destroy();this._headers.length;) {
@@ -5365,39 +5367,39 @@ var throwError, Errors;
             window.removeEventListener("resize", this._onResize.bind(this));
           }
         };
         c.prototype._initializeViews = function() {
           if (this._activeProfile) {
             var c = this, a = this._activeProfile.startTime, h = this._activeProfile.endTime;
             this._overviewHeader.initialize(a, h);
             this._overview.initialize(a, h);
-            this._activeProfile.forEachSnapshot(function(q, l) {
+            this._activeProfile.forEachSnapshot(function(p, l) {
               c._headers[l].initialize(a, h);
               c._charts[l].initialize(a, h);
             });
           }
         };
         c.prototype._onResize = function() {
           if (this._activeProfile) {
             var c = this, a = this._container.offsetWidth;
             this._overviewHeader.setSize(a);
             this._overview.setSize(a);
-            this._activeProfile.forEachSnapshot(function(h, q) {
-              c._headers[q].setSize(a);
-              c._charts[q].setSize(a);
+            this._activeProfile.forEachSnapshot(function(h, p) {
+              c._headers[p].setSize(a);
+              c._charts[p].setSize(a);
             });
           }
         };
         c.prototype._updateViews = function() {
           if (this._activeProfile) {
             var c = this, a = this._activeProfile.windowStart, h = this._activeProfile.windowEnd;
             this._overviewHeader.setWindow(a, h);
             this._overview.setWindow(a, h);
-            this._activeProfile.forEachSnapshot(function(q, l) {
+            this._activeProfile.forEachSnapshot(function(p, l) {
               c._headers[l].setWindow(a, h);
               c._charts[l].setWindow(a, h);
             });
           }
         };
         c.prototype._drawViews = function() {
         };
         c.prototype._createTooltip = function() {
@@ -5410,75 +5412,75 @@ var throwError, Errors;
         c.prototype.setWindow = function(c, a) {
           this._activeProfile.setWindow(c, a);
           this._updateViews();
         };
         c.prototype.moveWindowTo = function(c) {
           this._activeProfile.moveWindowTo(c);
           this._updateViews();
         };
-        c.prototype.showTooltip = function(c, a, h, q) {
+        c.prototype.showTooltip = function(c, a, h, p) {
           this.removeTooltipContent();
           this._tooltip.appendChild(this.createTooltipContent(c, a));
           this._tooltip.style.display = "block";
           var l = this._tooltip.firstChild;
           a = l.clientWidth;
           l = l.clientHeight;
           h += h + a >= c.canvas.clientWidth - 50 ? -(a + 20) : 25;
-          q += c.canvas.offsetTop - l / 2;
+          p += c.canvas.offsetTop - l / 2;
           this._tooltip.style.left = h + "px";
-          this._tooltip.style.top = q + "px";
+          this._tooltip.style.top = p + "px";
         };
         c.prototype.hideTooltip = function() {
           this._tooltip.style.display = "none";
         };
         c.prototype.createTooltipContent = function(c, a) {
-          var h = Math.round(1E5 * a.totalTime) / 1E5, q = Math.round(1E5 * a.selfTime) / 1E5, l = Math.round(1E4 * a.selfTime / a.totalTime) / 100, f = document.createElement("div"), m = document.createElement("h1");
+          var h = Math.round(1E5 * a.totalTime) / 1E5, p = Math.round(1E5 * a.selfTime) / 1E5, l = Math.round(1E4 * a.selfTime / a.totalTime) / 100, g = document.createElement("div"), m = document.createElement("h1");
           m.textContent = a.kind.name;
-          f.appendChild(m);
+          g.appendChild(m);
           m = document.createElement("p");
           m.textContent = "Total: " + h + " ms";
-          f.appendChild(m);
+          g.appendChild(m);
           h = document.createElement("p");
-          h.textContent = "Self: " + q + " ms (" + l + "%)";
-          f.appendChild(h);
-          if (q = c.getStatistics(a.kind)) {
-            l = document.createElement("p"), l.textContent = "Count: " + q.count, f.appendChild(l), l = Math.round(1E5 * q.totalTime) / 1E5, h = document.createElement("p"), h.textContent = "All Total: " + l + " ms", f.appendChild(h), q = Math.round(1E5 * q.selfTime) / 1E5, l = document.createElement("p"), l.textContent = "All Self: " + q + " ms", f.appendChild(l);
-          }
-          this.appendDataElements(f, a.startData);
-          this.appendDataElements(f, a.endData);
-          return f;
+          h.textContent = "Self: " + p + " ms (" + l + "%)";
+          g.appendChild(h);
+          if (p = c.getStatistics(a.kind)) {
+            l = document.createElement("p"), l.textContent = "Count: " + p.count, g.appendChild(l), l = Math.round(1E5 * p.totalTime) / 1E5, h = document.createElement("p"), h.textContent = "All Total: " + l + " ms", g.appendChild(h), p = Math.round(1E5 * p.selfTime) / 1E5, l = document.createElement("p"), l.textContent = "All Self: " + p + " ms", g.appendChild(l);
+          }
+          this.appendDataElements(g, a.startData);
+          this.appendDataElements(g, a.endData);
+          return g;
         };
         c.prototype.appendDataElements = function(c, a) {
           if (!k.isNullOrUndefined(a)) {
             c.appendChild(document.createElement("hr"));
             var h;
             if (k.isObject(a)) {
-              for (var q in a) {
-                h = document.createElement("p"), h.textContent = q + ": " + a[q], c.appendChild(h);
+              for (var p in a) {
+                h = document.createElement("p"), h.textContent = p + ": " + a[p], c.appendChild(h);
               }
             } else {
               h = document.createElement("p"), h.textContent = a.toString(), c.appendChild(h);
             }
           }
         };
         c.prototype.removeTooltipContent = function() {
           for (var c = this._tooltip;c.firstChild;) {
             c.removeChild(c.firstChild);
           }
         };
         return c;
       }();
-      f.Controller = c;
+      g.Controller = c;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = k.NumberUtilities.clamp, r = function() {
         function a(a) {
           this.value = a;
         }
         a.prototype.toString = function() {
           return this.value;
         };
         a.AUTO = new a("auto");
@@ -5512,17 +5514,17 @@ var throwError, Errors;
         a.NESW_RESIZE = new a("nesw-resize");
         a.NWSE_RESIZE = new a("nwse-resize");
         a.ZOOM_IN = new a("zoom-in");
         a.ZOOM_OUT = new a("zoom-out");
         a.GRAB = new a("grab");
         a.GRABBING = new a("grabbing");
         return a;
       }();
-      f.MouseCursor = r;
+      g.MouseCursor = r;
       var n = function() {
         function a(a, c) {
           this._target = a;
           this._eventTarget = c;
           this._wheelDisabled = !1;
           this._boundOnMouseDown = this._onMouseDown.bind(this);
           this._boundOnMouseUp = this._onMouseUp.bind(this);
           this._boundOnMouseOver = this._onMouseOver.bind(this);
@@ -5541,21 +5543,21 @@ var throwError, Errors;
           a.removeEventListener("mouseover", this._boundOnMouseOver);
           a.removeEventListener("mouseout", this._boundOnMouseOut);
           a.removeEventListener("onwheel" in document ? "wheel" : "mousewheel", this._boundOnMouseWheel);
           window.removeEventListener("mousemove", this._boundOnDrag);
           window.removeEventListener("mouseup", this._boundOnMouseUp);
           this._killHoverCheck();
           this._target = this._eventTarget = null;
         };
-        a.prototype.updateCursor = function(c) {
+        a.prototype.updateCursor = function(h) {
           if (!a._cursorOwner || a._cursorOwner === this._target) {
-            var q = this._eventTarget.parentElement;
-            a._cursor !== c && (a._cursor = c, ["", "-moz-", "-webkit-"].forEach(function(a) {
-              q.style.cursor = a + c;
+            var c = this._eventTarget.parentElement;
+            a._cursor !== h && (a._cursor = h, ["", "-moz-", "-webkit-"].forEach(function(a) {
+              c.style.cursor = a + h;
             }));
             a._cursorOwner = a._cursor === r.DEFAULT ? null : this._target;
           }
         };
         a.prototype._onMouseDown = function(a) {
           this._killHoverCheck();
           if (0 === a.button) {
             var c = this._getTargetMousePos(a, a.target);
@@ -5610,19 +5612,19 @@ var throwError, Errors;
             var c = this._getTargetMousePos(a, a.target);
             this._target.onMouseMove(c.x, c.y);
             this._killHoverCheck();
             this._startHoverCheck(a);
           }
         };
         a.prototype._onMouseWheel = function(a) {
           if (!(a.altKey || a.metaKey || a.ctrlKey || a.shiftKey || (a.preventDefault(), this._dragInfo || this._wheelDisabled))) {
-            var q = this._getTargetMousePos(a, a.target);
+            var p = this._getTargetMousePos(a, a.target);
             a = c("undefined" !== typeof a.deltaY ? a.deltaY / 16 : -a.wheelDelta / 40, -1, 1);
-            this._target.onMouseWheel(q.x, q.y, Math.pow(1.2, a) - 1);
+            this._target.onMouseWheel(p.x, p.y, Math.pow(1.2, a) - 1);
           }
         };
         a.prototype._startHoverCheck = function(c) {
           this._hoverInfo = {isHovering:!1, timeoutHandle:setTimeout(this._onMouseMoveIdleHandler.bind(this), a.HOVER_TIMEOUT), pos:this._getTargetMousePos(c, c.target)};
         };
         a.prototype._killHoverCheck = function() {
           if (this._hoverInfo) {
             clearTimeout(this._hoverInfo.timeoutHandle);
@@ -5640,37 +5642,37 @@ var throwError, Errors;
         a.prototype._getTargetMousePos = function(a, c) {
           var l = c.getBoundingClientRect();
           return{x:a.clientX - l.left, y:a.clientY - l.top};
         };
         a.HOVER_TIMEOUT = 500;
         a._cursor = r.DEFAULT;
         return a;
       }();
-      f.MouseController = n;
+      g.MouseController = n;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       (function(c) {
         c[c.NONE = 0] = "NONE";
         c[c.WINDOW = 1] = "WINDOW";
         c[c.HANDLE_LEFT = 2] = "HANDLE_LEFT";
         c[c.HANDLE_RIGHT = 3] = "HANDLE_RIGHT";
         c[c.HANDLE_BOTH = 4] = "HANDLE_BOTH";
-      })(f.FlameChartDragTarget || (f.FlameChartDragTarget = {}));
+      })(g.FlameChartDragTarget || (g.FlameChartDragTarget = {}));
       var c = function() {
         function c(n) {
           this._controller = n;
           this._initialized = !1;
           this._canvas = document.createElement("canvas");
           this._context = this._canvas.getContext("2d");
-          this._mouseController = new f.MouseController(this, this._canvas);
+          this._mouseController = new g.MouseController(this, this._canvas);
           n = n.container;
           n.appendChild(this._canvas);
           n = n.getBoundingClientRect();
           this.setSize(n.width);
         }
         Object.defineProperty(c.prototype, "canvas", {get:function() {
           return this._canvas;
         }, enumerable:!0, configurable:!0});
@@ -5733,53 +5735,53 @@ var throwError, Errors;
           return 0;
         };
         c.prototype._toTimeRelative = function(c) {
           return 0;
         };
         c.prototype._toTime = function(c) {
           return 0;
         };
-        c.prototype.onMouseWheel = function(f, a, h) {
-          f = this._toTime(f);
+        c.prototype.onMouseWheel = function(g, a, h) {
+          g = this._toTime(g);
           a = this._windowStart;
-          var q = this._windowEnd, l = q - a;
+          var p = this._windowEnd, l = p - a;
           h = Math.max((c.MIN_WINDOW_LEN - l) / l, h);
-          this._controller.setWindow(a + (a - f) * h, q + (q - f) * h);
+          this._controller.setWindow(a + (a - g) * h, p + (p - g) * h);
           this.onHoverEnd();
         };
         c.prototype.onMouseDown = function(c, a) {
         };
         c.prototype.onMouseMove = function(c, a) {
         };
         c.prototype.onMouseOver = function(c, a) {
         };
         c.prototype.onMouseOut = function() {
         };
-        c.prototype.onDrag = function(c, a, h, q, l, f) {
-        };
-        c.prototype.onDragEnd = function(c, a, h, q, l, f) {
+        c.prototype.onDrag = function(c, a, h, p, l, g) {
+        };
+        c.prototype.onDragEnd = function(c, a, h, p, l, g) {
         };
         c.prototype.onClick = function(c, a) {
         };
         c.prototype.onHoverStart = function(c, a) {
         };
         c.prototype.onHoverEnd = function() {
         };
         c.DRAGHANDLE_WIDTH = 4;
         c.MIN_WINDOW_LEN = .1;
         return c;
       }();
-      f.FlameChartBase = c;
+      g.FlameChartBase = c;
     })(k.Profiler || (k.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = k.StringUtilities.trimMiddle, r = function(n) {
         function a(a, c) {
           n.call(this, a);
           this._textWidth = {};
           this._minFrameWidthInPixels = 1;
           this._snapshot = c;
           this._kindStyle = Object.create(null);
         }
@@ -5807,49 +5809,49 @@ var throwError, Errors;
           a.fillRect(0, 0, this._width, this._height);
           this._initialized && this._drawChildren(this._snapshot);
           a.restore();
         };
         a.prototype._drawChildren = function(a, c) {
           void 0 === c && (c = 0);
           var l = a.getChildRange(this._windowStart, this._windowEnd);
           if (l) {
-            for (var f = l.startIndex;f <= l.endIndex;f++) {
-              var m = a.children[f];
+            for (var g = l.startIndex;g <= l.endIndex;g++) {
+              var m = a.children[g];
               this._drawFrame(m, c) && this._drawChildren(m, c + 1);
             }
           }
         };
         a.prototype._drawFrame = function(a, c) {
-          var l = this._context, f = this._toPixels(a.startTime), m = this._toPixels(a.endTime), s = m - f;
+          var l = this._context, g = this._toPixels(a.startTime), m = this._toPixels(a.endTime), s = m - g;
           if (s <= this._minFrameWidthInPixels) {
-            return l.fillStyle = this._controller.theme.tabToolbar(1), l.fillRect(f, 12.5 * c, this._minFrameWidthInPixels, 12 + 12.5 * (a.maxDepth - a.depth)), !1;
-          }
-          0 > f && (m = s + f, f = 0);
-          var m = m - f, n = this._kindStyle[a.kind.id];
+            return l.fillStyle = this._controller.theme.tabToolbar(1), l.fillRect(g, 12.5 * c, this._minFrameWidthInPixels, 12 + 12.5 * (a.maxDepth - a.depth)), !1;
+          }
+          0 > g && (m = s + g, g = 0);
+          var m = m - g, n = this._kindStyle[a.kind.id];
           n || (n = k.ColorStyle.randomStyle(), n = this._kindStyle[a.kind.id] = {bgColor:n, textColor:k.ColorStyle.contrastStyle(n)});
           l.save();
           l.fillStyle = n.bgColor;
-          l.fillRect(f, 12.5 * c, m, 12);
-          12 < s && (s = a.kind.name) && s.length && (s = this._prepareText(l, s, m - 4), s.length && (l.fillStyle = n.textColor, l.textBaseline = "bottom", l.fillText(s, f + 2, 12.5 * (c + 1) - 1)));
+          l.fillRect(g, 12.5 * c, m, 12);
+          12 < s && (s = a.kind.name) && s.length && (s = this._prepareText(l, s, m - 4), s.length && (l.fillStyle = n.textColor, l.textBaseline = "bottom", l.fillText(s, g + 2, 12.5 * (c + 1) - 1)));
           l.restore();
           return!0;
         };
-        a.prototype._prepareText = function(a, q, l) {
-          var f = this._measureWidth(a, q);
-          if (l > f) {
-            return q;
-          }
-          for (var f = 3, m = q.length;f < m;) {
-            var s = f + m >> 1;
-            this._measureWidth(a, c(q, s)) < l ? f = s + 1 : m = s;
-          }
-          q = c(q, m - 1);
-          f = this._measureWidth(a, q);
-          return f <= l ? q : "";
+        a.prototype._prepareText = function(a, p, l) {
+          var g = this._measureWidth(a, p);
+          if (l > g) {
+            return p;
+          }
+          for (var g = 3, m = p.length;g < m;) {
+            var s = g + m >> 1;
+            this._measureWidth(a, c(p, s)) < l ? g = s + 1 : m = s;
+          }
+          p = c(p, m - 1);
+          g = this._measureWidth(a, p);
+          return g <= l ? p : "";
         };
         a.prototype._measureWidth = function(a, c) {
           var l = this._textWidth[c];
           l || (l = a.measureText(c).width, this._textWidth[c] = l);
           return l;
         };
         a.prototype._toPixelsRelative = function(a) {
           return a * this._width / (this._windowEnd - this._windowStart);
@@ -5859,74 +5861,74 @@ var throwError, Errors;
         };
         a.prototype._toTimeRelative = function(a) {
           return a * (this._windowEnd - this._windowStart) / this._width;
         };
         a.prototype._toTime = function(a) {
           return this._toTimeRelative(a) + this._windowStart;
         };
         a.prototype._getFrameAtPosition = function(a, c) {
-          var l = 1 + c / 12.5 | 0, f = this._snapshot.query(this._toTime(a));
-          if (f && f.depth >= l) {
-            for (;f && f.depth > l;) {
-              f = f.parent;
-            }
-            return f;
+          var l = 1 + c / 12.5 | 0, g = this._snapshot.query(this._toTime(a));
+          if (g && g.depth >= l) {
+            for (;g && g.depth > l;) {
+              g = g.parent;
+            }
+            return g;
           }
           return null;
         };
         a.prototype.onMouseDown = function(a, c) {
-          this._windowEqRange() || (this._mouseController.updateCursor(f.MouseCursor.ALL_SCROLL), this._dragInfo = {windowStartInitial:this._windowStart, windowEndInitial:this._windowEnd, target:1});
+          this._windowEqRange() || (this._mouseController.updateCursor(g.MouseCursor.ALL_SCROLL), this._dragInfo = {windowStartInitial:this._windowStart, windowEndInitial:this._windowEnd, target:1});
         };
         a.prototype.onMouseMove = function(a, c) {
         };
         a.prototype.onMouseOver = function(a, c) {
         };
         a.prototype.onMouseOut = function() {
         };
-        a.prototype.onDrag = function(a, c, l, f, m, s) {
+        a.prototype.onDrag = function(a, c, l, g, m, s) {
           if (a = this._dragInfo) {
             m = this._toTimeRelative(-m), this._controller.setWindow(a.windowStartInitial + m, a.windowEndInitial + m);
           }
         };
-        a.prototype.onDragEnd = function(a, c, l, k, m, s) {
+        a.prototype.onDragEnd = function(a, c, l, n, m, s) {
           this._dragInfo = null;
-          this._mouseController.updateCursor(f.MouseCursor.DEFAULT);
+          this._mouseController.updateCursor(g.MouseCursor.DEFAULT);
         };
         a.prototype.onClick = function(a, c) {
           this._dragInfo = null;
-          this._mouseController.updateCursor(f.MouseCursor.DEFAULT);
+          this._mouseController.updateCursor(g.MouseCursor.DEFAULT);
         };
         a.prototype.onHoverStart = function(a, c) {
           var l = this._getFrameAtPosition(a, c);
           l && (this._hoveredFrame = l, this._controller.showTooltip(this, l, a, c));
         };
         a.prototype.onHoverEnd = function() {
           this._hoveredFrame && (this._hoveredFrame = null, this._controller.hideTooltip());
         };
         a.prototype.getStatistics = function(a) {
           var c = this._snapshot;
           c.statistics || c.calculateStatistics();
           return c.statistics[a.id];
         };
         return a;
-      }(f.FlameChartBase);
-      f.FlameChart = r;
+      }(g.FlameChartBase);
+      g.FlameChart = r;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = k.NumberUtilities.clamp;
       (function(c) {
         c[c.OVERLAY = 0] = "OVERLAY";
         c[c.STACK = 1] = "STACK";
         c[c.UNION = 2] = "UNION";
-      })(f.FlameChartOverviewMode || (f.FlameChartOverviewMode = {}));
+      })(g.FlameChartOverviewMode || (g.FlameChartOverviewMode = {}));
       var r = function(k) {
         function a(a, c) {
           void 0 === c && (c = 1);
           this._mode = c;
           this._overviewCanvasDirty = !0;
           this._overviewCanvas = document.createElement("canvas");
           this._overviewContext = this._overviewCanvas.getContext("2d");
           k.call(this, a);
@@ -5941,62 +5943,62 @@ var throwError, Errors;
         }, enumerable:!0, configurable:!0});
         a.prototype._resetCanvas = function() {
           k.prototype._resetCanvas.call(this);
           this._overviewCanvas.width = this._canvas.width;
           this._overviewCanvas.height = this._canvas.height;
           this._overviewCanvasDirty = !0;
         };
         a.prototype.draw = function() {
-          var a = this._context, c = window.devicePixelRatio, l = this._width, f = this._height;
+          var a = this._context, c = window.devicePixelRatio, l = this._width, g = this._height;
           a.save();
           a.scale(c, c);
           a.fillStyle = this._controller.theme.bodyBackground(1);
-          a.fillRect(0, 0, l, f);
+          a.fillRect(0, 0, l, g);
           a.restore();
           this._initialized && (this._overviewCanvasDirty && (this._drawChart(), this._overviewCanvasDirty = !1), a.drawImage(this._overviewCanvas, 0, 0), this._drawSelection());
         };
         a.prototype._drawSelection = function() {
-          var a = this._context, c = this._height, l = window.devicePixelRatio, f = this._selection ? this._selection.left : this._toPixels(this._windowStart), m = this._selection ? this._selection.right : this._toPixels(this._windowEnd), s = this._controller.theme;
+          var a = this._context, c = this._height, l = window.devicePixelRatio, g = this._selection ? this._selection.left : this._toPixels(this._windowStart), m = this._selection ? this._selection.right : this._toPixels(this._windowEnd), s = this._controller.theme;
           a.save();
           a.scale(l, l);
-          this._selection ? (a.fillStyle = s.selectionText(.15), a.fillRect(f, 1, m - f, c - 1), a.fillStyle = "rgba(133, 0, 0, 1)", a.fillRect(f + .5, 0, m - f - 1, 4), a.fillRect(f + .5, c - 4, m - f - 1, 4)) : (a.fillStyle = s.bodyBackground(.4), a.fillRect(0, 1, f, c - 1), a.fillRect(m, 1, this._width, c - 1));
+          this._selection ? (a.fillStyle = s.selectionText(.15), a.fillRect(g, 1, m - g, c - 1), a.fillStyle = "rgba(133, 0, 0, 1)", a.fillRect(g + .5, 0, m - g - 1, 4), a.fillRect(g + .5, c - 4, m - g - 1, 4)) : (a.fillStyle = s.bodyBackground(.4), a.fillRect(0, 1, g, c - 1), a.fillRect(m, 1, this._width, c - 1));
           a.beginPath();
-          a.moveTo(f, 0);
-          a.lineTo(f, c);
+          a.moveTo(g, 0);
+          a.lineTo(g, c);
           a.moveTo(m, 0);
           a.lineTo(m, c);
           a.lineWidth = .5;
           a.strokeStyle = s.foregroundTextGrey(1);
           a.stroke();
           c = Math.abs((this._selection ? this._toTime(this._selection.right) : this._windowEnd) - (this._selection ? this._toTime(this._selection.left) : this._windowStart));
           a.fillStyle = s.selectionText(.5);
           a.font = "8px sans-serif";
           a.textBaseline = "alphabetic";
           a.textAlign = "end";
-          a.fillText(c.toFixed(2), Math.min(f, m) - 4, 10);
-          a.fillText((c / 60).toFixed(2), Math.min(f, m) - 4, 20);
+          a.fillText(c.toFixed(2), Math.min(g, m) - 4, 10);
+          a.fillText((c / 60).toFixed(2), Math.min(g, m) - 4, 20);
           a.restore();
         };
         a.prototype._drawChart = function() {
-          var a = window.devicePixelRatio, c = this._height, l = this._controller.activeProfile, f = 4 * this._width, m = l.totalTime / f, s = this._overviewContext, k = this._controller.theme.blueHighlight(1);
+          var a = window.devicePixelRatio, c = this._height, l = this._controller.activeProfile, g = 4 * this._width, m = l.totalTime / g, s = this._overviewContext, k = this._controller.theme.blueHighlight(1);
           s.save();
           s.translate(0, a * c);
           var d = -a * c / (l.maxDepth - 1);
           s.scale(a / 4, d);
-          s.clearRect(0, 0, f, l.maxDepth - 1);
+          s.clearRect(0, 0, g, l.maxDepth - 1);
           1 == this._mode && s.scale(1, 1 / l.snapshotCount);
           for (var e = 0, b = l.snapshotCount;e < b;e++) {
-            var g = l.getSnapshotAt(e);
-            if (g) {
-              var p = null, u = 0;
+            var f = l.getSnapshotAt(e);
+            if (f) {
+              var q = null, w = 0;
               s.beginPath();
               s.moveTo(0, 0);
-              for (var G = 0;G < f;G++) {
-                u = l.startTime + G * m, u = (p = p ? p.queryNext(u) : g.query(u)) ? p.getDepth() - 1 : 0, s.lineTo(G, u);
+              for (var G = 0;G < g;G++) {
+                w = l.startTime + G * m, w = (q = q ? q.queryNext(w) : f.query(w)) ? q.getDepth() - 1 : 0, s.lineTo(G, w);
               }
               s.lineTo(G, 0);
               s.fillStyle = k;
               s.fill();
               1 == this._mode && s.translate(0, -c * a / d);
             }
           }
           s.restore();
@@ -6010,17 +6012,17 @@ var throwError, Errors;
         a.prototype._toTimeRelative = function(a) {
           return a * (this._rangeEnd - this._rangeStart) / this._width;
         };
         a.prototype._toTime = function(a) {
           return this._toTimeRelative(a) + this._rangeStart;
         };
         a.prototype._getDragTargetUnderCursor = function(a, c) {
           if (0 <= c && c < this._height) {
-            var l = this._toPixels(this._windowStart), k = this._toPixels(this._windowEnd), m = 2 + f.FlameChartBase.DRAGHANDLE_WIDTH / 2, s = a >= l - m && a <= l + m, n = a >= k - m && a <= k + m;
+            var l = this._toPixels(this._windowStart), k = this._toPixels(this._windowEnd), m = 2 + g.FlameChartBase.DRAGHANDLE_WIDTH / 2, s = a >= l - m && a <= l + m, n = a >= k - m && a <= k + m;
             if (s && n) {
               return 4;
             }
             if (s) {
               return 2;
             }
             if (n) {
               return 3;
@@ -6028,139 +6030,139 @@ var throwError, Errors;
             if (!this._windowEqRange() && a > l + m && a < k - m) {
               return 1;
             }
           }
           return 0;
         };
         a.prototype.onMouseDown = function(a, c) {
           var l = this._getDragTargetUnderCursor(a, c);
-          0 === l ? (this._selection = {left:a, right:a}, this.draw()) : (1 === l && this._mouseController.updateCursor(f.MouseCursor.GRABBING), this._dragInfo = {windowStartInitial:this._windowStart, windowEndInitial:this._windowEnd, target:l});
+          0 === l ? (this._selection = {left:a, right:a}, this.draw()) : (1 === l && this._mouseController.updateCursor(g.MouseCursor.GRABBING), this._dragInfo = {windowStartInitial:this._windowStart, windowEndInitial:this._windowEnd, target:l});
         };
         a.prototype.onMouseMove = function(a, c) {
-          var l = f.MouseCursor.DEFAULT, k = this._getDragTargetUnderCursor(a, c);
-          0 === k || this._selection || (l = 1 === k ? f.MouseCursor.GRAB : f.MouseCursor.EW_RESIZE);
+          var l = g.MouseCursor.DEFAULT, k = this._getDragTargetUnderCursor(a, c);
+          0 === k || this._selection || (l = 1 === k ? g.MouseCursor.GRAB : g.MouseCursor.EW_RESIZE);
           this._mouseController.updateCursor(l);
         };
         a.prototype.onMouseOver = function(a, c) {
           this.onMouseMove(a, c);
         };
         a.prototype.onMouseOut = function() {
-          this._mouseController.updateCursor(f.MouseCursor.DEFAULT);
-        };
-        a.prototype.onDrag = function(a, q, l, k, m, s) {
+          this._mouseController.updateCursor(g.MouseCursor.DEFAULT);
+        };
+        a.prototype.onDrag = function(a, p, l, k, m, s) {
           if (this._selection) {
             this._selection = {left:a, right:c(l, 0, this._width - 1)}, this.draw();
           } else {
             a = this._dragInfo;
             if (4 === a.target) {
               if (0 !== m) {
                 a.target = 0 > m ? 2 : 3;
               } else {
                 return;
               }
             }
-            q = this._windowStart;
+            p = this._windowStart;
             l = this._windowEnd;
             m = this._toTimeRelative(m);
             switch(a.target) {
               case 1:
-                q = a.windowStartInitial + m;
+                p = a.windowStartInitial + m;
                 l = a.windowEndInitial + m;
                 break;
               case 2:
-                q = c(a.windowStartInitial + m, this._rangeStart, l - f.FlameChartBase.MIN_WINDOW_LEN);
+                p = c(a.windowStartInitial + m, this._rangeStart, l - g.FlameChartBase.MIN_WINDOW_LEN);
                 break;
               case 3:
-                l = c(a.windowEndInitial + m, q + f.FlameChartBase.MIN_WINDOW_LEN, this._rangeEnd);
+                l = c(a.windowEndInitial + m, p + g.FlameChartBase.MIN_WINDOW_LEN, this._rangeEnd);
                 break;
               default:
                 return;
             }
-            this._controller.setWindow(q, l);
-          }
-        };
-        a.prototype.onDragEnd = function(a, c, l, f, m, s) {
+            this._controller.setWindow(p, l);
+          }
+        };
+        a.prototype.onDragEnd = function(a, c, l, g, m, s) {
           this._selection && (this._selection = null, this._controller.setWindow(this._toTime(a), this._toTime(l)));
           this._dragInfo = null;
-          this.onMouseMove(l, f);
+          this.onMouseMove(l, g);
         };
         a.prototype.onClick = function(a, c) {
           this._selection = this._dragInfo = null;
           this._windowEqRange() || (0 === this._getDragTargetUnderCursor(a, c) && this._controller.moveWindowTo(this._toTime(a)), this.onMouseMove(a, c));
           this.draw();
         };
         a.prototype.onHoverStart = function(a, c) {
         };
         a.prototype.onHoverEnd = function() {
         };
         return a;
-      }(f.FlameChartBase);
-      f.FlameChartOverview = r;
+      }(g.FlameChartBase);
+      g.FlameChartOverview = r;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = k.NumberUtilities.clamp;
       (function(c) {
         c[c.OVERVIEW = 0] = "OVERVIEW";
         c[c.CHART = 1] = "CHART";
-      })(f.FlameChartHeaderType || (f.FlameChartHeaderType = {}));
+      })(g.FlameChartHeaderType || (g.FlameChartHeaderType = {}));
       var r = function(k) {
         function a(a, c) {
           this._type = c;
           k.call(this, a);
         }
         __extends(a, k);
         a.prototype.draw = function() {
-          var a = this._context, c = window.devicePixelRatio, l = this._width, f = this._height;
+          var a = this._context, c = window.devicePixelRatio, l = this._width, g = this._height;
           a.save();
           a.scale(c, c);
           a.fillStyle = this._controller.theme.tabToolbar(1);
-          a.fillRect(0, 0, l, f);
-          this._initialized && (0 == this._type ? (c = this._toPixels(this._windowStart), l = this._toPixels(this._windowEnd), a.fillStyle = this._controller.theme.bodyBackground(1), a.fillRect(c, 0, l - c, f), this._drawLabels(this._rangeStart, this._rangeEnd), this._drawDragHandle(c), this._drawDragHandle(l)) : this._drawLabels(this._windowStart, this._windowEnd));
+          a.fillRect(0, 0, l, g);
+          this._initialized && (0 == this._type ? (c = this._toPixels(this._windowStart), l = this._toPixels(this._windowEnd), a.fillStyle = this._controller.theme.bodyBackground(1), a.fillRect(c, 0, l - c, g), this._drawLabels(this._rangeStart, this._rangeEnd), this._drawDragHandle(c), this._drawDragHandle(l)) : this._drawLabels(this._windowStart, this._windowEnd));
           a.restore();
         };
-        a.prototype._drawLabels = function(c, q) {
-          var l = this._context, f = this._calculateTickInterval(c, q), m = Math.ceil(c / f) * f, s = 500 <= f, k = s ? 1E3 : 1, d = this._decimalPlaces(f / k), s = s ? "s" : "ms", e = this._toPixels(m), b = this._height / 2, g = this._controller.theme;
+        a.prototype._drawLabels = function(c, p) {
+          var l = this._context, g = this._calculateTickInterval(c, p), m = Math.ceil(c / g) * g, s = 500 <= g, k = s ? 1E3 : 1, d = this._decimalPlaces(g / k), s = s ? "s" : "ms", e = this._toPixels(m), b = this._height / 2, f = this._controller.theme;
           l.lineWidth = 1;
-          l.strokeStyle = g.contentTextDarkGrey(.5);
-          l.fillStyle = g.contentTextDarkGrey(1);
+          l.strokeStyle = f.contentTextDarkGrey(.5);
+          l.fillStyle = f.contentTextDarkGrey(1);
           l.textAlign = "right";
           l.textBaseline = "middle";
           l.font = "11px sans-serif";
-          for (g = this._width + a.TICK_MAX_WIDTH;e < g;) {
-            l.fillText((m / k).toFixed(d) + " " + s, e - 7, b + 1), l.beginPath(), l.moveTo(e, 0), l.lineTo(e, this._height + 1), l.closePath(), l.stroke(), m += f, e = this._toPixels(m);
-          }
-        };
-        a.prototype._calculateTickInterval = function(c, q) {
-          var l = (q - c) / (this._width / a.TICK_MAX_WIDTH), f = Math.pow(10, Math.floor(Math.log(l) / Math.LN10)), l = l / f;
-          return 5 < l ? 10 * f : 2 < l ? 5 * f : 1 < l ? 2 * f : f;
+          for (f = this._width + a.TICK_MAX_WIDTH;e < f;) {
+            l.fillText((m / k).toFixed(d) + " " + s, e - 7, b + 1), l.beginPath(), l.moveTo(e, 0), l.lineTo(e, this._height + 1), l.closePath(), l.stroke(), m += g, e = this._toPixels(m);
+          }
+        };
+        a.prototype._calculateTickInterval = function(c, p) {
+          var l = (p - c) / (this._width / a.TICK_MAX_WIDTH), g = Math.pow(10, Math.floor(Math.log(l) / Math.LN10)), l = l / g;
+          return 5 < l ? 10 * g : 2 < l ? 5 * g : 1 < l ? 2 * g : g;
         };
         a.prototype._drawDragHandle = function(a) {
           var c = this._context;
           c.lineWidth = 2;
           c.strokeStyle = this._controller.theme.bodyBackground(1);
           c.fillStyle = this._controller.theme.foregroundTextGrey(.7);
-          this._drawRoundedRect(c, a - f.FlameChartBase.DRAGHANDLE_WIDTH / 2, f.FlameChartBase.DRAGHANDLE_WIDTH, this._height - 2);
-        };
-        a.prototype._drawRoundedRect = function(a, c, l, f) {
+          this._drawRoundedRect(c, a - g.FlameChartBase.DRAGHANDLE_WIDTH / 2, g.FlameChartBase.DRAGHANDLE_WIDTH, this._height - 2);
+        };
+        a.prototype._drawRoundedRect = function(a, c, l, g) {
           var m, s = !0;
           void 0 === s && (s = !0);
           void 0 === m && (m = !0);
           a.beginPath();
           a.moveTo(c + 2, 1);
           a.lineTo(c + l - 2, 1);
           a.quadraticCurveTo(c + l, 1, c + l, 3);
-          a.lineTo(c + l, 1 + f - 2);
-          a.quadraticCurveTo(c + l, 1 + f, c + l - 2, 1 + f);
-          a.lineTo(c + 2, 1 + f);
-          a.quadraticCurveTo(c, 1 + f, c, 1 + f - 2);
+          a.lineTo(c + l, 1 + g - 2);
+          a.quadraticCurveTo(c + l, 1 + g, c + l - 2, 1 + g);
+          a.lineTo(c + 2, 1 + g);
+          a.quadraticCurveTo(c, 1 + g, c, 1 + g - 2);
           a.lineTo(c, 3);
           a.quadraticCurveTo(c, 1, c + 2, 1);
           a.closePath();
           s && a.stroke();
           m && a.fill();
         };
         a.prototype._toPixelsRelative = function(a) {
           return a * this._width / (0 === this._type ? this._rangeEnd - this._rangeStart : this._windowEnd - this._windowStart);
@@ -6172,17 +6174,17 @@ var throwError, Errors;
           return a * (0 === this._type ? this._rangeEnd - this._rangeStart : this._windowEnd - this._windowStart) / this._width;
         };
         a.prototype._toTime = function(a) {
           return this._toTimeRelative(a) + (0 === this._type ? this._rangeStart : this._windowStart);
         };
         a.prototype._getDragTargetUnderCursor = function(a, c) {
           if (0 <= c && c < this._height) {
             if (0 === this._type) {
-              var l = this._toPixels(this._windowStart), k = this._toPixels(this._windowEnd), m = 2 + f.FlameChartBase.DRAGHANDLE_WIDTH / 2, l = a >= l - m && a <= l + m, k = a >= k - m && a <= k + m;
+              var l = this._toPixels(this._windowStart), k = this._toPixels(this._windowEnd), m = 2 + g.FlameChartBase.DRAGHANDLE_WIDTH / 2, l = a >= l - m && a <= l + m, k = a >= k - m && a <= k + m;
               if (l && k) {
                 return 4;
               }
               if (l) {
                 return 2;
               }
               if (k) {
                 return 3;
@@ -6191,256 +6193,256 @@ var throwError, Errors;
             if (!this._windowEqRange()) {
               return 1;
             }
           }
           return 0;
         };
         a.prototype.onMouseDown = function(a, c) {
           var l = this._getDragTargetUnderCursor(a, c);
-          1 === l && this._mouseController.updateCursor(f.MouseCursor.GRABBING);
+          1 === l && this._mouseController.updateCursor(g.MouseCursor.GRABBING);
           this._dragInfo = {windowStartInitial:this._windowStart, windowEndInitial:this._windowEnd, target:l};
         };
         a.prototype.onMouseMove = function(a, c) {
-          var l = f.MouseCursor.DEFAULT, k = this._getDragTargetUnderCursor(a, c);
-          0 !== k && (1 !== k ? l = f.MouseCursor.EW_RESIZE : 1 !== k || this._windowEqRange() || (l = f.MouseCursor.GRAB));
+          var l = g.MouseCursor.DEFAULT, k = this._getDragTargetUnderCursor(a, c);
+          0 !== k && (1 !== k ? l = g.MouseCursor.EW_RESIZE : 1 !== k || this._windowEqRange() || (l = g.MouseCursor.GRAB));
           this._mouseController.updateCursor(l);
         };
         a.prototype.onMouseOver = function(a, c) {
           this.onMouseMove(a, c);
         };
         a.prototype.onMouseOut = function() {
-          this._mouseController.updateCursor(f.MouseCursor.DEFAULT);
-        };
-        a.prototype.onDrag = function(a, q, l, k, m, s) {
+          this._mouseController.updateCursor(g.MouseCursor.DEFAULT);
+        };
+        a.prototype.onDrag = function(a, p, l, k, m, s) {
           a = this._dragInfo;
           if (4 === a.target) {
             if (0 !== m) {
               a.target = 0 > m ? 2 : 3;
             } else {
               return;
             }
           }
-          q = this._windowStart;
+          p = this._windowStart;
           l = this._windowEnd;
           m = this._toTimeRelative(m);
           switch(a.target) {
             case 1:
               l = 0 === this._type ? 1 : -1;
-              q = a.windowStartInitial + l * m;
+              p = a.windowStartInitial + l * m;
               l = a.windowEndInitial + l * m;
               break;
             case 2:
-              q = c(a.windowStartInitial + m, this._rangeStart, l - f.FlameChartBase.MIN_WINDOW_LEN);
+              p = c(a.windowStartInitial + m, this._rangeStart, l - g.FlameChartBase.MIN_WINDOW_LEN);
               break;
             case 3:
-              l = c(a.windowEndInitial + m, q + f.FlameChartBase.MIN_WINDOW_LEN, this._rangeEnd);
+              l = c(a.windowEndInitial + m, p + g.FlameChartBase.MIN_WINDOW_LEN, this._rangeEnd);
               break;
             default:
               return;
           }
-          this._controller.setWindow(q, l);
-        };
-        a.prototype.onDragEnd = function(a, c, l, f, m, s) {
+          this._controller.setWindow(p, l);
+        };
+        a.prototype.onDragEnd = function(a, c, l, g, m, s) {
           this._dragInfo = null;
-          this.onMouseMove(l, f);
+          this.onMouseMove(l, g);
         };
         a.prototype.onClick = function(a, c) {
-          1 === this._dragInfo.target && this._mouseController.updateCursor(f.MouseCursor.GRAB);
+          1 === this._dragInfo.target && this._mouseController.updateCursor(g.MouseCursor.GRAB);
         };
         a.prototype.onHoverStart = function(a, c) {
         };
         a.prototype.onHoverEnd = function() {
         };
         a.TICK_MAX_WIDTH = 75;
         return a;
-      }(f.FlameChartBase);
-      f.FlameChartHeader = r;
+      }(g.FlameChartBase);
+      g.FlameChartHeader = r;
     })(r.Profiler || (r.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       (function(c) {
-        var f = function() {
-          function a(a, c, l, f, m) {
+        var g = function() {
+          function a(a, c, g, k, m) {
             this.pageLoaded = a;
             this.threadsTotal = c;
-            this.threadsLoaded = l;
-            this.threadFilesTotal = f;
+            this.threadsLoaded = g;
+            this.threadFilesTotal = k;
             this.threadFilesLoaded = m;
           }
           a.prototype.toString = function() {
-            return "[" + ["pageLoaded", "threadsTotal", "threadsLoaded", "threadFilesTotal", "threadFilesLoaded"].map(function(a, c, l) {
+            return "[" + ["pageLoaded", "threadsTotal", "threadsLoaded", "threadFilesTotal", "threadFilesLoaded"].map(function(a, c, g) {
               return a + ":" + this[a];
             }, this).join(", ") + "]";
           };
           return a;
         }();
-        c.TraceLoggerProgressInfo = f;
+        c.TraceLoggerProgressInfo = g;
         var k = function() {
           function a(a) {
             this._baseUrl = a;
             this._threads = [];
             this._progressInfo = null;
           }
           a.prototype.loadPage = function(a, c, l) {
             this._threads = [];
             this._pageLoadCallback = c;
             this._pageLoadProgressCallback = l;
-            this._progressInfo = new f(!1, 0, 0, 0, 0);
+            this._progressInfo = new g(!1, 0, 0, 0, 0);
             this._loadData([a], this._onLoadPage.bind(this));
           };
           Object.defineProperty(a.prototype, "buffers", {get:function() {
-            for (var a = [], c = 0, l = this._threads.length;c < l;c++) {
+            for (var a = [], c = 0, g = this._threads.length;c < g;c++) {
               a.push(this._threads[c].buffer);
             }
             return a;
           }, enumerable:!0, configurable:!0});
           a.prototype._onProgress = function() {
             this._pageLoadProgressCallback && this._pageLoadProgressCallback.call(this, this._progressInfo);
           };
           a.prototype._onLoadPage = function(a) {
             if (a && 1 == a.length) {
-              var f = this, l = 0;
+              var g = this, l = 0;
               a = a[0];
               var k = a.length;
               this._threads = Array(k);
               this._progressInfo.pageLoaded = !0;
               this._progressInfo.threadsTotal = k;
               for (var m = 0;m < a.length;m++) {
                 var s = a[m], n = [s.dict, s.tree];
                 s.corrections && n.push(s.corrections);
                 this._progressInfo.threadFilesTotal += n.length;
                 this._loadData(n, function(a) {
                   return function(e) {
-                    e && (e = new c.Thread(e), e.buffer.name = "Thread " + a, f._threads[a] = e);
+                    e && (e = new c.Thread(e), e.buffer.name = "Thread " + a, g._threads[a] = e);
                     l++;
-                    f._progressInfo.threadsLoaded++;
-                    f._onProgress();
-                    l === k && f._pageLoadCallback.call(f, null, f._threads);
+                    g._progressInfo.threadsLoaded++;
+                    g._onProgress();
+                    l === k && g._pageLoadCallback.call(g, null, g._threads);
                   };
                 }(m), function(a) {
-                  f._progressInfo.threadFilesLoaded++;
-                  f._onProgress();
+                  g._progressInfo.threadFilesLoaded++;
+                  g._onProgress();
                 });
               }
               this._onProgress();
             } else {
               this._pageLoadCallback.call(this, "Error loading page.", null);
             }
           };
-          a.prototype._loadData = function(a, c, f) {
+          a.prototype._loadData = function(a, c, g) {
             var k = 0, m = 0, s = a.length, n = [];
             n.length = s;
             for (var d = 0;d < s;d++) {
-              var e = this._baseUrl + a[d], b = new XMLHttpRequest, g = /\.tl$/i.test(e) ? "arraybuffer" : "json";
+              var e = this._baseUrl + a[d], b = new XMLHttpRequest, f = /\.tl$/i.test(e) ? "arraybuffer" : "json";
               b.open("GET", e, !0);
-              b.responseType = g;
-              b.onload = function(b, g) {
+              b.responseType = f;
+              b.onload = function(b, f) {
                 return function(a) {
-                  if ("json" === g) {
+                  if ("json" === f) {
                     if (a = this.response, "string" === typeof a) {
                       try {
                         a = JSON.parse(a), n[b] = a;
                       } catch (e) {
                         m++;
                       }
                     } else {
                       n[b] = a;
                     }
                   } else {
                     n[b] = this.response;
                   }
                   ++k;
-                  f && f(k);
+                  g && g(k);
                   k === s && c(n);
                 };
-              }(d, g);
+              }(d, f);
               b.send();
             }
           };
           a.colors = "#0044ff #8c4b00 #cc5c33 #ff80c4 #ffbfd9 #ff8800 #8c5e00 #adcc33 #b380ff #bfd9ff #ffaa00 #8c0038 #bf8f30 #f780ff #cc99c9 #aaff00 #000073 #452699 #cc8166 #cca799 #000066 #992626 #cc6666 #ccc299 #ff6600 #526600 #992663 #cc6681 #99ccc2 #ff0066 #520066 #269973 #61994d #739699 #ffcc00 #006629 #269199 #94994d #738299 #ff0000 #590000 #234d8c #8c6246 #7d7399 #ee00ff #00474d #8c2385 #8c7546 #7c8c69 #eeff00 #4d003d #662e1a #62468c #8c6969 #6600ff #4c2900 #1a6657 #8c464f #8c6981 #44ff00 #401100 #1a2466 #663355 #567365 #d90074 #403300 #101d40 #59562d #66614d #cc0000 #002b40 #234010 #4c2626 #4d5e66 #00a3cc #400011 #231040 #4c3626 #464359 #0000bf #331b00 #80e6ff #311a33 #4d3939 #a69b00 #003329 #80ffb2 #331a20 #40303d #00a658 #40ffd9 #ffc480 #ffe1bf #332b26 #8c2500 #9933cc #80fff6 #ffbfbf #303326 #005e8c #33cc47 #b2ff80 #c8bfff #263332 #00708c #cc33ad #ffe680 #f2ffbf #262a33 #388c00 #335ccc #8091ff #bfffd9".split(" ");
           return a;
         }();
         c.TraceLogger = k;
-      })(f.TraceLogger || (f.TraceLogger = {}));
+      })(g.TraceLogger || (g.TraceLogger = {}));
     })(k.Profiler || (k.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       (function(c) {
         var k;
         (function(c) {
           c[c.START_HI = 0] = "START_HI";
           c[c.START_LO = 4] = "START_LO";
           c[c.STOP_HI = 8] = "STOP_HI";
           c[c.STOP_LO = 12] = "STOP_LO";
           c[c.TEXTID = 16] = "TEXTID";
           c[c.NEXTID = 20] = "NEXTID";
         })(k || (k = {}));
         k = function() {
           function c(a) {
-            2 <= a.length && (this._text = a[0], this._data = new DataView(a[1]), this._buffer = new f.TimelineBuffer, this._walkTree(0));
+            2 <= a.length && (this._text = a[0], this._data = new DataView(a[1]), this._buffer = new g.TimelineBuffer, this._walkTree(0));
           }
           Object.defineProperty(c.prototype, "buffer", {get:function() {
             return this._buffer;
           }, enumerable:!0, configurable:!0});
           c.prototype._walkTree = function(a) {
-            var h = this._data, f = this._buffer;
+            var h = this._data, g = this._buffer;
             do {
-              var l = a * c.ITEM_SIZE, k = 4294967295 * h.getUint32(l + 0) + h.getUint32(l + 4), m = 4294967295 * h.getUint32(l + 8) + h.getUint32(l + 12), s = h.getUint32(l + 16), l = h.getUint32(l + 20), w = 1 === (s & 1), s = s >>> 1, s = this._text[s];
-              f.enter(s, null, k / 1E6);
-              w && this._walkTree(a + 1);
-              f.leave(s, null, m / 1E6);
+              var l = a * c.ITEM_SIZE, k = 4294967295 * h.getUint32(l + 0) + h.getUint32(l + 4), m = 4294967295 * h.getUint32(l + 8) + h.getUint32(l + 12), s = h.getUint32(l + 16), l = h.getUint32(l + 20), v = 1 === (s & 1), s = s >>> 1, s = this._text[s];
+              g.enter(s, null, k / 1E6);
+              v && this._walkTree(a + 1);
+              g.leave(s, null, m / 1E6);
               a = l;
             } while (0 !== a);
           };
           c.ITEM_SIZE = 24;
           return c;
         }();
         c.Thread = k;
-      })(f.TraceLogger || (f.TraceLogger = {}));
+      })(g.TraceLogger || (g.TraceLogger = {}));
     })(k.Profiler || (k.Profiler = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(r) {
-    (function(f) {
+    (function(g) {
       var c = k.NumberUtilities.clamp, r = function() {
         function a() {
           this.length = 0;
           this.lines = [];
           this.format = [];
           this.time = [];
           this.repeat = [];
           this.length = 0;
         }
         a.prototype.append = function(a, c) {
-          var f = this.lines;
-          0 < f.length && f[f.length - 1] === a ? this.repeat[f.length - 1]++ : (this.lines.push(a), this.repeat.push(1), this.format.push(c ? {backgroundFillStyle:c} : void 0), this.time.push(performance.now()), this.length++);
+          var g = this.lines;
+          0 < g.length && g[g.length - 1] === a ? this.repeat[g.length - 1]++ : (this.lines.push(a), this.repeat.push(1), this.format.push(c ? {backgroundFillStyle:c} : void 0), this.time.push(performance.now()), this.length++);
         };
         a.prototype.get = function(a) {
           return this.lines[a];
         };
         a.prototype.getFormat = function(a) {
           return this.format[a];
         };
         a.prototype.getTime = function(a) {
           return this.time[a];
         };
         a.prototype.getRepeat = function(a) {
           return this.repeat[a];
         };
         return a;
       }();
-      f.Buffer = r;
+      g.Buffer = r;
       var n = function() {
         function a(a) {
           this.lineColor = "#2A2A2A";
           this.alternateLineColor = "#262626";
           this.textColor = "#FFFFFF";
           this.selectionColor = "#96C9F3";
           this.selectionTextColor = "#000000";
           this.ratio = 1;
@@ -6458,32 +6460,32 @@ var throwError, Errors;
           window.addEventListener("resize", this._resizeHandler.bind(this), !1);
           this._resizeHandler();
           this.textMarginBottom = this.textMarginLeft = 4;
           this.refreshFrequency = 0;
           this.buffer = new r;
           a.addEventListener("keydown", function(a) {
             var h = 0;
             switch(a.keyCode) {
-              case p:
+              case q:
                 this.showLineNumbers = !this.showLineNumbers;
                 break;
-              case u:
+              case w:
                 this.showLineTime = !this.showLineTime;
                 break;
               case s:
                 h = -1;
                 break;
               case n:
                 h = 1;
                 break;
               case c:
                 h = -this.pageLineCount;
                 break;
-              case f:
+              case g:
                 h = this.pageLineCount;
                 break;
               case k:
                 h = -this.lineIndex;
                 break;
               case m:
                 h = this.buffer.length - this.lineIndex;
                 break;
@@ -6494,17 +6496,17 @@ var throwError, Errors;
                 break;
               case e:
                 this.columnIndex += a.metaKey ? 10 : 1;
                 a.preventDefault();
                 break;
               case b:
                 a.metaKey && (this.selection = {start:0, end:this.buffer.length}, a.preventDefault());
                 break;
-              case g:
+              case f:
                 if (a.metaKey) {
                   var V = "";
                   if (this.selection) {
                     for (var Q = this.selection.start;Q <= this.selection.end;Q++) {
                       V += this.buffer.get(Q) + "\n";
                     }
                   } else {
                     V = this.buffer.get(this.lineIndex);
@@ -6519,85 +6521,85 @@ var throwError, Errors;
             this.paint();
           }.bind(this), !1);
           a.addEventListener("focus", function(b) {
             this.hasFocus = !0;
           }.bind(this), !1);
           a.addEventListener("blur", function(b) {
             this.hasFocus = !1;
           }.bind(this), !1);
-          var c = 33, f = 34, k = 36, m = 35, s = 38, n = 40, d = 37, e = 39, b = 65, g = 67, p = 78, u = 84;
+          var c = 33, g = 34, k = 36, m = 35, s = 38, n = 40, d = 37, e = 39, b = 65, f = 67, q = 78, w = 84;
         }
         a.prototype.resize = function() {
           this._resizeHandler();
         };
         a.prototype._resizeHandler = function() {
-          var a = this.canvas.parentElement, c = a.clientWidth, a = a.clientHeight - 1, f = window.devicePixelRatio || 1;
-          1 !== f ? (this.ratio = f / 1, this.canvas.width = c * this.ratio, this.canvas.height = a * this.ratio, this.canvas.style.width = c + "px", this.canvas.style.height = a + "px") : (this.ratio = 1, this.canvas.width = c, this.canvas.height = a);
+          var a = this.canvas.parentElement, c = a.clientWidth, a = a.clientHeight - 1, g = window.devicePixelRatio || 1;
+          1 !== g ? (this.ratio = g / 1, this.canvas.width = c * this.ratio, this.canvas.height = a * this.ratio, this.canvas.style.width = c + "px", this.canvas.style.height = a + "px") : (this.ratio = 1, this.canvas.width = c, this.canvas.height = a);
           this.pageLineCount = Math.floor(this.canvas.height / this.lineHeight);
         };
         a.prototype.gotoLine = function(a) {
           this.lineIndex = c(a, 0, this.buffer.length - 1);
         };
         a.prototype.scrollIntoView = function() {
           this.lineIndex < this.pageIndex ? this.pageIndex = this.lineIndex : this.lineIndex >= this.pageIndex + this.pageLineCount && (this.pageIndex = this.lineIndex - this.pageLineCount + 1);
         };
         a.prototype.scroll = function(a) {
           this.gotoLine(this.lineIndex + a);
           this.scrollIntoView();
         };
         a.prototype.paint = function() {
           var a = this.pageLineCount;
           this.pageIndex + a > this.buffer.length && (a = this.buffer.length - this.pageIndex);
-          var c = this.textMarginLeft, f = c + (this.showLineNumbers ? 5 * (String(this.buffer.length).length + 2) : 0), k = f + (this.showLineTime ? 40 : 10), m = k + 25;
+          var c = this.textMarginLeft, g = c + (this.showLineNumbers ? 5 * (String(this.buffer.length).length + 2) : 0), k = g + (this.showLineTime ? 40 : 10), m = k + 25;
           this.context.font = this.fontSize + 'px Consolas, "Liberation Mono", Courier, monospace';
           this.context.setTransform(this.ratio, 0, 0, this.ratio, 0, 0);
           for (var s = this.canvas.width, n = this.lineHeight, d = 0;d < a;d++) {
-            var e = d * this.lineHeight, b = this.pageIndex + d, g = this.buffer.get(b), p = this.buffer.getFormat(b), u = this.buffer.getRepeat(b), G = 1 < b ? this.buffer.getTime(b) - this.buffer.getTime(0) : 0;
+            var e = d * this.lineHeight, b = this.pageIndex + d, f = this.buffer.get(b), q = this.buffer.getFormat(b), w = this.buffer.getRepeat(b), G = 1 < b ? this.buffer.getTime(b) - this.buffer.getTime(0) : 0;
             this.context.fillStyle = b % 2 ? this.lineColor : this.alternateLineColor;
-            p && p.backgroundFillStyle && (this.context.fillStyle = p.backgroundFillStyle);
+            q && q.backgroundFillStyle && (this.context.fillStyle = q.backgroundFillStyle);
             this.context.fillRect(0, e, s, n);
             this.context.fillStyle = this.selectionTextColor;
             this.context.fillStyle = this.textColor;
             this.selection && b >= this.selection.start && b <= this.selection.end && (this.context.fillStyle = this.selectionColor, this.context.fillRect(0, e, s, n), this.context.fillStyle = this.selectionTextColor);
             this.hasFocus && b === this.lineIndex && (this.context.fillStyle = this.selectionColor, this.context.fillRect(0, e, s, n), this.context.fillStyle = this.selectionTextColor);
-            0 < this.columnIndex && (g = g.substring(this.columnIndex));
+            0 < this.columnIndex && (f = f.substring(this.columnIndex));
             e = (d + 1) * this.lineHeight - this.textMarginBottom;
             this.showLineNumbers && this.context.fillText(String(b), c, e);
-            this.showLineTime && this.context.fillText(G.toFixed(1).padLeft(" ", 6), f, e);
-            1 < u && this.context.fillText(String(u).padLeft(" ", 3), k, e);
-            this.context.fillText(g, m, e);
+            this.showLineTime && this.context.fillText(G.toFixed(1).padLeft(" ", 6), g, e);
+            1 < w && this.context.fillText(String(w).padLeft(" ", 3), k, e);
+            this.context.fillText(f, m, e);
           }
         };
         a.prototype.refreshEvery = function(a) {
           function c() {
-            f.paint();
-            f.refreshFrequency && setTimeout(c, f.refreshFrequency);
-          }
-          var f = this;
+            g.paint();
+            g.refreshFrequency && setTimeout(c, g.refreshFrequency);
+          }
+          var g = this;
           this.refreshFrequency = a;
-          f.refreshFrequency && setTimeout(c, f.refreshFrequency);
+          g.refreshFrequency && setTimeout(c, g.refreshFrequency);
         };
         a.prototype.isScrolledToBottom = function() {
           return this.lineIndex === this.buffer.length - 1;
         };
         return a;
       }();
-      f.Terminal = n;
+      g.Terminal = n;
     })(r.Terminal || (r.Terminal = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
-    (function(f) {
+    (function(g) {
       var c = function() {
-        function c(f) {
+        function c(g) {
           this._lastWeightedTime = this._lastTime = this._index = 0;
           this._gradient = "#FF0000 #FF1100 #FF2300 #FF3400 #FF4600 #FF5700 #FF6900 #FF7B00 #FF8C00 #FF9E00 #FFAF00 #FFC100 #FFD300 #FFE400 #FFF600 #F7FF00 #E5FF00 #D4FF00 #C2FF00 #B0FF00 #9FFF00 #8DFF00 #7CFF00 #6AFF00 #58FF00 #47FF00 #35FF00 #24FF00 #12FF00 #00FF00".split(" ");
-          this._container = f;
+          this._container = g;
           this._canvas = document.createElement("canvas");
           this._container.appendChild(this._canvas);
           this._context = this._canvas.getContext("2d");
           this._listenForContainerSizeChanges();
         }
         c.prototype._listenForContainerSizeChanges = function() {
           var c = this._containerWidth, a = this._containerHeight;
           this._onContainerSizeChanged();
@@ -6619,119 +6621,119 @@ var throwError, Errors;
           return this._container.clientHeight;
         }, enumerable:!0, configurable:!0});
         c.prototype.tickAndRender = function(c, a) {
           void 0 === c && (c = !1);
           void 0 === a && (a = 0);
           if (0 === this._lastTime) {
             this._lastTime = performance.now();
           } else {
-            var h = 1 * (performance.now() - this._lastTime) + 0 * this._lastWeightedTime, f = this._context, l = 2 * this._ratio, k = 30 * this._ratio, m = performance;
+            var h = 1 * (performance.now() - this._lastTime) + 0 * this._lastWeightedTime, g = this._context, l = 2 * this._ratio, k = 30 * this._ratio, m = performance;
             m.memory && (k += 30 * this._ratio);
-            var s = (this._canvas.width - k) / (l + 1) | 0, w = this._index++;
+            var s = (this._canvas.width - k) / (l + 1) | 0, v = this._index++;
             this._index > s && (this._index = 0);
             s = this._canvas.height;
-            f.globalAlpha = 1;
-            f.fillStyle = "black";
-            f.fillRect(k + w * (l + 1), 0, 4 * l, this._canvas.height);
+            g.globalAlpha = 1;
+            g.fillStyle = "black";
+            g.fillRect(k + v * (l + 1), 0, 4 * l, this._canvas.height);
             var d = Math.min(1E3 / 60 / h, 1);
-            f.fillStyle = "#00FF00";
-            f.globalAlpha = c ? .5 : 1;
+            g.fillStyle = "#00FF00";
+            g.globalAlpha = c ? .5 : 1;
             d = s / 2 * d | 0;
-            f.fillRect(k + w * (l + 1), s - d, l, d);
-            a && (d = Math.min(1E3 / 240 / a, 1), f.fillStyle = "#FF6347", d = s / 2 * d | 0, f.fillRect(k + w * (l + 1), s / 2 - d, l, d));
-            0 === w % 16 && (f.globalAlpha = 1, f.fillStyle = "black", f.fillRect(0, 0, k, this._canvas.height), f.fillStyle = "white", f.font = 8 * this._ratio + "px Arial", f.textBaseline = "middle", l = (1E3 / h).toFixed(0), a && (l += " " + a.toFixed(0)), m.memory && (l += " " + (m.memory.usedJSHeapSize / 1024 / 1024).toFixed(2)), f.fillText(l, 2 * this._ratio, this._containerHeight / 2 * this._ratio));
+            g.fillRect(k + v * (l + 1), s - d, l, d);
+            a && (d = Math.min(1E3 / 240 / a, 1), g.fillStyle = "#FF6347", d = s / 2 * d | 0, g.fillRect(k + v * (l + 1), s / 2 - d, l, d));
+            0 === v % 16 && (g.globalAlpha = 1, g.fillStyle = "black", g.fillRect(0, 0, k, this._canvas.height), g.fillStyle = "white", g.font = 8 * this._ratio + "px Arial", g.textBaseline = "middle", l = (1E3 / h).toFixed(0), a && (l += " " + a.toFixed(0)), m.memory && (l += " " + (m.memory.usedJSHeapSize / 1024 / 1024).toFixed(2)), g.fillText(l, 2 * this._ratio, this._containerHeight / 2 * this._ratio));
             this._lastTime = performance.now();
             this._lastWeightedTime = h;
           }
         };
         return c;
       }();
-      f.FPS = c;
+      g.FPS = c;
     })(k.Mini || (k.Mini = {}));
   })(k.Tools || (k.Tools = {}));
 })(Shumway || (Shumway = {}));
 console.timeEnd("Load Shared Dependencies");
 console.time("Load GFX Dependencies");
 (function(k) {
   (function(r) {
-    function f(b, g, a) {
-      return q && a ? "string" === typeof g ? (b = k.ColorUtilities.cssStyleToRGBA(g), k.ColorUtilities.rgbaToCSSStyle(a.transformRGBA(b))) : g instanceof CanvasGradient && g._template ? g._template.createCanvasGradient(b, a) : g : g;
+    function g(b, f, a) {
+      return p && a ? "string" === typeof f ? (b = k.ColorUtilities.cssStyleToRGBA(f), k.ColorUtilities.rgbaToCSSStyle(a.transformRGBA(b))) : f instanceof CanvasGradient && f._template ? f._template.createCanvasGradient(b, a) : f : f;
     }
     var c = k.NumberUtilities.clamp;
     (function(b) {
       b[b.None = 0] = "None";
       b[b.Brief = 1] = "Brief";
       b[b.Verbose = 2] = "Verbose";
     })(r.TraceLevel || (r.TraceLevel = {}));
     var t = k.Metrics.Counter.instance;
     r.frameCounter = new k.Metrics.Counter(!0);
     r.traceLevel = 2;
     r.writer = null;
     r.frameCount = function(b) {
       t.count(b);
       r.frameCounter.count(b);
     };
     r.timelineBuffer = new k.Tools.Profiler.TimelineBuffer("GFX");
-    r.enterTimeline = function(b, g) {
-    };
-    r.leaveTimeline = function(b, g) {
-    };
-    var n = null, a = null, h = null, q = !0;
-    q && "undefined" !== typeof CanvasRenderingContext2D && (n = CanvasGradient.prototype.addColorStop, a = CanvasRenderingContext2D.prototype.createLinearGradient, h = CanvasRenderingContext2D.prototype.createRadialGradient, CanvasRenderingContext2D.prototype.createLinearGradient = function(b, g, a, e) {
-      return(new v(b, g, a, e)).createCanvasGradient(this, null);
-    }, CanvasRenderingContext2D.prototype.createRadialGradient = function(b, g, a, e, d, c) {
-      return(new m(b, g, a, e, d, c)).createCanvasGradient(this, null);
-    }, CanvasGradient.prototype.addColorStop = function(b, g) {
-      n.call(this, b, g);
-      this._template.addColorStop(b, g);
+    r.enterTimeline = function(b, f) {
+    };
+    r.leaveTimeline = function(b, f) {
+    };
+    var n = null, a = null, h = null, p = !0;
+    p && "undefined" !== typeof CanvasRenderingContext2D && (n = CanvasGradient.prototype.addColorStop, a = CanvasRenderingContext2D.prototype.createLinearGradient, h = CanvasRenderingContext2D.prototype.createRadialGradient, CanvasRenderingContext2D.prototype.createLinearGradient = function(b, f, a, e) {
+      return(new u(b, f, a, e)).createCanvasGradient(this, null);
+    }, CanvasRenderingContext2D.prototype.createRadialGradient = function(b, f, a, e, d, c) {
+      return(new m(b, f, a, e, d, c)).createCanvasGradient(this, null);
+    }, CanvasGradient.prototype.addColorStop = function(b, f) {
+      n.call(this, b, f);
+      this._template.addColorStop(b, f);
     });
     var l = function() {
-      return function(b, g) {
+      return function(b, f) {
         this.offset = b;
-        this.color = g;
-      };
-    }(), v = function() {
-      function b(g, a, e, d) {
-        this.x0 = g;
+        this.color = f;
+      };
+    }(), u = function() {
+      function b(f, a, e, d) {
+        this.x0 = f;
         this.y0 = a;
         this.x1 = e;
         this.y1 = d;
         this.colorStops = [];
       }
-      b.prototype.addColorStop = function(b, g) {
-        this.colorStops.push(new l(b, g));
-      };
-      b.prototype.createCanvasGradient = function(b, g) {
+      b.prototype.addColorStop = function(b, f) {
+        this.colorStops.push(new l(b, f));
+      };
+      b.prototype.createCanvasGradient = function(b, f) {
         for (var e = a.call(b, this.x0, this.y0, this.x1, this.y1), d = this.colorStops, c = 0;c < d.length;c++) {
-          var p = d[c], u = p.offset, p = p.color, p = g ? f(b, p, g) : p;
-          n.call(e, u, p);
+          var q = d[c], w = q.offset, q = q.color, q = f ? g(b, q, f) : q;
+          n.call(e, w, q);
         }
         e._template = this;
         e._transform = this._transform;
         return e;
       };
       return b;
     }(), m = function() {
-      function b(g, a, e, d, c, p) {
-        this.x0 = g;
+      function b(f, a, e, d, c, q) {
+        this.x0 = f;
         this.y0 = a;
         this.r0 = e;
         this.x1 = d;
         this.y1 = c;
-        this.r1 = p;
+        this.r1 = q;
         this.colorStops = [];
       }
-      b.prototype.addColorStop = function(b, g) {
-        this.colorStops.push(new l(b, g));
-      };
-      b.prototype.createCanvasGradient = function(b, g) {
+      b.prototype.addColorStop = function(b, f) {
+        this.colorStops.push(new l(b, f));
+      };
+      b.prototype.createCanvasGradient = function(b, f) {
         for (var a = h.call(b, this.x0, this.y0, this.r0, this.x1, this.y1, this.r1), e = this.colorStops, d = 0;d < e.length;d++) {
-          var c = e[d], p = c.offset, c = c.color, c = g ? f(b, c, g) : c;
-          n.call(a, p, c);
+          var c = e[d], q = c.offset, c = c.color, c = f ? g(b, c, f) : c;
+          n.call(a, q, c);
         }
         a._template = this;
         a._transform = this._transform;
         return a;
       };
       return b;
     }(), s;
     (function(b) {
@@ -6742,210 +6744,210 @@ console.time("Load GFX Dependencies");
       b[b.BezierCurveTo = 5] = "BezierCurveTo";
       b[b.ArcTo = 6] = "ArcTo";
       b[b.Rect = 7] = "Rect";
       b[b.Arc = 8] = "Arc";
       b[b.Save = 9] = "Save";
       b[b.Restore = 10] = "Restore";
       b[b.Transform = 11] = "Transform";
     })(s || (s = {}));
-    var w = function() {
-      function b(g) {
+    var v = function() {
+      function b(f) {
         this._commands = new Uint8Array(b._arrayBufferPool.acquire(8), 0, 8);
         this._commandPosition = 0;
         this._data = new Float64Array(b._arrayBufferPool.acquire(8 * Float64Array.BYTES_PER_ELEMENT), 0, 8);
         this._dataPosition = 0;
-        g instanceof b && this.addPath(g);
-      }
-      b._apply = function(b, g) {
+        f instanceof b && this.addPath(f);
+      }
+      b._apply = function(b, f) {
         var a = b._commands, e = b._data, d = 0, c = 0;
-        g.beginPath();
-        for (var p = b._commandPosition;d < p;) {
+        f.beginPath();
+        for (var q = b._commandPosition;d < q;) {
           switch(a[d++]) {
             case 1:
-              g.closePath();
+              f.closePath();
               break;
             case 2:
-              g.moveTo(e[c++], e[c++]);
+              f.moveTo(e[c++], e[c++]);
               break;
             case 3:
-              g.lineTo(e[c++], e[c++]);
+              f.lineTo(e[c++], e[c++]);
               break;
             case 4:
-              g.quadraticCurveTo(e[c++], e[c++], e[c++], e[c++]);
+              f.quadraticCurveTo(e[c++], e[c++], e[c++], e[c++]);
               break;
             case 5:
-              g.bezierCurveTo(e[c++], e[c++], e[c++], e[c++], e[c++], e[c++]);
+              f.bezierCurveTo(e[c++], e[c++], e[c++], e[c++], e[c++], e[c++]);
               break;
             case 6:
-              g.arcTo(e[c++], e[c++], e[c++], e[c++], e[c++]);
+              f.arcTo(e[c++], e[c++], e[c++], e[c++], e[c++]);
               break;
             case 7:
-              g.rect(e[c++], e[c++], e[c++], e[c++]);
+              f.rect(e[c++], e[c++], e[c++], e[c++]);
               break;
             case 8:
-              g.arc(e[c++], e[c++], e[c++], e[c++], e[c++], !!e[c++]);
+              f.arc(e[c++], e[c++], e[c++], e[c++], e[c++], !!e[c++]);
               break;
             case 9:
-              g.save();
+              f.save();
               break;
             case 10:
-              g.restore();
+              f.restore();
               break;
             case 11:
-              g.transform(e[c++], e[c++], e[c++], e[c++], e[c++], e[c++]);
-          }
-        }
-      };
-      b.prototype._ensureCommandCapacity = function(g) {
-        this._commands = b._arrayBufferPool.ensureUint8ArrayLength(this._commands, g);
-      };
-      b.prototype._ensureDataCapacity = function(g) {
-        this._data = b._arrayBufferPool.ensureFloat64ArrayLength(this._data, g);
+              f.transform(e[c++], e[c++], e[c++], e[c++], e[c++], e[c++]);
+          }
+        }
+      };
+      b.prototype._ensureCommandCapacity = function(f) {
+        this._commands = b._arrayBufferPool.ensureUint8ArrayLength(this._commands, f);
+      };
+      b.prototype._ensureDataCapacity = function(f) {
+        this._data = b._arrayBufferPool.ensureFloat64ArrayLength(this._data, f);
       };
       b.prototype._writeCommand = function(b) {
         this._commandPosition >= this._commands.length && this._ensureCommandCapacity(this._commandPosition + 1);
         this._commands[this._commandPosition++] = b;
       };
-      b.prototype._writeData = function(b, g, a, e, c, d) {
-        var p = arguments.length;
-        this._dataPosition + p >= this._data.length && this._ensureDataCapacity(this._dataPosition + p);
-        var u = this._data, m = this._dataPosition;
-        u[m] = b;
-        u[m + 1] = g;
-        2 < p && (u[m + 2] = a, u[m + 3] = e, 4 < p && (u[m + 4] = c, 6 === p && (u[m + 5] = d)));
-        this._dataPosition += p;
+      b.prototype._writeData = function(b, f, a, e, d, c) {
+        var q = arguments.length;
+        this._dataPosition + q >= this._data.length && this._ensureDataCapacity(this._dataPosition + q);
+        var w = this._data, h = this._dataPosition;
+        w[h] = b;
+        w[h + 1] = f;
+        2 < q && (w[h + 2] = a, w[h + 3] = e, 4 < q && (w[h + 4] = d, 6 === q && (w[h + 5] = c)));
+        this._dataPosition += q;
       };
       b.prototype.closePath = function() {
         this._writeCommand(1);
       };
-      b.prototype.moveTo = function(b, g) {
+      b.prototype.moveTo = function(b, f) {
         this._writeCommand(2);
-        this._writeData(b, g);
-      };
-      b.prototype.lineTo = function(b, g) {
+        this._writeData(b, f);
+      };
+      b.prototype.lineTo = function(b, f) {
         this._writeCommand(3);
-        this._writeData(b, g);
-      };
-      b.prototype.quadraticCurveTo = function(b, g, a, e) {
+        this._writeData(b, f);
+      };
+      b.prototype.quadraticCurveTo = function(b, f, a, e) {
         this._writeCommand(4);
-        this._writeData(b, g, a, e);
-      };
-      b.prototype.bezierCurveTo = function(b, g, a, e, c, d) {
+        this._writeData(b, f, a, e);
+      };
+      b.prototype.bezierCurveTo = function(b, f, a, e, d, c) {
         this._writeCommand(5);
-        this._writeData(b, g, a, e, c, d);
-      };
-      b.prototype.arcTo = function(b, g, a, e, c) {
+        this._writeData(b, f, a, e, d, c);
+      };
+      b.prototype.arcTo = function(b, f, a, e, d) {
         this._writeCommand(6);
-        this._writeData(b, g, a, e, c);
-      };
-      b.prototype.rect = function(b, g, a, e) {
+        this._writeData(b, f, a, e, d);
+      };
+      b.prototype.rect = function(b, f, a, e) {
         this._writeCommand(7);
-        this._writeData(b, g, a, e);
-      };
-      b.prototype.arc = function(b, g, a, e, c, d) {
+        this._writeData(b, f, a, e);
+      };
+      b.prototype.arc = function(b, f, a, e, d, c) {
         this._writeCommand(8);
-        this._writeData(b, g, a, e, c, +d);
-      };
-      b.prototype.addPath = function(b, g) {
-        g && (this._writeCommand(9), this._writeCommand(11), this._writeData(g.a, g.b, g.c, g.d, g.e, g.f));
+        this._writeData(b, f, a, e, d, +c);
+      };
+      b.prototype.addPath = function(b, f) {
+        f && (this._writeCommand(9), this._writeCommand(11), this._writeData(f.a, f.b, f.c, f.d, f.e, f.f));
         var a = this._commandPosition + b._commandPosition;
         a >= this._commands.length && this._ensureCommandCapacity(a);
-        for (var e = this._commands, c = b._commands, d = this._commandPosition, p = 0;d < a;d++) {
-          e[d] = c[p++];
+        for (var e = this._commands, d = b._commands, c = this._commandPosition, q = 0;c < a;c++) {
+          e[c] = d[q++];
         }
         this._commandPosition = a;
         a = this._dataPosition + b._dataPosition;
         a >= this._data.length && this._ensureDataCapacity(a);
         e = this._data;
-        c = b._data;
-        d = this._dataPosition;
-        for (p = 0;d < a;d++) {
-          e[d] = c[p++];
+        d = b._data;
+        c = this._dataPosition;
+        for (q = 0;c < a;c++) {
+          e[c] = d[q++];
         }
         this._dataPosition = a;
-        g && this._writeCommand(10);
+        f && this._writeCommand(10);
       };
       b._arrayBufferPool = new k.ArrayBufferPool;
       return b;
     }();
-    r.Path = w;
+    r.Path = v;
     if ("undefined" !== typeof CanvasRenderingContext2D && ("undefined" === typeof Path2D || !Path2D.prototype.addPath)) {
       var d = CanvasRenderingContext2D.prototype.fill;
-      CanvasRenderingContext2D.prototype.fill = function(b, g) {
-        arguments.length && (b instanceof w ? w._apply(b, this) : g = b);
-        g ? d.call(this, g) : d.call(this);
+      CanvasRenderingContext2D.prototype.fill = function(b, f) {
+        arguments.length && (b instanceof v ? v._apply(b, this) : f = b);
+        f ? d.call(this, f) : d.call(this);
       };
       var e = CanvasRenderingContext2D.prototype.stroke;
-      CanvasRenderingContext2D.prototype.stroke = function(b, g) {
-        arguments.length && (b instanceof w ? w._apply(b, this) : g = b);
-        g ? e.call(this, g) : e.call(this);
+      CanvasRenderingContext2D.prototype.stroke = function(b, f) {
+        arguments.length && (b instanceof v ? v._apply(b, this) : f = b);
+        f ? e.call(this, f) : e.call(this);
       };
       var b = CanvasRenderingContext2D.prototype.clip;
-      CanvasRenderingContext2D.prototype.clip = function(g, a) {
-        arguments.length && (g instanceof w ? w._apply(g, this) : a = g);
+      CanvasRenderingContext2D.prototype.clip = function(f, a) {
+        arguments.length && (f instanceof v ? v._apply(f, this) : a = f);
         a ? b.call(this, a) : b.call(this);
       };
-      window.Path2D = w;
+      window.Path2D = v;
     }
     if ("undefined" !== typeof CanvasPattern && Path2D.prototype.addPath) {
       s = function(b) {
         this._transform = b;
         this._template && (this._template._transform = b);
       };
       CanvasPattern.prototype.setTransform || (CanvasPattern.prototype.setTransform = s);
       CanvasGradient.prototype.setTransform || (CanvasGradient.prototype.setTransform = s);
-      var g = CanvasRenderingContext2D.prototype.fill, p = CanvasRenderingContext2D.prototype.stroke;
+      var f = CanvasRenderingContext2D.prototype.fill, q = CanvasRenderingContext2D.prototype.stroke;
       CanvasRenderingContext2D.prototype.fill = function(b, a) {
         var e = !!this.fillStyle._transform;
         if ((this.fillStyle instanceof CanvasPattern || this.fillStyle instanceof CanvasGradient) && e && b instanceof Path2D) {
-          var e = this.fillStyle._transform, c;
+          var e = this.fillStyle._transform, d;
           try {
-            c = e.inverse();
-          } catch (d) {
-            c = e = r.Geometry.Matrix.createIdentitySVGMatrix();
+            d = e.inverse();
+          } catch (c) {
+            d = e = r.Geometry.Matrix.createIdentitySVGMatrix();
           }
           this.transform(e.a, e.b, e.c, e.d, e.e, e.f);
           e = new Path2D;
-          e.addPath(b, c);
-          g.call(this, e, a);
-          this.transform(c.a, c.b, c.c, c.d, c.e, c.f);
+          e.addPath(b, d);
+          f.call(this, e, a);
+          this.transform(d.a, d.b, d.c, d.d, d.e, d.f);
         } else {
-          0 === arguments.length ? g.call(this) : 1 === arguments.length ? g.call(this, b) : 2 === arguments.length && g.call(this, b, a);
+          0 === arguments.length ? f.call(this) : 1 === arguments.length ? f.call(this, b) : 2 === arguments.length && f.call(this, b, a);
         }
       };
       CanvasRenderingContext2D.prototype.stroke = function(b) {
-        var g = !!this.strokeStyle._transform;
-        if ((this.strokeStyle instanceof CanvasPattern || this.strokeStyle instanceof CanvasGradient) && g && b instanceof Path2D) {
-          var a = this.strokeStyle._transform, g = a.inverse();
+        var f = !!this.strokeStyle._transform;
+        if ((this.strokeStyle instanceof CanvasPattern || this.strokeStyle instanceof CanvasGradient) && f && b instanceof Path2D) {
+          var a = this.strokeStyle._transform, f = a.inverse();
           this.transform(a.a, a.b, a.c, a.d, a.e, a.f);
           a = new Path2D;
-          a.addPath(b, g);
+          a.addPath(b, f);
           var e = this.lineWidth;
-          this.lineWidth *= (g.a + g.d) / 2;
-          p.call(this, a);
-          this.transform(g.a, g.b, g.c, g.d, g.e, g.f);
+          this.lineWidth *= (f.a + f.d) / 2;
+          q.call(this, a);
+          this.transform(f.a, f.b, f.c, f.d, f.e, f.f);
           this.lineWidth = e;
         } else {
-          0 === arguments.length ? p.call(this) : 1 === arguments.length && p.call(this, b);
+          0 === arguments.length ? q.call(this) : 1 === arguments.length && q.call(this, b);
         }
       };
     }
     "undefined" !== typeof CanvasRenderingContext2D && function() {
       function b() {
         return r.Geometry.Matrix.createSVGMatrixFromArray(this.mozCurrentTransform);
       }
-      CanvasRenderingContext2D.prototype.flashStroke = function(b, g) {
+      CanvasRenderingContext2D.prototype.flashStroke = function(b, f) {
         var a = this.currentTransform;
         if (a) {
           var e = new Path2D;
           e.addPath(b, a);
           var d = this.lineWidth;
           this.setTransform(1, 0, 0, 1, 0, 0);
-          switch(g) {
+          switch(f) {
             case 1:
               this.lineWidth = c(d * (k.getScaleX(a) + k.getScaleY(a)) / 2, 1, 1024);
               break;
             case 2:
               this.lineWidth = c(d * k.getScaleY(a), 1, 1024);
               break;
             case 3:
               this.lineWidth = c(d * k.getScaleX(a), 1, 1024);
@@ -6955,106 +6957,106 @@ console.time("Load GFX Dependencies");
           this.lineWidth = d;
         } else {
           this.stroke(b);
         }
       };
       !("currentTransform" in CanvasRenderingContext2D.prototype) && "mozCurrentTransform" in CanvasRenderingContext2D.prototype && Object.defineProperty(CanvasRenderingContext2D.prototype, "currentTransform", {get:b});
     }();
     if ("undefined" !== typeof CanvasRenderingContext2D && void 0 === CanvasRenderingContext2D.prototype.globalColorMatrix) {
-      var u = CanvasRenderingContext2D.prototype.fill, G = CanvasRenderingContext2D.prototype.stroke, U = CanvasRenderingContext2D.prototype.fillText, V = CanvasRenderingContext2D.prototype.strokeText;
+      var w = CanvasRenderingContext2D.prototype.fill, G = CanvasRenderingContext2D.prototype.stroke, U = CanvasRenderingContext2D.prototype.fillText, V = CanvasRenderingContext2D.prototype.strokeText;
       Object.defineProperty(CanvasRenderingContext2D.prototype, "globalColorMatrix", {get:function() {
         return this._globalColorMatrix ? this._globalColorMatrix.clone() : null;
       }, set:function(b) {
         b ? this._globalColorMatrix ? this._globalColorMatrix.set(b) : this._globalColorMatrix = b.clone() : this._globalColorMatrix = null;
       }, enumerable:!0, configurable:!0});
-      CanvasRenderingContext2D.prototype.fill = function(b, g) {
+      CanvasRenderingContext2D.prototype.fill = function(b, f) {
         var a = null;
-        this._globalColorMatrix && (a = this.fillStyle, this.fillStyle = f(this, this.fillStyle, this._globalColorMatrix));
-        0 === arguments.length ? u.call(this) : 1 === arguments.length ? u.call(this, b) : 2 === arguments.length && u.call(this, b, g);
+        this._globalColorMatrix && (a = this.fillStyle, this.fillStyle = g(this, this.fillStyle, this._globalColorMatrix));
+        0 === arguments.length ? w.call(this) : 1 === arguments.length ? w.call(this, b) : 2 === arguments.length && w.call(this, b, f);
         a && (this.fillStyle = a);
       };
-      CanvasRenderingContext2D.prototype.stroke = function(b, g) {
+      CanvasRenderingContext2D.prototype.stroke = function(b, f) {
         var a = null;
-        this._globalColorMatrix && (a = this.strokeStyle, this.strokeStyle = f(this, this.strokeStyle, this._globalColorMatrix));
+        this._globalColorMatrix && (a = this.strokeStyle, this.strokeStyle = g(this, this.strokeStyle, this._globalColorMatrix));
         0 === arguments.length ? G.call(this) : 1 === arguments.length && G.call(this, b);
         a && (this.strokeStyle = a);
       };
-      CanvasRenderingContext2D.prototype.fillText = function(b, g, a, e) {
-        var c = null;
-        this._globalColorMatrix && (c = this.fillStyle, this.fillStyle = f(this, this.fillStyle, this._globalColorMatrix));
-        3 === arguments.length ? U.call(this, b, g, a) : 4 === arguments.length ? U.call(this, b, g, a, e) : k.Debug.unexpected();
-        c && (this.fillStyle = c);
-      };
-      CanvasRenderingContext2D.prototype.strokeText = function(b, g, a, e) {
-        var c = null;
-        this._globalColorMatrix && (c = this.strokeStyle, this.strokeStyle = f(this, this.strokeStyle, this._globalColorMatrix));
-        3 === arguments.length ? V.call(this, b, g, a) : 4 === arguments.length ? V.call(this, b, g, a, e) : k.Debug.unexpected();
-        c && (this.strokeStyle = c);
+      CanvasRenderingContext2D.prototype.fillText = function(b, f, a, e) {
+        var d = null;
+        this._globalColorMatrix && (d = this.fillStyle, this.fillStyle = g(this, this.fillStyle, this._globalColorMatrix));
+        3 === arguments.length ? U.call(this, b, f, a) : 4 === arguments.length ? U.call(this, b, f, a, e) : k.Debug.unexpected();
+        d && (this.fillStyle = d);
+      };
+      CanvasRenderingContext2D.prototype.strokeText = function(b, f, a, e) {
+        var d = null;
+        this._globalColorMatrix && (d = this.strokeStyle, this.strokeStyle = g(this, this.strokeStyle, this._globalColorMatrix));
+        3 === arguments.length ? V.call(this, b, f, a) : 4 === arguments.length ? V.call(this, b, f, a, e) : k.Debug.unexpected();
+        d && (this.strokeStyle = d);
       };
     }
   })(k.GFX || (k.GFX = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   (function(k) {
     k.ScreenShot = function() {
-      return function(f, c, k) {
-        this.dataURL = f;
+      return function(g, c, k) {
+        this.dataURL = g;
         this.w = c;
         this.h = k;
       };
     }();
   })(k.GFX || (k.GFX = {}));
 })(Shumway || (Shumway = {}));
 (function(k) {
   var r = function() {
-    function f() {
+    function g() {
       this._count = 0;
       this._head = this._tail = null;
     }
-    Object.defineProperty(f.prototype, "count", {get:function() {
+    Object.defineProperty(g.prototype, "count", {get:function() {
       return this._count;
     }, enumerable:!0, configurable:!0});
-    Object.defineProperty(f.prototype, "head", {get:function() {
+    Object.defineProperty(g.prototype, "head", {get:function() {
       return this._head;
     }, enumerable:!0, configurable:!0});
-    f.prototype._unshift = function(c) {
+    g.prototype._unshift = function(c) {
       0 === this._count ? this._head = this._tail = c : (c.next = this._head, this._head = c.next.previous = c);
       this._count++;
     };
-    f.prototype._remove = function(c) {
+    g.prototype._remove = function(c) {
       c === this._head && c === this._tail ? this._head = this._tail = null : c === this._head ? (this._head = c.next, this._head.previous = null) : c == this._tail ? (this._tail = c.previous, this._tail.next = null) : (c.previous.next = c.next, c.next.previous = c.previous);
       c.previous = c.next = null;
       this._count--;
     };
-    f.prototype.use = function(c) {
+    g.prototype.use = function(c) {
       this._head !== c && ((c.next || c.previous || this._tail === c) && this._remove(c), this._unshift(c));
     };
-    f.prototype.pop = function() {
+    g.prototype.pop = function() {
       if (!this._tail) {
         return null;
       }
       var c = this._tail;
       this._remove(c);
       return c;
     };
-    f.prototype.visit = function(c, f) {
-      void 0 === f && (f = !0);