Merge mozilla-inbound to mozilla-central. a=merge
authorDorel Luca <dluca@mozilla.com>
Wed, 20 Jun 2018 00:54:45 +0300
changeset 422983 e429320fcdd2d5236bb4713e6c435456146e42b9
parent 422953 33c34fbb0b0d7e890c1985c3ba896dd1a238dd1d (current diff)
parent 422982 2d5727bbe035f34e4044878e2870520291286156 (diff)
child 422988 b994e5f56361c407feabf5f336bc34fbb8bface2
child 423050 42d6174c52eeba85a89d72a5cb2d25411b4c22a4
push id34160
push userdluca@mozilla.com
push dateTue, 19 Jun 2018 21:55:15 +0000
treeherdermozilla-central@e429320fcdd2 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone62.0a1
first release with
nightly linux32
e429320fcdd2 / 62.0a1 / 20180619220118 / files
nightly linux64
e429320fcdd2 / 62.0a1 / 20180619220118 / files
nightly mac
e429320fcdd2 / 62.0a1 / 20180619220118 / files
nightly win32
e429320fcdd2 / 62.0a1 / 20180619220118 / files
nightly win64
e429320fcdd2 / 62.0a1 / 20180619220118 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-inbound to mozilla-central. a=merge
js/src/gc/GC.cpp
js/src/gc/GCRuntime.h
js/src/jsfriendapi.cpp
js/src/vm/Runtime.cpp
js/src/vm/Runtime.h
--- a/accessible/tests/mochitest/aom/test_general.html
+++ b/accessible/tests/mochitest/aom/test_general.html
@@ -102,16 +102,16 @@
     }
 
     // Check if an AccessibleNode is properly cached.
     let node = ifrDoc.createElement("div");
     anode = node.accessibleNode;
     is(anode, node.accessibleNode, "an AccessibleNode is properly cached");
 
     // Adopting node to another document doesn't change .accessibleNode
-    anotherDoc = document.implementation.createDocument("", "", null);
+    let anotherDoc = document.implementation.createDocument("", "", null);
     let adopted_node = anotherDoc.adoptNode(node);
     is(anode, adopted_node.accessibleNode, "adopting node to another document doesn't change node.accessibleNode");
 
     finish();
   }
   </script>
 </head>
--- a/devtools/client/accessibility/constants.js
+++ b/devtools/client/accessibility/constants.js
@@ -33,31 +33,29 @@ exports.UPDATE_CAN_BE_ENABLED = "UPDATE_
 // Ordered accessible properties to be displayed by the accessible component.
 exports.ORDERED_PROPS = [
   "name",
   "role",
   "actions",
   "value",
   "DOMNode",
   "description",
-  "help",
   "keyboardShortcut",
   "childCount",
   "indexInParent",
   "states",
   "attributes"
 ];
 
 // Accessible events (emitted by accessible front) that the accessible component
 // listens to for a current accessible.
 exports.ACCESSIBLE_EVENTS = [
   "actions-change",
   "attributes-change",
   "description-change",
-  "help-change",
   "name-change",
   "reorder",
   "shortcut-change",
   "states-change",
   "text-change",
   "value-change",
   "index-in-parent-change"
 ];
--- a/devtools/client/accessibility/test/browser/browser.ini
+++ b/devtools/client/accessibility/test/browser/browser.ini
@@ -1,14 +1,16 @@
 [DEFAULT]
 tags = devtools
 subsuite = devtools
 support-files =
   head.js
   !/devtools/client/shared/test/shared-head.js
+  !/devtools/client/shared/test/test-actor.js
+  !/devtools/client/shared/test/test-actor-registry.js
   !/devtools/client/inspector/test/shared-head.js
   !/devtools/client/shared/test/shared-redux-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
 
 [browser_accessibility_context_menu_browser.js]
 [browser_accessibility_context_menu_inspector.js]
 [browser_accessibility_mutations.js]
 [browser_accessibility_panel_highlighter.js]
--- a/devtools/client/accessibility/test/browser/browser_accessibility_mutations.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_mutations.js
@@ -45,17 +45,16 @@ const tests = [{
       name: `""`
     }],
     sidebar: {
       name: null,
       role: "paragraph",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 1,
       indexInParent: 1,
       states: ["selectable text", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Remove a child from a document.",
--- a/devtools/client/accessibility/test/browser/browser_accessibility_sidebar.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_sidebar.js
@@ -24,17 +24,16 @@ const tests = [{
   desc: "Test the initial accessibility sidebar state.",
   expected: {
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 0,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Mark document as disabled for accessibility.",
--- a/devtools/client/accessibility/test/browser/browser_accessibility_tree_nagivation.js
+++ b/devtools/client/accessibility/test/browser/browser_accessibility_tree_nagivation.js
@@ -31,17 +31,16 @@ const tests = [{
       name: `"Accessibility Panel Test"`
     }],
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 2,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Expand first tree node.",
@@ -76,34 +75,32 @@ const tests = [{
       name: `""`
     }],
     sidebar: {
       name: "Top level header",
       role: "heading",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 1,
       indexInParent: 0,
       states: ["selectable text", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Select third tree node.",
   action: ({ doc }) => selectRow(doc, 2),
   expected: {
     sidebar: {
       name: "Top level header",
       role: "text leaf",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 0,
       indexInParent: 0,
       states: ["opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Collapse first tree node.",
@@ -114,17 +111,16 @@ const tests = [{
       name: `"Accessibility Panel Test"`
     }],
     sidebar: {
       name: "Accessibility Panel Test",
       role: "document",
       actions: [],
       value: "",
       description: "",
-      help: "",
       keyboardShortcut: "",
       childCount: 2,
       indexInParent: 0,
       states: ["readonly", "focusable", "opaque", "enabled", "sensitive"]
     }
   }
 }, {
   desc: "Expand first tree node again.",
--- a/devtools/client/inspector/inspector.js
+++ b/devtools/client/inspector/inspector.js
@@ -49,16 +49,17 @@ const INITIAL_SIDEBAR_SIZE = 350;
 // If the toolbox's width is smaller than the given amount of pixels, the sidebar
 // automatically switches from 'landscape/horizontal' to 'portrait/vertical' mode.
 const PORTRAIT_MODE_WIDTH_THRESHOLD = 700;
 // If the toolbox's width docked to the side is smaller than the given amount of pixels,
 // the sidebar automatically switches from 'landscape/horizontal' to 'portrait/vertical'
 // mode.
 const SIDE_PORTAIT_MODE_WIDTH_THRESHOLD = 1000;
 
+const THREE_PANE_FIRST_RUN_PREF = "devtools.inspector.three-pane-first-run";
 const SHOW_THREE_PANE_ONBOARDING_PREF = "devtools.inspector.show-three-pane-tooltip";
 const THREE_PANE_ENABLED_PREF = "devtools.inspector.three-pane-enabled";
 const THREE_PANE_ENABLED_SCALAR = "devtools.inspector.three_pane_enabled";
 
 const TELEMETRY_EYEDROPPER_OPENED = "devtools.toolbar.eyedropper.opened";
 
 /**
  * Represents an open instance of the Inspector for a tab.
@@ -115,16 +116,17 @@ function Inspector(toolbox) {
   this.reflowTracker = new ReflowTracker(this._target);
   this.styleChangeTracker = new InspectorStyleChangeTracker(this);
 
   // Store the URL of the target page prior to navigation in order to ensure
   // telemetry counts in the Grid Inspector are not double counted on reload.
   this.previousURL = this.target.url;
 
   this.is3PaneModeEnabled = Services.prefs.getBoolPref(THREE_PANE_ENABLED_PREF);
+  this.is3PaneModeFirstRun = Services.prefs.getBoolPref(THREE_PANE_FIRST_RUN_PREF);
   this.show3PaneTooltip = Services.prefs.getBoolPref(SHOW_THREE_PANE_ONBOARDING_PREF);
 
   this.nodeMenuTriggerInfo = null;
 
   this._clearSearchResultsLabel = this._clearSearchResultsLabel.bind(this);
   this._handleRejectionIfNotDestroyed = this._handleRejectionIfNotDestroyed.bind(this);
   this._onBeforeNavigate = this._onBeforeNavigate.bind(this);
   this._onContextMenu = this._onContextMenu.bind(this);
@@ -245,16 +247,24 @@ Inspector.prototype = {
 
     if (this.target.isLocalTab) {
       this.target.on("thread-paused", this._updateDebuggerPausedWarning);
       this.target.on("thread-resumed", this._updateDebuggerPausedWarning);
       this.toolbox.on("select", this._updateDebuggerPausedWarning);
       this._updateDebuggerPausedWarning();
     }
 
+    // Resets the inspector sidebar widths if this is the first run of the 3 pane mode.
+    if (this.is3PaneModeFirstRun) {
+      Services.prefs.clearUserPref("devtools.toolsidebar-width.inspector");
+      Services.prefs.clearUserPref("devtools.toolsidebar-height.inspector");
+      Services.prefs.clearUserPref("devtools.toolsidebar-width.inspector.splitsidebar");
+      Services.prefs.setBoolPref(THREE_PANE_FIRST_RUN_PREF, false);
+    }
+
     this._initMarkup();
     this.isReady = false;
 
     this.setupSearchBox();
 
     // Setup the splitter before the sidebar is displayed so,
     // we don't miss any events.
     this.setupSplitter();
@@ -1391,16 +1401,17 @@ Inspector.prototype = {
     this.reflowTracker.destroy();
     this.styleChangeTracker.destroy();
 
     this._notificationBox = null;
     this._target = null;
     this._toolbox = null;
     this.breadcrumbs = null;
     this.is3PaneModeEnabled = null;
+    this.is3PaneModeFirstRun = null;
     this.panelDoc = null;
     this.panelWin.inspector = null;
     this.panelWin = null;
     this.resultsLength = null;
     this.searchBox = null;
     this.show3PaneTooltip = null;
     this.sidebar = null;
     this.store = null;
--- a/devtools/client/inspector/rules/models/element-style.js
+++ b/devtools/client/inspector/rules/models/element-style.js
@@ -1,43 +1,41 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const promise = require("promise");
 const Rule = require("devtools/client/inspector/rules/models/rule");
-const {promiseWarn} = require("devtools/client/inspector/shared/utils");
-const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
-const {getCssProperties, isCssVariable} = require("devtools/shared/fronts/css-properties");
+const UserProperties = require("devtools/client/inspector/rules/models/user-properties");
+const { promiseWarn } = require("devtools/client/inspector/shared/utils");
+const { getCssProperties, isCssVariable } = require("devtools/shared/fronts/css-properties");
+const { ELEMENT_STYLE } = require("devtools/shared/specs/styles");
 
 /**
  * ElementStyle is responsible for the following:
  *   Keeps track of which properties are overridden.
  *   Maintains a list of Rule objects for a given element.
  *
- * @param {Element} element
- *        The element whose style we are viewing.
- * @param {CssRuleView} ruleView
- *        The instance of the rule-view panel.
- * @param {Object} store
- *        The ElementStyle can use this object to store metadata
- *        that might outlast the rule view, particularly the current
- *        set of disabled properties.
- * @param {PageStyleFront} pageStyle
- *        Front for the page style actor that will be providing
- *        the style information.
- * @param {Boolean} showUserAgentStyles
- *        Should user agent styles be inspected?
+ * @param  {Element} element
+ *         The element whose style we are viewing.
+ * @param  {CssRuleView} ruleView
+ *         The instance of the rule-view panel.
+ * @param  {Object} store
+ *         The ElementStyle can use this object to store metadata
+ *         that might outlast the rule view, particularly the current
+ *         set of disabled properties.
+ * @param  {PageStyleFront} pageStyle
+ *         Front for the page style actor that will be providing
+ *         the style information.
+ * @param  {Boolean} showUserAgentStyles
+ *         Should user agent styles be inspected?
  */
-function ElementStyle(element, ruleView, store, pageStyle,
-    showUserAgentStyles) {
+function ElementStyle(element, ruleView, store, pageStyle, showUserAgentStyles) {
   this.element = element;
   this.ruleView = ruleView;
   this.store = store || {};
   this.pageStyle = pageStyle;
   this.showUserAgentStyles = showUserAgentStyles;
   this.rules = [];
   this.cssProperties = getCssProperties(this.ruleView.inspector.toolbox);
   this.variables = new Map();
@@ -49,23 +47,21 @@ function ElementStyle(element, ruleView,
   }
 
   if (!("disabled" in this.store)) {
     this.store.disabled = new WeakMap();
   }
 }
 
 ElementStyle.prototype = {
-  // The element we're looking at.
-  element: null,
-
   destroy: function() {
     if (this.destroyed) {
       return;
     }
+
     this.destroyed = true;
 
     for (const rule of this.rules) {
       if (rule.editor) {
         rule.editor.destroy();
       }
     }
   },
@@ -88,27 +84,22 @@ ElementStyle.prototype = {
    * ready.
    */
   populate: function() {
     const populated = this.pageStyle.getApplied(this.element, {
       inherited: true,
       matchedSelectors: true,
       filter: this.showUserAgentStyles ? "ua" : undefined,
     }).then(entries => {
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-
-      if (this.populated !== populated) {
-        // Don't care anymore.
+      if (this.destroyed || this.populated !== populated) {
         return promise.resolve(undefined);
       }
 
       // Store the current list of rules (if any) during the population
-      // process.  They will be reused if possible.
+      // process. They will be reused if possible.
       const existingRules = this.rules;
 
       this.rules = [];
 
       for (const entry of entries) {
         this._maybeAddRule(entry, existingRules);
       }
 
@@ -136,17 +127,17 @@ ElementStyle.prototype = {
     this.populated = populated;
     return this.populated;
   },
 
   /**
    * Get the font families in use by the element.
    *
    * Returns a promise that will be resolved to a list of CSS family
-   * names.  The list might have duplicates.
+   * names. The list might have duplicates.
    */
   getUsedFontFamilies: function() {
     return new Promise((resolve, reject) => {
       this.ruleView.styleWindow.requestIdleCallback(async () => {
         try {
           const fonts = await this.pageStyle.getUsedFontFaces(
             this.element, { includePreviews: false });
           resolve(fonts.map(font => font.CSSFamilyName));
@@ -162,35 +153,31 @@ ElementStyle.prototype = {
    */
   _sortRulesForPseudoElement: function() {
     this.rules = this.rules.sort((a, b) => {
       return (a.pseudoElement || "z") > (b.pseudoElement || "z");
     });
   },
 
   /**
-   * Add a rule if it's one we care about.  Filters out duplicates and
+   * Add a rule if it's one we care about. Filters out duplicates and
    * inherited styles with no inherited properties.
    *
-   * @param {Object} options
-   *        Options for creating the Rule, see the Rule constructor.
-   * @param {Array} existingRules
-   *        Rules to reuse if possible.  If a rule is reused, then it
-   *        it will be deleted from this array.
+   * @param  {Object} options
+   *         Options for creating the Rule, see the Rule constructor.
+   * @param  {Array} existingRules
+   *         Rules to reuse if possible. If a rule is reused, then it
+   *         it will be deleted from this array.
    * @return {Boolean} true if we added the rule.
    */
   _maybeAddRule: function(options, existingRules) {
     // If we've already included this domRule (for example, when a
     // common selector is inherited), ignore it.
-    if (options.rule &&
-        this.rules.some(rule => rule.domRule === options.rule)) {
-      return false;
-    }
-
-    if (options.system) {
+    if (options.system ||
+        (options.rule && this.rules.some(rule => rule.domRule === options.rule))) {
       return false;
     }
 
     let rule = null;
 
     // If we're refreshing and the rule previously existed, reuse the
     // Rule object.
     if (existingRules) {
@@ -227,19 +214,19 @@ ElementStyle.prototype = {
       this.markOverridden(pseudo);
     }
   },
 
   /**
    * Mark the properties listed in this.rules for a given pseudo element
    * with an overridden flag if an earlier property overrides it.
    *
-   * @param {String} pseudo
-   *        Which pseudo element to flag as overridden.
-   *        Empty string or undefined will default to no pseudo element.
+   * @param  {String} pseudo
+   *         Which pseudo element to flag as overridden.
+   *         Empty string or undefined will default to no pseudo element.
    */
   markOverridden: function(pseudo = "") {
     // Gather all the text properties applied by these rules, ordered
     // from more- to less-specific. Text properties from keyframes rule are
     // excluded from being marked as overridden since a number of criteria such
     // as time, and animation overlay are required to be check in order to
     // determine if the property is overridden.
     const textProps = [];
@@ -257,17 +244,17 @@ ElementStyle.prototype = {
 
     // Gather all the computed properties applied by those text
     // properties.
     let computedProps = [];
     for (const textProp of textProps) {
       computedProps = computedProps.concat(textProp.computed);
     }
 
-    // Walk over the computed properties.  As we see a property name
+    // Walk over the computed properties. As we see a property name
     // for the first time, mark that property's name as taken by this
     // property.
     //
     // If we come across a property whose name is already taken, check
     // its priority against the property that was found first:
     //
     //   If the new property is a higher priority, mark the old
     //   property overridden and mark the property name as taken by
@@ -286,73 +273,77 @@ ElementStyle.prototype = {
       // linear-gradient in this case:
       //  -moz-linear-gradient: ...;
       //  -webkit-linear-gradient: ...;
       //  linear-gradient: ...;
       if (!computedProp.textProp.isValid()) {
         computedProp.overridden = true;
         continue;
       }
+
       let overridden;
       if (earlier &&
           computedProp.priority === "important" &&
           earlier.priority !== "important" &&
           (earlier.textProp.rule.inherited ||
            !computedProp.textProp.rule.inherited)) {
-        // New property is higher priority.  Mark the earlier property
+        // New property is higher priority. Mark the earlier property
         // overridden (which will reverse its dirty state).
         earlier._overriddenDirty = !earlier._overriddenDirty;
         earlier.overridden = true;
         overridden = false;
       } else {
         overridden = !!earlier;
       }
 
       computedProp._overriddenDirty =
         (!!computedProp.overridden !== overridden);
       computedProp.overridden = overridden;
+
       if (!computedProp.overridden && computedProp.textProp.enabled) {
         taken[computedProp.name] = computedProp;
 
         if (isCssVariable(computedProp.name)) {
           this.variables.set(computedProp.name, computedProp.value);
         }
       }
     }
 
     // For each TextProperty, mark it overridden if all of its
-    // computed properties are marked overridden.  Update the text
-    // property's associated editor, if any.  This will clear the
+    // computed properties are marked overridden. Update the text
+    // property's associated editor, if any. This will clear the
     // _overriddenDirty state on all computed properties.
     for (const textProp of textProps) {
       // _updatePropertyOverridden will return true if the
       // overridden state has changed for the text property.
       if (this._updatePropertyOverridden(textProp)) {
         textProp.updateEditor();
       }
     }
   },
 
   /**
    * Mark a given TextProperty as overridden or not depending on the
-   * state of its computed properties.  Clears the _overriddenDirty state
+   * state of its computed properties. Clears the _overriddenDirty state
    * on all computed properties.
    *
-   * @param {TextProperty} prop
-   *        The text property to update.
+   * @param  {TextProperty} prop
+   *         The text property to update.
    * @return {Boolean} true if the TextProperty's overridden state (or any of
    *         its computed properties overridden state) changed.
    */
   _updatePropertyOverridden: function(prop) {
     let overridden = true;
     let dirty = false;
+
     for (const computedProp of prop.computed) {
       if (!computedProp.overridden) {
         overridden = false;
       }
+
       dirty = computedProp._overriddenDirty || dirty;
       delete computedProp._overriddenDirty;
     }
 
     dirty = (!!prop.overridden !== overridden) || dirty;
     prop.overridden = overridden;
     return dirty;
   },
@@ -366,87 +357,9 @@ ElementStyle.prototype = {
   * @return {String} the variable's value or null if the variable is
   *         not defined.
   */
   getVariable: function(name) {
     return this.variables.get(name);
   },
 };
 
-/**
- * Store of CSSStyleDeclarations mapped to properties that have been changed by
- * the user.
- */
-function UserProperties() {
-  this.map = new Map();
-}
-
-UserProperties.prototype = {
-  /**
-   * Get a named property for a given CSSStyleDeclaration.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property is mapped.
-   * @param {String} name
-   *        The name of the property to get.
-   * @param {String} value
-   *        Default value.
-   * @return {String}
-   *        The property value if it has previously been set by the user, null
-   *        otherwise.
-   */
-  getProperty: function(style, name, value) {
-    const key = this.getKey(style);
-    const entry = this.map.get(key, null);
-
-    if (entry && name in entry) {
-      return entry[name];
-    }
-    return value;
-  },
-
-  /**
-   * Set a named property for a given CSSStyleDeclaration.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property is to be mapped.
-   * @param {String} name
-   *        The name of the property to set.
-   * @param {String} userValue
-   *        The value of the property to set.
-   */
-  setProperty: function(style, name, userValue) {
-    const key = this.getKey(style, name);
-    const entry = this.map.get(key, null);
-
-    if (entry) {
-      entry[name] = userValue;
-    } else {
-      const props = {};
-      props[name] = userValue;
-      this.map.set(key, props);
-    }
-  },
-
-  /**
-   * Check whether a named property for a given CSSStyleDeclaration is stored.
-   *
-   * @param {CSSStyleDeclaration} style
-   *        The CSSStyleDeclaration against which the property would be mapped.
-   * @param {String} name
-   *        The name of the property to check.
-   */
-  contains: function(style, name) {
-    const key = this.getKey(style, name);
-    const entry = this.map.get(key, null);
-    return !!entry && name in entry;
-  },
-
-  getKey: function(style, name) {
-    return style.actorID + ":" + name;
-  },
-
-  clear: function() {
-    this.map.clear();
-  }
-};
-
 module.exports = ElementStyle;
--- a/devtools/client/inspector/rules/models/moz.build
+++ b/devtools/client/inspector/rules/models/moz.build
@@ -3,9 +3,10 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DevToolsModules(
     'element-style.js',
     'rule.js',
     'text-property.js',
+    'user-properties.js',
 )
copy from devtools/client/inspector/rules/models/element-style.js
copy to devtools/client/inspector/rules/models/user-properties.js
--- a/devtools/client/inspector/rules/models/element-style.js
+++ b/devtools/client/inspector/rules/models/user-properties.js
@@ -1,381 +1,14 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ts=2 et sw=2 tw=80: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const promise = require("promise");
-const Rule = require("devtools/client/inspector/rules/models/rule");
-const {promiseWarn} = require("devtools/client/inspector/shared/utils");
-const {ELEMENT_STYLE} = require("devtools/shared/specs/styles");
-const {getCssProperties, isCssVariable} = require("devtools/shared/fronts/css-properties");
-
-/**
- * ElementStyle is responsible for the following:
- *   Keeps track of which properties are overridden.
- *   Maintains a list of Rule objects for a given element.
- *
- * @param {Element} element
- *        The element whose style we are viewing.
- * @param {CssRuleView} ruleView
- *        The instance of the rule-view panel.
- * @param {Object} store
- *        The ElementStyle can use this object to store metadata
- *        that might outlast the rule view, particularly the current
- *        set of disabled properties.
- * @param {PageStyleFront} pageStyle
- *        Front for the page style actor that will be providing
- *        the style information.
- * @param {Boolean} showUserAgentStyles
- *        Should user agent styles be inspected?
- */
-function ElementStyle(element, ruleView, store, pageStyle,
-    showUserAgentStyles) {
-  this.element = element;
-  this.ruleView = ruleView;
-  this.store = store || {};
-  this.pageStyle = pageStyle;
-  this.showUserAgentStyles = showUserAgentStyles;
-  this.rules = [];
-  this.cssProperties = getCssProperties(this.ruleView.inspector.toolbox);
-  this.variables = new Map();
-
-  // We don't want to overwrite this.store.userProperties so we only create it
-  // if it doesn't already exist.
-  if (!("userProperties" in this.store)) {
-    this.store.userProperties = new UserProperties();
-  }
-
-  if (!("disabled" in this.store)) {
-    this.store.disabled = new WeakMap();
-  }
-}
-
-ElementStyle.prototype = {
-  // The element we're looking at.
-  element: null,
-
-  destroy: function() {
-    if (this.destroyed) {
-      return;
-    }
-    this.destroyed = true;
-
-    for (const rule of this.rules) {
-      if (rule.editor) {
-        rule.editor.destroy();
-      }
-    }
-  },
-
-  /**
-   * Called by the Rule object when it has been changed through the
-   * setProperty* methods.
-   */
-  _changed: function() {
-    if (this.onChanged) {
-      this.onChanged();
-    }
-  },
-
-  /**
-   * Refresh the list of rules to be displayed for the active element.
-   * Upon completion, this.rules[] will hold a list of Rule objects.
-   *
-   * Returns a promise that will be resolved when the elementStyle is
-   * ready.
-   */
-  populate: function() {
-    const populated = this.pageStyle.getApplied(this.element, {
-      inherited: true,
-      matchedSelectors: true,
-      filter: this.showUserAgentStyles ? "ua" : undefined,
-    }).then(entries => {
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-
-      if (this.populated !== populated) {
-        // Don't care anymore.
-        return promise.resolve(undefined);
-      }
-
-      // Store the current list of rules (if any) during the population
-      // process.  They will be reused if possible.
-      const existingRules = this.rules;
-
-      this.rules = [];
-
-      for (const entry of entries) {
-        this._maybeAddRule(entry, existingRules);
-      }
-
-      // Mark overridden computed styles.
-      this.markOverriddenAll();
-
-      this._sortRulesForPseudoElement();
-
-      // We're done with the previous list of rules.
-      for (const r of existingRules) {
-        if (r && r.editor) {
-          r.editor.destroy();
-        }
-      }
-
-      return undefined;
-    }).catch(e => {
-      // populate is often called after a setTimeout,
-      // the connection may already be closed.
-      if (this.destroyed) {
-        return promise.resolve(undefined);
-      }
-      return promiseWarn(e);
-    });
-    this.populated = populated;
-    return this.populated;
-  },
-
-  /**
-   * Get the font families in use by the element.
-   *
-   * Returns a promise that will be resolved to a list of CSS family
-   * names.  The list might have duplicates.
-   */
-  getUsedFontFamilies: function() {
-    return new Promise((resolve, reject) => {
-      this.ruleView.styleWindow.requestIdleCallback(async () => {
-        try {
-          const fonts = await this.pageStyle.getUsedFontFaces(
-            this.element, { includePreviews: false });
-          resolve(fonts.map(font => font.CSSFamilyName));
-        } catch (e) {
-          reject(e);
-        }
-      });
-    });
-  },
-
-  /**
-   * Put pseudo elements in front of others.
-   */
-  _sortRulesForPseudoElement: function() {
-    this.rules = this.rules.sort((a, b) => {
-      return (a.pseudoElement || "z") > (b.pseudoElement || "z");
-    });
-  },
-
-  /**
-   * Add a rule if it's one we care about.  Filters out duplicates and
-   * inherited styles with no inherited properties.
-   *
-   * @param {Object} options
-   *        Options for creating the Rule, see the Rule constructor.
-   * @param {Array} existingRules
-   *        Rules to reuse if possible.  If a rule is reused, then it
-   *        it will be deleted from this array.
-   * @return {Boolean} true if we added the rule.
-   */
-  _maybeAddRule: function(options, existingRules) {
-    // If we've already included this domRule (for example, when a
-    // common selector is inherited), ignore it.
-    if (options.rule &&
-        this.rules.some(rule => rule.domRule === options.rule)) {
-      return false;
-    }
-
-    if (options.system) {
-      return false;
-    }
-
-    let rule = null;
-
-    // If we're refreshing and the rule previously existed, reuse the
-    // Rule object.
-    if (existingRules) {
-      const ruleIndex = existingRules.findIndex((r) => r.matches(options));
-      if (ruleIndex >= 0) {
-        rule = existingRules[ruleIndex];
-        rule.refresh(options);
-        existingRules.splice(ruleIndex, 1);
-      }
-    }
-
-    // If this is a new rule, create its Rule object.
-    if (!rule) {
-      rule = new Rule(this, options);
-    }
-
-    // Ignore inherited rules with no visible properties.
-    if (options.inherited && !rule.hasAnyVisibleProperties()) {
-      return false;
-    }
-
-    this.rules.push(rule);
-    return true;
-  },
-
-  /**
-   * Calls markOverridden with all supported pseudo elements
-   */
-  markOverriddenAll: function() {
-    this.variables.clear();
-    this.markOverridden();
-
-    for (const pseudo of this.cssProperties.pseudoElements) {
-      this.markOverridden(pseudo);
-    }
-  },
-
-  /**
-   * Mark the properties listed in this.rules for a given pseudo element
-   * with an overridden flag if an earlier property overrides it.
-   *
-   * @param {String} pseudo
-   *        Which pseudo element to flag as overridden.
-   *        Empty string or undefined will default to no pseudo element.
-   */
-  markOverridden: function(pseudo = "") {
-    // Gather all the text properties applied by these rules, ordered
-    // from more- to less-specific. Text properties from keyframes rule are
-    // excluded from being marked as overridden since a number of criteria such
-    // as time, and animation overlay are required to be check in order to
-    // determine if the property is overridden.
-    const textProps = [];
-    for (const rule of this.rules) {
-      if ((rule.matchedSelectors.length > 0 ||
-           rule.domRule.type === ELEMENT_STYLE) &&
-          rule.pseudoElement === pseudo && !rule.keyframes) {
-        for (const textProp of rule.textProps.slice(0).reverse()) {
-          if (textProp.enabled) {
-            textProps.push(textProp);
-          }
-        }
-      }
-    }
-
-    // Gather all the computed properties applied by those text
-    // properties.
-    let computedProps = [];
-    for (const textProp of textProps) {
-      computedProps = computedProps.concat(textProp.computed);
-    }
-
-    // Walk over the computed properties.  As we see a property name
-    // for the first time, mark that property's name as taken by this
-    // property.
-    //
-    // If we come across a property whose name is already taken, check
-    // its priority against the property that was found first:
-    //
-    //   If the new property is a higher priority, mark the old
-    //   property overridden and mark the property name as taken by
-    //   the new property.
-    //
-    //   If the new property is a lower or equal priority, mark it as
-    //   overridden.
-    //
-    // _overriddenDirty will be set on each prop, indicating whether its
-    // dirty status changed during this pass.
-    const taken = {};
-    for (const computedProp of computedProps) {
-      const earlier = taken[computedProp.name];
-
-      // Prevent -webkit-gradient from being selected after unchecking
-      // linear-gradient in this case:
-      //  -moz-linear-gradient: ...;
-      //  -webkit-linear-gradient: ...;
-      //  linear-gradient: ...;
-      if (!computedProp.textProp.isValid()) {
-        computedProp.overridden = true;
-        continue;
-      }
-      let overridden;
-      if (earlier &&
-          computedProp.priority === "important" &&
-          earlier.priority !== "important" &&
-          (earlier.textProp.rule.inherited ||
-           !computedProp.textProp.rule.inherited)) {
-        // New property is higher priority.  Mark the earlier property
-        // overridden (which will reverse its dirty state).
-        earlier._overriddenDirty = !earlier._overriddenDirty;
-        earlier.overridden = true;
-        overridden = false;
-      } else {
-        overridden = !!earlier;
-      }
-
-      computedProp._overriddenDirty =
-        (!!computedProp.overridden !== overridden);
-      computedProp.overridden = overridden;
-      if (!computedProp.overridden && computedProp.textProp.enabled) {
-        taken[computedProp.name] = computedProp;
-
-        if (isCssVariable(computedProp.name)) {
-          this.variables.set(computedProp.name, computedProp.value);
-        }
-      }
-    }
-
-    // For each TextProperty, mark it overridden if all of its
-    // computed properties are marked overridden.  Update the text
-    // property's associated editor, if any.  This will clear the
-    // _overriddenDirty state on all computed properties.
-    for (const textProp of textProps) {
-      // _updatePropertyOverridden will return true if the
-      // overridden state has changed for the text property.
-      if (this._updatePropertyOverridden(textProp)) {
-        textProp.updateEditor();
-      }
-    }
-  },
-
-  /**
-   * Mark a given TextProperty as overridden or not depending on the
-   * state of its computed properties.  Clears the _overriddenDirty state
-   * on all computed properties.
-   *
-   * @param {TextProperty} prop
-   *        The text property to update.
-   * @return {Boolean} true if the TextProperty's overridden state (or any of
-   *         its computed properties overridden state) changed.
-   */
-  _updatePropertyOverridden: function(prop) {
-    let overridden = true;
-    let dirty = false;
-    for (const computedProp of prop.computed) {
-      if (!computedProp.overridden) {
-        overridden = false;
-      }
-      dirty = computedProp._overriddenDirty || dirty;
-      delete computedProp._overriddenDirty;
-    }
-
-    dirty = (!!prop.overridden !== overridden) || dirty;
-    prop.overridden = overridden;
-    return dirty;
-  },
-
- /**
-  * Returns the current value of a CSS variable; or null if the
-  * variable is not defined.
-  *
-  * @param  {String} name
-  *         The name of the variable.
-  * @return {String} the variable's value or null if the variable is
-  *         not defined.
-  */
-  getVariable: function(name) {
-    return this.variables.get(name);
-  },
-};
-
 /**
  * Store of CSSStyleDeclarations mapped to properties that have been changed by
  * the user.
  */
 function UserProperties() {
   this.map = new Map();
 }
 
@@ -444,9 +77,9 @@ UserProperties.prototype = {
     return style.actorID + ":" + name;
   },
 
   clear: function() {
     this.map.clear();
   }
 };
 
-module.exports = ElementStyle;
+module.exports = UserProperties;
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -210,16 +210,18 @@ devtools.jar:
     skin/images/tool-scratchpad.svg (themes/images/tool-scratchpad.svg)
     skin/images/tool-webaudio.svg (themes/images/tool-webaudio.svg)
     skin/images/tool-memory.svg (themes/images/tool-memory.svg)
     skin/images/tool-dom.svg (themes/images/tool-dom.svg)
     skin/images/tool-accessibility.svg (themes/images/tool-accessibility.svg)
     skin/images/tool-application.svg (themes/images/tool-application.svg)
     skin/images/close.svg (themes/images/close.svg)
     skin/images/clear.svg (themes/images/clear.svg)
+    skin/images/close-3-pane.svg (themes/images/close-3-pane.svg)
+    skin/images/open-3-pane.svg (themes/images/open-3-pane.svg)
     skin/images/vview-delete.png (themes/images/vview-delete.png)
     skin/images/vview-delete@2x.png (themes/images/vview-delete@2x.png)
     skin/images/vview-edit.png (themes/images/vview-edit.png)
     skin/images/vview-edit@2x.png (themes/images/vview-edit@2x.png)
     skin/images/vview-lock.png (themes/images/vview-lock.png)
     skin/images/vview-lock@2x.png (themes/images/vview-lock@2x.png)
     skin/images/vview-open-inspector.png (themes/images/vview-open-inspector.png)
     skin/images/vview-open-inspector@2x.png (themes/images/vview-open-inspector@2x.png)
--- a/devtools/client/preferences/devtools-client.js
+++ b/devtools/client/preferences/devtools-client.js
@@ -39,17 +39,19 @@ pref("devtools.inspector.remote", false)
 // Show the 3 pane onboarding tooltip in the inspector only in release or beta builds.
 #if defined(RELEASE_OR_BETA)
 pref("devtools.inspector.show-three-pane-tooltip", true);
 #else
 pref("devtools.inspector.show-three-pane-tooltip", false);
 #endif
 // Enable the 3 pane mode in the inspector
 pref("devtools.inspector.three-pane-enabled", true);
-
+// Whether or not this is the first run of the 3 pane mode. Used to reset the default
+// inspector sidebar widths for its first run.
+pref("devtools.inspector.three-pane-first-run", true);
 // Collapse pseudo-elements by default in the rule-view
 pref("devtools.inspector.show_pseudo_elements", false);
 // The default size for image preview tooltips in the rule-view/computed-view/markup-view
 pref("devtools.inspector.imagePreviewTooltipSize", 300);
 // Enable user agent style inspection in rule-view
 pref("devtools.inspector.showUserAgentStyles", false);
 // Show all native anonymous content (like controls in <video> tags)
 pref("devtools.inspector.showAllAnonymousContent", false);
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/close-3-pane.svg
@@ -0,0 +1,10 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g fill="context-fill #0b0b0b">
+    <rect width="3" height="10" x="11" y="3" fill-opacity=".2"/>
+    <path d="M2,3.00247329 L2,3.00247329 L2,12.9975267 C2,12.9944441 2.00555363,13 2.00684547,13 L13.9931545,13 C13.9983241,13 14,12.9983304 14,12.9975267 L14,3.00247329 C14,3.00555595 13.9944464,3 13.9931545,3 L2.00684547,3 C2.00167589,3 2,3.00166957 2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 Z M1,3.00247329 C1,2.44882258 1.44994876,2 2.00684547,2 L13.9931545,2 C14.5492199,2 15,2.45576096 15,3.00247329 L15,12.9975267 C15,13.5511774 14.5500512,14 13.9931545,14 L2.00684547,14 C1.45078007,14 1,13.544239 1,12.9975267 L1,3.00247329 Z M10,3.45454545 L10,12.5454545 L10,13 L11,13 L11,12.5454545 L11,3.45454545 L11,3 L10,3 L10,3.45454545 Z"/>
+    <polygon points="4 10.75 4 6 8.5 8.375"/>
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/open-3-pane.svg
@@ -0,0 +1,10 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+  <g fill="context-fill #0b0b0b">
+    <rect width="5" height="10" x="10" y="3" fill-opacity=".2"/>
+    <path d="M2,3.00247329 L2,3.00247329 L2,12.9975267 C2,12.9944441 2.00601643,13 2.00741593,13 L14.9925841,13 C14.9981844,13 15,12.9983304 15,12.9975267 L15,3.00247329 C15,3.00555595 14.9939836,3 14.9925841,3 L2.00741593,3 C2.00181555,3 2,3.00166957 2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 L2,3.00247329 Z M2.07876301,2 L14.921237,2 C15.5170213,2 16,2.45576096 16,3.00247329 L16,12.9975267 C16,13.5511774 15.517912,14 14.921237,14 L2.07876301,14 C1.48297865,14 1,13.544239 1,12.9975267 L1,3.00247329 C1,2.44882258 1.48208795,2 2.07876301,2 Z M12,12.5454545 L12,13 L13,13 L13,12.5454545 L13,3.45454545 L13,3 L12,3 L12,3.45454545 L12,12.5454545 Z M9,3.45454545 L9,12.5454545 L9,13 L10,13 L10,12.5454545 L10,3.45454545 L10,3 L9,3 L9,3.45454545 Z"/>
+    <polygon points="3 10.75 3 6 7.5 8.375" transform="rotate(-180 5.25 8.375)"/>
+  </g>
+</svg>
--- a/devtools/client/themes/inspector.css
+++ b/devtools/client/themes/inspector.css
@@ -59,19 +59,24 @@ window {
   min-width: 200px;
 }
 
 #inspector-splitter-box .controlled.pane-collapsed {
   visibility: collapse;
 }
 
 #inspector-splitter-box .sidebar-toggle::before {
+  background-image: url("chrome://devtools/skin/images/close-3-pane.svg");
   transform: unset;
 }
 
+#inspector-splitter-box .sidebar-toggle.pane-collapsed::before {
+  background-image: url("chrome://devtools/skin/images/open-3-pane.svg");
+}
+
 /* Use flex layout for the Inspector toolbar. For now, it's done
    specifically for the Inspector toolbar since general rule applied
    on .devtools-toolbar breaks breadcrumbs and also toolbars in other
    panels (e.g. webconsole, debugger), these are not ready for HTML
    layout yet. */
 #inspector-toolbar.devtools-toolbar {
   display: flex;
 }
--- a/devtools/server/actors/accessibility.js
+++ b/devtools/server/actors/accessibility.js
@@ -32,17 +32,16 @@ const {
   EVENT_TEXT_CHANGED,
   EVENT_TEXT_INSERTED,
   EVENT_TEXT_REMOVED,
   EVENT_ACCELERATOR_CHANGE,
   EVENT_ACTION_CHANGE,
   EVENT_DEFACTION_CHANGE,
   EVENT_DESCRIPTION_CHANGE,
   EVENT_DOCUMENT_ATTRIBUTES_CHANGED,
-  EVENT_HELP_CHANGE,
   EVENT_HIDE,
   EVENT_NAME_CHANGE,
   EVENT_OBJECT_ATTRIBUTE_CHANGED,
   EVENT_REORDER,
   EVENT_STATE_CHANGE,
   EVENT_TEXT_ATTRIBUTE_CHANGED,
   EVENT_VALUE_CHANGE
 } = nsIAccessibleEvent;
@@ -229,28 +228,26 @@ const AccessibleActor = ActorClassWithSp
 
   get description() {
     if (this.isDefunct) {
       return null;
     }
     return this.rawAccessible.description;
   },
 
-  get help() {
-    if (this.isDefunct) {
-      return null;
-    }
-    return this.rawAccessible.help;
-  },
-
   get keyboardShortcut() {
     if (this.isDefunct) {
       return null;
     }
-    return this.rawAccessible.keyboardShortcut;
+    // Gecko accessibility exposes two key bindings: Accessible::AccessKey and
+    // Accessible::KeyboardShortcut. The former is used for accesskey, where the latter
+    // is used for global shortcuts defined by XUL menu items, etc. Here - do what the
+    // Windows implementation does: try AccessKey first, and if that's empty, use
+    // KeyboardShortcut.
+    return this.rawAccessible.accessKey || this.rawAccessible.keyboardShortcut;
   },
 
   get childCount() {
     if (this.isDefunct) {
       return 0;
     }
     return this.rawAccessible.childCount;
   },
@@ -356,17 +353,16 @@ const AccessibleActor = ActorClassWithSp
 
   form() {
     return {
       actor: this.actorID,
       role: this.role,
       name: this.name,
       value: this.value,
       description: this.description,
-      help: this.help,
       keyboardShortcut: this.keyboardShortcut,
       childCount: this.childCount,
       domNodeType: this.domNodeType,
       indexInParent: this.indexInParent,
       states: this.states,
       actions: this.actions,
       attributes: this.attributes
     };
@@ -639,21 +635,16 @@ const AccessibleWalkerActor = ActorClass
           events.emit(accessible, "value-change", rawAccessible.value);
         }
         break;
       case EVENT_DESCRIPTION_CHANGE:
         if (accessible) {
           events.emit(accessible, "description-change", rawAccessible.description);
         }
         break;
-      case EVENT_HELP_CHANGE:
-        if (accessible) {
-          events.emit(accessible, "help-change", rawAccessible.help);
-        }
-        break;
       case EVENT_REORDER:
         if (accessible) {
           accessible.children().forEach(child =>
             events.emit(child, "index-in-parent-change", child.indexInParent));
           events.emit(accessible, "reorder", rawAccessible.childCount, this);
         }
         break;
       case EVENT_HIDE:
@@ -679,19 +670,20 @@ const AccessibleWalkerActor = ActorClass
         break;
       case EVENT_DOCUMENT_ATTRIBUTES_CHANGED:
       case EVENT_OBJECT_ATTRIBUTE_CHANGED:
       case EVENT_TEXT_ATTRIBUTE_CHANGED:
         if (accessible) {
           events.emit(accessible, "attributes-change", accessible.attributes);
         }
         break;
+      // EVENT_ACCELERATOR_CHANGE is currently not fired by gecko accessibility.
       case EVENT_ACCELERATOR_CHANGE:
         if (accessible) {
-          events.emit(accessible, "shortcut-change", rawAccessible.keyboardShortcut);
+          events.emit(accessible, "shortcut-change", accessible.keyboardShortcut);
         }
         break;
       default:
         break;
     }
   },
 
   /**
--- a/devtools/server/tests/browser/browser_accessibility_node.js
+++ b/devtools/server/tests/browser/browser_accessibility_node.js
@@ -4,29 +4,29 @@
 
 "use strict";
 
 // Checks for the AccessibleActor
 
 add_task(async function() {
   const {client, walker, accessibility} =
     await initAccessibilityFrontForUrl(MAIN_DOMAIN + "doc_accessibility.html");
+  const modifiers = Services.appinfo.OS === "Darwin" ? "\u2303\u2325" : "Alt+Shift+";
 
   const a11yWalker = await accessibility.getWalker();
   await accessibility.enable();
   const buttonNode = await walker.querySelector(walker.rootNode, "#button");
   const accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
 
   checkA11yFront(accessibleFront, {
     name: "Accessible Button",
     role: "pushbutton",
     value: "",
     description: "Accessibility Test",
-    help: "",
-    keyboardShortcut: "",
+    keyboardShortcut: modifiers + "b",
     childCount: 1,
     domNodeType: 1,
     indexInParent: 1,
     states: ["focusable", "selectable text", "opaque", "enabled", "sensitive"],
     actions: [ "Press" ],
     attributes: {
       "margin-top": "0px",
       display: "inline-block",
--- a/devtools/server/tests/browser/browser_accessibility_node_events.js
+++ b/devtools/server/tests/browser/browser_accessibility_node_events.js
@@ -4,34 +4,34 @@
 
 "use strict";
 
 // Checks for the AccessibleActor events
 
 add_task(async function() {
   const {client, walker, accessibility} =
     await initAccessibilityFrontForUrl(MAIN_DOMAIN + "doc_accessibility.html");
+  const modifiers = Services.appinfo.OS === "Darwin" ? "\u2303\u2325" : "Alt+Shift+";
 
   const a11yWalker = await accessibility.getWalker();
   await accessibility.enable();
   const rootNode = await walker.getRootNode();
   const a11yDoc = await a11yWalker.getAccessibleFor(rootNode);
   const buttonNode = await walker.querySelector(walker.rootNode, "#button");
   const accessibleFront = await a11yWalker.getAccessibleFor(buttonNode);
   const sliderNode = await walker.querySelector(walker.rootNode, "#slider");
   const accessibleSliderFront = await a11yWalker.getAccessibleFor(sliderNode);
   const browser = gBrowser.selectedBrowser;
 
   checkA11yFront(accessibleFront, {
     name: "Accessible Button",
     role: "pushbutton",
     value: "",
     description: "Accessibility Test",
-    help: "",
-    keyboardShortcut: "",
+    keyboardShortcut: modifiers + "b",
     childCount: 1,
     domNodeType: 1,
     indexInParent: 1,
     states: ["focusable", "selectable text", "opaque", "enabled", "sensitive"],
     actions: [ "Press" ],
     attributes: {
       "margin-top": "0px",
       display: "inline-block",
--- a/devtools/server/tests/browser/doc_accessibility.html
+++ b/devtools/server/tests/browser/doc_accessibility.html
@@ -1,12 +1,12 @@
 <!DOCTYPE HTML>
 <html>
   <head>
     <meta charset="utf-8">
   </head>
 <body>
   <h1 id="h1">Accessibility Test</h1>
-  <button id="button" aria-describedby="h1">Accessible Button</button>
+  <button id="button" aria-describedby="h1" accesskey="b">Accessible Button</button>
   <div id="slider" role="slider" aria-valuenow="5"
        aria-valuemin="0" aria-valuemax="7">slider</div>
 </body>
 </html>
--- a/devtools/shared/fronts/accessibility.js
+++ b/devtools/shared/fronts/accessibility.js
@@ -36,20 +36,16 @@ const AccessibleFront = FrontClassWithSp
   get value() {
     return this._form.value;
   },
 
   get description() {
     return this._form.description;
   },
 
-  get help() {
-    return this._form.help;
-  },
-
   get keyboardShortcut() {
     return this._form.keyboardShortcut;
   },
 
   get childCount() {
     return this._form.childCount;
   },
 
@@ -95,20 +91,16 @@ const AccessibleFront = FrontClassWithSp
   valueChange: preEvent("value-change", function(value) {
     this._form.value = value;
   }),
 
   descriptionChange: preEvent("description-change", function(description) {
     this._form.description = description;
   }),
 
-  helpChange: preEvent("help-change", function(help) {
-    this._form.help = help;
-  }),
-
   shortcutChange: preEvent("shortcut-change", function(keyboardShortcut) {
     this._form.keyboardShortcut = keyboardShortcut;
   }),
 
   reorder: preEvent("reorder", function(childCount, walker) {
     this._form.childCount = childCount;
     // Reorder event affects the tree rendering, we fire this event on
     // accessibility walker as the point of interaction for UI.
--- a/devtools/shared/specs/accessibility.js
+++ b/devtools/shared/specs/accessibility.js
@@ -45,20 +45,16 @@ const accessibleSpec = generateActorSpec
     "states-change": {
       type: "statesChange",
       states: Arg(0, "array:string")
     },
     "attributes-change": {
       type: "attributesChange",
       attributes: Arg(0, "json")
     },
-    "help-change": {
-      type: "helpChange",
-      help: Arg(0, "string")
-    },
     "shortcut-change": {
       type: "shortcutChange",
       shortcut: Arg(0, "string")
     },
     "reorder": {
       type: "reorder",
       childCount: Arg(0, "number"),
       walker: Arg(1, "nullable:accessiblewalker")
--- a/dom/base/AnonymousContent.cpp
+++ b/dom/base/AnonymousContent.cpp
@@ -223,15 +223,17 @@ AnonymousContent::GetComputedStyleProper
 
   nsIPresShell* shell = element->OwnerDoc()->GetShell();
   if (!shell) {
     aRv.Throw(NS_ERROR_NOT_AVAILABLE);
     return;
   }
 
   RefPtr<nsComputedDOMStyle> cs =
-    new nsComputedDOMStyle(element, NS_LITERAL_STRING(""), shell,
+    new nsComputedDOMStyle(element,
+                           NS_LITERAL_STRING(""),
+                           element->OwnerDoc(),
                            nsComputedDOMStyle::eAll);
   aRv = cs->GetPropertyValue(aPropertyName, aResult);
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/base/Attr.cpp
+++ b/dom/base/Attr.cpp
@@ -284,28 +284,16 @@ Attr::ComputeIndexOf(const nsINode* aPos
 
 nsresult
 Attr::InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                         bool aNotify)
 {
   return NS_ERROR_NOT_IMPLEMENTED;
 }
 
-nsresult
-Attr::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                               bool aNotify)
-{
-  return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-void
-Attr::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-}
-
 void
 Attr::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
 }
 
 void
 Attr::GetEventTargetParent(EventChainPreVisitor& aVisitor)
 {
--- a/dom/base/Attr.h
+++ b/dom/base/Attr.h
@@ -58,19 +58,16 @@ public:
 
   // nsINode interface
   virtual bool IsNodeOfType(uint32_t aFlags) const override;
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
   virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;
 
   static void Initialize();
   static void Shutdown();
 
--- a/dom/base/CharacterData.cpp
+++ b/dom/base/CharacterData.cpp
@@ -629,29 +629,16 @@ CharacterData::ComputeIndexOf(const nsIN
 nsresult
 CharacterData::InsertChildBefore(nsIContent* aKid,
                                  nsIContent* aBeforeThis,
                                  bool aNotify)
 {
   return NS_OK;
 }
 
-nsresult
-CharacterData::InsertChildAt_Deprecated(nsIContent* aKid,
-                                        uint32_t aIndex,
-                                        bool aNotify)
-{
-  return NS_OK;
-}
-
-void
-CharacterData::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-}
-
 void
 CharacterData::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
 }
 
 nsXBLBinding *
 CharacterData::DoGetXBLBinding() const
 {
--- a/dom/base/CharacterData.h
+++ b/dom/base/CharacterData.h
@@ -100,19 +100,16 @@ public:
                                     ErrorResult& aError) override;
 
   // nsINode methods
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual void GetTextContentInternal(nsAString& aTextContent,
                                       OOMReporter& aError) override
   {
     GetNodeValue(aTextContent);
   }
   virtual void SetTextContentInternal(const nsAString& aTextContent,
                                       nsIPrincipal* aSubjectPrincipal,
--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -1220,37 +1220,16 @@ FragmentOrElement::InsertChildBefore(nsI
   MOZ_ASSERT(aKid, "null ptr");
 
   int32_t index = aBeforeThis ? ComputeIndexOf(aBeforeThis) : GetChildCount();
   MOZ_ASSERT(index >= 0);
 
   return doInsertChildAt(aKid, index, aNotify, mAttrsAndChildren);
 }
 
-nsresult
-FragmentOrElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                            uint32_t aIndex,
-                                            bool aNotify)
-{
-  MOZ_ASSERT(aKid, "null ptr");
-
-  return doInsertChildAt(aKid, aIndex, aNotify, mAttrsAndChildren);
-}
-
-void
-FragmentOrElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> oldKid = mAttrsAndChildren.GetSafeChildAt(aIndex);
-  NS_ASSERTION(oldKid == GetChildAt_Deprecated(aIndex), "Unexpected child in RemoveChildAt_Deprecated");
-
-  if (oldKid) {
-    doRemoveChildAt(aIndex, aNotify, oldKid, mAttrsAndChildren);
-  }
-}
-
 void
 FragmentOrElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   // Let's keep the node alive.
   nsCOMPtr<nsIContent> kungFuDeathGrip = aKid;
   doRemoveChildAt(ComputeIndexOf(aKid), aNotify, aKid, mAttrsAndChildren);
 }
 
--- a/dom/base/FragmentOrElement.h
+++ b/dom/base/FragmentOrElement.h
@@ -93,19 +93,16 @@ public:
   NS_DECL_ADDSIZEOFEXCLUDINGTHIS
 
   // nsINode interface methods
   virtual uint32_t GetChildCount() const override;
   virtual nsIContent *GetChildAt_Deprecated(uint32_t aIndex) const override;
   virtual int32_t ComputeIndexOf(const nsINode* aPossibleChild) const override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual void GetTextContentInternal(nsAString& aTextContent,
                                       mozilla::OOMReporter& aError) override;
   virtual void SetTextContentInternal(const nsAString& aTextContent,
                                       nsIPrincipal* aSubjectPrincipal,
                                       mozilla::ErrorResult& aError) override;
 
   // nsIContent interface methods
--- a/dom/base/nsDocument.cpp
+++ b/dom/base/nsDocument.cpp
@@ -4104,56 +4104,16 @@ nsIDocument::InsertChildBefore(nsIConten
   }
 
   int32_t index = aBeforeThis ? ComputeIndexOf(aBeforeThis) : GetChildCount();
   MOZ_ASSERT(index >= 0);
 
   return doInsertChildAt(aKid, index, aNotify, mChildren);
 }
 
-nsresult
-nsIDocument::InsertChildAt_Deprecated(nsIContent* aKid,
-                                      uint32_t aIndex,
-                                      bool aNotify)
-{
-  if (aKid->IsElement() && GetRootElement()) {
-    NS_WARNING("Inserting root element when we already have one");
-    return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
-  }
-
-  return doInsertChildAt(aKid, aIndex, aNotify, mChildren);
-}
-
-void
-nsIDocument::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> oldKid = GetChildAt_Deprecated(aIndex);
-  if (!oldKid) {
-    return;
-  }
-
-  if (oldKid->IsElement()) {
-    // Destroy the link map up front before we mess with the child list.
-    DestroyElementMaps();
-  }
-
-  // Preemptively clear mCachedRootElement, since we may be about to remove it
-  // from our child list, and we don't want to return this maybe-obsolete value
-  // from any GetRootElement() calls that happen inside of doRemoveChildAt().
-  // (NOTE: for this to be useful, doRemoveChildAt() must NOT trigger any
-  // GetRootElement() calls until after it's removed the child from mChildren.
-  // Any call before that point would restore this soon-to-be-obsolete cached
-  // answer, and our clearing here would be fruitless.)
-  mCachedRootElement = nullptr;
-  doRemoveChildAt(aIndex, aNotify, oldKid, mChildren);
-  MOZ_ASSERT(mCachedRootElement != oldKid,
-             "Stale pointer in mCachedRootElement, after we tried to clear it "
-             "(maybe somebody called GetRootElement() too early?)");
-}
-
 void
 nsIDocument::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   if (aKid->IsElement()) {
     // Destroy the link map up front before we mess with the child list.
     DestroyElementMaps();
   }
 
--- a/dom/base/nsGlobalWindowOuter.cpp
+++ b/dom/base/nsGlobalWindowOuter.cpp
@@ -6686,45 +6686,22 @@ nsGlobalWindowOuter::PageHidden()
   FORWARD_TO_INNER_VOID(PageHidden, ());
 }
 
 already_AddRefed<nsICSSDeclaration>
 nsGlobalWindowOuter::GetComputedStyleHelperOuter(Element& aElt,
                                                  const nsAString& aPseudoElt,
                                                  bool aDefaultStylesOnly)
 {
-  if (!mDocShell) {
+  if (!mDoc) {
     return nullptr;
   }
 
-  nsCOMPtr<nsIPresShell> presShell = mDocShell->GetPresShell();
-
-  if (!presShell) {
-    // Try flushing frames on our parent in case there's a pending
-    // style change that will create the presshell.
-    auto* parent = nsGlobalWindowOuter::Cast(GetPrivateParent());
-    if (!parent) {
-      return nullptr;
-    }
-
-    parent->FlushPendingNotifications(FlushType::Frames);
-
-    // Might have killed mDocShell
-    if (!mDocShell) {
-      return nullptr;
-    }
-
-    presShell = mDocShell->GetPresShell();
-    if (!presShell) {
-      return nullptr;
-    }
-  }
-
   RefPtr<nsICSSDeclaration> compStyle =
-    NS_NewComputedDOMStyle(&aElt, aPseudoElt, presShell,
+    NS_NewComputedDOMStyle(&aElt, aPseudoElt, mDoc,
                            aDefaultStylesOnly ? nsComputedDOMStyle::eDefaultOnly :
                                                 nsComputedDOMStyle::eAll);
 
   return compStyle.forget();
 }
 
 //*****************************************************************************
 // nsGlobalWindowOuter::nsIInterfaceRequestor
--- a/dom/base/nsIDocument.h
+++ b/dom/base/nsIDocument.h
@@ -543,19 +543,16 @@ public:
 
   uint32_t GetChildCount() const final
   {
     return mChildren.ChildCount();
   }
 
   nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                              bool aNotify) override;
-  nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                    bool aNotify) override;
-  void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) final;
   void RemoveChildNode(nsIContent* aKid, bool aNotify) final;
   nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo,
                  nsINode **aResult,
                  bool aPreallocateChildren) const override
   {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
--- a/dom/base/nsINode.cpp
+++ b/dom/base/nsINode.cpp
@@ -528,34 +528,36 @@ void
 nsINode::GetNodeValueInternal(nsAString& aNodeValue)
 {
   SetDOMStringToNull(aNodeValue);
 }
 
 nsINode*
 nsINode::RemoveChild(nsINode& aOldChild, ErrorResult& aError)
 {
-  if (IsCharacterData()) {
+  if (!aOldChild.IsContent()) {
     // aOldChild can't be one of our children.
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
   if (aOldChild.GetParentNode() == this) {
     nsContentUtils::MaybeFireNodeRemoved(&aOldChild, this);
   }
 
-  int32_t index = ComputeIndexOf(&aOldChild);
-  if (index == -1) {
+  // Check again, we may not be the child's parent anymore.
+  // Can be triggered by dom/base/crashtests/293388-1.html
+  if (aOldChild.AsContent()->IsRootOfAnonymousSubtree() ||
+      aOldChild.GetParentNode() != this) {
     // aOldChild isn't one of our children.
     aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
     return nullptr;
   }
 
-  RemoveChildAt_Deprecated(index, true);
+  RemoveChildNode(aOldChild.AsContent(), true);
   return &aOldChild;
 }
 
 void
 nsINode::Normalize()
 {
   // First collect list of nodes to be removed
   AutoTArray<nsCOMPtr<nsIContent>, 50> nodes;
@@ -635,17 +637,17 @@ nsINode::Normalize()
     }
 
     // Remove node
     nsCOMPtr<nsINode> parent = node->GetParentNode();
     NS_ASSERTION(parent || hasRemoveListeners,
                  "Should always have a parent unless "
                  "mutation events messed us up");
     if (parent) {
-      parent->RemoveChildAt_Deprecated(parent->ComputeIndexOf(node), true);
+      parent->RemoveChildNode(node, true);
     }
   }
 }
 
 nsresult
 nsINode::GetBaseURI(nsAString &aURI) const
 {
   nsCOMPtr<nsIURI> baseURI = GetBaseURI();
@@ -1992,58 +1994,54 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   }
 
   EnsurePreInsertionValidity2(aReplace, *aNewChild, aRefChild, aError);
   if (aError.Failed()) {
     return nullptr;
   }
 
   // Record the node to insert before, if any
-  nsINode* nodeToInsertBefore;
+  nsIContent* nodeToInsertBefore;
   if (aReplace) {
     nodeToInsertBefore = aRefChild->GetNextSibling();
   } else {
-    nodeToInsertBefore = aRefChild;
+    // Since aRefChild is our child, it must be an nsIContent object.
+    nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
   }
   if (nodeToInsertBefore == aNewChild) {
     // We're going to remove aNewChild from its parent, so use its next sibling
     // as the node to insert before.
     nodeToInsertBefore = nodeToInsertBefore->GetNextSibling();
   }
 
   Maybe<AutoTArray<nsCOMPtr<nsIContent>, 50> > fragChildren;
 
   // Remove the new child from the old parent if one exists
   nsIContent* newContent = aNewChild->AsContent();
   nsCOMPtr<nsINode> oldParent = newContent->GetParentNode();
   if (oldParent) {
-    int32_t removeIndex = oldParent->ComputeIndexOf(newContent);
-    if (removeIndex < 0) {
-      // newContent is anonymous.  We can't deal with this, so just bail
-      NS_ERROR("How come our flags didn't catch this?");
-      aError.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
-      return nullptr;
-    }
-
     // Hold a strong ref to nodeToInsertBefore across the removal of newContent
     nsCOMPtr<nsINode> kungFuDeathGrip = nodeToInsertBefore;
 
     // Removing a child can run script, via XBL destructors.
     nsMutationGuard guard;
 
     // Scope for the mutation batch and scriptblocker, so they go away
     // while kungFuDeathGrip is still alive.
     {
       mozAutoDocUpdate batch(newContent->GetComposedDoc(), true);
       nsAutoMutationBatch mb(oldParent, true, true);
-      oldParent->RemoveChildAt_Deprecated(removeIndex, true);
+      // ScriptBlocker ensures previous and next stay alive.
+      nsIContent* previous = aNewChild->GetPreviousSibling();
+      nsIContent* next = aNewChild->GetNextSibling();
+      oldParent->RemoveChildNode(aNewChild->AsContent(), true);
       if (nsAutoMutationBatch::GetCurrentBatch() == &mb) {
         mb.RemovalDone();
-        mb.SetPrevSibling(oldParent->GetChildAt_Deprecated(removeIndex - 1));
-        mb.SetNextSibling(oldParent->GetChildAt_Deprecated(removeIndex));
+        mb.SetPrevSibling(previous);
+        mb.SetNextSibling(next);
       }
     }
 
     // We expect one mutation (the removal) to have happened.
     if (guard.Mutated(1)) {
       // XBL destructors, yuck.
 
       // Verify that nodeToInsertBefore, if non-null, is still our child.  If
@@ -2072,17 +2070,17 @@ nsINode::ReplaceOrInsertBefore(bool aRep
             !IsAllowedAsChild(newContent, this, aReplace, aRefChild)) {
           aError.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
           return nullptr;
         }
         // And recompute nodeToInsertBefore, just in case.
         if (aReplace) {
           nodeToInsertBefore = aRefChild->GetNextSibling();
         } else {
-          nodeToInsertBefore = aRefChild;
+          nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
         }
       }
     }
   } else if (nodeType == DOCUMENT_FRAGMENT_NODE) {
     // Make sure to remove all the fragment's kids.  We need to do this before
     // we start inserting anything, so we will run out XBL destructors and
     // binding teardown (GOD, I HATE THESE THINGS) before we insert anything
     // into the DOM.
@@ -2107,18 +2105,18 @@ nsINode::ReplaceOrInsertBefore(bool aRep
     nsMutationGuard guard;
 
     // Scope for the mutation batch and scriptblocker, so they go away
     // while kungFuDeathGrip is still alive.
     {
       mozAutoDocUpdate batch(newContent->GetComposedDoc(), true);
       nsAutoMutationBatch mb(newContent, false, true);
 
-      for (uint32_t i = count; i > 0;) {
-        newContent->RemoveChildAt_Deprecated(--i, true);
+      while (newContent->HasChildren()) {
+        newContent->RemoveChildNode(newContent->GetLastChild(), true);
       }
     }
 
     // We expect |count| removals
     if (guard.Mutated(count)) {
       // XBL destructors, yuck.
 
       // Verify that nodeToInsertBefore, if non-null, is still our child.  If
@@ -2146,17 +2144,18 @@ nsINode::ReplaceOrInsertBefore(bool aRep
         aError.Throw(NS_ERROR_DOM_HIERARCHY_REQUEST_ERR);
         return nullptr;
       }
 
       // Recompute nodeToInsertBefore, just in case.
       if (aReplace) {
         nodeToInsertBefore = aRefChild->GetNextSibling();
       } else {
-        nodeToInsertBefore = aRefChild;
+        // If aRefChild has 'this' as a parent, it must be an nsIContent.
+        nodeToInsertBefore = aRefChild ? aRefChild->AsContent() : nullptr;
       }
 
       // And verify that newContent is still allowed as our child.  Sadly, we
       // need to reimplement the relevant part of IsAllowedAsChild() because
       // now our nodes are in an array and all.  If you change this code,
       // change the code there.
       if (IsDocument()) {
         bool sawElement = false;
@@ -2177,47 +2176,30 @@ nsINode::ReplaceOrInsertBefore(bool aRep
         }
       }
     }
   }
 
   mozAutoDocUpdate batch(GetComposedDoc(), true);
   nsAutoMutationBatch mb;
 
-  // Figure out which index we want to insert at.  Note that we use
-  // nodeToInsertBefore to determine this, because it's possible that
-  // aRefChild == aNewChild, in which case we just removed it from the
-  // parent list.
-  int32_t insPos;
-  if (nodeToInsertBefore) {
-    insPos = ComputeIndexOf(nodeToInsertBefore);
-    if (insPos < 0) {
-      // XXXbz How the heck would _that_ happen, exactly?
-      aError.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
-      return nullptr;
-    }
-  }
-  else {
-    insPos = GetChildCount();
-  }
-
   // If we're replacing and we haven't removed aRefChild yet, do so now
   if (aReplace && aRefChild != aNewChild) {
     mb.Init(this, true, true);
 
     // Since aRefChild is never null in the aReplace case, we know that at
     // this point nodeToInsertBefore is the next sibling of aRefChild.
     NS_ASSERTION(aRefChild->GetNextSibling() == nodeToInsertBefore,
                  "Unexpected nodeToInsertBefore");
 
-    // An since nodeToInsertBefore is at index insPos, we want to remove
-    // at the previous index.
-    NS_ASSERTION(insPos >= 1, "insPos too small");
-    RemoveChildAt_Deprecated(insPos-1, true);
-    --insPos;
+    nsIContent* toBeRemoved = nodeToInsertBefore ?
+      nodeToInsertBefore->GetPreviousSibling() : GetLastChild();
+    MOZ_ASSERT(toBeRemoved);
+
+    RemoveChildNode(toBeRemoved, true);
   }
 
   // Move new child over to our document if needed. Do this after removing
   // it from its parent so that AdoptNode doesn't fire DOMNodeRemoved
   // DocumentType nodes are the only nodes that can have a null
   // ownerDocument according to the DOM spec, and we need to allow
   // inserting them w/o calling AdoptNode().
   nsIDocument* doc = OwnerDoc();
@@ -2241,35 +2223,36 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   nsINode* result = aReplace ? aRefChild : aNewChild;
   if (nodeType == DOCUMENT_FRAGMENT_NODE) {
     if (!aReplace) {
       mb.Init(this, true, true);
     }
     nsAutoMutationBatch* mutationBatch = nsAutoMutationBatch::GetCurrentBatch();
     if (mutationBatch) {
       mutationBatch->RemovalDone();
-      mutationBatch->SetPrevSibling(GetChildAt_Deprecated(insPos - 1));
-      mutationBatch->SetNextSibling(GetChildAt_Deprecated(insPos));
+      mutationBatch->SetPrevSibling(nodeToInsertBefore ?
+        nodeToInsertBefore->GetPreviousSibling() : GetLastChild());
+      mutationBatch->SetNextSibling(nodeToInsertBefore);
     }
 
     uint32_t count = fragChildren->Length();
     if (!count) {
       return result;
     }
 
-    bool appending = !IsDocument() && uint32_t(insPos) == GetChildCount();
+    bool appending = !IsDocument() && !nodeToInsertBefore;
     nsIContent* firstInsertedContent = fragChildren->ElementAt(0);
 
     // Iterate through the fragment's children, and insert them in the new
     // parent
-    for (uint32_t i = 0; i < count; ++i, ++insPos) {
+    for (uint32_t i = 0; i < count; ++i) {
       // XXXbz how come no reparenting here?  That seems odd...
       // Insert the child.
-      aError = InsertChildAt_Deprecated(fragChildren->ElementAt(i), insPos,
-                                        !appending);
+      aError = InsertChildBefore(fragChildren->ElementAt(i), nodeToInsertBefore,
+                                 !appending);
       if (aError.Failed()) {
         // Make sure to notify on any children that we did succeed to insert
         if (appending && i != 0) {
           nsNodeUtils::ContentAppended(static_cast<nsIContent*>(this),
                                        firstInsertedContent);
         }
         return nullptr;
       }
@@ -2295,23 +2278,23 @@ nsINode::ReplaceOrInsertBefore(bool aRep
   }
   else {
     // Not inserting a fragment but rather a single node.
 
     // FIXME https://bugzilla.mozilla.org/show_bug.cgi?id=544654
     //       We need to reparent here for nodes for which the parent of their
     //       wrapper is not the wrapper for their ownerDocument (XUL elements,
     //       form controls, ...). Also applies in the fragment code above.
-
     if (nsAutoMutationBatch::GetCurrentBatch() == &mb) {
       mb.RemovalDone();
-      mb.SetPrevSibling(GetChildAt_Deprecated(insPos - 1));
-      mb.SetNextSibling(GetChildAt_Deprecated(insPos));
+      mb.SetPrevSibling(nodeToInsertBefore ?
+                        nodeToInsertBefore->GetPreviousSibling() : GetLastChild());
+      mb.SetNextSibling(nodeToInsertBefore);
     }
-    aError = InsertChildAt_Deprecated(newContent, insPos, true);
+    aError = InsertChildBefore(newContent, nodeToInsertBefore, true);
     if (aError.Failed()) {
       return nullptr;
     }
   }
 
   return result;
 }
 
--- a/dom/base/nsINode.h
+++ b/dom/base/nsINode.h
@@ -817,39 +817,16 @@ public:
    * child of |this|.
    *
    * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
    */
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) = 0;
 
   /**
-   * Insert a content node at a particular index.  This method handles calling
-   * BindToTree on the child appropriately.
-   *
-   * @param aKid the content to insert
-   * @param aIndex the index it is being inserted at (the index it will have
-   *        after it is inserted)
-   * @param aNotify whether to notify the document (current document for
-   *        nsIContent, and |this| for nsIDocument) that the insert has
-   *        occurred
-   *
-   * @throws NS_ERROR_DOM_HIERARCHY_REQUEST_ERR if one attempts to have more
-   * than one element node as a child of a document.  Doing this will also
-   * assert -- you shouldn't be doing it!  Check with
-   * nsIDocument::GetRootElement() first if you're not sure.  Apart from this
-   * one constraint, this doesn't do any checking on whether aKid is a valid
-   * child of |this|.
-   *
-   * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
-   */
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) = 0;
-
-  /**
    * Append a content node to the end of the child list.  This method handles
    * calling BindToTree on the child appropriately.
    *
    * @param aKid the content to append
    * @param aNotify whether to notify the document (current document for
    *        nsIContent, and |this| for nsIDocument) that the append has
    *        occurred
    *
@@ -859,36 +836,20 @@ public:
    * nsIDocument::GetRootElement() first if you're not sure.  Apart from this
    * one constraint, this doesn't do any checking on whether aKid is a valid
    * child of |this|.
    *
    * @throws NS_ERROR_OUT_OF_MEMORY in some cases (from BindToTree).
    */
   nsresult AppendChildTo(nsIContent* aKid, bool aNotify)
   {
-    return InsertChildAt_Deprecated(aKid, GetChildCount(), aNotify);
+    return InsertChildBefore(aKid, nullptr, aNotify);
   }
 
   /**
-   * NOTE: this function is going to be removed soon (hopefully!) Don't use it
-   * in new code.
-   *
-   * Remove a child from this node.  This method handles calling UnbindFromTree
-   * on the child appropriately.
-   *
-   * @param aIndex the index of the child to remove
-   * @param aNotify whether to notify the document (current document for
-   *        nsIContent, and |this| for nsIDocument) that the remove has
-   *        occurred
-   *
-   * Note: If there is no child at aIndex, this method will simply do nothing.
-   */
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) = 0;
-
-  /**
    * Remove a child from this node.  This method handles calling UnbindFromTree
    * on the child appropriately.
    *
    * @param aKid the content to remove
    * @param aNotify whether to notify the document (current document for
    *        nsIContent, and |this| for nsIDocument) that the remove has
    *        occurred
    */
--- a/dom/events/EventDispatcher.cpp
+++ b/dom/events/EventDispatcher.cpp
@@ -231,21 +231,23 @@ public:
   }
 
   void RetargetTouchTargets(WidgetTouchEvent* aTouchEvent, Event* aDOMEvent)
   {
     MOZ_ASSERT(HasRetargetTouchTargets());
     MOZ_ASSERT(aTouchEvent,
                "mRetargetedTouchTargets should be empty when dispatching non-touch events.");
 
-    WidgetTouchEvent::TouchArray& touches = aTouchEvent->mTouches;
-    MOZ_ASSERT(!touches.Length() ||
-               touches.Length() == mRetargetedTouchTargets->Length());
-    for (uint32_t i = 0; i < touches.Length(); ++i) {
-      touches[i]->mTarget = mRetargetedTouchTargets->ElementAt(i);
+    if (mRetargetedTouchTargets.isSome()) {
+      WidgetTouchEvent::TouchArray& touches = aTouchEvent->mTouches;
+      MOZ_ASSERT(!touches.Length() ||
+                 touches.Length() == mRetargetedTouchTargets->Length());
+      for (uint32_t i = 0; i < touches.Length(); ++i) {
+        touches[i]->mTarget = mRetargetedTouchTargets->ElementAt(i);
+      }
     }
 
     if (aDOMEvent) {
       // The number of touch objects in targetTouches list may change depending
       // on the retargeting.
       TouchEvent* touchDOMEvent = static_cast<TouchEvent*>(aDOMEvent);
       TouchList* targetTouches = touchDOMEvent->GetExistingTargetTouches();
       if (targetTouches) {
--- a/dom/html/HTMLFieldSetElement.cpp
+++ b/dom/html/HTMLFieldSetElement.cpp
@@ -166,74 +166,16 @@ HTMLFieldSetElement::InsertChildBefore(n
 
   if (firstLegendHasChanged) {
     NotifyElementsForFirstLegendChange(aNotify);
   }
 
   return rv;
 }
 
-nsresult
-HTMLFieldSetElement::InsertChildAt_Deprecated(nsIContent* aChild,
-                                              uint32_t aIndex,
-                                              bool aNotify)
-{
-  bool firstLegendHasChanged = false;
-
-  if (aChild->IsHTMLElement(nsGkAtoms::legend)) {
-    if (!mFirstLegend) {
-      mFirstLegend = aChild;
-      // We do not want to notify the first time mFirstElement is set.
-    } else {
-      // If mFirstLegend is before aIndex, we do not change it.
-      // Otherwise, mFirstLegend is now aChild.
-      if (int32_t(aIndex) <= ComputeIndexOf(mFirstLegend)) {
-        mFirstLegend = aChild;
-        firstLegendHasChanged = true;
-      }
-    }
-  }
-
-  nsresult rv =
-    nsGenericHTMLFormElement::InsertChildAt_Deprecated(aChild, aIndex, aNotify);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  if (firstLegendHasChanged) {
-    NotifyElementsForFirstLegendChange(aNotify);
-  }
-
-  return rv;
-}
-
-void
-HTMLFieldSetElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  bool firstLegendHasChanged = false;
-
-  if (mFirstLegend && (GetChildAt_Deprecated(aIndex) == mFirstLegend)) {
-    // If we are removing the first legend we have to found another one.
-    nsIContent* child = mFirstLegend->GetNextSibling();
-    mFirstLegend = nullptr;
-    firstLegendHasChanged = true;
-
-    for (; child; child = child->GetNextSibling()) {
-      if (child->IsHTMLElement(nsGkAtoms::legend)) {
-        mFirstLegend = child;
-        break;
-      }
-    }
-  }
-
-  nsGenericHTMLFormElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-
-  if (firstLegendHasChanged) {
-    NotifyElementsForFirstLegendChange(aNotify);
-  }
-}
-
 void
 HTMLFieldSetElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   bool firstLegendHasChanged = false;
 
   if (mFirstLegend && aKid == mFirstLegend) {
     // If we are removing the first legend we have to found another one.
     nsIContent* child = mFirstLegend->GetNextSibling();
--- a/dom/html/HTMLFieldSetElement.h
+++ b/dom/html/HTMLFieldSetElement.h
@@ -37,19 +37,16 @@ public:
   virtual nsresult AfterSetAttr(int32_t aNameSpaceID, nsAtom* aName,
                                 const nsAttrValue* aValue,
                                 const nsAttrValue* aOldValue,
                                 nsIPrincipal* aSubjectPrincipal,
                                 bool aNotify) override;
 
   virtual nsresult InsertChildBefore(nsIContent* aChild, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aChild, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIFormControl
   NS_IMETHOD Reset() override;
   NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
   virtual bool IsDisabledForEvents(EventMessage aMessage) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
--- a/dom/html/HTMLOptGroupElement.cpp
+++ b/dom/html/HTMLOptGroupElement.cpp
@@ -81,38 +81,16 @@ HTMLOptGroupElement::InsertChildBefore(n
   nsresult rv =
     nsGenericHTMLElement::InsertChildBefore(aKid, aBeforeThis, aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
-nsresult
-HTMLOptGroupElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                              uint32_t aIndex,
-                                              bool aNotify)
-{
-  SafeOptionListMutation safeMutation(GetSelect(), this, aKid, aIndex, aNotify);
-  nsresult rv = nsGenericHTMLElement::InsertChildAt_Deprecated(aKid, aIndex,
-                                                               aNotify);
-  if (NS_FAILED(rv)) {
-    safeMutation.MutationFailed();
-  }
-  return rv;
-}
-
-void
-HTMLOptGroupElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SafeOptionListMutation safeMutation(GetSelect(), this, nullptr, aIndex,
-                                      aNotify);
-  nsGenericHTMLElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
 void
 HTMLOptGroupElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SafeOptionListMutation safeMutation(GetSelect(), this, nullptr,
                                       ComputeIndexOf(aKid), aNotify);
   nsGenericHTMLElement::RemoveChildNode(aKid, aNotify);
 }
 
--- a/dom/html/HTMLOptGroupElement.h
+++ b/dom/html/HTMLOptGroupElement.h
@@ -23,19 +23,16 @@ public:
 
   // nsISupports
   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLOptGroupElement,
                                        nsGenericHTMLElement)
 
   // nsINode
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIContent
   void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
 
   virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult,
                          bool aPreallocateChildren) const override;
 
--- a/dom/html/HTMLPictureElement.cpp
+++ b/dom/html/HTMLPictureElement.cpp
@@ -26,42 +26,16 @@ HTMLPictureElement::HTMLPictureElement(a
 
 HTMLPictureElement::~HTMLPictureElement()
 {
 }
 
 NS_IMPL_ELEMENT_CLONE(HTMLPictureElement)
 
 void
-HTMLPictureElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  nsCOMPtr<nsIContent> child = GetChildAt_Deprecated(aIndex);
-
-  if (child && child->IsHTMLElement(nsGkAtoms::img)) {
-    HTMLImageElement* img = HTMLImageElement::FromNode(child);
-    if (img) {
-      img->PictureSourceRemoved(child->AsContent());
-    }
-  } else if (child && child->IsHTMLElement(nsGkAtoms::source)) {
-    // Find all img siblings after this <source> to notify them of its demise
-    nsCOMPtr<nsIContent> nextSibling = child->GetNextSibling();
-    if (nextSibling && nextSibling->GetParentNode() == this) {
-      do {
-        HTMLImageElement* img = HTMLImageElement::FromNode(nextSibling);
-        if (img) {
-          img->PictureSourceRemoved(child->AsContent());
-        }
-      } while ( (nextSibling = nextSibling->GetNextSibling()) );
-    }
-  }
-
-  nsGenericHTMLElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
-void
 HTMLPictureElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   if (aKid && aKid->IsHTMLElement(nsGkAtoms::img)) {
     HTMLImageElement* img = HTMLImageElement::FromNode(aKid);
     if (img) {
       img->PictureSourceRemoved(aKid->AsContent());
     }
   } else if (aKid && aKid->IsHTMLElement(nsGkAtoms::source)) {
@@ -106,45 +80,16 @@ HTMLPictureElement::InsertChildBefore(ns
         }
       } while ( (nextSibling = nextSibling->GetNextSibling()) );
     }
   }
 
   return rv;
 }
 
-nsresult
-HTMLPictureElement::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex, bool aNotify)
-{
-  nsresult rv = nsGenericHTMLElement::InsertChildAt_Deprecated(aKid, aIndex, aNotify);
-
-  NS_ENSURE_SUCCESS(rv, rv);
-  NS_ENSURE_TRUE(aKid, rv);
-
-  if (aKid->IsHTMLElement(nsGkAtoms::img)) {
-    HTMLImageElement* img = HTMLImageElement::FromNode(aKid);
-    if (img) {
-      img->PictureSourceAdded(aKid->AsContent());
-    }
-  } else if (aKid->IsHTMLElement(nsGkAtoms::source)) {
-    // Find all img siblings after this <source> to notify them of its insertion
-    nsCOMPtr<nsIContent> nextSibling = aKid->GetNextSibling();
-    if (nextSibling && nextSibling->GetParentNode() == this) {
-      do {
-        HTMLImageElement* img = HTMLImageElement::FromNode(nextSibling);
-        if (img) {
-          img->PictureSourceAdded(aKid->AsContent());
-        }
-      } while ( (nextSibling = nextSibling->GetNextSibling()) );
-    }
-  }
-
-  return rv;
-}
-
 JSObject*
 HTMLPictureElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return HTMLPictureElementBinding::Wrap(aCx, this, aGivenProto);
 }
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/HTMLPictureElement.h
+++ b/dom/html/HTMLPictureElement.h
@@ -18,22 +18,19 @@ class HTMLPictureElement final : public 
 public:
   explicit HTMLPictureElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
 
   // nsISupports
   NS_INLINE_DECL_REFCOUNTING_INHERITED(HTMLPictureElement, nsGenericHTMLElement)
 
   virtual nsresult Clone(mozilla::dom::NodeInfo* aNodeInfo, nsINode** aResult,
                          bool aPreallocateChildren) const override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
 
 protected:
   virtual ~HTMLPictureElement();
 
   virtual JSObject* WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
 };
 
 } // namespace dom
--- a/dom/html/HTMLSelectElement.cpp
+++ b/dom/html/HTMLSelectElement.cpp
@@ -212,38 +212,16 @@ HTMLSelectElement::InsertChildBefore(nsI
     nsGenericHTMLFormElementWithState::InsertChildBefore(aKid, aBeforeThis,
                                                          aNotify);
   if (NS_FAILED(rv)) {
     safeMutation.MutationFailed();
   }
   return rv;
 }
 
-nsresult
-HTMLSelectElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                            uint32_t aIndex,
-                                            bool aNotify)
-{
-  SafeOptionListMutation safeMutation(this, this, aKid, aIndex, aNotify);
-  nsresult rv =
-    nsGenericHTMLFormElementWithState::InsertChildAt_Deprecated(aKid, aIndex,
-                                                                aNotify);
-  if (NS_FAILED(rv)) {
-    safeMutation.MutationFailed();
-  }
-  return rv;
-}
-
-void
-HTMLSelectElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SafeOptionListMutation safeMutation(this, this, nullptr, aIndex, aNotify);
-  nsGenericHTMLFormElementWithState::RemoveChildAt_Deprecated(aIndex, aNotify);
-}
-
 void
 HTMLSelectElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SafeOptionListMutation safeMutation(this, this, nullptr,
                                       ComputeIndexOf(aKid), aNotify);
   nsGenericHTMLFormElementWithState::RemoveChildNode(aKid, aNotify);
 }
 
--- a/dom/html/HTMLSelectElement.h
+++ b/dom/html/HTMLSelectElement.h
@@ -242,19 +242,16 @@ public:
   // nsIContent
   void GetEventTargetParent(EventChainPreVisitor& aVisitor) override;
   virtual nsresult PostHandleEvent(
                      EventChainPostVisitor& aVisitor) override;
 
   virtual bool IsHTMLFocusable(bool aWithMouse, bool* aIsFocusable, int32_t* aTabIndex) override;
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // Overriden nsIFormControl methods
   NS_IMETHOD Reset() override;
   NS_IMETHOD SubmitNamesValues(HTMLFormSubmission* aFormSubmission) override;
   NS_IMETHOD SaveState() override;
   virtual bool RestoreState(PresState* aState) override;
   virtual bool IsDisabledForEvents(EventMessage aMessage) override;
--- a/dom/svg/SVGDocument.cpp
+++ b/dom/svg/SVGDocument.cpp
@@ -46,33 +46,16 @@ SVGDocument::InsertChildBefore(nsIConten
     // loaded by then.
     EnsureNonSVGUserAgentStyleSheetsLoaded();
   }
 
   return XMLDocument::InsertChildBefore(aKid, aBeforeThis, aNotify);
 }
 
 nsresult
-SVGDocument::InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                      bool aNotify)
-{
-  if (aKid->IsElement() && !aKid->IsSVGElement()) {
-    // We can get here when well formed XML with a non-SVG root element is
-    // served with the SVG MIME type, for example. In that case we need to load
-    // the non-SVG UA sheets or else we can get bugs like bug 1016145.  Note
-    // that we have to do this _before_ the
-    // XMLDocument::InsertChildAt_Deprecated call, since that can try to
-    // construct frames, and we need to have the sheets loaded by then.
-    EnsureNonSVGUserAgentStyleSheetsLoaded();
-  }
-
-  return XMLDocument::InsertChildAt_Deprecated(aKid, aIndex, aNotify);
-}
-
-nsresult
 SVGDocument::Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                    bool aPreallocateChildren) const
 {
   NS_ASSERTION(aNodeInfo->NodeInfoManager() == mNodeInfoManager,
                "Can't import this document into another document!");
 
   RefPtr<SVGDocument> clone = new SVGDocument();
   nsresult rv = CloneDocHelper(clone.get(), aPreallocateChildren);
--- a/dom/svg/SVGDocument.h
+++ b/dom/svg/SVGDocument.h
@@ -30,18 +30,16 @@ public:
     : XMLDocument("image/svg+xml")
     , mHasLoadedNonSVGUserAgentStyleSheets(false)
   {
     mType = eSVG;
   }
 
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
 
   void SetCurrentContextPaint(const SVGContextPaint* aContextPaint)
   {
     mCurrentContextPaint = aContextPaint;
   }
 
--- a/dom/svg/SVGSwitchElement.cpp
+++ b/dom/svg/SVGSwitchElement.cpp
@@ -88,36 +88,16 @@ SVGSwitchElement::InsertChildBefore(nsIC
   nsresult rv =
     SVGSwitchElementBase::InsertChildBefore(aKid, aBeforeThis, aNotify);
   if (NS_SUCCEEDED(rv)) {
     MaybeInvalidate();
   }
   return rv;
 }
 
-nsresult
-SVGSwitchElement::InsertChildAt_Deprecated(nsIContent* aKid,
-                                           uint32_t aIndex,
-                                           bool aNotify)
-{
-  nsresult rv = SVGSwitchElementBase::InsertChildAt_Deprecated(aKid, aIndex,
-                                                               aNotify);
-  if (NS_SUCCEEDED(rv)) {
-    MaybeInvalidate();
-  }
-  return rv;
-}
-
-void
-SVGSwitchElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-  SVGSwitchElementBase::RemoveChildAt_Deprecated(aIndex, aNotify);
-  MaybeInvalidate();
-}
-
 void
 SVGSwitchElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
   SVGSwitchElementBase::RemoveChildNode(aKid, aNotify);
   MaybeInvalidate();
 }
 
 //----------------------------------------------------------------------
--- a/dom/svg/SVGSwitchElement.h
+++ b/dom/svg/SVGSwitchElement.h
@@ -37,19 +37,16 @@ public:
   // interfaces:
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGSwitchElement,
                                            SVGSwitchElementBase)
   // nsINode
   virtual nsresult InsertChildBefore(nsIContent* aKid, nsIContent* aBeforeThis,
                                      bool aNotify) override;
-  virtual nsresult InsertChildAt_Deprecated(nsIContent* aKid, uint32_t aIndex,
-                                            bool aNotify) override;
-  virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
   virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
 
   // nsIContent
   NS_IMETHOD_(bool) IsAttributeMapped(const nsAtom* aAttribute) const override;
 
   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
                          bool aPreallocateChildren) const override;
 private:
--- a/dom/xul/nsXULElement.cpp
+++ b/dom/xul/nsXULElement.cpp
@@ -823,113 +823,16 @@ nsXULElement::UnbindFromTree(bool aDeep,
         }
         slots->mFrameLoaderOrOpener = nullptr;
     }
 
     nsStyledElement::UnbindFromTree(aDeep, aNullParent);
 }
 
 void
-nsXULElement::RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify)
-{
-    nsCOMPtr<nsIContent> oldKid = mAttrsAndChildren.GetSafeChildAt(aIndex);
-    if (!oldKid) {
-      return;
-    }
-
-    // On the removal of a <treeitem>, <treechildren>, or <treecell> element,
-    // the possibility exists that some of the items in the removed subtree
-    // are selected (and therefore need to be deselected). We need to account for this.
-    nsCOMPtr<nsIDOMXULMultiSelectControlElement> controlElement;
-    nsCOMPtr<nsIListBoxObject> listBox;
-    bool fireSelectionHandler = false;
-
-    // -1 = do nothing, -2 = null out current item
-    // anything else = index to re-set as current
-    int32_t newCurrentIndex = -1;
-
-    if (oldKid->NodeInfo()->Equals(nsGkAtoms::listitem, kNameSpaceID_XUL)) {
-      // This is the nasty case. We have (potentially) a slew of selected items
-      // and cells going away.
-      // First, retrieve the tree.
-      // Check first whether this element IS the tree
-      controlElement = do_QueryObject(this);
-
-      // If it's not, look at our parent
-      if (!controlElement)
-        GetParentTree(getter_AddRefs(controlElement));
-      nsCOMPtr<nsIContent> controlContent(do_QueryInterface(controlElement));
-      RefPtr<nsXULElement> xulElement = FromNodeOrNull(controlContent);
-
-      if (xulElement) {
-        // Iterate over all of the items and find out if they are contained inside
-        // the removed subtree.
-        int32_t length;
-        controlElement->GetSelectedCount(&length);
-        for (int32_t i = 0; i < length; i++) {
-          nsCOMPtr<nsIDOMXULSelectControlItemElement> item;
-          controlElement->MultiGetSelectedItem(i, getter_AddRefs(item));
-          nsCOMPtr<nsINode> node = do_QueryInterface(item);
-          if (node == oldKid &&
-              NS_SUCCEEDED(controlElement->RemoveItemFromSelection(item))) {
-            length--;
-            i--;
-            fireSelectionHandler = true;
-          }
-        }
-
-        nsCOMPtr<nsIDOMXULSelectControlItemElement> curItem;
-        controlElement->GetCurrentItem(getter_AddRefs(curItem));
-        nsCOMPtr<nsIContent> curNode = do_QueryInterface(curItem);
-        if (curNode && nsContentUtils::ContentIsDescendantOf(curNode, oldKid)) {
-            // Current item going away
-            nsCOMPtr<nsIBoxObject> box = xulElement->GetBoxObject(IgnoreErrors());
-            listBox = do_QueryInterface(box);
-            if (listBox) {
-              listBox->GetIndexOfItem(oldKid->AsElement(), &newCurrentIndex);
-            }
-
-            // If any of this fails, we'll just set the current item to null
-            if (newCurrentIndex == -1)
-              newCurrentIndex = -2;
-        }
-      }
-    }
-
-    nsStyledElement::RemoveChildAt_Deprecated(aIndex, aNotify);
-
-    if (newCurrentIndex == -2) {
-        controlElement->SetCurrentItem(nullptr);
-    } else if (newCurrentIndex > -1) {
-        // Make sure the index is still valid
-        int32_t treeRows;
-        listBox->GetRowCount(&treeRows);
-        if (treeRows > 0) {
-            newCurrentIndex = std::min((treeRows - 1), newCurrentIndex);
-            RefPtr<Element> newCurrentItem;
-            listBox->GetItemAtIndex(newCurrentIndex, getter_AddRefs(newCurrentItem));
-            nsCOMPtr<nsIDOMXULSelectControlItemElement> xulCurItem = do_QueryInterface(newCurrentItem);
-            if (xulCurItem)
-                controlElement->SetCurrentItem(xulCurItem);
-        } else {
-            controlElement->SetCurrentItem(nullptr);
-        }
-    }
-
-    nsIDocument* doc;
-    if (fireSelectionHandler && (doc = GetComposedDoc())) {
-      nsContentUtils::DispatchTrustedEvent(doc,
-                                           static_cast<nsIContent*>(this),
-                                           NS_LITERAL_STRING("select"),
-                                           false,
-                                           true);
-    }
-}
-
-void
 nsXULElement::RemoveChildNode(nsIContent* aKid, bool aNotify)
 {
     // On the removal of a <treeitem>, <treechildren>, or <treecell> element,
     // the possibility exists that some of the items in the removed subtree
     // are selected (and therefore need to be deselected). We need to account for this.
     nsCOMPtr<nsIDOMXULMultiSelectControlElement> controlElement;
     nsCOMPtr<nsIListBoxObject> listBox;
     bool fireSelectionHandler = false;
--- a/dom/xul/nsXULElement.h
+++ b/dom/xul/nsXULElement.h
@@ -363,17 +363,16 @@ public:
     void GetEventTargetParent(mozilla::EventChainPreVisitor& aVisitor) override;
     virtual nsresult PreHandleEvent(
                        mozilla::EventChainVisitor& aVisitor) override;
     // nsIContent
     virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
                                 nsIContent* aBindingParent,
                                 bool aCompileEventHandlers) override;
     virtual void UnbindFromTree(bool aDeep, bool aNullParent) override;
-    virtual void RemoveChildAt_Deprecated(uint32_t aIndex, bool aNotify) override;
     virtual void RemoveChildNode(nsIContent* aKid, bool aNotify) override;
     virtual void DestroyContent() override;
 
 #ifdef DEBUG
     virtual void List(FILE* out, int32_t aIndent) const override;
     virtual void DumpContent(FILE* out, int32_t aIndent,bool aDumpAll) const override
     {
     }
--- a/editor/libeditor/CSSEditUtils.cpp
+++ b/editor/libeditor/CSSEditUtils.cpp
@@ -551,21 +551,18 @@ CSSEditUtils::GetCSSInlinePropertyBase(n
 already_AddRefed<nsComputedDOMStyle>
 CSSEditUtils::GetComputedStyle(Element* aElement)
 {
   MOZ_ASSERT(aElement);
 
   nsIDocument* doc = aElement->GetComposedDoc();
   NS_ENSURE_TRUE(doc, nullptr);
 
-  nsIPresShell* presShell = doc->GetShell();
-  NS_ENSURE_TRUE(presShell, nullptr);
-
   RefPtr<nsComputedDOMStyle> style =
-    NS_NewComputedDOMStyle(aElement, EmptyString(), presShell);
+    NS_NewComputedDOMStyle(aElement, EmptyString(), doc);
 
   return style.forget();
 }
 
 // remove the CSS style "aProperty : aPropertyValue" and possibly remove the whole node
 // if it is a span and if its only attribute is _moz_dirty
 nsresult
 CSSEditUtils::RemoveCSSInlineStyle(nsINode& aNode,
--- a/gfx/ipc/GPUParent.cpp
+++ b/gfx/ipc/GPUParent.cpp
@@ -379,16 +379,19 @@ GPUParent::RecvGetDeviceStatus(GPUDevice
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvSimulateDeviceReset(GPUDeviceData* aOut)
 {
 #if defined(XP_WIN)
   DeviceManagerDx::Get()->ForceDeviceReset(ForcedDeviceResetReason::COMPOSITOR_UPDATED);
   DeviceManagerDx::Get()->MaybeResetAndReacquireDevices();
+  if (gfxVars::UseWebRender()) {
+    wr::RenderThread::Get()->SimulateDeviceReset();
+  }
 #endif
   RecvGetDeviceStatus(aOut);
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 GPUParent::RecvNewContentCompositorManager(Endpoint<PCompositorManagerParent>&& aEndpoint)
 {
--- a/gfx/qcms/chain.c
+++ b/gfx/qcms/chain.c
@@ -967,17 +967,19 @@ static float* qcms_modular_transform_dat
 		    transform_fn != qcms_transform_module_clut_only &&
 		    transform_fn != qcms_transform_module_matrix &&
 		    transform_fn != qcms_transform_module_matrix_translate &&
 		    transform_fn != qcms_transform_module_LAB_to_XYZ &&
 		    transform_fn != qcms_transform_module_XYZ_to_LAB) {
 			assert(0 && "Unsupported transform module");
 			return NULL;
 		}
-		if (transform->grid_size <= 0) {
+		if (transform->grid_size <= 0 &&
+			(transform_fn == qcms_transform_module_clut ||
+			 transform_fn == qcms_transform_module_clut_only)) {
 			assert(0 && "Invalid transform");
 			return NULL;
 		}
                 transform->transform_module_fn(transform,src,dest,len);
                 dest = src;
                 src = new_src;
                 transform = transform->next_transform;
         }
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -157,16 +157,17 @@ static bool gEverInitialized = false;
 const ContentDeviceData* gContentDeviceInitData = nullptr;
 
 static Mutex* gGfxPlatformPrefsLock = nullptr;
 
 // These two may point to the same profile
 static qcms_profile *gCMSOutputProfile = nullptr;
 static qcms_profile *gCMSsRGBProfile = nullptr;
 
+static bool gCMSRGBTransformFailed = false;
 static qcms_transform *gCMSRGBTransform = nullptr;
 static qcms_transform *gCMSInverseRGBTransform = nullptr;
 static qcms_transform *gCMSRGBATransform = nullptr;
 
 static bool gCMSInitialized = false;
 static eCMSMode gCMSMode = eCMSMode_Off;
 
 static void ShutdownCMS();
@@ -2083,27 +2084,30 @@ gfxPlatform::GetCMSsRGBProfile()
         gCMSsRGBProfile = qcms_profile_sRGB();
     }
     return gCMSsRGBProfile;
 }
 
 qcms_transform *
 gfxPlatform::GetCMSRGBTransform()
 {
-    if (!gCMSRGBTransform) {
+    if (!gCMSRGBTransform && !gCMSRGBTransformFailed) {
         qcms_profile *inProfile, *outProfile;
         outProfile = GetCMSOutputProfile();
         inProfile = GetCMSsRGBProfile();
 
         if (!inProfile || !outProfile)
             return nullptr;
 
         gCMSRGBTransform = qcms_transform_create(inProfile, QCMS_DATA_RGB_8,
                                               outProfile, QCMS_DATA_RGB_8,
                                              QCMS_INTENT_PERCEPTUAL);
+        if (!gCMSRGBTransform) {
+            gCMSRGBTransformFailed = true;
+        }
     }
 
     return gCMSRGBTransform;
 }
 
 qcms_transform *
 gfxPlatform::GetCMSInverseRGBTransform()
 {
--- a/gfx/webrender_bindings/RenderCompositorANGLE.cpp
+++ b/gfx/webrender_bindings/RenderCompositorANGLE.cpp
@@ -306,17 +306,17 @@ RenderCompositorANGLE::CreateSwapChainFo
     mCompositionDevice = dCompDevice;
   }
 }
 
 bool
 RenderCompositorANGLE::BeginFrame()
 {
   if (mDevice->GetDeviceRemovedReason() != S_OK) {
-    RenderThread::Get()->HandleDeviceReset("BeginFrame");
+    RenderThread::Get()->HandleDeviceReset("BeginFrame", /* aNotify */ true);
     return false;
   }
 
   mWidget->AsWindows()->UpdateCompositorWndSizeIfNecessary();
 
   if (!ResizeBufferIfNeeded()) {
     return false;
   }
@@ -324,17 +324,17 @@ RenderCompositorANGLE::BeginFrame()
   if (!mGL->MakeCurrent()) {
     gfxCriticalNote << "Failed to make render context current, can't draw.";
     return false;
   }
 
   if (mSyncObject) {
     if (!mSyncObject->Synchronize()) {
       // It's timeout or other error. Handle the device-reset here.
-      RenderThread::Get()->HandleDeviceReset("SyncObject");
+      RenderThread::Get()->HandleDeviceReset("SyncObject", /* aNotify */ true);
       return false;
     }
   }
   return true;
 }
 
 void
 RenderCompositorANGLE::EndFrame()
--- a/gfx/webrender_bindings/RenderThread.cpp
+++ b/gfx/webrender_bindings/RenderThread.cpp
@@ -547,27 +547,29 @@ RenderThread::GetRenderTexture(wr::WrExt
 
 void
 RenderThread::ProgramCacheTask()
 {
   ProgramCache();
 }
 
 void
-RenderThread::HandleDeviceReset(const char* aWhere)
+RenderThread::HandleDeviceReset(const char* aWhere, bool aNotify)
 {
   MOZ_ASSERT(IsInRenderThread());
 
   if (mHandlingDeviceReset) {
     return;
   }
 
-  gfxCriticalNote << "GFX: RenderThread detected a device reset in " << aWhere;
-  if (XRE_IsGPUProcess()) {
-    gfx::GPUParent::GetSingleton()->NotifyDeviceReset();
+  if (aNotify) {
+    gfxCriticalNote << "GFX: RenderThread detected a device reset in " << aWhere;
+    if (XRE_IsGPUProcess()) {
+      gfx::GPUParent::GetSingleton()->NotifyDeviceReset();
+    }
   }
 
   {
     MutexAutoLock lock(mRenderTextureMapLock);
     mRenderTexturesDeferred.clear();
     for (auto iter = mRenderTextures.Iter(); !iter.Done(); iter.Next()) {
       iter.UserData()->ClearCachedResources();
     }
@@ -579,16 +581,31 @@ RenderThread::HandleDeviceReset(const ch
 
 bool
 RenderThread::IsHandlingDeviceReset()
 {
   MOZ_ASSERT(IsInRenderThread());
   return mHandlingDeviceReset;
 }
 
+void
+RenderThread::SimulateDeviceReset()
+{
+  if (!IsInRenderThread()) {
+    Loop()->PostTask(NewRunnableMethod(
+      "RenderThread::SimulateDeviceReset",
+      this, &RenderThread::SimulateDeviceReset
+      ));
+  } else {
+    // When this function is called GPUProcessManager::SimulateDeviceReset() already
+    // triggers destroying all CompositorSessions before re-creating them.
+    HandleDeviceReset("SimulateDeviceReset", /* aNotify */ false);
+  }
+}
+
 WebRenderProgramCache*
 RenderThread::ProgramCache()
 {
   MOZ_ASSERT(IsInRenderThread());
 
   if (!mProgramCache) {
     mProgramCache = MakeUnique<WebRenderProgramCache>(ThreadPool().Raw());
   }
--- a/gfx/webrender_bindings/RenderThread.h
+++ b/gfx/webrender_bindings/RenderThread.h
@@ -163,19 +163,21 @@ public:
 
   /// Can be called from any thread.
   WebRenderThreadPool& ThreadPool() { return mThreadPool; }
 
   /// Can only be called from the render thread.
   WebRenderProgramCache* ProgramCache();
 
   /// Can only be called from the render thread.
-  void HandleDeviceReset(const char* aWhere);
+  void HandleDeviceReset(const char* aWhere, bool aNotify);
   /// Can only be called from the render thread.
   bool IsHandlingDeviceReset();
+  /// Can be called from any thread.
+  void SimulateDeviceReset();
 
   size_t RendererCount();
 
 private:
   explicit RenderThread(base::Thread* aThread);
 
   void DeferredRenderTextureHostDestroy();
   void ShutDownTask(layers::SynchronousTask* aTask);
--- a/js/src/gc/GC.cpp
+++ b/js/src/gc/GC.cpp
@@ -2963,17 +2963,17 @@ GCRuntime::updateZonePointersToRelocated
     for (CompartmentsInZoneIter comp(zone); !comp.done(); comp.next())
         callWeakPointerCompartmentCallbacks(comp);
 }
 
 /*
  * Update runtime-wide pointers to relocated cells.
  */
 void
-GCRuntime::updateRuntimePointersToRelocatedCells(AutoTraceSession& session)
+GCRuntime::updateRuntimePointersToRelocatedCells(AutoGCSession& session)
 {
     MOZ_ASSERT(!rt->isBeingDestroyed());
 
     gcstats::AutoPhase ap1(stats(), gcstats::PhaseKind::COMPACT_UPDATE);
     MovingTracer trc(rt);
 
     Compartment::fixupCrossCompartmentWrappersAfterMovingGC(&trc);
 
@@ -4257,18 +4257,17 @@ ShouldCollectZone(Zone* zone, JS::gcreas
     // set of atoms in use by the other collected zones at the end of the GC.
     if (zone->isAtomsZone())
         return TlsContext.get()->canCollectAtoms();
 
     return zone->canCollect();
 }
 
 bool
-GCRuntime::prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut,
-                                     AutoLockForExclusiveAccess& lock)
+GCRuntime::prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut)
 {
 #ifdef DEBUG
     /* Assert that zone state is as we expect */
     for (ZonesIter zone(rt, WithAtoms); !zone.done(); zone.next()) {
         MOZ_ASSERT(!zone->isCollecting());
         MOZ_ASSERT_IF(!zone->isAtomsZone(), !zone->compartments().empty());
         for (auto i : AllAllocKinds())
             MOZ_ASSERT(!zone->arenas.arenaListsToSweep(i));
@@ -4350,17 +4349,17 @@ RelazifyFunctionsForShrinkingGC(JSRuntim
     }
 }
 
 static void
 PurgeShapeTablesForShrinkingGC(JSRuntime* rt)
 {
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::PURGE_SHAPE_TABLES);
     for (GCZonesIter zone(rt); !zone.done(); zone.next()) {
-        if (zone->keepShapeTables() || zone->isSelfHostingZone())
+        if (!CanRelocateZone(zone) || zone->keepShapeTables())
             continue;
         for (auto baseShape = zone->cellIter<BaseShape>(); !baseShape.done(); baseShape.next())
             baseShape->maybePurgeTable();
     }
 }
 
 static void
 UnmarkCollectedZones(GCParallelTask* task)
@@ -4379,31 +4378,29 @@ UnmarkCollectedZones(GCParallelTask* tas
 
 static void
 BufferGrayRoots(GCParallelTask* task)
 {
     task->runtime()->gc.bufferGrayRoots();
 }
 
 bool
-GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoTraceSession& session)
-{
-    MOZ_ASSERT(session.maybeLock.isSome());
-
+GCRuntime::beginMarkPhase(JS::gcreason::Reason reason, AutoGCSession& session)
+{
 #ifdef DEBUG
     if (fullCompartmentChecks)
         checkForCompartmentMismatches();
 #endif
 
-    if (!prepareZonesForCollection(reason, &isFull.ref(), session.lock()))
+    if (!prepareZonesForCollection(reason, &isFull.ref()))
         return false;
 
-    /* If we're not collecting the atoms zone we can release the lock now. */
-    if (!atomsZone->isCollecting())
-        session.maybeLock.reset();
+    /* * Check it's safe to access the atoms zone if we are collecting it. */
+    if (atomsZone->isCollecting())
+        session.maybeCheckAtomsAccess.emplace(rt);
 
     /*
      * In an incremental GC, clear the area free lists to ensure that subsequent
      * allocations refill them and end up marking new cells back. See
      * arenaAllocatedDuringGC().
      */
     for (GCZonesIter zone(rt); !zone.done(); zone.next())
         zone->arenas.clearFreeLists();
@@ -4661,17 +4658,17 @@ struct GCChunkHasher {
     }
 };
 
 class js::gc::MarkingValidator
 {
   public:
     explicit MarkingValidator(GCRuntime* gc);
     ~MarkingValidator();
-    void nonIncrementalMark(AutoTraceSession& session);
+    void nonIncrementalMark(AutoGCSession& session);
     void validate();
 
   private:
     GCRuntime* gc;
     bool initialized;
 
     typedef HashMap<Chunk*, ChunkBitmap*, GCChunkHasher, SystemAllocPolicy> BitmapMap;
     BitmapMap map;
@@ -4687,17 +4684,17 @@ js::gc::MarkingValidator::~MarkingValida
     if (!map.initialized())
         return;
 
     for (BitmapMap::Range r(map.all()); !r.empty(); r.popFront())
         js_delete(r.front().value());
 }
 
 void
-js::gc::MarkingValidator::nonIncrementalMark(AutoTraceSession& session)
+js::gc::MarkingValidator::nonIncrementalMark(AutoGCSession& session)
 {
     /*
      * Perform a non-incremental mark for all collecting zones and record
      * the results for later comparison.
      *
      * Currently this does not validate gray marking.
      */
 
@@ -4903,17 +4900,17 @@ js::gc::MarkingValidator::validate()
             }
         }
     }
 }
 
 #endif // JS_GC_ZEAL
 
 void
-GCRuntime::computeNonIncrementalMarkingForValidation(AutoTraceSession& session)
+GCRuntime::computeNonIncrementalMarkingForValidation(AutoGCSession& session)
 {
 #ifdef JS_GC_ZEAL
     MOZ_ASSERT(!markingValidator);
     if (isIncremental && hasZealMode(ZealMode::IncrementalMarkingValidator))
         markingValidator = js_new<MarkingValidator>(this);
     if (markingValidator)
         markingValidator->nonIncrementalMark(session);
 #endif
@@ -5879,17 +5876,17 @@ GCRuntime::endSweepingSweepGroup(FreeOp*
         queueZonesForBackgroundSweep(zones);
     else
         sweepBackgroundThings(zones, blocksToFreeAfterSweeping.ref());
 
     return Finished;
 }
 
 void
-GCRuntime::beginSweepPhase(JS::gcreason::Reason reason, AutoTraceSession& session)
+GCRuntime::beginSweepPhase(JS::gcreason::Reason reason, AutoGCSession& session)
 {
     /*
      * Sweep phase.
      *
      * Finalize as we sweep, outside of lock but with RuntimeHeapIsBusy()
      * true so that any attempt to allocate a GC-thing from a finalizer will
      * fail, rather than nest badly and leave the unmarked newborn to be swept.
      */
@@ -6754,17 +6751,17 @@ GCRuntime::beginCompactPhase()
     }
 
     MOZ_ASSERT(!relocatedArenasToRelease);
     startedCompacting = true;
 }
 
 IncrementalProgress
 GCRuntime::compactPhase(JS::gcreason::Reason reason, SliceBudget& sliceBudget,
-                        AutoTraceSession& session)
+                        AutoGCSession& session)
 {
     assertBackgroundSweepingFinished();
     MOZ_ASSERT(startedCompacting);
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::COMPACT);
 
     // TODO: JSScripts can move. If the sampler interrupts the GC in the
     // middle of relocating an arena, invalid JSScript pointers may be
@@ -6865,47 +6862,44 @@ HeapStateToLabel(JS::HeapState heapState
       case JS::HeapState::CycleCollecting:
         MOZ_CRASH("Should never have an Idle or CC heap state when pushing GC profiling stack frames!");
     }
     MOZ_ASSERT_UNREACHABLE("Should have exhausted every JS::HeapState variant!");
     return nullptr;
 }
 
 /* Start a new heap session. */
-AutoTraceSession::AutoTraceSession(JSRuntime* rt, JS::HeapState heapState)
+AutoHeapSession::AutoHeapSession(JSRuntime* rt, JS::HeapState heapState)
   : runtime(rt),
     prevState(rt->heapState_),
     profilingStackFrame(rt->mainContextFromOwnThread(), HeapStateToLabel(heapState),
                         ProfilingStackFrame::Category::GCCC)
 {
     MOZ_ASSERT(CurrentThreadCanAccessRuntime(rt));
     MOZ_ASSERT(prevState == JS::HeapState::Idle);
     MOZ_ASSERT(heapState != JS::HeapState::Idle);
     MOZ_ASSERT_IF(heapState == JS::HeapState::MajorCollecting, rt->gc.nursery().isEmpty());
 
-    // Session always begins with lock held, see comment in class definition.
-    maybeLock.emplace(rt);
-
     rt->heapState_ = heapState;
 }
 
-AutoTraceSession::~AutoTraceSession()
+AutoHeapSession::~AutoHeapSession()
 {
     MOZ_ASSERT(JS::RuntimeHeapIsBusy());
     runtime->heapState_ = prevState;
 }
 
 JS_PUBLIC_API(JS::HeapState)
 JS::RuntimeHeapState()
 {
     return TlsContext.get()->runtime()->heapState();
 }
 
 GCRuntime::IncrementalResult
-GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoTraceSession& session)
+GCRuntime::resetIncrementalGC(gc::AbortReason reason, AutoGCSession& session)
 {
     MOZ_ASSERT(reason != gc::AbortReason::None);
 
     switch (incrementalState) {
       case State::NotActive:
           return IncrementalResult::Ok;
 
       case State::MarkRoots:
@@ -7087,25 +7081,18 @@ ShouldCleanUpEverything(JS::gcreason::Re
     // During shutdown, we must clean everything up, for the sake of leak
     // detection. When a runtime has no contexts, or we're doing a GC before a
     // shutdown CC, those are strong indications that we're shutting down.
     return IsShutdownGC(reason) || gckind == GC_SHRINK;
 }
 
 void
 GCRuntime::incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
-                                   AutoTraceSession& session)
-{
-    /*
-     * Drop the exclusive access lock if we are in an incremental collection
-     * that does not touch the atoms zone.
-     */
-    if (isIncrementalGCInProgress() && !atomsZone->isCollecting())
-        session.maybeLock.reset();
-
+                                   AutoGCSession& session)
+{
     AutoDisableBarriers disableBarriers(rt);
 
     bool destroyingRuntime = (reason == JS::gcreason::DESTROY_RUNTIME);
 
     initialState = incrementalState;
 
 #ifdef JS_GC_ZEAL
     /*
@@ -7323,17 +7310,17 @@ CheckZoneIsScheduled(Zone* zone, JS::gcr
     }
     fflush(stderr);
     MOZ_CRASH("Zone not scheduled");
 #endif
 }
 
 GCRuntime::IncrementalResult
 GCRuntime::budgetIncrementalGC(bool nonincrementalByAPI, JS::gcreason::Reason reason,
-                               SliceBudget& budget, AutoTraceSession& session)
+                               SliceBudget& budget, AutoGCSession& session)
 {
     if (nonincrementalByAPI) {
         stats().nonincremental(gc::AbortReason::NonIncrementalRequested);
         budget.makeUnlimited();
 
         // Reset any in progress incremental GC if this was triggered via the
         // API. This isn't required for correctness, but sometimes during tests
         // the caller expects this GC to collect certain objects, and we need
@@ -7490,17 +7477,17 @@ GCRuntime::gcCycle(bool nonincrementalBy
 {
     // Note that GC callbacks are allowed to re-enter GC.
     AutoCallGCCallbacks callCallbacks(*this);
 
     gcstats::AutoGCSlice agc(stats(), scanZonesBeforeGC(), invocationKind, budget, reason);
 
     minorGC(reason, gcstats::PhaseKind::EVICT_NURSERY_FOR_MAJOR_GC);
 
-    AutoTraceSession session(rt, JS::HeapState::MajorCollecting);
+    AutoGCSession session(rt, JS::HeapState::MajorCollecting);
 
     majorGCTriggerReason = JS::gcreason::NO_REASON;
 
     number++;
     if (!isIncrementalGCInProgress())
         incMajorGcNumber();
 
     // It's ok if threads other than the main thread have suppressGC set, as
@@ -7523,18 +7510,19 @@ GCRuntime::gcCycle(bool nonincrementalBy
         // We must also wait for background allocation to finish so we can
         // avoid taking the GC lock when manipulating the chunks during the GC.
         // The background alloc task can run between slices, so we must wait
         // for it at the start of every slice.
         allocTask.cancelAndWait();
     }
 
     // We don't allow off-thread parsing to start while we're doing an
-    // incremental GC.
-    MOZ_ASSERT_IF(rt->activeGCInAtomsZone(), !rt->hasHelperThreadZones());
+    // incremental GC of the atoms zone.
+    if (rt->activeGCInAtomsZone())
+        session.maybeCheckAtomsAccess.emplace(rt);
 
     auto result = budgetIncrementalGC(nonincrementalByAPI, reason, budget, session);
 
     // If an ongoing incremental GC was reset, we may need to restart.
     if (result == IncrementalResult::Reset) {
         MOZ_ASSERT(!isIncrementalGCInProgress());
         return result;
     }
@@ -7968,22 +7956,16 @@ js::gc::FinishGC(JSContext* cx)
     if (JS::IsIncrementalGCInProgress(cx)) {
         JS::PrepareForIncrementalGC(cx);
         JS::FinishIncrementalGC(cx, JS::gcreason::API);
     }
 
     cx->nursery().waitBackgroundFreeEnd();
 }
 
-AutoPrepareForTracing::AutoPrepareForTracing(JSContext* cx)
-{
-    js::gc::FinishGC(cx);
-    session_.emplace(cx->runtime());
-}
-
 Realm*
 js::NewRealm(JSContext* cx, JSPrincipals* principals, const JS::RealmOptions& options)
 {
     JSRuntime* rt = cx->runtime();
     JS_AbortIfWrongThread(cx);
 
     UniquePtr<Zone> zoneHolder;
     UniquePtr<Compartment> compHolder;
--- a/js/src/gc/GCInternals.h
+++ b/js/src/gc/GCInternals.h
@@ -9,61 +9,113 @@
  */
 
 #ifndef gc_GCInternals_h
 #define gc_GCInternals_h
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/Maybe.h"
 
+#include "gc/GC.h"
 #include "gc/RelocationOverlay.h"
 #include "gc/Zone.h"
 #include "vm/HelperThreads.h"
 #include "vm/Runtime.h"
 
 namespace js {
 namespace gc {
 
-/*
- * This class should be used by any code that needs to exclusive access to the
- * heap in order to trace through it...
- */
-class MOZ_RAII AutoTraceSession
+class MOZ_RAII AutoCheckCanAccessAtomsDuringGC
+{
+#ifdef DEBUG
+    JSRuntime* runtime;
+
+  public:
+    explicit AutoCheckCanAccessAtomsDuringGC(JSRuntime* rt)
+      : runtime(rt)
+    {
+        // Ensure we're only used from within the GC.
+        MOZ_ASSERT(JS::RuntimeHeapIsMajorCollecting());
+
+        // Ensure there is no off-thread parsing running.
+        MOZ_ASSERT(!rt->hasHelperThreadZones());
+
+        // Set up a check to assert if we try to start an off-thread parse.
+        runtime->setOffThreadParsingBlocked(true);
+    }
+    ~AutoCheckCanAccessAtomsDuringGC() {
+        runtime->setOffThreadParsingBlocked(false);
+    }
+#else
+  public:
+    explicit AutoCheckCanAccessAtomsDuringGC(JSRuntime* rt) {}
+#endif
+};
+
+// Abstract base class for exclusive heap access for tracing or GC.
+class MOZ_RAII AutoHeapSession
 {
   public:
-    explicit AutoTraceSession(JSRuntime* rt, JS::HeapState state = JS::HeapState::Tracing);
-    ~AutoTraceSession();
-
-    // Constructing an AutoTraceSession takes the exclusive access lock, but GC
-    // may release it during a trace session if we're not collecting the atoms
-    // zone.
-    mozilla::Maybe<AutoLockForExclusiveAccess> maybeLock;
-
-    AutoLockForExclusiveAccess& lock() {
-        return maybeLock.ref();
-    }
+    ~AutoHeapSession();
 
   protected:
-    JSRuntime* runtime;
+    AutoHeapSession(JSRuntime* rt, JS::HeapState state);
 
   private:
-    AutoTraceSession(const AutoTraceSession&) = delete;
-    void operator=(const AutoTraceSession&) = delete;
+    AutoHeapSession(const AutoHeapSession&) = delete;
+    void operator=(const AutoHeapSession&) = delete;
 
+    JSRuntime* runtime;
     JS::HeapState prevState;
     AutoGeckoProfilerEntry profilingStackFrame;
 };
 
-class MOZ_RAII AutoPrepareForTracing
+class MOZ_RAII AutoGCSession : public AutoHeapSession
 {
-    mozilla::Maybe<AutoTraceSession> session_;
+  public:
+    explicit AutoGCSession(JSRuntime* rt, JS::HeapState state)
+      : AutoHeapSession(rt, state)
+    {}
+
+    AutoCheckCanAccessAtomsDuringGC& checkAtomsAccess() {
+        return maybeCheckAtomsAccess.ref();
+    }
+
+    // During a GC we can check that it's not possible for anything else to be
+    // using the atoms zone.
+    mozilla::Maybe<AutoCheckCanAccessAtomsDuringGC> maybeCheckAtomsAccess;
+};
 
+class MOZ_RAII AutoTraceSession : public AutoLockForExclusiveAccess,
+                                  public AutoHeapSession
+{
   public:
-    explicit AutoPrepareForTracing(JSContext* cx);
-    AutoTraceSession& session() { return session_.ref(); }
+    explicit AutoTraceSession(JSRuntime* rt)
+      : AutoLockForExclusiveAccess(rt),
+        AutoHeapSession(rt, JS::HeapState::Tracing)
+    {}
+};
+
+struct MOZ_RAII AutoFinishGC
+{
+    explicit AutoFinishGC(JSContext* cx) {
+        FinishGC(cx);
+    }
+};
+
+// This class should be used by any code that needs to exclusive access to the
+// heap in order to trace through it.
+class MOZ_RAII AutoPrepareForTracing : private AutoFinishGC,
+                                       public AutoTraceSession
+{
+  public:
+    explicit AutoPrepareForTracing(JSContext* cx)
+      : AutoFinishGC(cx),
+        AutoTraceSession(cx->runtime())
+    {}
 };
 
 AbortReason
 IsIncrementalGCUnsafe(JSRuntime* rt);
 
 #ifdef JS_GC_ZEAL
 
 class MOZ_RAII AutoStopVerifyingBarriers
--- a/js/src/gc/GCMarker.h
+++ b/js/src/gc/GCMarker.h
@@ -9,16 +9,17 @@
 
 #include "ds/OrderedHashTable.h"
 #include "js/SliceBudget.h"
 #include "js/TracingAPI.h"
 #include "js/TypeDecls.h"
 
 namespace js {
 
+class AutoAccessAtomsZone;
 class WeakMapBase;
 
 static const size_t NON_INCREMENTAL_MARK_STACK_BASE_CAPACITY = 4096;
 static const size_t INCREMENTAL_MARK_STACK_BASE_CAPACITY = 32768;
 
 namespace gc {
 
 struct Cell;
@@ -276,17 +277,17 @@ class GCMarker : public JSTracer
         return isMarkStackEmpty() && !unmarkedArenaStackTop;
     }
 
     MOZ_MUST_USE bool drainMarkStack(SliceBudget& budget);
 
     void setGCMode(JSGCMode mode) { stack.setGCMode(mode); }
 
     size_t sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
-                               const AutoLockForExclusiveAccess& lock) const;
+                               const AutoAccessAtomsZone& access) const;
 
 #ifdef DEBUG
 
     bool shouldCheckCompartments() { return strictCompartmentChecking; }
 
     JS::Zone* stackContainsCrossZonePointerTo(const gc::Cell* cell) const;
 
 #endif
--- a/js/src/gc/GCRuntime.h
+++ b/js/src/gc/GCRuntime.h
@@ -21,27 +21,29 @@
 #include "gc/Statistics.h"
 #include "gc/StoreBuffer.h"
 #include "js/GCAnnotations.h"
 #include "js/UniquePtr.h"
 #include "vm/AtomsTable.h"
 
 namespace js {
 
+class AutoAccessAtomsZone;
 class AutoLockGC;
 class AutoLockGCBgAlloc;
 class AutoLockHelperThreadState;
 class VerifyPreTracer;
 
 namespace gc {
 
 using BlackGrayEdgeVector = Vector<TenuredCell*, 0, SystemAllocPolicy>;
 using ZoneVector = Vector<JS::Zone*, 4, SystemAllocPolicy>;
 
 class AutoCallGCCallbacks;
+class AutoGCSession;
 class AutoRunParallelTask;
 class AutoTraceSession;
 class MarkingValidator;
 struct MovingTracer;
 enum class ShouldCheckThresholds;
 class SweepGroupsIter;
 class WeakCacheSweepIterator;
 
@@ -259,17 +261,17 @@ class GCRuntime
     void runDebugGC();
     void notifyRootsRemoved();
 
     enum TraceOrMarkRuntime {
         TraceRuntime,
         MarkRuntime
     };
     void traceRuntime(JSTracer* trc, AutoTraceSession& session);
-    void traceRuntimeForMinorGC(JSTracer* trc, AutoTraceSession& session);
+    void traceRuntimeForMinorGC(JSTracer* trc, AutoGCSession& session);
 
     void purgeRuntimeForMinorGC();
 
     void shrinkBuffers();
     void onOutOfMallocMemory();
     void onOutOfMallocMemory(const AutoLockGC& lock);
 
 #ifdef JS_GC_ZEAL
@@ -535,62 +537,60 @@ class GCRuntime
 
     friend class BackgroundAllocTask;
     bool wantBackgroundAllocation(const AutoLockGC& lock) const;
     void startBackgroundAllocTaskIfIdle();
 
     void requestMajorGC(JS::gcreason::Reason reason);
     SliceBudget defaultBudget(JS::gcreason::Reason reason, int64_t millis);
     IncrementalResult budgetIncrementalGC(bool nonincrementalByAPI, JS::gcreason::Reason reason,
-                                          SliceBudget& budget, AutoTraceSession& session);
-    IncrementalResult resetIncrementalGC(AbortReason reason, AutoTraceSession& session);
+                                          SliceBudget& budget, AutoGCSession& session);
+    IncrementalResult resetIncrementalGC(AbortReason reason, AutoGCSession& session);
 
     // Assert if the system state is such that we should never
     // receive a request to do GC work.
     void checkCanCallAPI();
 
     // Check if the system state is such that GC has been supressed
     // or otherwise delayed.
     MOZ_MUST_USE bool checkIfGCAllowedInCurrentState(JS::gcreason::Reason reason);
 
     gcstats::ZoneGCStats scanZonesBeforeGC();
     void collect(bool nonincrementalByAPI, SliceBudget budget, JS::gcreason::Reason reason) JS_HAZ_GC_CALL;
     MOZ_MUST_USE IncrementalResult gcCycle(bool nonincrementalByAPI, SliceBudget& budget,
                                            JS::gcreason::Reason reason);
     bool shouldRepeatForDeadZone(JS::gcreason::Reason reason);
     void incrementalCollectSlice(SliceBudget& budget, JS::gcreason::Reason reason,
-                                 AutoTraceSession& session);
+                                 AutoGCSession& session);
 
     friend class AutoCallGCCallbacks;
     void maybeCallGCCallback(JSGCStatus status);
 
     void pushZealSelectedObjects();
     void purgeRuntime();
-    MOZ_MUST_USE bool beginMarkPhase(JS::gcreason::Reason reason, AutoTraceSession& session);
-    bool prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut,
-                                   AutoLockForExclusiveAccess& lock);
+    MOZ_MUST_USE bool beginMarkPhase(JS::gcreason::Reason reason, AutoGCSession& session);
+    bool prepareZonesForCollection(JS::gcreason::Reason reason, bool* isFullOut);
     bool shouldPreserveJITCode(JS::Realm* realm, int64_t currentTime,
                                JS::gcreason::Reason reason, bool canAllocateMoreCode);
-    void traceRuntimeForMajorGC(JSTracer* trc, AutoTraceSession& session);
-    void traceRuntimeAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock);
+    void traceRuntimeForMajorGC(JSTracer* trc, AutoGCSession& session);
+    void traceRuntimeAtoms(JSTracer* trc, const AutoAccessAtomsZone& atomsAccess);
     void traceKeptAtoms(JSTracer* trc);
-    void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark,
-                            AutoTraceSession& session);
+    void traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark);
     void maybeDoCycleCollection();
     void markCompartments();
     IncrementalProgress drainMarkStack(SliceBudget& sliceBudget, gcstats::PhaseKind phase);
     template <class CompartmentIterT> void markWeakReferences(gcstats::PhaseKind phase);
     void markWeakReferencesInCurrentGroup(gcstats::PhaseKind phase);
     template <class ZoneIterT, class CompartmentIterT> void markGrayReferences(gcstats::PhaseKind phase);
     void markBufferedGrayRoots(JS::Zone* zone);
     void markGrayReferencesInCurrentGroup(gcstats::PhaseKind phase);
     void markAllWeakReferences(gcstats::PhaseKind phase);
     void markAllGrayReferences(gcstats::PhaseKind phase);
 
-    void beginSweepPhase(JS::gcreason::Reason reason, AutoTraceSession& session);
+    void beginSweepPhase(JS::gcreason::Reason reason, AutoGCSession& session);
     void groupZonesForSweeping(JS::gcreason::Reason reason);
     MOZ_MUST_USE bool findInterZoneEdges();
     void getNextSweepGroup();
     IncrementalProgress endMarkingSweepGroup(FreeOp* fop, SliceBudget& budget);
     IncrementalProgress beginSweepingSweepGroup(FreeOp* fop, SliceBudget& budget);
 #ifdef JS_GC_ZEAL
     IncrementalProgress maybeYieldForSweepingZeal(FreeOp* fop, SliceBudget& budget);
 #endif
@@ -613,34 +613,34 @@ class GCRuntime
     void decommitAllWithoutUnlocking(const AutoLockGC& lock);
     void startDecommit();
     void queueZonesForBackgroundSweep(ZoneList& zones);
     void sweepBackgroundThings(ZoneList& zones, LifoAlloc& freeBlocks);
     void assertBackgroundSweepingFinished();
     bool shouldCompact();
     void beginCompactPhase();
     IncrementalProgress compactPhase(JS::gcreason::Reason reason, SliceBudget& sliceBudget,
-                                     AutoTraceSession& session);
+                                     AutoGCSession& session);
     void endCompactPhase();
     void sweepTypesAfterCompacting(Zone* zone);
     void sweepZoneAfterCompacting(Zone* zone);
     MOZ_MUST_USE bool relocateArenas(Zone* zone, JS::gcreason::Reason reason,
                                      Arena*& relocatedListOut, SliceBudget& sliceBudget);
     void updateTypeDescrObjects(MovingTracer* trc, Zone* zone);
     void updateCellPointers(Zone* zone, AllocKinds kinds, size_t bgTaskCount);
     void updateAllCellPointers(MovingTracer* trc, Zone* zone);
     void updateZonePointersToRelocatedCells(Zone* zone);
-    void updateRuntimePointersToRelocatedCells(AutoTraceSession& session);
+    void updateRuntimePointersToRelocatedCells(AutoGCSession& session);
     void protectAndHoldArenas(Arena* arenaList);
     void unprotectHeldRelocatedArenas();
     void releaseRelocatedArenas(Arena* arenaList);
     void releaseRelocatedArenasWithoutUnlocking(Arena* arenaList, const AutoLockGC& lock);
     void finishCollection();
 
-    void computeNonIncrementalMarkingForValidation(AutoTraceSession& session);
+    void computeNonIncrementalMarkingForValidation(AutoGCSession& session);
     void validateIncrementalMarking();
     void finishMarkingValidation();
 
 #ifdef DEBUG
     void checkForCompartmentMismatches();
 #endif
 
     void callFinalizeCallbacks(FreeOp* fop, JSFinalizeStatus status) const;
@@ -987,17 +987,16 @@ class GCRuntime
                  gcstats::PhaseKind phase = gcstats::PhaseKind::MINOR_GC) JS_HAZ_GC_CALL;
     void evictNursery(JS::gcreason::Reason reason = JS::gcreason::EVICT_NURSERY) {
         minorGC(reason, gcstats::PhaseKind::EVICT_NURSERY);
     }
     void freeAllLifoBlocksAfterMinorGC(LifoAlloc* lifo);
 
     friend class js::GCHelperState;
     friend class MarkingValidator;
-    friend class AutoTraceSession;
     friend class AutoEnterIteration;
 };
 
 /* Prevent compartments and zones from being collected during iteration. */
 class MOZ_RAII AutoEnterIteration {
     GCRuntime* gc;
 
   public:
--- a/js/src/gc/Marking.cpp
+++ b/js/src/gc/Marking.cpp
@@ -2558,17 +2558,17 @@ GCMarker::checkZone(void* p)
     MOZ_ASSERT(started);
     DebugOnly<Cell*> cell = static_cast<Cell*>(p);
     MOZ_ASSERT_IF(cell->isTenured(), cell->asTenured().zone()->isCollecting());
 }
 #endif
 
 size_t
 GCMarker::sizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf,
-                              const AutoLockForExclusiveAccess& lock) const
+                              const AutoAccessAtomsZone& access) const
 {
     size_t size = stack.sizeOfExcludingThis(mallocSizeOf);
     for (ZonesIter zone(runtime(), WithAtoms); !zone.done(); zone.next())
         size += zone->gcGrayRoots().sizeOfExcludingThis(mallocSizeOf);
     return size;
 }
 
 #ifdef DEBUG
--- a/js/src/gc/Nursery.cpp
+++ b/js/src/gc/Nursery.cpp
@@ -767,17 +767,17 @@ js::Nursery::collect(JS::gcreason::Reaso
                 if (group->canPreTenure(sweep)) {
                     group->setShouldPreTenure(sweep, cx);
                     pretenureCount++;
                 }
             }
         }
     }
 
-    mozilla::Maybe<AutoTraceSession> session;
+    mozilla::Maybe<AutoGCSession> session;
     for (ZonesIter zone(rt, SkipAtoms); !zone.done(); zone.next()) {
         if (shouldPretenure && zone->allocNurseryStrings && zone->tenuredStrings >= 30 * 1000) {
             if (!session.isSome())
                 session.emplace(rt, JS::HeapState::MinorCollecting);
             CancelOffThreadIonCompile(zone);
             bool preserving = zone->isPreservingCode();
             zone->setPreservingCode(false);
             zone->discardJitCode(rt->defaultFreeOp());
@@ -841,17 +841,17 @@ js::Nursery::collect(JS::gcreason::Reaso
         }
     }
 }
 
 void
 js::Nursery::doCollection(JS::gcreason::Reason reason, TenureCountCache& tenureCounts)
 {
     JSRuntime* rt = runtime();
-    AutoTraceSession session(rt, JS::HeapState::MinorCollecting);
+    AutoGCSession session(rt, JS::HeapState::MinorCollecting);
     AutoSetThreadIsPerformingGC performingGC;
     AutoStopVerifyingBarriers av(rt, false);
     AutoDisableProxyCheck disableStrictProxyChecking;
     mozilla::DebugOnly<AutoEnterOOMUnsafeRegion> oomUnsafeRegion;
 
     const size_t initialNurseryCapacity = spaceToEnd(maxChunkCount());
     const size_t initialNurseryUsedBytes = initialNurseryCapacity - freeSpace();
 
--- a/js/src/gc/PublicIterators.cpp
+++ b/js/src/gc/PublicIterators.cpp
@@ -46,33 +46,33 @@ IterateRealmsArenasCellsUnbarriered(JSCo
 
 void
 js::IterateHeapUnbarriered(JSContext* cx, void* data,
                            IterateZoneCallback zoneCallback,
                            JS::IterateRealmCallback realmCallback,
                            IterateArenaCallback arenaCallback,
                            IterateCellCallback cellCallback)
 {
-    AutoPrepareForTracing prop(cx);
+    AutoPrepareForTracing prep(cx);
 
     for (ZonesIter zone(cx->runtime(), WithAtoms); !zone.done(); zone.next()) {
         (*zoneCallback)(cx->runtime(), data, zone);
         IterateRealmsArenasCellsUnbarriered(cx, zone, data,
                                             realmCallback, arenaCallback, cellCallback);
     }
 }
 
 void
 js::IterateHeapUnbarrieredForZone(JSContext* cx, Zone* zone, void* data,
                                   IterateZoneCallback zoneCallback,
                                   JS::IterateRealmCallback realmCallback,
                                   IterateArenaCallback arenaCallback,
                                   IterateCellCallback cellCallback)
 {
-    AutoPrepareForTracing prop(cx);
+    AutoPrepareForTracing prep(cx);
 
     (*zoneCallback)(cx->runtime(), data, zone);
     IterateRealmsArenasCellsUnbarriered(cx, zone, data,
                                         realmCallback, arenaCallback, cellCallback);
 }
 
 void
 js::IterateChunks(JSContext* cx, void* data, IterateChunkCallback chunkCallback)
--- a/js/src/gc/RootMarking.cpp
+++ b/js/src/gc/RootMarking.cpp
@@ -257,100 +257,99 @@ PropertyDescriptor::trace(JSTracer* trc)
     if ((attrs & JSPROP_SETTER) && setter) {
         JSObject* tmp = JS_FUNC_TO_DATA_PTR(JSObject*, setter);
         TraceRoot(trc, &tmp, "Descriptor::set");
         setter = JS_DATA_TO_FUNC_PTR(JSSetterOp, tmp);
     }
 }
 
 void
-js::gc::GCRuntime::traceRuntimeForMajorGC(JSTracer* trc, AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeForMajorGC(JSTracer* trc, AutoGCSession& session)
 {
     MOZ_ASSERT(!TlsContext.get()->suppressGC);
-    MOZ_ASSERT_IF(atomsZone->isCollecting(), session.maybeLock.isSome());
 
     // FinishRoots will have asserted that every root that we do not expect
     // is gone, so we can simply skip traceRuntime here.
     if (rt->isBeingDestroyed())
         return;
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
     if (atomsZone->isCollecting())
-        traceRuntimeAtoms(trc, session.lock());
+        traceRuntimeAtoms(trc, session.checkAtomsAccess());
     traceKeptAtoms(trc);
     Compartment::traceIncomingCrossCompartmentEdgesForZoneGC(trc);
-    traceRuntimeCommon(trc, MarkRuntime, session);
+    traceRuntimeCommon(trc, MarkRuntime);
 }
 
 void
-js::gc::GCRuntime::traceRuntimeForMinorGC(JSTracer* trc, AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeForMinorGC(JSTracer* trc, AutoGCSession& session)
 {
     MOZ_ASSERT(!TlsContext.get()->suppressGC);
 
     // Note that we *must* trace the runtime during the SHUTDOWN_GC's minor GC
     // despite having called FinishRoots already. This is because FinishRoots
     // does not clear the crossCompartmentWrapper map. It cannot do this
     // because Proxy's trace for CrossCompartmentWrappers asserts presence in
     // the map. And we can reach its trace function despite having finished the
     // roots via the edges stored by the pre-barrier verifier when we finish
     // the verifier for the last time.
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
 
     jit::JitRuntime::TraceJitcodeGlobalTableForMinorGC(trc);
 
-    traceRuntimeCommon(trc, TraceRuntime, session);
+    traceRuntimeCommon(trc, TraceRuntime);
 }
 
 void
 js::TraceRuntime(JSTracer* trc)
 {
     MOZ_ASSERT(!trc->isMarkingTracer());
 
     JSRuntime* rt = trc->runtime();
     rt->gc.evictNursery();
     AutoPrepareForTracing prep(rt->mainContextFromOwnThread());
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    rt->gc.traceRuntime(trc, prep.session());
+    rt->gc.traceRuntime(trc, prep);
 }
 
 void
 js::gc::GCRuntime::traceRuntime(JSTracer* trc, AutoTraceSession& session)
 {
     MOZ_ASSERT(!rt->isBeingDestroyed());
 
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_ROOTS);
-    traceRuntimeAtoms(trc, session.lock());
-    traceRuntimeCommon(trc, TraceRuntime, session);
+
+    traceRuntimeAtoms(trc, session);
+    traceRuntimeCommon(trc, TraceRuntime);
 }
 
 void
-js::gc::GCRuntime::traceRuntimeAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+js::gc::GCRuntime::traceRuntimeAtoms(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_RUNTIME_DATA);
     TracePermanentAtoms(trc);
-    TraceAtoms(trc, lock);
+    TraceAtoms(trc, access);
     TraceWellKnownSymbols(trc);
-    jit::JitRuntime::Trace(trc, lock);
+    jit::JitRuntime::Trace(trc, access);
 }
 
 void
 js::gc::GCRuntime::traceKeptAtoms(JSTracer* trc)
 {
     // We don't have exact rooting information for atoms while parsing. When
     // this is happeninng we set a flag on the zone and trace all atoms in the
     // zone's cache.
     for (GCZonesIter zone(trc->runtime()); !zone.done(); zone.next()) {
         if (zone->hasKeptAtoms())
             zone->traceAtomCache(trc);
     }
 }
 
 void
-js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark,
-                                      AutoTraceSession& session)
+js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrMark)
 {
     {
         gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_STACK);
 
         JSContext* cx = rt->mainContextFromOwnThread();
 
         // Trace active interpreter and JIT stack roots.
         TraceInterpreterActivations(cx, trc);
@@ -381,17 +380,17 @@ js::gc::GCRuntime::traceRuntimeCommon(JS
     rt->mainContextFromOwnThread()->trace(trc);
 
     // Trace all realm roots, but not the realm itself; it is traced via the
     // parent pointer if traceRoots actually traces anything.
     for (RealmsIter r(rt); !r.done(); r.next())
         r->traceRoots(trc, traceOrMark);
 
     // Trace helper thread roots.
-    HelperThreadState().trace(trc, session);
+    HelperThreadState().trace(trc);
 
     // Trace the embedding's black and gray roots.
     if (!JS::RuntimeHeapIsMinorCollecting()) {
         gcstats::AutoPhase ap(stats(), gcstats::PhaseKind::MARK_EMBEDDING);
 
         /*
          * The embedding can register additional roots here.
          *
@@ -445,19 +444,19 @@ js::gc::GCRuntime::finishRoots()
 
 #ifdef DEBUG
     // The nsWrapperCache may not be empty before our shutdown GC, so we have
     // to skip that table when verifying that we are fully unrooted.
     auto prior = grayRootTracer;
     grayRootTracer = Callback<JSTraceDataOp>(nullptr, nullptr);
 
     AssertNoRootsTracer trc(rt, TraceWeakMapKeysValues);
-    AutoPrepareForTracing prep(TlsContext.get());
+    AutoTraceSession session(rt);
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    traceRuntime(&trc, prep.session());
+    traceRuntime(&trc, session);
 
     // Restore the wrapper tracing so that we leak instead of leaving dangling
     // pointers.
     grayRootTracer = prior;
 #endif // DEBUG
 }
 
 // Append traced things to a buffer on the zone for use later in the GC.
--- a/js/src/gc/Verifier.cpp
+++ b/js/src/gc/Verifier.cpp
@@ -216,17 +216,17 @@ gc::GCRuntime::startVerifyPreBarriers()
         goto oom;
 
     /* Create the root node. */
     trc->curnode = MakeNode(trc, nullptr, JS::TraceKind(0));
 
     incrementalState = State::MarkRoots;
 
     /* Make all the roots be edges emanating from the root node. */
-    traceRuntime(trc, prep.session());
+    traceRuntime(trc, prep);
 
     VerifyNode* node;
     node = trc->curnode;
     if (trc->edgeptr == trc->term)
         goto oom;
 
     /* For each edge, make a node for it if one doesn't already exist. */
     while ((char*)node < trc->edgeptr) {
@@ -650,17 +650,17 @@ CheckHeapTracer::check(AutoTraceSession&
     if (failures)
         fprintf(stderr, "Heap check: %zu failure(s)\n", failures);
     MOZ_RELEASE_ASSERT(failures == 0);
 }
 
 void
 js::gc::CheckHeapAfterGC(JSRuntime* rt)
 {
-    AutoTraceSession session(rt, JS::HeapState::Tracing);
+    AutoTraceSession session(rt);
     CheckHeapTracer tracer(rt);
     if (tracer.init())
         tracer.check(session);
 }
 
 #endif /* JSGC_HASH_TABLE_CHECKS */
 
 #if defined(JS_GC_ZEAL) || defined(DEBUG)
@@ -719,17 +719,17 @@ JS_FRIEND_API(bool)
 js::CheckGrayMarkingState(JSRuntime* rt)
 {
     MOZ_ASSERT(!JS::RuntimeHeapIsCollecting());
     MOZ_ASSERT(!rt->gc.isIncrementalGCInProgress());
     if (!rt->gc.areGrayBitsValid())
         return true;
 
     gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-    AutoTraceSession session(rt, JS::HeapState::Tracing);
+    AutoTraceSession session(rt);
     CheckGrayMarkingTracer tracer(rt);
     if (!tracer.init())
         return true; // Ignore failure
 
     return tracer.check(session);
 }
 
 #endif // defined(JS_GC_ZEAL) || defined(DEBUG)
--- a/js/src/gc/Zone.cpp
+++ b/js/src/gc/Zone.cpp
@@ -56,22 +56,22 @@ JS::Zone::Zone(JSRuntime* rt)
     allocNurseryStrings(this, true),
     propertyTree_(this, this),
     baseShapes_(this, this),
     initialShapes_(this, this),
     nurseryShapes_(this),
     data(this, nullptr),
     isSystem(this, false),
 #ifdef DEBUG
-    gcLastSweepGroupIndex(this, 0),
+    gcLastSweepGroupIndex(0),
 #endif
     jitZone_(this, nullptr),
     gcScheduled_(false),
     gcScheduledSaved_(false),
-    gcPreserveCode_(this, false),
+    gcPreserveCode_(false),
     keepShapeTables_(this, false),
     listNext_(NotOnList)
 {
     /* Ensure that there are no vtables to mess us up here. */
     MOZ_ASSERT(reinterpret_cast<JS::shadow::Zone*>(this) ==
                static_cast<JS::shadow::Zone*>(this));
 
     AutoLockGC lock(rt);
--- a/js/src/gc/Zone.h
+++ b/js/src/gc/Zone.h
@@ -578,17 +578,17 @@ class Zone : public JS::shadow::Zone,
     void fixupAfterMovingGC();
 
     // Per-zone data for use by an embedder.
     js::ZoneData<void*> data;
 
     js::ZoneData<bool> isSystem;
 
 #ifdef DEBUG
-    js::ZoneData<unsigned> gcLastSweepGroupIndex;
+    js::MainThreadData<unsigned> gcLastSweepGroupIndex;
 #endif
 
     static js::HashNumber UniqueIdToHash(uint64_t uid) {
         return mozilla::HashGeneric(uid);
     }
 
     // Creates a HashNumber based on getUniqueId. Returns false on OOM.
     MOZ_MUST_USE bool getHashCode(js::gc::Cell* cell, js::HashNumber* hashp) {
@@ -732,21 +732,21 @@ class Zone : public JS::shadow::Zone,
     // Non-zero if the storage underlying any typed object in this zone might
     // be detached. This is stored in Zone because IC stubs bake in a pointer
     // to this field and Baseline IC code is shared across realms within a
     // Zone. Furthermore, it's not entirely clear if this flag is ever set to
     // a non-zero value since bug 1458011.
     uint32_t detachedTypedObjects = 0;
 
   private:
-    js::ZoneData<js::jit::JitZone*> jitZone_;
+    js::ZoneOrGCTaskData<js::jit::JitZone*> jitZone_;
 
     js::MainThreadData<bool> gcScheduled_;
     js::MainThreadData<bool> gcScheduledSaved_;
-    js::ZoneData<bool> gcPreserveCode_;
+    js::MainThreadData<bool> gcPreserveCode_;
     js::ZoneData<bool> keepShapeTables_;
 
     // Allow zones to be linked into a list
     friend class js::gc::ZoneList;
     static Zone * const NotOnList;
     js::MainThreadOrGCTaskData<Zone*> listNext_;
     bool isOnList() const;
     Zone* nextZone() const;
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -577,26 +577,26 @@ jit::LazyLinkTopActivation(JSContext* cx
 
     MOZ_ASSERT(calleeScript->hasBaselineScript());
     MOZ_ASSERT(calleeScript->jitCodeRaw());
 
     return calleeScript->jitCodeRaw();
 }
 
 /* static */ void
-JitRuntime::Trace(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+JitRuntime::Trace(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     MOZ_ASSERT(!JS::RuntimeHeapIsMinorCollecting());
 
     // Shared stubs are allocated in the atoms zone, so do not iterate
     // them after the atoms heap after it has been "finished."
     if (trc->runtime()->atomsAreFinished())
         return;
 
-    Zone* zone = trc->runtime()->atomsZone(lock);
+    Zone* zone = trc->runtime()->atomsZone(access);
     for (auto i = zone->cellIter<JitCode>(); !i.done(); i.next()) {
         JitCode* code = i;
         TraceRoot(trc, &code, "wrapper");
     }
 }
 
 /* static */ void
 JitRuntime::TraceJitcodeGlobalTableForMinorGC(JSTracer* trc)
--- a/js/src/jit/JitRealm.h
+++ b/js/src/jit/JitRealm.h
@@ -188,17 +188,17 @@ class JitRuntime
         return TrampolinePtr(trampolineCode_->raw() + offset);
     }
 
   public:
     JitRuntime();
     ~JitRuntime();
     MOZ_MUST_USE bool initialize(JSContext* cx, js::AutoLockForExclusiveAccess& lock);
 
-    static void Trace(JSTracer* trc, js::AutoLockForExclusiveAccess& lock);
+    static void Trace(JSTracer* trc, const js::AutoAccessAtomsZone& access);
     static void TraceJitcodeGlobalTableForMinorGC(JSTracer* trc);
     static MOZ_MUST_USE bool MarkJitcodeGlobalTableIteratively(GCMarker* marker);
     static void SweepJitcodeGlobalTable(JSRuntime* rt);
 
     ExecutableAllocator& execAlloc() {
         return execAlloc_.ref();
     }
 
--- a/js/src/jsfriendapi.cpp
+++ b/js/src/jsfriendapi.cpp
@@ -1247,19 +1247,19 @@ js::DumpHeap(JSContext* cx, FILE* fp, js
     if (nurseryBehaviour == js::CollectNurseryBeforeDump)
         cx->runtime()->gc.evictNursery(JS::gcreason::API);
 
     DumpHeapTracer dtrc(fp, cx);
 
     fprintf(dtrc.output, "# Roots.\n");
     {
         JSRuntime* rt = cx->runtime();
-        js::gc::AutoPrepareForTracing prep(cx);
+        js::gc::AutoTraceSession session(rt);
         gcstats::AutoPhase ap(rt->gc.stats(), gcstats::PhaseKind::TRACE_HEAP);
-        rt->gc.traceRuntime(&dtrc, prep.session());
+        rt->gc.traceRuntime(&dtrc, session);
     }
 
     fprintf(dtrc.output, "# Weak maps.\n");
     WeakMapBase::traceAllMappings(&dtrc);
 
     fprintf(dtrc.output, "==========\n");
 
     dtrc.prefix = "> ";
--- a/js/src/threading/ProtectedData.cpp
+++ b/js/src/threading/ProtectedData.cpp
@@ -60,27 +60,29 @@ template class CheckMainThread<AllowedHe
 
 template <AllowedHelperThread Helper>
 void
 CheckZone<Helper>::check() const
 {
     if (OnHelperThread<Helper>())
         return;
 
-    JSContext* cx = TlsContext.get();
+    JSRuntime* runtime = TlsContext.get()->runtime();
     if (zone->isAtomsZone()) {
-        // The atoms zone is protected by the exclusive access lock.
-        MOZ_ASSERT(cx->runtime()->currentThreadHasExclusiveAccess());
+        // The atoms zone is protected by the exclusive access lock, but can be
+        // also accessed when off-thread parsing is blocked.
+        MOZ_ASSERT(runtime->currentThreadHasExclusiveAccess() ||
+                   (!runtime->isOffThreadParseRunning() && runtime->isOffThreadParsingBlocked()));
     } else if (zone->usedByHelperThread()) {
         // This may only be accessed by the helper thread using this zone.
         MOZ_ASSERT(zone->ownedByCurrentHelperThread());
     } else {
         // The main thread is permitted access to all zones. These accesses
         // are threadsafe if the zone is not in use by a helper thread.
-        MOZ_ASSERT(CurrentThreadCanAccessRuntime(cx->runtime()));
+        MOZ_ASSERT(CurrentThreadCanAccessRuntime(runtime));
     }
 }
 
 template class CheckZone<AllowedHelperThread::None>;
 template class CheckZone<AllowedHelperThread::GCTask>;
 template class CheckZone<AllowedHelperThread::IonCompile>;
 template class CheckZone<AllowedHelperThread::GCTaskOrIonCompile>;
 
--- a/js/src/util/NativeStack.cpp
+++ b/js/src/util/NativeStack.cpp
@@ -8,20 +8,34 @@
 
 #ifdef XP_WIN
 # include "util/Windows.h"
 #elif defined(XP_DARWIN) || defined(DARWIN) || defined(XP_UNIX)
 # include <pthread.h>
 # if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
 #  include <pthread_np.h>
 # endif
+# if defined(SOLARIS) || defined(AIX)
+#  include <ucontext.h>
+# endif
 # if defined(ANDROID) && !defined(__aarch64__)
 #  include <sys/types.h>
 #  include <unistd.h>
 # endif
+# if defined(XP_LINUX) && !defined(ANDROID) && defined(__GLIBC__)
+#  include <dlfcn.h>
+#  include <sys/syscall.h>
+#  include <sys/types.h>
+#  include <unistd.h>
+static pid_t
+gettid()
+{
+    return syscall(__NR_gettid);
+}
+# endif
 #else
 # error "Unsupported platform"
 #endif
 
 #include "jsfriendapi.h"
 
 #if defined(XP_WIN)
 
@@ -29,43 +43,85 @@ void*
 js::GetNativeStackBaseImpl()
 {
     PNT_TIB pTib = reinterpret_cast<PNT_TIB>(NtCurrentTeb());
     return static_cast<void*>(pTib->StackBase);
 }
 
 #elif defined(SOLARIS)
 
-#include <ucontext.h>
-
 JS_STATIC_ASSERT(JS_STACK_GROWTH_DIRECTION < 0);
 
 void*
 js::GetNativeStackBaseImpl()
 {
     stack_t st;
     stack_getbounds(&st);
     return static_cast<char*>(st.ss_sp) + st.ss_size;
 }
 
 #elif defined(AIX)
 
-#include <ucontext.h>
-
 JS_STATIC_ASSERT(JS_STACK_GROWTH_DIRECTION < 0);
 
 void*
 js::GetNativeStackBaseImpl()
 {
     ucontext_t context;
     getcontext(&context);
     return static_cast<char*>(context.uc_stack.ss_sp) +
         context.uc_stack.ss_size;
 }
 
+#elif defined(XP_LINUX) && !defined(ANDROID) && defined(__GLIBC__)
+void*
+js::GetNativeStackBaseImpl()
+{
+
+    // On the main thread, get stack base from glibc's __libc_stack_end rather than pthread APIs
+    // to avoid filesystem calls /proc/self/maps.  Non-main threads spawned with pthreads can read
+    // this information directly from their pthread struct, but the main thread must go parse
+    // /proc/self/maps to figure the mapped stack address space ranges.  We want to avoid reading
+    // from /proc/ so that firefox can run in sandboxed environments where /proc may not be mounted
+    if (gettid() == getpid()) {
+        void** pLibcStackEnd = (void**)dlsym(RTLD_DEFAULT, "__libc_stack_end");
+
+        // If __libc_stack_end is not found, architecture specific frame pointer hopping will need
+        // to be implemented.
+        MOZ_RELEASE_ASSERT(pLibcStackEnd, "__libc_stack_end unavailable, unable to setup stack range for JS");
+        void* stackBase = *pLibcStackEnd;
+        MOZ_RELEASE_ASSERT(stackBase, "invalid stack base, unable to setup stack range for JS");
+
+        // We don't need to fix stackBase, as it already roughly points to beginning of the stack
+        return stackBase;
+    }
+
+    // Non-main threads have the required info stored in memory, so no filesystem calls are made.
+    pthread_t thread = pthread_self();
+    pthread_attr_t sattr;
+    pthread_attr_init(&sattr);
+    pthread_getattr_np(thread, &sattr);
+
+    // stackBase will be the *lowest* address on all architectures.
+    void* stackBase = nullptr;
+    size_t stackSize = 0;
+    int rc = pthread_attr_getstack(&sattr, &stackBase, &stackSize);
+    if (rc) {
+        MOZ_CRASH("call to pthread_attr_getstack failed, unable to setup stack range for JS");
+    }
+    MOZ_RELEASE_ASSERT(stackBase, "invalid stack base, unable to setup stack range for JS");
+    pthread_attr_destroy(&sattr);
+
+# if JS_STACK_GROWTH_DIRECTION > 0
+    return stackBase;
+# else
+    return static_cast<char*>(stackBase) + stackSize;
+# endif
+}
+
 #else /* XP_UNIX */
 
 void*
 js::GetNativeStackBaseImpl()
 {
     pthread_t thread = pthread_self();
 # if defined(XP_DARWIN) || defined(DARWIN)
     return pthread_get_stackaddr_np(thread);
--- a/js/src/vm/BytecodeUtil.cpp
+++ b/js/src/vm/BytecodeUtil.cpp
@@ -2891,16 +2891,17 @@ static bool
 GenerateLcovInfo(JSContext* cx, JS::Realm* realm, GenericPrinter& out)
 {
     JSRuntime* rt = cx->runtime();
 
     // Collect the list of scripts which are part of the current realm.
     {
         js::gc::AutoPrepareForTracing apft(cx);
     }
+
     Rooted<ScriptVector> topScripts(cx, ScriptVector(cx));
     for (ZonesIter zone(rt, SkipAtoms); !zone.done(); zone.next()) {
         for (auto script = zone->cellIter<JSScript>(); !script.done(); script.next()) {
             if (script->realm() != realm ||
                 !script->isTopLevel() ||
                 !script->filename())
             {
                 continue;
--- a/js/src/vm/HelperThreads.cpp
+++ b/js/src/vm/HelperThreads.cpp
@@ -2094,19 +2094,22 @@ void
 HelperThread::handleParseWorkload(AutoLockHelperThreadState& locked)
 {
     MOZ_ASSERT(HelperThreadState().canStartParseTask(locked));
     MOZ_ASSERT(idle());
 
     currentTask.emplace(HelperThreadState().parseWorklist(locked).popCopy());
     ParseTask* task = parseTask();
 
+    JSRuntime* runtime = task->parseGlobal->runtimeFromAnyThread();
+    runtime->incOffThreadParsesRunning();
+
     {
         AutoUnlockHelperThreadState unlock(locked);
-        AutoSetContextRuntime ascr(task->parseGlobal->runtimeFromAnyThread());
+        AutoSetContextRuntime ascr(runtime);
 
         JSContext* cx = TlsContext.get();
 
         Zone* zone = task->parseGlobal->zoneFromAnyThread();
         zone->setHelperThreadOwnerContext(cx);
         auto resetOwnerContext = mozilla::MakeScopeExit([&] {
             zone->setHelperThreadOwnerContext(nullptr);
         });
@@ -2120,16 +2123,18 @@ HelperThread::handleParseWorkload(AutoLo
 
     // The callback is invoked while we are still off thread.
     task->callback(task, task->callbackData);
 
     // FinishOffThreadScript will need to be called on the script to
     // migrate it into the correct compartment.
     HelperThreadState().parseFinishedList(locked).insertBack(task);
 
+    runtime->decOffThreadParsesRunning();
+
     currentTask.reset();
 
     // Notify the main thread in case it is waiting for the parse/emit to finish.
     HelperThreadState().notifyAll(GlobalHelperThreadState::CONSUMER, locked);
 }
 
 void
 HelperThread::handleCompressionWorkload(AutoLockHelperThreadState& locked)
@@ -2262,17 +2267,17 @@ js::StartOffThreadPromiseHelperTask(Prom
     if (!HelperThreadState().promiseHelperTasks(lock).append(task))
         return false;
 
     HelperThreadState().notifyOne(GlobalHelperThreadState::PRODUCER, lock);
     return true;
 }
 
 void
-GlobalHelperThreadState::trace(JSTracer* trc, gc::AutoTraceSession& session)
+GlobalHelperThreadState::trace(JSTracer* trc)
 {
     AutoLockHelperThreadState lock;
     for (auto builder : ionWorklist(lock))
         builder->trace(trc);
     for (auto builder : ionFinishedList(lock))
         builder->trace(trc);
 
     if (HelperThreadState().threads) {
--- a/js/src/vm/HelperThreads.h
+++ b/js/src/vm/HelperThreads.h
@@ -306,17 +306,17 @@ class GlobalHelperThreadState
 
     bool finishParseTask(JSContext* cx, ParseTaskKind kind, JS::OffThreadToken* token, MutableHandle<ScriptVector> scripts);
 
     void cancelParseTask(JSRuntime* rt, ParseTaskKind kind, JS::OffThreadToken* token);
     void destroyParseTask(JSRuntime* rt, ParseTask* parseTask);
 
     void mergeParseTaskRealm(JSContext* cx, ParseTask* parseTask, JS::Realm* dest);
 
-    void trace(JSTracer* trc, js::gc::AutoTraceSession& session);
+    void trace(JSTracer* trc);
 
     JSScript* finishScriptParseTask(JSContext* cx, JS::OffThreadToken* token);
     JSScript* finishScriptDecodeTask(JSContext* cx, JS::OffThreadToken* token);
     bool finishMultiScriptsDecodeTask(JSContext* cx, JS::OffThreadToken* token, MutableHandle<ScriptVector> scripts);
     JSObject* finishModuleParseTask(JSContext* cx, JS::OffThreadToken* token);
 
 #if defined(JS_BUILD_BINAST)
     JSScript* finishBinASTDecodeTask(JSContext* cx, JS::OffThreadToken* token);
--- a/js/src/vm/JSAtom.cpp
+++ b/js/src/vm/JSAtom.cpp
@@ -250,24 +250,24 @@ TracePinnedAtoms(JSTracer* trc, const At
             JSAtom* atom = entry.asPtrUnbarriered();
             TraceRoot(trc, &atom, "interned_atom");
             MOZ_ASSERT(entry.asPtrUnbarriered() == atom);
         }
     }
 }
 
 void
-js::TraceAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock)
+js::TraceAtoms(JSTracer* trc, const AutoAccessAtomsZone& access)
 {
     JSRuntime* rt = trc->runtime();
 
     if (rt->atomsAreFinished())
         return;
 
-    TracePinnedAtoms(trc, rt->atoms(lock));
+    TracePinnedAtoms(trc, rt->atoms(access));
     if (rt->atomsAddedWhileSweeping())
         TracePinnedAtoms(trc, *rt->atomsAddedWhileSweeping());
 }
 
 void
 js::TracePermanentAtoms(JSTracer* trc)
 {
     JSRuntime* rt = trc->runtime();
--- a/js/src/vm/JSAtom.h
+++ b/js/src/vm/JSAtom.h
@@ -34,23 +34,23 @@ JS_FOR_EACH_PROTOTYPE(DECLARE_PROTO_STR)
 #undef DECLARE_PROTO_STR
 
 #define DECLARE_CONST_CHAR_STR(idpart, id, text)  extern const char js_##idpart##_str[];
 FOR_EACH_COMMON_PROPERTYNAME(DECLARE_CONST_CHAR_STR)
 #undef DECLARE_CONST_CHAR_STR
 
 namespace js {
 
-class AutoLockForExclusiveAccess;
+class AutoAccessAtomsZone;
 
 /*
  * Atom tracing and garbage collection hooks.
  */
 void
-TraceAtoms(JSTracer* trc, AutoLockForExclusiveAccess& lock);
+TraceAtoms(JSTracer* trc, const AutoAccessAtomsZone& atomsAccess);
 
 void
 TracePermanentAtoms(JSTracer* trc);
 
 void
 TraceWellKnownSymbols(JSTracer* trc);
 
 /* N.B. must correspond to boolean tagging behavior. */
--- a/js/src/vm/JSContext.h
+++ b/js/src/vm/JSContext.h
@@ -29,16 +29,17 @@ class AutoAtomsZone;
 class AutoRealm;
 
 namespace jit {
 class JitContext;
 class DebugModeOSRVolatileJitFrameIter;
 } // namespace jit
 
 namespace gc {
+class AutoCheckCanAccessAtomsDuringGC;
 class AutoSuppressNurseryCellAlloc;
 }
 
 typedef HashSet<Shape*> ShapeSet;
 
 /* Detects cycles when traversing an object graph. */
 class MOZ_RAII AutoCycleDetector
 {
@@ -259,24 +260,24 @@ struct JSContext : public JS::RootingCon
     // Zone local methods that can be used freely.
     inline js::LifoAlloc& typeLifoAlloc();
 
     // Current global. This is only safe to use within the scope of the
     // AutoRealm from which it's called.
     inline js::Handle<js::GlobalObject*> global() const;
 
     // Methods to access runtime data that must be protected by locks.
-    js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->atoms(lock);
+    js::AtomSet& atoms(const js::AutoAccessAtomsZone& access) {
+        return runtime_->atoms(access);
     }
-    const JS::Zone* atomsZone(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->atomsZone(lock);
+    const JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) {
+        return runtime_->atomsZone(access);
     }
-    js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) {
-        return runtime_->symbolRegistry(lock);
+    js::SymbolRegistry& symbolRegistry(const js::AutoAccessAtomsZone& access) {
+        return runtime_->symbolRegistry(access);
     }
     js::ScriptDataTable& scriptDataTable(js::AutoLockScriptData& lock) {
         return runtime_->scriptDataTable(lock);
     }
 
     // Methods to access other runtime data that checks locking internally.
     js::gc::AtomMarkingRuntime& atomMarking() {
         return runtime_->gc.atomMarking;
@@ -535,16 +536,18 @@ struct JSContext : public JS::RootingCon
     // Count of AutoDisableGenerationalGC instances on the thread's stack.
     js::ThreadData<unsigned> generationalDisabled;
 
     // Some code cannot tolerate compacting GC so it can be disabled temporarily
     // with AutoDisableCompactingGC which uses this counter.
     js::ThreadData<unsigned> compactingDisabledCount;
 
     bool canCollectAtoms() const {
+        // TODO: We may be able to improve this by collecting if
+        // !isOffThreadParseRunning() (bug 1468422).
         return !runtime()->hasHelperThreadZones();
     }
 
   private:
     // Pools used for recycling name maps and vectors when parsing and
     // emitting bytecode. Purged on GC when there are no active script
     // compilations.
     js::ThreadData<js::frontend::NameCollectionPool> frontendCollectionPool_;
@@ -1165,16 +1168,32 @@ class MOZ_RAII AutoLockScriptData
             runtime->activeThreadHasScriptDataAccess = false;
 #endif
         }
     }
 
     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 };
 
+// A token used to prove you can safely access the atoms zone. This zone is
+// accessed by the main thread and by off-thread parsing. There are two
+// situations in which it is safe:
+//
+//  - the current thread holds the exclusive access lock (off-thread parsing may
+//    be running and this must also take the lock for access)
+//
+//  - the GC is running and is collecting the atoms zone (this cannot be started
+//    while off-thread parsing is happening)
+class MOZ_STACK_CLASS AutoAccessAtomsZone
+{
+  public:
+    MOZ_IMPLICIT AutoAccessAtomsZone(const AutoLockForExclusiveAccess& lock) {}
+    MOZ_IMPLICIT AutoAccessAtomsZone(const gc::AutoCheckCanAccessAtomsDuringGC& canAccess) {}
+};
+
 class MOZ_RAII AutoKeepAtoms
 {
     JSContext* cx;
     MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER
 
   public:
     explicit inline AutoKeepAtoms(JSContext* cx
                            MOZ_GUARD_OBJECT_NOTIFIER_PARAM);
--- a/js/src/vm/Runtime.cpp
+++ b/js/src/vm/Runtime.cpp
@@ -161,16 +161,20 @@ JSRuntime::JSRuntime(JSRuntime* parentRu
     commonNames(nullptr),
     permanentAtoms(nullptr),
     wellKnownSymbols(nullptr),
     jitSupportsFloatingPoint(false),
     jitSupportsUnalignedAccesses(false),
     jitSupportsSimd(false),
     offthreadIonCompilationEnabled_(true),
     parallelParsingEnabled_(true),
+#ifdef DEBUG
+    offThreadParsesRunning_(0),
+    offThreadParsingBlocked_(false),
+#endif
     autoWritableJitCodeActive_(false),
     oomCallback(nullptr),
     debuggerMallocSizeOf(ReturnZeroSize),
     lastAnimationTime(0),
     performanceMonitoring_(),
     stackFormat_(parentRuntime ? js::StackFormat::Default
                                : js::StackFormat::SpiderMonkey),
     wasmInstances(mutexid::WasmRuntimeInstances),
@@ -803,16 +807,17 @@ JSRuntime::destroyAtomsAddedWhileSweepin
     atomsAddedWhileSweeping_ = nullptr;
 }
 
 void
 JSRuntime::setUsedByHelperThread(Zone* zone)
 {
     MOZ_ASSERT(!zone->usedByHelperThread());
     MOZ_ASSERT(!zone->wasGCStarted());
+    MOZ_ASSERT(!isOffThreadParsingBlocked());
     zone->setUsedByHelperThread();
     numActiveHelperThreadZones++;
 }
 
 void
 JSRuntime::clearUsedByHelperThread(Zone* zone)
 {
     MOZ_ASSERT(zone->usedByHelperThread());
--- a/js/src/vm/Runtime.h
+++ b/js/src/vm/Runtime.h
@@ -56,16 +56,20 @@ namespace js {
 
 class AutoAssertNoContentJS;
 class AutoKeepAtoms;
 class EnterDebuggeeNoExecute;
 #ifdef JS_TRACE_LOGGING
 class TraceLoggerThread;
 #endif
 
+namespace gc {
+class AutoHeapSession;
+}
+
 } // namespace js
 
 struct DtoaState;
 
 #ifdef JS_SIMULATOR_ARM64
 namespace vixl {
 class Simulator;
 }
@@ -697,69 +701,69 @@ struct JSRuntime : public js::MallocProv
         return allowContentJS_;
     }
 
     friend class js::AutoAssertNoContentJS;
 
   private:
     // Set of all atoms other than those in permanentAtoms and staticStrings.
     // Reading or writing this set requires the calling thread to use
-    // AutoLockForExclusiveAccess.
+    // AutoAccessAtomsZone.
     js::ExclusiveAccessLockOrGCTaskData<js::AtomSet*> atoms_;
 
     // Set of all atoms added while the main atoms table is being swept.
-    js::ExclusiveAccessLockData<js::AtomSet*> atomsAddedWhileSweeping_;
+    js::ExclusiveAccessLockOrGCTaskData<js::AtomSet*> atomsAddedWhileSweeping_;
 
     // Set of all live symbols produced by Symbol.for(). All such symbols are
-    // allocated in the atomsZone. Reading or writing the symbol registry
-    // requires the calling thread to use AutoLockForExclusiveAccess.
+    // allocated in the atoms zone. Reading or writing the symbol registry
+    // requires the calling thread to use AutoAccessAtomsZone.
     js::ExclusiveAccessLockOrGCTaskData<js::SymbolRegistry> symbolRegistry_;
 
   public:
     bool initializeAtoms(JSContext* cx);
     void finishAtoms();
     bool atomsAreFinished() const { return !atoms_; }
 
     js::AtomSet* atomsForSweeping() {
         MOZ_ASSERT(JS::RuntimeHeapIsCollecting());
         return atoms_;
     }
 
-    js::AtomSet& atoms(js::AutoLockForExclusiveAccess& lock) {
+    js::AtomSet& atoms(const js::AutoAccessAtomsZone& access) {
         MOZ_ASSERT(atoms_);
         return *atoms_;
     }
     js::AtomSet& unsafeAtoms() {
         MOZ_ASSERT(atoms_);
         return *atoms_;
     }
 
     bool createAtomsAddedWhileSweepingTable();
     void destroyAtomsAddedWhileSweepingTable();
     js::AtomSet* atomsAddedWhileSweeping() {
         return atomsAddedWhileSweeping_;
     }
 
-    const JS::Zone* atomsZone(const js::AutoLockForExclusiveAccess& lock) const {
+    const JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) const {
         return gc.atomsZone;
     }
-    JS::Zone* atomsZone(const js::AutoLockForExclusiveAccess& lock) {
+    JS::Zone* atomsZone(const js::AutoAccessAtomsZone& access) {
         return gc.atomsZone;
     }
     JS::Zone* unsafeAtomsZone() {
         return gc.atomsZone;
     }
 
     bool isAtomsZone(const JS::Zone* zone) const {
         return zone == gc.atomsZone;
     }
 
     bool activeGCInAtomsZone();
 
-    js::SymbolRegistry& symbolRegistry(js::AutoLockForExclusiveAccess& lock) {
+    js::SymbolRegistry& symbolRegistry(const js::AutoAccessAtomsZone& access) {
         return symbolRegistry_.ref();
     }
     js::SymbolRegistry& unsafeSymbolRegistry() {
         return symbolRegistry_.ref();
     }
 
     // Permanent atoms are fixed during initialization of the runtime and are
     // not modified or collected until the runtime is destroyed. These may be
@@ -852,16 +856,21 @@ struct JSRuntime : public js::MallocProv
 
     void addSizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf, JS::RuntimeSizes* rtSizes);
 
   private:
     // Settings for how helper threads can be used.
     mozilla::Atomic<bool> offthreadIonCompilationEnabled_;
     mozilla::Atomic<bool> parallelParsingEnabled_;
 
+#ifdef DEBUG
+    mozilla::Atomic<uint32_t> offThreadParsesRunning_;
+    mozilla::Atomic<bool> offThreadParsingBlocked_;
+#endif
+
     js::MainThreadData<bool> autoWritableJitCodeActive_;
 
   public:
 
     // Note: these values may be toggled dynamically (in response to about:config
     // prefs changing).
     void setOffthreadIonCompilationEnabled(bool value) {
         offthreadIonCompilationEnabled_ = value;
@@ -871,16 +880,48 @@ struct JSRuntime : public js::MallocProv
     }
     void setParallelParsingEnabled(bool value) {
         parallelParsingEnabled_ = value;
     }
     bool canUseParallelParsing() const {
         return parallelParsingEnabled_;
     }
 
+#ifdef DEBUG
+
+    bool isOffThreadParseRunning() const {
+        return offThreadParsesRunning_;
+    }
+
+    void incOffThreadParsesRunning() {
+        MOZ_ASSERT(!isOffThreadParsingBlocked());
+        offThreadParsesRunning_++;
+    }
+
+    void decOffThreadParsesRunning() {
+        MOZ_ASSERT(isOffThreadParseRunning());
+        offThreadParsesRunning_--;
+    }
+
+    bool isOffThreadParsingBlocked() const {
+        return offThreadParsingBlocked_;
+    }
+    void setOffThreadParsingBlocked(bool blocked) {
+        MOZ_ASSERT(offThreadParsingBlocked_ != blocked);
+        MOZ_ASSERT(!isOffThreadParseRunning());
+        offThreadParsingBlocked_ = blocked;
+    }
+
+#else
+
+    void incOffThreadParsesRunning() {}
+    void decOffThreadParsesRunning() {}
+
+#endif
+
     void toggleAutoWritableJitCodeActive(bool b) {
         MOZ_ASSERT(autoWritableJitCodeActive_ != b, "AutoWritableJitCode should not be nested.");
         autoWritableJitCodeActive_ = b;
     }
 
     /* See comment for JS::SetOutOfMemoryCallback in jsapi.h. */
     js::MainThreadData<JS::OutOfMemoryCallback> oomCallback;
     js::MainThreadData<void*> oomCallbackData;
@@ -916,17 +957,17 @@ struct JSRuntime : public js::MallocProv
     }
     void setStackFormat(js::StackFormat format) {
         MOZ_ASSERT(!parentRuntime);
         MOZ_ASSERT(format != js::StackFormat::Default);
         stackFormat_ = format;
     }
 
     // For inherited heap state accessors.
-    friend class js::gc::AutoTraceSession;
+    friend class js::gc::AutoHeapSession;
     friend class JS::AutoEnterCycleCollection;
 
   private:
     js::MainThreadData<js::RuntimeCaches> caches_;
   public:
     js::RuntimeCaches& caches() { return caches_.ref(); }
 
     // List of all the live wasm::Instances in the runtime. Equal to the union
--- a/js/src/vm/SymbolType.cpp
+++ b/js/src/vm/SymbolType.cpp
@@ -15,19 +15,19 @@
 
 #include "vm/Realm-inl.h"
 
 using JS::Symbol;
 using namespace js;
 
 Symbol*
 Symbol::newInternal(JSContext* cx, JS::SymbolCode code, uint32_t hash, JSAtom* description,
-                    AutoLockForExclusiveAccess& lock)
+                    const AutoAccessAtomsZone& access)
 {
-    MOZ_ASSERT(cx->zone() == cx->atomsZone(lock));
+    MOZ_ASSERT(cx->zone() == cx->atomsZone(access));
 
     // Following js::AtomizeString, we grudgingly forgo last-ditch GC here.
     Symbol* p = Allocate<JS::Symbol, NoGC>(cx);
     if (!p) {
         ReportOutOfMemory(cx);
         return nullptr;
     }
     return new (p) Symbol(code, hash, description);
--- a/js/src/vm/SymbolType.h
+++ b/js/src/vm/SymbolType.h
@@ -20,17 +20,17 @@
 #include "js/HeapAPI.h"
 #include "js/RootingAPI.h"
 #include "js/TypeDecls.h"
 #include "js/Utility.h"
 #include "vm/Printer.h"
 #include "vm/StringType.h"
 
 namespace js {
-class AutoLockForExclusiveAccess;
+class AutoAccessAtomsZone;
 } // namespace js
 
 namespace JS {
 
 class Symbol : public js::gc::TenuredCell
 {
   private:
     SymbolCode code_;
@@ -55,17 +55,17 @@ class Symbol : public js::gc::TenuredCel
                       "JS::shadow::Symbol::WellKnownAPILimit must match SymbolCode::WellKnownAPILimit");
     }
 
     Symbol(const Symbol&) = delete;
     void operator=(const Symbol&) = delete;
 
     static Symbol*
     newInternal(JSContext* cx, SymbolCode code, js::HashNumber hash,
-                JSAtom* description, js::AutoLockForExclusiveAccess& lock);
+                JSAtom* description, const js::AutoAccessAtomsZone& access);
 
   public:
     static Symbol* new_(JSContext* cx, SymbolCode code, JSString* description);
     static Symbol* for_(JSContext* cx, js::HandleString description);
 
     JSAtom* description() const { return description_; }
     SymbolCode code() const { return code_; }
     js::HashNumber hash() const { return hash_; }
--- a/layout/style/ServoBindingList.h
+++ b/layout/style/ServoBindingList.h
@@ -506,22 +506,16 @@ SERVO_BINDING_FUNC(Servo_AnimationValue_
                    RawServoAnimationValueBorrowed value)
 SERVO_BINDING_FUNC(Servo_AnimationValue_Compute,
                    RawServoAnimationValueStrong,
                    RawGeckoElementBorrowed element,
                    RawServoDeclarationBlockBorrowed declarations,
                    ComputedStyleBorrowed style,
                    RawServoStyleSetBorrowed raw_data)
 
-// There's no reason we couldn't expose more stuff here, but GetCssText is
-// pretty much all we'd ever want.
-SERVO_BINDING_FUNC(Servo_UnlockedDeclarationBlock_GetCssText, void,
-                   const RawServoUnlockedDeclarationBlock* declarations,
-                   nsAString* result)
-
 // Style attribute
 SERVO_BINDING_FUNC(Servo_ParseStyleAttribute, RawServoDeclarationBlockStrong,
                    const nsACString* data,
                    RawGeckoURLExtraData* extra_data,
                    nsCompatibility quirks_mode,
                    mozilla::css::Loader* loader)
 SERVO_BINDING_FUNC(Servo_DeclarationBlock_CreateEmpty,
                    RawServoDeclarationBlockStrong)
--- a/layout/style/ServoBindingTypes.h
+++ b/layout/style/ServoBindingTypes.h
@@ -78,29 +78,22 @@ typedef nsStyleAutoArray<mozilla::StyleA
 typedef nsTArray<nsFontFaceRuleContainer> RawGeckoFontFaceRuleList;
 typedef mozilla::AnimationPropertySegment RawGeckoAnimationPropertySegment;
 typedef mozilla::ComputedTiming RawGeckoComputedTiming;
 typedef nsTArray<const RawServoStyleRule*> RawGeckoServoStyleRuleList;
 typedef nsTArray<nsCSSPropertyID> RawGeckoCSSPropertyIDList;
 typedef mozilla::gfx::Float RawGeckoGfxMatrix4x4[16];
 typedef mozilla::dom::StyleChildrenIterator RawGeckoStyleChildrenIterator;
 
-// A struct which to be used as an opaque pointer to a DeclarationBlock that has
-// been read.
-//
-// This is effectively a *const PropertyDeclarationBlock in Rust.
-struct RawServoUnlockedDeclarationBlock;
-
 // A callback that can be sent via FFI which will be invoked _right before_
 // being mutated, and at most once.
 struct DeclarationBlockMutationClosure
 {
-  // The callback function, first argument is the unlocked servo declaration
-  // block, second is `data`.
-  void (*function)(const RawServoUnlockedDeclarationBlock*, void*) = nullptr;
+  // The callback function. The argument is `data`.
+  void (*function)(void*) = nullptr;
   void* data = nullptr;
 };
 
 // We have these helper types so that we can directly generate
 // things like &T or Borrowed<T> on the Rust side in the function, providing
 // additional safety benefits.
 //
 // FFI has a problem with templated types, so we just use raw pointers here.
--- a/layout/style/ServoBindings.toml
+++ b/layout/style/ServoBindings.toml
@@ -420,17 +420,16 @@ mapped-generic-types = [
     { generic = false, gecko = "ServoNodeData", servo = "AtomicRefCell<ElementData>" },
     { generic = false, gecko = "mozilla::ServoWritingMode", servo = "::logical_geometry::WritingMode" },
     { generic = false, gecko = "mozilla::ServoCustomPropertiesMap", servo = "Option<::servo_arc::Arc<::custom_properties::CustomPropertiesMap>>" },
     { generic = false, gecko = "mozilla::ServoRuleNode", servo = "Option<::rule_tree::StrongRuleNode>" },
     { generic = false, gecko = "mozilla::ServoVisitedStyle", servo = "Option<::servo_arc::RawOffsetArc<::properties::ComputedValues>>" },
     { generic = false, gecko = "mozilla::ServoComputedValueFlags", servo = "::properties::computed_value_flags::ComputedValueFlags" },
     { generic = true, gecko = "mozilla::ServoRawOffsetArc", servo = "::servo_arc::RawOffsetArc" },
     { generic = false, gecko = "ComputedStyleStrong", servo = "::gecko_bindings::sugar::ownership::Strong<::properties::ComputedValues>" },
-    { generic = false, gecko = "RawServoUnlockedDeclarationBlock", servo = "::properties::PropertyDeclarationBlock" },
 ]
 fixups = [
     { pat = "\\broot\\s*::\\s*nsString\\b", rep = "::nsstring::nsStringRepr" },
     { pat = "\\broot\\s*::\\s*nsTString\\s*<\\s*u16\\s*>", rep = "::nsstring::nsStringRepr" },
 ]
 
 [bindings]
 headers = ["mozilla/ServoBindings.h"]
@@ -464,17 +463,16 @@ structs-types = [
     "mozilla::FontStretch",
     "mozilla::FontSlantStyle",
     "mozilla::FontWeight",
     "mozilla::MallocSizeOf",
     "mozilla::OriginFlags",
     "mozilla::UniquePtr",
     "ServoRawOffsetArc",
     "DeclarationBlockMutationClosure",
-    "RawServoUnlockedDeclarationBlock",
     "nsIContent",
     "nsINode",
     "nsIDocument",
     "nsIDocument_DocumentTheme",
     "nsSimpleContentList",
     "MediumFeaturesChangedResult",
     "RawGeckoAnimationPropertySegment",
     "RawGeckoComputedTiming",
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -63,22 +63,23 @@ using namespace mozilla::dom;
 #endif
 
 /*
  * This is the implementation of the readonly CSSStyleDeclaration that is
  * returned by the getComputedStyle() function.
  */
 
 already_AddRefed<nsComputedDOMStyle>
-NS_NewComputedDOMStyle(dom::Element* aElement, const nsAString& aPseudoElt,
-                       nsIPresShell* aPresShell,
+NS_NewComputedDOMStyle(dom::Element* aElement,
+                       const nsAString& aPseudoElt,
+                       nsIDocument* aDocument,
                        nsComputedDOMStyle::StyleType aStyleType)
 {
   RefPtr<nsComputedDOMStyle> computedStyle =
-    new nsComputedDOMStyle(aElement, aPseudoElt, aPresShell, aStyleType);
+    new nsComputedDOMStyle(aElement, aPseudoElt, aDocument, aStyleType);
   return computedStyle.forget();
 }
 
 static nsDOMCSSValueList*
 GetROCSSValueList(bool aCommaDelimited)
 {
   return new nsDOMCSSValueList(aCommaDelimited, true);
 }
@@ -112,17 +113,17 @@ DocumentNeedsRestyle(
   nsIPresShell* shell = aDocument->GetShell();
   if (!shell) {
     return true;
   }
 
   nsPresContext* presContext = shell->GetPresContext();
   MOZ_ASSERT(presContext);
 
-  // Unfortunately we don't know if the sheet change affects mContent or not, so
+  // Unfortunately we don't know if the sheet change affects mElement or not, so
   // just assume it will and that we need to flush normally.
   ServoStyleSet* styleSet = shell->StyleSet();
   if (styleSet->StyleSheetsHaveChanged()) {
     return true;
   }
 
   // Pending media query updates can definitely change style on the element. For
   // example, if you change the zoom factor and then call getComputedStyle, you
@@ -307,53 +308,54 @@ ComputedStyleMap::Update()
       mIndexMap[index++] = i;
     }
   }
   mExposedPropertyCount = index;
 }
 
 nsComputedDOMStyle::nsComputedDOMStyle(dom::Element* aElement,
                                        const nsAString& aPseudoElt,
-                                       nsIPresShell* aPresShell,
+                                       nsIDocument* aDocument,
                                        StyleType aStyleType)
   : mDocumentWeak(nullptr)
   , mOuterFrame(nullptr)
   , mInnerFrame(nullptr)
   , mPresShell(nullptr)
   , mStyleType(aStyleType)
   , mComputedStyleGeneration(0)
   , mExposeVisitedStyle(false)
   , mResolvedComputedStyle(false)
 #ifdef DEBUG
   , mFlushedPendingReflows(false)
 #endif
 {
-  MOZ_ASSERT(aElement && aPresShell);
-  MOZ_ASSERT(aPresShell->GetPresContext());
-
-  mDocumentWeak = do_GetWeakReference(aPresShell->GetDocument());
-  mContent = aElement;
+  MOZ_ASSERT(aElement);
+  MOZ_ASSERT(aDocument);
+  // TODO(emilio, bug 548397, https://github.com/w3c/csswg-drafts/issues/2403):
+  // Should use aElement->OwnerDoc() instead.
+  mDocumentWeak = do_GetWeakReference(aDocument);
+  mElement = aElement;
   mPseudo = nsCSSPseudoElements::GetPseudoAtom(aPseudoElt);
 }
 
 nsComputedDOMStyle::~nsComputedDOMStyle()
 {
   ClearComputedStyle();
 }
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(nsComputedDOMStyle)
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsComputedDOMStyle)
-  tmp->ClearComputedStyle();  // remove observer before clearing mContent
-  NS_IMPL_CYCLE_COLLECTION_UNLINK(mContent)
+  tmp->ClearComputedStyle();  // remove observer before clearing mElement
+  NS_IMPL_CYCLE_COLLECTION_UNLINK(mElement)
   NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsComputedDOMStyle)
-  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)
+  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElement)
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsComputedDOMStyle)
 
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsComputedDOMStyle)
   return tmp->HasKnownLiveWrapper();
 NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
 
@@ -407,24 +409,26 @@ nsComputedDOMStyle::SetCssText(const nsA
                                ErrorResult& aRv)
 {
   aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR);
 }
 
 uint32_t
 nsComputedDOMStyle::Length()
 {
-  uint32_t length = GetComputedStyleMap()->Length();
-
   // Make sure we have up to date style so that we can include custom
   // properties.
   UpdateCurrentStyleSources(false);
-  if (mComputedStyle) {
-    length += Servo_GetCustomPropertiesCount(mComputedStyle);
-  }
+  if (!mComputedStyle) {
+    return 0;
+  }
+
+  uint32_t length =
+    GetComputedStyleMap()->Length() +
+    Servo_GetCustomPropertiesCount(mComputedStyle);
 
   ClearCurrentStyleSources();
 
   return length;
 }
 
 css::Rule*
 nsComputedDOMStyle::GetParentRule()
@@ -447,17 +451,17 @@ nsComputedDOMStyle::GetPropertyValue(con
     if (!entry) {
       return NS_OK;
     }
   }
 
   const bool layoutFlushIsNeeded = entry && entry->IsLayoutFlushNeeded();
   UpdateCurrentStyleSources(layoutFlushIsNeeded);
   if (!mComputedStyle) {
-    return NS_ERROR_NOT_AVAILABLE;
+    return NS_OK;
   }
 
   auto cleanup = mozilla::MakeScopeExit([&] {
     ClearCurrentStyleSources();
   });
 
   if (!entry) {
     MOZ_ASSERT(nsCSSProps::IsCustomPropertyName(aPropertyName));
@@ -754,17 +758,16 @@ nsComputedDOMStyle::GetCSSImageURLs(cons
   if (prop == eCSSProperty_UNKNOWN) {
     aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR);
     return;
   }
 
   UpdateCurrentStyleSources(false);
 
   if (!mComputedStyle) {
-    aRv.Throw(NS_ERROR_NOT_AVAILABLE);
     return;
   }
 
   CollectImageURLsForProperty(prop, *mComputedStyle, aImageURLs);
   ClearCurrentStyleSources();
 }
 
 // nsDOMCSSDeclaration abstract methods which should never be called
@@ -795,28 +798,28 @@ nsComputedDOMStyle::GetParsingEnvironmen
   MOZ_CRASH("called nsComputedDOMStyle::GetParsingEnvironment");
 }
 
 void
 nsComputedDOMStyle::ClearComputedStyle()
 {
   if (mResolvedComputedStyle) {
     mResolvedComputedStyle = false;
-    mContent->RemoveMutationObserver(this);
+    mElement->RemoveMutationObserver(this);
   }
   mComputedStyle = nullptr;
 }
 
 void
 nsComputedDOMStyle::SetResolvedComputedStyle(RefPtr<ComputedStyle>&& aContext,
                                             uint64_t aGeneration)
 {
   if (!mResolvedComputedStyle) {
     mResolvedComputedStyle = true;
-    mContent->AddMutationObserver(this);
+    mElement->AddMutationObserver(this);
   }
   mComputedStyle = aContext;
   mComputedStyleGeneration = aGeneration;
 }
 
 void
 nsComputedDOMStyle::SetFrameComputedStyle(mozilla::ComputedStyle* aStyle,
                                          uint64_t aGeneration)
@@ -824,28 +827,28 @@ nsComputedDOMStyle::SetFrameComputedStyl
   ClearComputedStyle();
   mComputedStyle = aStyle;
   mComputedStyleGeneration = aGeneration;
 }
 
 bool
 nsComputedDOMStyle::NeedsToFlush(nsIDocument* aDocument) const
 {
-  // If mContent is not in the same document, we could do some checks to know if
+  // If mElement is not in the same document, we could do some checks to know if
   // there are some pending restyles can be ignored across documents (since we
   // will use the caller document's style), but it can be complicated and should
   // be an edge case, so we just don't bother to do the optimization in this
   // case.
   //
   // FIXME(emilio): This is likely to want GetComposedDoc() instead of
   // OwnerDoc().
-  if (aDocument != mContent->OwnerDoc()) {
+  if (aDocument != mElement->OwnerDoc()) {
     return true;
   }
-  if (DocumentNeedsRestyle(aDocument, mContent->AsElement(), mPseudo)) {
+  if (DocumentNeedsRestyle(aDocument, mElement, mPseudo)) {
     return true;
   }
   // If parent document is there, also needs to check if there is some change
   // that needs to flush this document (e.g. size change for iframe).
   while (nsIDocument* parentDocument = aDocument->GetParentDocument()) {
     Element* element = parentDocument->FindContentForSubDocument(aDocument);
     if (DocumentNeedsRestyle(parentDocument, element, nullptr)) {
       return true;
@@ -870,28 +873,28 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
   //  * https://github.com/w3c/csswg-drafts/issues/1964
   //  * https://github.com/w3c/csswg-drafts/issues/1548
 
   // If the property we are computing relies on layout, then we must flush.
   const bool needsToFlush = aNeedsLayoutFlush || NeedsToFlush(document);
   if (needsToFlush) {
     // Flush _before_ getting the presshell, since that could create a new
     // presshell.  Also note that we want to flush the style on the document
-    // we're computing style in, not on the document mContent is in -- the two
+    // we're computing style in, not on the document mElement is in -- the two
     // may be different.
     document->FlushPendingNotifications(
       aNeedsLayoutFlush ? FlushType::Layout : FlushType::Style);
   }
 
 #ifdef DEBUG
   mFlushedPendingReflows = aNeedsLayoutFlush;
 #endif
 
   nsCOMPtr<nsIPresShell> presShellForContent =
-    nsContentUtils::GetPresShellForContent(mContent);
+    nsContentUtils::GetPresShellForContent(mElement);
   if (presShellForContent && presShellForContent->GetDocument() != document) {
     presShellForContent->GetDocument()->FlushPendingNotifications(FlushType::Style);
     if (presShellForContent->IsDestroying()) {
       presShellForContent = nullptr;
     }
   }
 
   mPresShell = document->GetShell();
@@ -908,45 +911,45 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
   // undisplayed elements.
   // As for Gecko, GetUndisplayedRestyleGeneration is effectively equal to
   // GetRestyleGeneration, since the generation is incremented whenever we
   // process restyles.
   uint64_t currentGeneration =
     mPresShell->GetPresContext()->GetUndisplayedRestyleGeneration();
 
   if (mComputedStyle) {
-    // We can't rely on the undisplayed restyle generation if mContent is
+    // We can't rely on the undisplayed restyle generation if mElement is
     // out-of-document, since that generation is not incremented for DOM changes
     // on out-of-document elements.
     //
     // So we always need to update the style to ensure it it up-to-date.
-    if (mComputedStyleGeneration == currentGeneration
-        && mContent->IsInComposedDoc()) {
+    if (mComputedStyleGeneration == currentGeneration &&
+        mElement->IsInComposedDoc()) {
       // Our cached style is still valid.
       return;
     }
     // We've processed some restyles, so the cached style might be out of date.
     mComputedStyle = nullptr;
   }
 
-  // XXX the !mContent->IsHTMLElement(nsGkAtoms::area)
+  // XXX the !mElement->IsHTMLElement(nsGkAtoms::area)
   // check is needed due to bug 135040 (to avoid using
   // mPrimaryFrame). Remove it once that's fixed.
-  if (mStyleType == eAll && !mContent->IsHTMLElement(nsGkAtoms::area)) {
+  if (mStyleType == eAll && !mElement->IsHTMLElement(nsGkAtoms::area)) {
     mOuterFrame = nullptr;
 
     if (!mPseudo) {
-      mOuterFrame = mContent->GetPrimaryFrame();
+      mOuterFrame = mElement->GetPrimaryFrame();
     } else if (mPseudo == nsCSSPseudoElements::before ||
                mPseudo == nsCSSPseudoElements::after) {
       nsAtom* property = mPseudo == nsCSSPseudoElements::before
                             ? nsGkAtoms::beforePseudoProperty
                             : nsGkAtoms::afterPseudoProperty;
 
-      auto* pseudo = static_cast<Element*>(mContent->GetProperty(property));
+      auto* pseudo = static_cast<Element*>(mElement->GetProperty(property));
       mOuterFrame = pseudo ? pseudo->GetPrimaryFrame() : nullptr;
     }
 
     mInnerFrame = mOuterFrame;
     if (mOuterFrame) {
       LayoutFrameType type = mOuterFrame->Type();
       if (type == LayoutFrameType::TableWrapper) {
         // If the frame is a table wrapper frame then we should get the style
@@ -962,17 +965,17 @@ nsComputedDOMStyle::UpdateCurrentStyleSo
       NS_ASSERTION(mComputedStyle, "Frame without style?");
     }
   }
 
   if (!mComputedStyle || MustReresolveStyle(mComputedStyle)) {
     // Need to resolve a style.
     RefPtr<ComputedStyle> resolvedComputedStyle =
       DoGetComputedStyleNoFlush(
-          mContent->AsElement(),
+          mElement,
           mPseudo,
           presShellForContent ? presShellForContent.get() : mPresShell,
           mStyleType);
     if (!resolvedComputedStyle) {
       ClearComputedStyle();
       return;
     }
 
@@ -5690,17 +5693,17 @@ nsComputedDOMStyle::GetLineHeightCoord(n
       GetCBContentHeight(blockHeight);
     }
   }
 
   nsPresContext* presContext = mPresShell->GetPresContext();
 
   // lie about font size inflation since we lie about font size (since
   // the inflation only applies to text)
-  aCoord = ReflowInput::CalcLineHeight(mContent,
+  aCoord = ReflowInput::CalcLineHeight(mElement,
                                        mComputedStyle,
                                        presContext,
                                        blockHeight, 1.0f);
 
   // CalcLineHeight uses font->mFont.size, but we want to use
   // font->mSize as the font size.  Adjust for that.  Also adjust for
   // the text zoom, if any.
   const nsStyleFont* font = StyleFont();
@@ -7169,17 +7172,17 @@ static void
 MarkComputedStyleMapDirty(const char* aPref, void* aData)
 {
   static_cast<ComputedStyleMap*>(aData)->MarkDirty();
 }
 
 void
 nsComputedDOMStyle::ParentChainChanged(nsIContent* aContent)
 {
-  NS_ASSERTION(mContent == aContent, "didn't we register mContent?");
+  NS_ASSERTION(mElement == aContent, "didn't we register mElement?");
   NS_ASSERTION(mResolvedComputedStyle,
                "should have only registered an observer when "
                "mResolvedComputedStyle is true");
 
   ClearComputedStyle();
 }
 
 /* static */ ComputedStyleMap*
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -75,22 +75,22 @@ public:
 
   enum StyleType {
     eDefaultOnly, // Only includes UA and user sheets
     eAll // Includes all stylesheets
   };
 
   nsComputedDOMStyle(mozilla::dom::Element* aElement,
                      const nsAString& aPseudoElt,
-                     nsIPresShell* aPresShell,
+                     nsIDocument* aDocument,
                      StyleType aStyleType);
 
-  virtual nsINode *GetParentObject() override
+  nsINode* GetParentObject() override
   {
-    return mContent;
+    return mElement;
   }
 
   static already_AddRefed<mozilla::ComputedStyle>
   GetComputedStyle(mozilla::dom::Element* aElement, nsAtom* aPseudo,
                    StyleType aStyleType = eAll);
 
   static already_AddRefed<mozilla::ComputedStyle>
   GetComputedStyleNoFlush(mozilla::dom::Element* aElement,
@@ -713,19 +713,19 @@ private:
   // restyles does not affect mContent).
   bool NeedsToFlush(nsIDocument* aDocument) const;
 
 
   static ComputedStyleMap* GetComputedStyleMap();
 
   // We don't really have a good immutable representation of "presentation".
   // Given the way GetComputedStyle is currently used, we should just grab the
-  // 0th presshell, if any, from the document.
+  // presshell, if any, from the document.
   nsWeakPtr mDocumentWeak;
-  nsCOMPtr<nsIContent> mContent;
+  RefPtr<mozilla::dom::Element> mElement;
 
   /**
    * Strong reference to the ComputedStyle we access data from.  This can be
    * either a ComputedStyle we resolved ourselves or a ComputedStyle we got
    * from our frame.
    *
    * If we got the ComputedStyle from the frame, we clear out mComputedStyle
    * in ClearCurrentStyleSources.  If we resolved one ourselves, then
@@ -781,13 +781,13 @@ private:
 #ifdef DEBUG
   bool mFlushedPendingReflows;
 #endif
 };
 
 already_AddRefed<nsComputedDOMStyle>
 NS_NewComputedDOMStyle(mozilla::dom::Element* aElement,
                        const nsAString& aPseudoElt,
-                       nsIPresShell* aPresShell,
+                       nsIDocument* aDocument,
                        nsComputedDOMStyle::StyleType aStyleType =
                          nsComputedDOMStyle::eAll);
 
 #endif /* nsComputedDOMStyle_h__ */
--- a/mfbt/tests/TestPair.cpp
+++ b/mfbt/tests/TestPair.cpp
@@ -28,23 +28,37 @@ using mozilla::Pair;
                 "second method should work on Pair<" #T2 ", " #T1 ">"); \
   static_assert(sizeof(name##_2) == (size), \
                 "Pair<" #T2 ", " #T1 "> has an unexpected size");
 
 INSTANTIATE(int, int, prim1, 2 * sizeof(int));
 INSTANTIATE(int, long, prim2, 2 * sizeof(long));
 
 struct EmptyClass { explicit EmptyClass(int) {} };
-struct NonEmpty { char mC; explicit NonEmpty(int) {} };
+struct NonEmpty
+{
+  char mC;
+  explicit NonEmpty(int)
+    : mC('\0')
+  {
+  }
+};
 
 INSTANTIATE(int, EmptyClass, both1, sizeof(int));
 INSTANTIATE(int, NonEmpty, both2, 2 * sizeof(int));
 INSTANTIATE(EmptyClass, NonEmpty, both3, 1);
 
-struct A { char dummy; explicit A(int) {} };
+struct A
+{
+  char dummy;
+  explicit A(int)
+    : dummy('\0')
+  {
+  }
+};
 struct B : A { explicit B(int aI) : A(aI) {} };
 
 INSTANTIATE(A, A, class1, 2);
 INSTANTIATE(A, B, class2, 2);
 INSTANTIATE(A, EmptyClass, class3, 1);
 
 struct OtherEmpty : EmptyClass { explicit OtherEmpty(int aI) : EmptyClass(aI) {} };
 
--- a/security/certverifier/CertVerifier.h
+++ b/security/certverifier/CertVerifier.h
@@ -6,16 +6,17 @@
 
 #ifndef CertVerifier_h
 #define CertVerifier_h
 
 #include "BRNameMatchingPolicy.h"
 #include "CTPolicyEnforcer.h"
 #include "CTVerifyResult.h"
 #include "OCSPCache.h"
+#include "RootCertificateTelemetryUtils.h"
 #include "ScopedNSSTypes.h"
 #include "mozilla/Telemetry.h"
 #include "mozilla/TimeStamp.h"
 #include "mozilla/UniquePtr.h"
 #include "nsString.h"
 #include "pkix/pkixtypes.h"
 
 #if defined(_MSC_VER)
@@ -73,33 +74,43 @@ enum DistrustedCAPolicy : uint32_t {
 // update this to account for new entries in DistrustedCAPolicy.
 const uint32_t DistrustedCAPolicyMaxAllowedValueMask = 0b0011;
 
 enum class NetscapeStepUpPolicy : uint32_t;
 
 class PinningTelemetryInfo
 {
 public:
-  PinningTelemetryInfo() { Reset(); }
+  PinningTelemetryInfo()
+    : certPinningResultBucket(0)
+    , rootBucket(ROOT_CERTIFICATE_UNKNOWN)
+  {
+    Reset();
+  }
 
   // Should we accumulate pinning telemetry for the result?
   bool accumulateResult;
-  Telemetry::HistogramID certPinningResultHistogram;
+  Maybe<Telemetry::HistogramID> certPinningResultHistogram;
   int32_t certPinningResultBucket;
   // Should we accumulate telemetry for the root?
   bool accumulateForRoot;
   int32_t rootBucket;
 
   void Reset() { accumulateForRoot = false; accumulateResult = false; }
 };
 
 class CertificateTransparencyInfo
 {
 public:
-  CertificateTransparencyInfo() { Reset(); }
+  CertificateTransparencyInfo()
+    : enabled(false)
+    , policyCompliance(mozilla::ct::CTPolicyCompliance::Unknown)
+  {
+    Reset();
+  }
 
   // Was CT enabled?
   bool enabled;
   // Verification result of the processed SCTs.
   mozilla::ct::CTVerifyResult verifyResult;
   // Connection compliance to the CT Policy.
   mozilla::ct::CTPolicyCompliance policyCompliance;
 
--- a/security/manager/ssl/PublicKeyPinningService.cpp
+++ b/security/manager/ssl/PublicKeyPinningService.cpp
@@ -300,17 +300,17 @@ CheckPinsForHostname(const RefPtr<nsNSSC
           ? Telemetry::CERT_PINNING_MOZ_TEST_RESULTS_BY_HOST
           : Telemetry::CERT_PINNING_MOZ_RESULTS_BY_HOST;
         pinningTelemetryInfo->certPinningResultBucket = bucket;
       } else {
         pinningTelemetryInfo->certPinningResultBucket =
             enforceTestModeResult ? 1 : 0;
       }
       pinningTelemetryInfo->accumulateResult = true;
-      pinningTelemetryInfo->certPinningResultHistogram = histogram;
+      pinningTelemetryInfo->certPinningResultHistogram = Some(histogram);
     }
 
     // We only collect per-CA pinning statistics upon failures.
     nsCOMPtr<nsIX509Cert> rootCert;
     rv = certList->GetRootCertificate(rootCert);
     if (NS_FAILED(rv)) {
       return rv;
     }
--- a/security/manager/ssl/SSLServerCertVerification.cpp
+++ b/security/manager/ssl/SSLServerCertVerification.cpp
@@ -1426,17 +1426,18 @@ AuthCertificate(CertVerifier& certVerifi
   }
 
   if (pinningTelemetryInfo.accumulateForRoot) {
     Telemetry::Accumulate(Telemetry::CERT_PINNING_FAILURES_BY_CA,
                           pinningTelemetryInfo.rootBucket);
   }
 
   if (pinningTelemetryInfo.accumulateResult) {
-    Telemetry::Accumulate(pinningTelemetryInfo.certPinningResultHistogram,
+    MOZ_ASSERT(pinningTelemetryInfo.certPinningResultHistogram.isSome());
+    Telemetry::Accumulate(pinningTelemetryInfo.certPinningResultHistogram.value(),
                           pinningTelemetryInfo.certPinningResultBucket);
   }
 
   if (rv == Success) {
     // Certificate verification succeeded. Delete any potential record of
     // certificate error bits.
     RememberCertErrorsTable::GetInstance().RememberCertHasError(infoObject,
                                                                 nullptr,
--- a/security/manager/ssl/moz.build
+++ b/security/manager/ssl/moz.build
@@ -63,16 +63,17 @@ EXPORTS += [
     'nsClientAuthRemember.h',
     'nsNSSCallbacks.h',
     'nsNSSCertificate.h',
     'nsNSSComponent.h',
     'nsNSSHelper.h',
     'nsRandomGenerator.h',
     'nsSecurityHeaderParser.h',
     'NSSErrorsService.h',
+    'RootCertificateTelemetryUtils.h',
     'ScopedNSSTypes.h',
     'SharedCertVerifier.h',
 ]
 
 EXPORTS.mozilla += [
     'DataStorage.h',
     'DataStorageList.h',
     'PublicSSL.h',
--- a/security/pkix/lib/pkixbuild.cpp
+++ b/security/pkix/lib/pkixbuild.cpp
@@ -56,16 +56,17 @@ public:
     : trustDomain(aTrustDomain)
     , subject(aSubject)
     , time(aTime)
     , requiredEKUIfPresent(aRequiredEKUIfPresent)
     , requiredPolicy(aRequiredPolicy)
     , stapledOCSPResponse(aStapledOCSPResponse)
     , subCACount(aSubCACount)
     , deferredSubjectError(aDeferredSubjectError)
+    , subjectSignaturePublicKeyAlg(der::PublicKeyAlgorithm::Uninitialized)
     , result(Result::FATAL_ERROR_LIBRARY_FAILURE)
     , resultWasSet(false)
     , buildForwardCallBudget(aBuildForwardCallBudget)
   {
   }
 
   Result Check(Input potentialIssuerDER,
                /*optional*/ const Input* additionalNameConstraints,
--- a/security/pkix/lib/pkixcheck.cpp
+++ b/security/pkix/lib/pkixcheck.cpp
@@ -112,17 +112,21 @@ CheckSignatureAlgorithm(TrustDomain& tru
     }
 
     case der::PublicKeyAlgorithm::ECDSA:
       // In theory, we could implement a similar early-pruning optimization for
       // ECDSA curves. However, since there has been no similar deprecation for
       // for any curve that we support, the chances of us encountering a curve
       // during path building is too low to be worth bothering with.
       break;
-
+    case der::PublicKeyAlgorithm::Uninitialized:
+    {
+      assert(false);
+      return Result::FATAL_ERROR_LIBRARY_FAILURE;
+    }
     MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
   }
 
   return Success;
 }
 
 // 4.1.2.4 Issuer
 
--- a/security/pkix/lib/pkixder.h
+++ b/security/pkix/lib/pkixder.h
@@ -452,17 +452,17 @@ CertificateSerialNumber(Reader& input, /
   //   gracefully handle such certificates."
   return internal::IntegralBytes(
            input, INTEGER, internal::IntegralValueRestriction::NoRestriction,
            value);
 }
 
 // x.509 and OCSP both use this same version numbering scheme, though OCSP
 // only supports v1.
-enum class Version { v1 = 0, v2 = 1, v3 = 2, v4 = 3 };
+enum class Version { v1 = 0, v2 = 1, v3 = 2, v4 = 3, Uninitialized = 255 };
 
 // X.509 Certificate and OCSP ResponseData both use
 // "[0] EXPLICIT Version DEFAULT v1". Although an explicit encoding of v1 is
 // illegal, we support it because some real-world OCSP responses explicitly
 // encode it.
 Result OptionalVersion(Reader& input, /*out*/ Version& version);
 
 template <typename ExtensionHandler>
@@ -517,16 +517,17 @@ OptionalExtensions(Reader& input, uint8_
 
 Result DigestAlgorithmIdentifier(Reader& input,
                                  /*out*/ DigestAlgorithm& algorithm);
 
 enum class PublicKeyAlgorithm
 {
   RSA_PKCS1,
   ECDSA,
+  Uninitialized
 };
 
 Result SignatureAlgorithmIdentifierValue(
          Reader& input,
          /*out*/ PublicKeyAlgorithm& publicKeyAlgorithm,
          /*out*/ DigestAlgorithm& digestAlgorithm);
 
 struct SignedDataWithSignature final
--- a/security/pkix/lib/pkixutil.h
+++ b/security/pkix/lib/pkixutil.h
@@ -37,21 +37,23 @@ namespace mozilla { namespace pkix {
 //
 // Each BackCert contains pointers to all the given certificate's extensions
 // so that we can parse the extension block once and then process the
 // extensions in an order that may be different than they appear in the cert.
 class BackCert final
 {
 public:
   // certDER and childCert must be valid for the lifetime of BackCert.
-  BackCert(Input aCertDER, EndEntityOrCA aEndEntityOrCA,
+  BackCert(Input aCertDER,
+           EndEntityOrCA aEndEntityOrCA,
            const BackCert* aChildCert)
     : der(aCertDER)
     , endEntityOrCA(aEndEntityOrCA)
     , childCert(aChildCert)
+    , version(der::Version::Uninitialized)
   {
   }
 
   Result Init();
 
   const Input GetDER() const { return der; }
   const der::SignedDataWithSignature& GetSignedData() const {
     return signedData;
--- a/security/pkix/lib/pkixverify.cpp
+++ b/security/pkix/lib/pkixverify.cpp
@@ -74,16 +74,19 @@ VerifySignedDigest(TrustDomain& trustDom
 {
   switch (publicKeyAlg) {
     case der::PublicKeyAlgorithm::ECDSA:
       return trustDomain.VerifyECDSASignedDigest(signedDigest,
                                                  signerSubjectPublicKeyInfo);
     case der::PublicKeyAlgorithm::RSA_PKCS1:
       return trustDomain.VerifyRSAPKCS1SignedDigest(signedDigest,
                                                     signerSubjectPublicKeyInfo);
+    case der::PublicKeyAlgorithm::Uninitialized:
+      assert(false);
+      return Result::FATAL_ERROR_LIBRARY_FAILURE;
     MOZILLA_PKIX_UNREACHABLE_DEFAULT_ENUM
   }
 }
 
 Result
 VerifySignedData(TrustDomain& trustDomain,
                  const der::SignedDataWithSignature& signedData,
                  Input signerSubjectPublicKeyInfo)
--- a/servo/components/style/properties/declaration_block.rs
+++ b/servo/components/style/properties/declaration_block.rs
@@ -559,61 +559,81 @@ impl PropertyDeclarationBlock {
         if let Some(id) = longhand_id {
             self.longhands.insert(id);
         }
         self.declarations.push(declaration);
         self.declarations_importance.push(importance.important());
         true
     }
 
+    /// Returns the first declaration that would be removed by removing
+    /// `property`.
+    #[inline]
+    pub fn first_declaration_to_remove(
+        &self,
+        property: &PropertyId,
+    ) -> Option<usize> {
+        if let Some(id) = property.longhand_id() {
+            if !self.longhands.contains(id) {
+                return None;
+            }
+        }
+
+        self.declarations.iter().position(|declaration| {
+            declaration.id().is_or_is_longhand_of(property)
+        })
+    }
+
+    /// Removes a given declaration at a given index.
+    #[inline]
+    fn remove_declaration_at(&mut self, i: usize) {
+        {
+            let id = self.declarations[i].id();
+            if let PropertyDeclarationId::Longhand(id) = id {
+                self.longhands.remove(id);
+            }
+            self.declarations_importance.remove(i);
+        }
+        self.declarations.remove(i);
+    }
+
     /// <https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-removeproperty>
     ///
-    /// Returns whether any declaration was actually removed.
-    pub fn remove_property<C>(
+    /// `first_declaration` needs to be the result of
+    /// `first_declaration_to_remove`.
+    #[inline]
+    pub fn remove_property(
         &mut self,
         property: &PropertyId,
-        mut before_change_callback: C,
-    ) -> bool
-    where
-        C: FnMut(&Self),
-    {
-        let longhand_id = property.longhand_id();
-        if let Some(id) = longhand_id {
-            if !self.longhands.contains(id) {
-                return false
-            }
-        }
-        let mut removed_at_least_one = false;
-        let mut i = 0;
+        first_declaration: usize,
+    ) {
+        debug_assert_eq!(
+            Some(first_declaration),
+            self.first_declaration_to_remove(property)
+        );
+        debug_assert!(self.declarations[first_declaration].id().is_or_is_longhand_of(property));
+
+        self.remove_declaration_at(first_declaration);
+
+        let shorthand = match property.as_shorthand() {
+            Ok(s) => s,
+            Err(_longhand_or_custom) => return,
+        };
+
+        let mut i = first_declaration;
         let mut len = self.len();
         while i < len {
-            {
-                let id = self.declarations[i].id();
-                if !id.is_or_is_longhand_of(property) {
-                    i += 1;
-                    continue;
-                }
+            if !self.declarations[i].id().is_longhand_of(shorthand) {
+                i += 1;
+                continue;
+            }
 
-                if !removed_at_least_one {
-                    before_change_callback(&*self);
-                }
-                removed_at_least_one = true;
-                if let PropertyDeclarationId::Longhand(id) = id {
-                    self.longhands.remove(id);
-                }
-                self.declarations_importance.remove(i);
-            }
-            self.declarations.remove(i);
+            self.remove_declaration_at(i);
             len -= 1;
         }
-
-        if longhand_id.is_some() {
-            debug_assert!(removed_at_least_one);
-        }
-        removed_at_least_one
     }
 
     /// Take a declaration block known to contain a single property and serialize it.
     pub fn single_value_to_css(
         &self,
         property: &PropertyId,
         dest: &mut CssStringWriter,
         computed_values: Option<&ComputedValues>,
@@ -722,19 +742,17 @@ impl PropertyDeclarationBlock {
         for declaration in self.normal_declaration_iter() {
             if let PropertyDeclaration::Custom(ref declaration) = *declaration {
                 builder.cascade(&declaration.name, declaration.value.borrow());
             }
         }
 
         builder.build()
     }
-}
 
-impl PropertyDeclarationBlock {
     /// Like the method on ToCss, but without the type parameter to avoid
     /// accidentally monomorphizing this large function multiple times for
     /// different writers.
     ///
     /// https://drafts.csswg.org/cssom/#serialize-a-css-declaration-block
     pub fn to_css(&self, dest: &mut CssStringWriter) -> fmt::Result {
         use std::iter::Cloned;
         use std::slice;
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -162,24 +162,24 @@ use style::values::generics::rect::Rect;
 use style::values::specified;
 use style::values::specified::gecko::{IntersectionObserverRootMargin, PixelOrPercentage};
 use style::values::specified::source_size_list::SourceSizeList;
 use style_traits::{CssType, CssWriter, ParsingMode, StyleParseErrorKind, ToCss};
 use super::error_reporter::ErrorReporter;
 use super::stylesheet_loader::{AsyncStylesheetParser, StylesheetLoader};
 
 trait ClosureHelper {
-    fn invoke(&self, decls: &PropertyDeclarationBlock);
+    fn invoke(&self);
 }
 
 impl ClosureHelper for DeclarationBlockMutationClosure {
     #[inline]
-    fn invoke(&self, decls: &PropertyDeclarationBlock) {
+    fn invoke(&self) {
         if let Some(function) = self.function.as_ref() {
-            unsafe { function(decls, self.data) };
+            unsafe { function(self.data) };
         }
     }
 }
 
 /*
  * For Gecko->Servo function calls, we need to redeclare the same signature that was declared in
  * the C header in Gecko. In order to catch accidental mismatches, we run rust-bindgen against
  * those signatures as well, giving us a second declaration of all the Servo_* functions in this
@@ -1598,17 +1598,19 @@ pub extern "C" fn Servo_StyleSheet_GetSo
     let contents = StylesheetContents::as_arc(&sheet);
     let url_opt = contents.source_url.read();
     if let Some(ref url) = *url_opt {
         write!(unsafe { &mut *result }, "{}", url).unwrap();
     }
 }
 
 fn read_locked_arc<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R
-    where Locked<T>: HasArcFFI, F: FnOnce(&T) -> R
+where
+    Locked<T>: HasArcFFI,
+    F: FnOnce(&T) -> R,
 {
     let global_style_data = &*GLOBAL_STYLE_DATA;
     let guard = global_style_data.shared_lock.read();
     func(Locked::<T>::as_arc(&raw).read_with(&guard))
 }
 
 #[cfg(debug_assertions)]
 unsafe fn read_locked_arc_unchecked<T, R, F>(raw: &<Locked<T> as HasFFI>::FFIType, func: F) -> R
@@ -3407,25 +3409,16 @@ pub unsafe extern "C" fn Servo_Declarati
     result: *mut nsAString,
 ) {
     read_locked_arc(declarations, |decls: &PropertyDeclarationBlock| {
         decls.to_css(&mut *result).unwrap()
     })
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn Servo_UnlockedDeclarationBlock_GetCssText(
-    declarations: *const structs::RawServoUnlockedDeclarationBlock,
-    result: *mut nsAString,
-) {
-    (*declarations).to_css(&mut *result).unwrap()
-}
-
-
-#[no_mangle]
 pub extern "C" fn Servo_DeclarationBlock_SerializeOneValue(
     declarations: RawServoDeclarationBlockBorrowed,
     property_id: nsCSSPropertyID, buffer: *mut nsAString,
     computed_values: ComputedStyleBorrowedOrNull,
     custom_properties: RawServoDeclarationBlockBorrowedOrNull,
 ) {
     let property_id = get_property_id_from_nscsspropertyid!(property_id, ());
 
@@ -3562,19 +3555,20 @@ fn set_property(
         quirks_mode,
         &reporter,
     );
 
     if result.is_err() {
         return false;
     }
 
+    before_change_closure.invoke();
+
     let importance = if is_important { Importance::Important } else { Importance::Normal };
     write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
-        before_change_closure.invoke(&*decls);
         decls.extend(
             source_declarations.drain(),
             importance,
             DeclarationSource::CssOm
         )
     })
 }
 
@@ -3642,21 +3636,32 @@ pub unsafe extern "C" fn Servo_Declarati
     )
 }
 
 fn remove_property(
     declarations: RawServoDeclarationBlockBorrowed,
     property_id: PropertyId,
     before_change_closure: DeclarationBlockMutationClosure,
 ) -> bool {
+    let first_declaration =
+        read_locked_arc(declarations, |decls: &PropertyDeclarationBlock| {
+            decls.first_declaration_to_remove(&property_id)
+        });
+
+    let first_declaration = match first_declaration {
+        Some(i) => i,
+        None => return false,
+    };
+
+    before_change_closure.invoke();
     write_locked_arc(declarations, |decls: &mut PropertyDeclarationBlock| {
-        decls.remove_property(&property_id, |decls| {
-            before_change_closure.invoke(decls)
-        })
-    })
+        decls.remove_property(&property_id, first_declaration)
+    });
+
+    true
 }
 
 #[no_mangle]
 pub unsafe extern "C" fn Servo_DeclarationBlock_RemoveProperty(
     declarations: RawServoDeclarationBlockBorrowed,
     property: *const nsACString,
     before_change_closure: DeclarationBlockMutationClosure,
 ) -> bool {
--- a/taskcluster/ci/source-test/jsshell.yml
+++ b/taskcluster/ci/source-test/jsshell.yml
@@ -39,8 +39,20 @@ bench-sixspeed:
         symbol: js-bench(6speed)
     run:
         command: >
             cd $USE_ARTIFACT_PATH/build &&
             unzip -qo -d jsshell target.jsshell.zip &&
             export JSSHELL=$USE_ARTIFACT_PATH/build/jsshell/js &&
             cd $GECKO_PATH &&
             ./mach jsshell-bench --binary $JSSHELL --perfherder six-speed
+
+bench-asmjsapps:
+    description: asm.js Apps shell benchmark suite
+    treeherder:
+        symbol: js-bench(asm.js-apps)
+    run:
+        command: >
+            cd $USE_ARTIFACT_PATH/build &&
+            unzip -q -d jsshell target.jsshell.zip &&
+            export JSSHELL=$USE_ARTIFACT_PATH/build/jsshell/js &&
+            cd $GECKO_PATH &&
+            ./mach jsshell-bench --binary $JSSHELL --perfherder asmjs-apps
--- a/testing/jsshell/benchmark.py
+++ b/testing/jsshell/benchmark.py
@@ -194,19 +194,76 @@ class SixSpeed(Benchmark):
             for score, values in scores.items():
                 test_name = "{}-{}".format(self.name, score)
                 total = sum(values) / len(values)
                 self.suite['subtests'].append({'name': test_name, 'value': total})
                 bench_total += int(sum(values))
         self.suite['value'] = bench_total
 
 
+class AsmJSApps(Benchmark):
+    name = 'asmjsapps'
+    path = os.path.join('third_party', 'webkit', 'PerformanceTests', 'asmjs-apps')
+    units = 'ms'
+
+    @property
+    def command(self):
+        if not self.args:
+            self.args = []
+        full_args = ['bash', 'harness.sh', self.shell + " " + " ".join(self.args)]
+        return full_args
+
+    def reset(self):
+        super(AsmJSApps, self).reset()
+
+        # Scores are of the form:
+        # {<bench_name>: {<score_name>: [<values>]}}
+        self.scores = defaultdict(lambda: defaultdict(list))
+
+    def process_results(self, output):
+        total = 0.0
+        tests = []
+        for line in output.splitlines():
+            m = re.search("(.+) - (\d+(\.\d+)?)", line)
+            if not m:
+                continue
+            name = m.group(1)
+            score = m.group(2)
+            total += float(score)
+            tests.append({ 'name': name, 'time': score })
+        tests.append({ 'name': '__total__', 'time': total })
+        return tests
+
+    def process_line(self, output):
+        m = re.search("(.+) - (\d+(\.\d+)?)", output)
+        if not m:
+            return
+        subtest = m.group(1)
+        score = m.group(2)
+        if subtest not in self.scores[self.name]:
+            self.scores[self.name][subtest] = []
+        self.scores[self.name][subtest].append(int(score))
+
+
+    def collect_results(self):
+        bench_total = 0
+        # NOTE: for this benchmark we run the test once, so we have a single value array
+        for bench, scores in self.scores.items():
+            for score, values in scores.items():
+                test_name = "{}-{}".format(self.name, score)
+                total = sum(values) / len(values)
+                self.suite['subtests'].append({'name': test_name, 'value': total})
+                bench_total += int(sum(values))
+        self.suite['value'] = bench_total
+
+
 all_benchmarks = {
     'ares6': Ares6,
     'six-speed': SixSpeed,
+    'asmjs-apps': AsmJSApps,
 }
 
 
 def run(benchmark, binary=None, extra_args=None, perfherder=False):
     if not binary:
         try:
             binary = os.path.join(build.bindir, 'js' + build.substs['BIN_SUFFIX'])
         except BuildEnvironmentNotFoundException:
--- a/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
+++ b/testing/web-platform/meta/service-workers/service-worker/fetch-canvas-tainting-video-cache.https.html.ini
@@ -1,7 +1,10 @@
 [fetch-canvas-tainting-video-cache.https.html]
+  disabled:
+    if (os == "linux"): https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
+    if (os == "win") and (version == "6.1.7601") and (bits == 32): https://bugzilla.mozilla.org/show_bug.cgi?id=1464898
   [url "https://web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
   [url "https://www1.web-platform.test:8443/service-workers/service-worker/resources/fetch-access-control.py?VIDEO&cache=true&mode=cors&credentials=same-origin&url=https%3A%2F%2Fwww1.web-platform.test%3A8443%2Fservice-workers%2Fservice-worker%2Fresources%2Ffetch-access-control.py%3FVIDEO%26cache%3Dtrue%26ACAOrigin%3Dhttps%3A%2F%2Fweb-platform.test%3A8443" with crossOrigin "" should be NOT_TAINTED]
     expected: FAIL
 
--- a/testing/web-platform/tests/css/cssom/getComputedStyle-detached-subtree.html
+++ b/testing/web-platform/tests/css/cssom/getComputedStyle-detached-subtree.html
@@ -7,32 +7,36 @@
 <script src=/resources/testharnessreport.js></script>
 <div id="host">
   <div id="non-slotted">
     <div id="non-slotted-descendant"></div>
   </div>
 </div>
 <iframe srcdoc="<html></html>" style="display: none"></iframe>
 <script>
-function testNoComputedStyle(element, description) {
+function testNoComputedStyle(element, description, global) {
   test(function() {
     assert_true(!!element);
-    let style = getComputedStyle(element);
+    let style = (global ? global : window).getComputedStyle(element);
     assert_true(!!style);
     assert_true(style.length === 0);
     assert_equals(style.color, "");
   }, `getComputedStyle returns no style for ${description}`);
 }
 
 let detached = document.createElement('div');
 testNoComputedStyle(detached, "detached element");
 
 testNoComputedStyle(document.querySelector('iframe').contentDocument.documentElement,
                     "element in non-rendered iframe (display: none)");
 
+testNoComputedStyle(document.querySelector('iframe').contentDocument.documentElement,
+                    "element in non-rendered iframe (display: none) from iframe's window",
+                    document.querySelector('iframe').contentWindow);
+
 host.attachShadow({ mode: "open" });
 testNoComputedStyle(document.getElementById('non-slotted'),
                     "element outside the flat tree");
 
 testNoComputedStyle(document.getElementById('non-slotted-descendant'),
                     "descendant outside the flat tree");
 
 let shadowRoot = detached.attachShadow({ mode: "open" });
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/README_MOZILLA
@@ -0,0 +1,9 @@
+This is intended to run in jsshell-bench.  We are migrating this from arewefastyet:
+https://github.com/mozilla/arewefastyet/tree/master/benchmarks/asmjs-apps
+
+There is no documentation on where this was pulled from, but it appears to be related to:
+https://github.com/kripken/Massive
+
+This benchmark has .js files which are 'minified' and to save space, we have removed the raw files
+which were stored in directories.  For example, box2d.js comes from the files in box2d/*.  We only
+have box2d.js in here.
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/VERSION
@@ -0,0 +1,1 @@
+0.20.2
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/box2d.js
@@ -0,0 +1,197 @@
+function e(a){throw a;}var i=void 0,l=!0,m=null,n=!1;function p(){return function(){}}var q;q||(q=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var ba={},s;for(s in q)q.hasOwnProperty(s)&&(ba[s]=q[s]);var u="object"===typeof process&&"function"===typeof require,ca="object"===typeof window,da="function"===typeof importScripts,ea=!ca&&!u&&!da;
+if(u){q.print||(q.print=function(a){process.stdout.write(a+"\n")});q.printErr||(q.printErr=function(a){process.stderr.write(a+"\n")});var fa=require("fs"),ga=require("path");q.read=function(a,b){var a=ga.normalize(a),c=fa.readFileSync(a);!c&&a!=ga.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=fa.readFileSync(a));c&&!b&&(c=c.toString());return c};q.readBinary=function(a){return q.read(a,l)};q.load=function(a){ha(read(a))};q.arguments=process.argv.slice(2);module.exports=q}else ea?(q.print||(q.print=
+print),"undefined"!=typeof printErr&&(q.printErr=printErr),q.read="undefined"!=typeof read?read:function(){e("no read() available (jsc?)")},q.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?q.arguments=scriptArgs:"undefined"!=typeof arguments&&(q.arguments=arguments),this.Module=q,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):ca||da?(q.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,n);b.send(m);return b.responseText},
+"undefined"!=typeof arguments&&(q.arguments=arguments),"undefined"!==typeof console?(q.print||(q.print=function(a){console.log(a)}),q.printErr||(q.printErr=function(a){console.log(a)})):q.print||(q.print=p()),ca?window.Module=q:q.load=importScripts):e("Unknown runtime environment. Where are we?");function ha(a){eval.call(m,a)}"undefined"==!q.load&&q.read&&(q.load=function(a){ha(q.read(a))});q.print||(q.print=p());q.printErr||(q.printErr=q.print);q.arguments||(q.arguments=[]);q.print=q.print;q.K=q.printErr;
+q.preRun=[];q.postRun=[];for(s in ba)ba.hasOwnProperty(s)&&(q[s]=ba[s]);
+var x={wc:function(a){ia=a},cc:function(){return ia},Wa:function(){return v},Va:function(a){v=a},Le:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},jc:function(a){return a in x.Qb||a in x.Ob},kc:function(a){return"*"==a[a.length-1]},lc:function(a){return isPointerType(a)?n:isArrayType(a)||/<?\{ ?[^}]* ?\}>?/.test(a)?l:"%"==a[0]},Qb:{i1:0,i8:0,i16:0,i32:0,i64:0},Ob:{"float":0,"double":0},
+bf:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},Ae:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},hf:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},La:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?x.Q:"i"===
+a[0]?(a=parseInt(a.substr(1)),z(0===a%8),a/8):0}},pb:function(a){return Math.max(x.La(a),x.Q)},Zb:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?n:c[a[b]]=l}):a.filter(function(a){return c[a]?n:c[a]=l})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},qe:8,Ka:function(a,b,c){return!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?x.pb(a):0),x.Q)},Vb:function(a){a.D=0;a.V=0;var b=[],c=-1,d=0;
+a.nb=a.Ha.map(function(f){d++;var g,h;x.jc(f)||x.kc(f)?(g=x.La(f),h=x.Ka(f,g)):x.lc(f)?"0"===f[1]?(g=0,h=Types.types[f]?x.Ka(m,Types.types[f].V):a.V||QUANTUM_SIZE):(g=Types.types[f].D,h=x.Ka(m,Types.types[f].V)):"b"==f[0]?(g=f.substr(1)|0,h=1):"<"===f[0]?g=h=Types.types[f].D:"i"===f[0]?(g=h=parseInt(f.substr(1))/8,z(0===g%1,"cannot handle non-byte-size field "+f)):z(n,"invalid type for calculateStructAlignment");a.cf&&(h=1);a.V=Math.max(a.V,h);f=x.U(a.D,h);a.D=f+g;0<=c&&b.push(f-c);return c=f});a.vb&&
+"["===a.vb[0]&&(a.D=parseInt(a.vb.substr(1))*a.D/2);a.D=x.U(a.D,a.V);0==b.length?a.mb=a.D:1==x.Zb(b).length&&(a.mb=b[0]);a.Ye=1!=a.mb;return a.nb},ac:function(a,b,c){var d,f;if(b){c=c||0;d=("undefined"===typeof Types?x.gf:Types.types)[b];if(!d)return m;if(d.Ha.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),m;f=d.nb}else d={Ha:a.map(function(a){return a[0]})},f=x.Vb(d);var g={se:d.D};b?a.forEach(function(a,
+b){if("string"===typeof a)g[a]=f[b]+c;else{var j,y;for(y in a)j=y;g[j]=x.ac(a[j],d.Ha[b],f[b])}}):a.forEach(function(a,b){g[a[1]]=f[b]});return g},ba:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),q["dynCall_"+a].apply(m,c)):q["dynCall_"+a].call(m,b)},pa:[],te:function(a){for(var b=0;b<x.pa.length;b++)if(!x.pa[b])return x.pa[b]=a,2*(1+b);e("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},ef:function(a){x.pa[(a-
+2)/2]=m},Me:function(a,b){x.Fa||(x.Fa={});var c=x.Fa[a];if(c)return c;for(var c=[],d=0;d<b;d++)c.push(String.fromCharCode(36)+d);d=B(a);'"'===d[0]&&(d.indexOf('"',1)===d.length-1?d=d.substr(1,d.length-2):E("invalid EM_ASM input |"+d+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));try{var f=eval("(function("+c.join(",")+"){ "+d+" })")}catch(g){q.K("error in executing inline EM_ASM code: "+g+" on: \n\n"+d+"\n\nwith args |"+c+"| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)"),
+e(g)}return x.Fa[a]=f},fa:function(a){x.fa.Ta||(x.fa.Ta={});x.fa.Ta[a]||(x.fa.Ta[a]=1,q.K(a))},Ja:{},Oe:function(a,b){z(b);x.Ja[a]||(x.Ja[a]=function(){return x.ba(b,a,arguments)});return x.Ja[a]},Ea:function(){var a=[],b=0;this.Pa=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],d=a[1],f=a[2],g=a[3];2==a.length?c=String.fromCharCode((c&31)<<6|d&63):3==a.length?c=String.fromCharCode((c&
+15)<<12|(d&63)<<6|f&63):(c=(c&7)<<18|(d&63)<<12|(f&63)<<6|g&63,c=String.fromCharCode(Math.floor((c-65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.rc=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],f=0;f<a.length;f++)b.push(a.charCodeAt(f));return b}},Ne:function(){e("You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work")},Ua:function(a){var b=v;v=v+a|0;v=v+7&-8;return b},Cb:function(a){var b=ja;
+ja=ja+a|0;ja=ja+7&-8;return b},ca:function(a){var b=G;G=G+a|0;G=G+7&-8;G>=ka&&E("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ka+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.");return b},U:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},nc:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|
+0)},Pb:8,Q:4,re:0};q.Runtime=x;var J=n,la,ma,ia;function z(a,b){a||E("Assertion failed: "+b)}q.ccall=function(a,b,c,d){return na(oa(a),b,c,d)};function oa(a){try{var b=q["_"+a];b||(b=eval("_"+a))}catch(c){}z(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}
+function na(a,b,c,d){function f(a,b){if("string"==b){if(a===m||a===i||0===a)return 0;a=K(a);b="array"}if("array"==b){g||(g=x.Wa());var c=x.Ua(a.length);pa(a,c);return c}return a}var g=0,h=0,d=d?d.map(function(a){return f(a,c[h++])}):[];a=a.apply(m,d);"string"==b?b=B(a):(z("array"!=b),b=a);g&&x.Va(g);return b}q.cwrap=function(a,b,c){var d=oa(a);return function(){return na(d,b,c,Array.prototype.slice.call(arguments))}};
+function qa(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":L[a>>0]=b;break;case "i8":L[a>>0]=b;break;case "i16":ra[a>>1]=b;break;case "i32":M[a>>2]=b;break;case "i64":ma=[b>>>0,(la=b,1<=+sa(la)?0<la?(ta(+ua(la/4294967296),4294967295)|0)>>>0:~~+va((la-+(~~la>>>0))/4294967296)>>>0:0)];M[a>>2]=ma[0];M[a+4>>2]=ma[1];break;case "float":wa[a>>2]=b;break;case "double":xa[a>>3]=b;break;default:E("invalid type for setValue: "+c)}}q.setValue=qa;
+q.getValue=function(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return L[a>>0];case "i8":return L[a>>0];case "i16":return ra[a>>1];case "i32":return M[a>>2];case "i64":return M[a>>2];case "float":return wa[a>>2];case "double":return xa[a>>3];default:E("invalid type for setValue: "+b)}return m};var ya=1,N=2,za=4;q.ALLOC_NORMAL=0;q.ALLOC_STACK=ya;q.ALLOC_STATIC=N;q.ALLOC_DYNAMIC=3;q.ALLOC_NONE=za;
+function O(a,b,c,d){var f,g;"number"===typeof a?(f=l,g=a):(f=n,g=a.length);var h="string"===typeof b?b:m,c=c==za?d:[Aa,x.Ua,x.Cb,x.ca][c===i?N:c](Math.max(g,h?1:b.length));if(f){d=c;z(0==(c&3));for(a=c+(g&-4);d<a;d+=4)M[d>>2]=0;for(a=c+g;d<a;)L[d++>>0]=0;return c}if("i8"===h)return a.subarray||a.slice?P.set(a,c):P.set(new Uint8Array(a),c),c;for(var d=0,k,j;d<g;){var y=a[d];"function"===typeof y&&(y=x.Pe(y));f=h||b[d];0===f?d++:("i64"==f&&(f="i32"),qa(c+d,y,f),j!==f&&(k=x.La(f),j=f),d+=k)}return c}
+q.allocate=O;function B(a,b){for(var c=n,d,f=0;;){d=P[a+f>>0];if(128<=d)c=l;else if(0==d&&!b)break;f++;if(b&&f==b)break}b||(b=f);var g="";if(!c){for(;0<b;)d=String.fromCharCode.apply(String,P.subarray(a,a+Math.min(b,1024))),g=g?g+d:d,a+=1024,b-=1024;return g}c=new x.Ea;for(f=0;f<b;f++)d=P[a+f>>0],g+=c.Pa(d);return g}q.Pointer_stringify=B;q.UTF16ToString=function(a){for(var b=0,c="";;){var d=ra[a+2*b>>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}};
+q.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ra[b+2*c>>1]=a.charCodeAt(c);ra[b+2*a.length>>1]=0};q.UTF32ToString=function(a){for(var b=0,c="";;){var d=M[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}};q.stringToUTF32=function(a,b){for(var c=0,d=0;d<a.length;++d){var f=a.charCodeAt(d);if(55296<=f&&57343>=f)var g=a.charCodeAt(++d),f=65536+((f&1023)<<10)|g&1023;M[b+4*c>>2]=f;++c}M[b+4*c>>2]=0};
+function Ba(a){function b(h,j,y){var j=j||Infinity,F="",r=[],w;if("N"===a[c]){c++;"K"===a[c]&&c++;for(w=[];"E"!==a[c];)if("S"===a[c]){c++;var C=a.indexOf("_",c);w.push(f[a.substring(c,C)||0]||"?");c=C+1}else if("C"===a[c])w.push(w[w.length-1]),c+=2;else{var C=parseInt(a.substr(c)),H=C.toString().length;if(!C||!H){c--;break}var I=a.substr(c+H,C);w.push(I);f.push(I);c+=H+C}c++;w=w.join("::");j--;if(0===j)return h?[w]:w}else if(("K"===a[c]||g&&"L"===a[c])&&c++,C=parseInt(a.substr(c)))H=C.toString().length,
+w=a.substr(c+H,C),c+=H+C;g=n;"I"===a[c]?(c++,C=b(l),H=b(l,1,l),F+=H[0]+" "+w+"<"+C.join(", ")+">"):F=w;a:for(;c<a.length&&0<j--;)if(w=a[c++],w in d)r.push(d[w]);else switch(w){case "P":r.push(b(l,1,l)[0]+"*");break;case "R":r.push(b(l,1,l)[0]+"&");break;case "L":c++;C=a.indexOf("E",c)-c;r.push(a.substr(c,C));c+=C+2;break;case "A":C=parseInt(a.substr(c));c+=C.toString().length;"_"!==a[c]&&e("?");c++;r.push(b(l,1,l)[0]+" ["+C+"]");break;case "E":break a;default:F+="?"+w;break a}!y&&(1===r.length&&"void"===
+r[0])&&(r=[]);return h?(F&&r.push(F+"?"),r):F+("("+r.join(", ")+")")}var c=3,d={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},f=[],g=l;try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=B(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}return b()}catch(h){return a}}
+function Ca(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=Ba(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}for(var L,P,ra,Da,M,Ea,wa,xa,Fa=0,ja=0,Ga=0,v=0,Ha=0,Ia=0,G=0,Ja=q.TOTAL_STACK||5242880,ka=q.TOTAL_MEMORY||134217728,Q=4096;Q<ka||Q<2*Ja;)Q=16777216>Q?2*Q:Q+16777216;Q!==ka&&(q.K("increasing TOTAL_MEMORY to "+Q+" to be more reasonable"),ka=Q);
+z("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"JS engine does not provide full typed array support");var R=new ArrayBuffer(ka);L=new Int8Array(R);ra=new Int16Array(R);M=new Int32Array(R);P=new Uint8Array(R);Da=new Uint16Array(R);Ea=new Uint32Array(R);wa=new Float32Array(R);xa=new Float64Array(R);M[0]=255;z(255===P[0]&&0===P[3],"Typed arrays 2 must be run on a little-endian system");q.HEAP=i;q.HEAP8=L;q.HEAP16=ra;
+q.HEAP32=M;q.HEAPU8=P;q.HEAPU16=Da;q.HEAPU32=Ea;q.HEAPF32=wa;q.HEAPF64=xa;function Ka(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.R;"number"===typeof c?b.ka===i?x.ba("v",c):x.ba("vi",c,[b.ka]):c(b.ka===i?m:b.ka)}}}var La=[],Ma=[],Na=[],Oa=[],Pa=[],Qa=n;function Ra(a){La.unshift(a)}q.addOnPreRun=q.ye=Ra;q.addOnInit=q.ve=function(a){Ma.unshift(a)};q.addOnPreMain=q.xe=function(a){Na.unshift(a)};q.addOnExit=q.ue=function(a){Oa.unshift(a)};
+function Sa(a){Pa.unshift(a)}q.addOnPostRun=q.we=Sa;function K(a,b,c){a=(new x.Ea).rc(a);c&&(a.length=c);b||a.push(0);return a}q.intArrayFromString=K;q.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];255<d&&(d&=255);b.push(String.fromCharCode(d))}return b.join("")};q.writeStringToMemory=function(a,b,c){a=K(a,c);for(c=0;c<a.length;)L[b+c>>0]=a[c],c+=1};function pa(a,b){for(var c=0;c<a.length;c++)L[b+c>>0]=a[c]}q.writeArrayToMemory=pa;
+q.writeAsciiToMemory=function(a,b,c){for(var d=0;d<a.length;d++)L[b+d>>0]=a.charCodeAt(d);c||(L[b+a.length>>0]=0)};function Ta(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function Ua(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,d=b&65535;return c*d+((a>>>16)*d+c*(b>>>16)<<16)|0};Math.Se=Math.imul;
+var sa=Math.abs,Va=Math.cos,Wa=Math.sin,Xa=Math.sqrt,va=Math.ceil,ua=Math.floor,ta=Math.min,S=0,Ya=m,Za=m;function $a(){S++;q.monitorRunDependencies&&q.monitorRunDependencies(S)}q.addRunDependency=$a;function ab(){S--;q.monitorRunDependencies&&q.monitorRunDependencies(S);if(0==S&&(Ya!==m&&(clearInterval(Ya),Ya=m),Za)){var a=Za;Za=m;a()}}q.removeRunDependency=ab;q.preloadedImages={};q.preloadedAudios={};var bb=7024,cb=7064,Fa=8,ja=Fa+x.U(7731);Ma.push();
+O([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,118,72,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,101,114,114,111,114,58,32,37,100,92,110,0,0,0,0,0,102,114,97,109,101,32,97,118,101,114,97,103,101,115,58,32,37,46,51,102,32,43,45,32,37,46,51,102,44,32,114,97,110,103,101,58,32,37,46,51,102,32,116,111,32,37,46,51,102,32,10,0,0,0,0,0,105,102,32,40,77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,41,32,
+77,111,100,117,108,101,46,114,101,112,111,114,116,67,111,109,112,108,101,116,105,111,110,40,41,0,0,114,101,115,112,111,110,115,105,118,101,32,109,97,105,110,32,108,111,111,112,0,0,0,0,0,0,0,0,56,1,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,49,49,98,50,69,100,103,101,83,104,97,112,101,0,0,0,55,98,50,83,104,97,112,101,0,0,0,0,0,0,0,0,120,27,0,0,32,1,0,0,160,27,0,0,16,1,0,0,48,1,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,
+50,80,111,108,121,103,111,110,83,104,97,112,101,46,99,112,112,0,0,0,0,0,0,0,48,46,48,102,32,60,61,32,108,111,119,101,114,32,38,38,32,108,111,119,101,114,32,60,61,32,105,110,112,117,116,46,109,97,120,70,114,97,99,116,105,111,110,0,0,0,0,0,82,97,121,67,97,115,116,0,109,95,118,101,114,116,101,120,67,111,117,110,116,32,62,61,32,51,0,0,0,0,0,0,67,111,109,112,117,116,101,77,97,115,115,0,0,0,0,0,97,114,101,97,32,62,32,49,46,49,57,50,48,57,50,57,48,101,45,48,55,70,0,0,0,0,0,0,48,2,0,0,3,0,0,0,4,0,0,0,2,0,
+0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,49,52,98,50,80,111,108,121,103,111,110,83,104,97,112,101,0,0,0,0,0,0,0,0,160,27,0,0,24,2,0,0,48,1,0,0,0,0,0,0,16,0,0,0,32,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,1,0,0,64,1,0,0,128,1,0,0,192,1,0,0,0,2,0,0,128,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,106,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,98,50,66,108,111,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,0,48,32,60,32,115,105,122,101,0,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,
+32,105,110,100,101,120,32,60,32,98,50,95,98,108,111,99,107,83,105,122,101,115,0,0,0,0,0,98,108,111,99,107,67,111,117,110,116,32,42,32,98,108,111,99,107,83,105,122,101,32,60,61,32,98,50,95,99,104,117,110,107,83,105,122,101,0,0,70,114,101,101,0,0,0,0,98,100,45,62,112,111,115,105,116,105,111,110,46,73,115,86,97,108,105,100,40,41,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,66,111,100,121,46,99,112,112,0,0,0,0,0,0,0,98,50,66,111,100,121,0,0,98,100,45,62,108,105,110,101,97,114,86,101,
+108,111,99,105,116,121,46,73,115,86,97,108,105,100,40,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,108,101,41,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,86,101,108,111,99,105,116,121,41,0,0,98,50,73,115,86,97,108,105,100,40,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,97,110,103,117,108,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,98,50,73,115,86,97,108,105,100,40,98,
+100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,41,32,38,38,32,98,100,45,62,108,105,110,101,97,114,68,97,109,112,105,110,103,32,62,61,32,48,46,48,102,0,0,0,0,0,0,0,109,95,119,111,114,108,100,45,62,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,67,114,101,97,116,101,70,105,120,116,117,114,101,0,0,0,109,95,116,121,112,101,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,0,0,82,101,115,101,116,77,97,115,115,68,97,116,97,0,0,0,109,95,73,32,
+62,32,48,46,48,102,0,0,0,0,0,0,0,10,0,0,0,0,0,0,240,7,0,0,0,0,0,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,104,0,0,0,0,0,0,0,71,101,116,85,115,101,114,68,97,116,97,0,0,0,0,0,71,101,116,70,97,116,65,65,66,66,0,0,0,0,0,0,0,0,0,0,32,8,0,0,5,0,0,0,6,0,0,0,1,0,0,0,2,0,0,0,1,0,
+0,0,2,0,0,0,49,55,98,50,67,111,110,116,97,99,116,76,105,115,116,101,110,101,114,0,0,0,0,0,120,27,0,0,8,8,0,0,109,95,112,114,111,120,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,70,105,120,116,117,114,101,46,99,112,112,0,0,0,0,67,114,101,97,116,101,80,114,111,120,105,101,115,0,0,0,73,115,76,111,99,107,101,100,40,41,32,61,61,32,102,97,108,115,101,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,87,111,114,108,100,46,
+99,112,112,0,0,0,0,0,0,67,114,101,97,116,101,66,111,100,121,0,0,0,0,0,0,98,45,62,73,115,65,99,116,105,118,101,40,41,32,61,61,32,116,114,117,101,0,0,0,83,111,108,118,101,0,0,0,115,116,97,99,107,67,111,117,110,116,32,60,32,115,116,97,99,107,83,105,122,101,0,0,116,121,112,101,65,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,32,124,124,32,116,121,112,101,66,32,61,61,32,98,50,95,100,121,110,97,109,105,99,66,111,100,121,0,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,97,108,112,
+104,97,48,32,60,32,49,46,48,102,0,0,0,46,47,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,77,97,116,104,46,104,0,65,100,118,97,110,99,101,0,109,95,106,111,105,110,116,67,111,117,110,116,32,60,32,109,95,106,111,105,110,116,67,97,112,97,99,105,116,121,0,0,46,47,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,104,0,0,0,0,0,65,100,100,0,0,0,0,0,109,95,99,111,110,116,97,99,116,67,111,117,110,116,32,60,32,109,95,99,111,110,116,97,99,116,67,97,112,97,99,105,116,121,
+0,0,0,0,0,0,109,95,98,111,100,121,67,111,117,110,116,32,60,32,109,95,98,111,100,121,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,40,10,0,0,7,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,49,53,98,50,67,111,110,116,97,99,116,70,105,108,116,101,114,0,0,0,0,0,0,0,120,27,0,0,16,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,99,104,97,105,110,45,62,109,95,99,111,117,110,116,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,
+47,98,50,68,105,115,116,97,110,99,101,46,99,112,112,0,0,83,101,116,0,0,0,0,0,102,97,108,115,101,0,0,0,98,50,68,105,115,116,97,110,99,101,0,0,0,0,0,0,71,101,116,77,101,116,114,105,99,0,0,0,0,0,0,0,71,101,116,87,105,116,110,101,115,115,80,111,105,110,116,115,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,
+86,101,114,116,101,120,0,0,0,0,0,0,0,71,101,116,67,108,111,115,101,115,116,80,111,105,110,116,0,99,97,99,104,101,45,62,99,111,117,110,116,32,60,61,32,51,0,0,0,0,0,0,0,82,101,97,100,67,97,99,104,101,0,0,0,0,0,0,0,109,95,110,111,100,101,67,111,117,110,116,32,61,61,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,121,110,97,109,105,99,84,114,101,101,46,99,112,112,0,0,0,0,0,0,0,65,108,108,111,99,97,116,101,78,111,100,101,0,
+0,0,0,48,32,60,61,32,110,111,100,101,73,100,32,38,38,32,110,111,100,101,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,70,114,101,101,78,111,100,101,0,0,0,0,0,0,0,0,48,32,60,32,109,95,110,111,100,101,67,111,117,110,116,0,48,32,60,61,32,112,114,111,120,121,73,100,32,38,38,32,112,114,111,120,121,73,100,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,0,0,0,0,0,0,109,95,110,111,100,101,115,91,112,114,111,120,121,73,100,93,46,73,115,76,101,97,102,40,41,0,0,0,0,0,
+0,0,77,111,118,101,80,114,111,120,121,0,0,0,0,0,0,0,99,104,105,108,100,49,32,33,61,32,40,45,49,41,0,0,73,110,115,101,114,116,76,101,97,102,0,0,0,0,0,0,99,104,105,108,100,50,32,33,61,32,40,45,49,41,0,0,105,65,32,33,61,32,40,45,49,41,0,0,0,0,0,0,66,97,108,97,110,99,101,0,48,32,60,61,32,105,66,32,38,38,32,105,66,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,67,32,38,38,32,105,67,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,70,
+32,38,38,32,105,70,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,71,32,38,38,32,105,71,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,109,95,110,111,100,101,115,91,67,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,48,32,60,61,32,105,68,32,38,38,32,105,68,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,121,0,0,48,32,60,61,32,105,69,32,38,38,32,105,69,32,60,32,109,95,110,111,100,101,67,97,112,97,99,105,116,
+121,0,0,109,95,110,111,100,101,115,91,66,45,62,112,97,114,101,110,116,93,46,99,104,105,108,100,50,32,61,61,32,105,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,116,97,114,103,101,116,32,62,32,116,111,108,101,114,97,110,99,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,84,105,109,101,79,102,73,109,112,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,84,105,109,101,79,102,73,109,112,97,99,116,0,0,102,97,108,115,101,0,0,0,69,118,97,108,
+117,97,116,101,0,0,0,0,0,0,0,0,48,32,60,61,32,105,110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,0,0,0,46,47,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,68,105,115,116,97,110,99,101,46,104,0,0,71,101,116,86,101,114,116,101,120,0,0,0,0,0,0,0,70,105,110,100,77,105,110,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,48,32,60,32,99,111,117,110,116,32,38,38,32,99,111,117,110,116,32,60,32,51,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,109,95,105,110,100,101,120,32,61,61,32,48,0,0,0,0,66,111,120,50,68,47,67,111,109,109,111,110,47,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,46,99,112,112,0,0,0,0,0,0,0,126,98,50,83,116,97,99,107,65,108,108,111,99,97,116,111,114,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,61,61,32,48,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,60,32,98,50,95,109,97,120,83,116,97,99,107,69,110,116,114,105,101,115,0,0,0,0,0,0,0,65,108,108,111,99,97,116,
+101,0,0,0,0,0,0,0,0,109,95,101,110,116,114,121,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,70,114,101,101,0,0,0,0,112,32,61,61,32,101,110,116,114,121,45,62,100,97,116,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,32,60,61,32,116,121,112,101,49,32,38,38,32,116,121,112,101,49,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,46,99,112,112,0,0,0,48,32,60,61,32,116,121,112,101,50,32,38,38,32,116,121,112,101,50,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,
+101,67,111,117,110,116,0,0,0,0,0,0,67,114,101,97,116,101,0,0,115,95,105,110,105,116,105,97,108,105,122,101,100,32,61,61,32,116,114,117,101,0,0,0,68,101,115,116,114,111,121,0,48,32,60,61,32,116,121,112,101,65,32,38,38,32,116,121,112,101,66,32,60,32,98,50,83,104,97,112,101,58,58,101,95,116,121,112,101,67,111,117,110,116,0,0,0,0,0,0,0,0,0,0,120,17,0,0,1,0,0,0,9,0,0,0,10,0,0,0,0,0,0,0,57,98,50,67,111,110,116,97,99,116,0,0,0,0,0,0,120,27,0,0,104,17,0,0,0,0,0,0,104,18,0,0,3,0,0,0,11,0,0,0,12,0,0,0,0,0,
+0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,0,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,
+40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,50,98,50,69,100,103,101,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,160,27,0,0,72,18,0,0,120,17,0,0,0,0,0,0,0,0,0,0,96,19,0,0,4,0,0,0,13,0,0,0,14,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,101,100,103,101,0,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,
+116,97,99,116,115,47,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,51,98,50,69,100,103,101,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,19,0,
+0,120,17,0,0,0,0,0,0,0,0,0,0,96,20,0,0,5,0,0,0,15,0,0,0,16,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,
+110,116,97,99,116,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,53,98,50,80,111,108,121,103,111,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,160,27,0,0,64,20,0,0,120,17,0,0,0,0,0,0,0,0,0,0,72,21,0,0,6,0,0,0,17,0,0,0,18,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,
+58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,49,54,98,50,80,111,108,121,103,111,110,67,111,110,
+116,97,99,116,0,0,0,0,0,0,160,27,0,0,48,21,0,0,120,17,0,0,0,0,0,0,116,111,105,73,110,100,101,120,65,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,98,50,73,115,108,97,110,100,46,99,112,112,0,0,0,0,0,83,111,108,118,101,84,79,73,0,0,0,0,0,0,0,0,116,111,105,73,110,100,101,120,66,32,60,32,109,95,98,111,100,121,67,111,117,110,116,0,100,101,110,32,62,32,48,46,48,102,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,
+108,108,105,100,101,69,100,103,101,46,99,112,112,0,0,0,0,0,0,0,98,50,67,111,108,108,105,100,101,69,100,103,101,65,110,100,67,105,114,99,108,101,0,0,48,32,60,61,32,101,100,103,101,49,32,38,38,32,101,100,103,101,49,32,60,32,112,111,108,121,49,45,62,109,95,118,101,114,116,101,120,67,111,117,110,116,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,98,50,67,111,108,108,105,100,101,80,111,108,121,103,111,110,46,99,112,112,0,0,0,0,98,50,70,105,110,100,73,110,99,105,100,101,110,116,69,
+100,103,101,0,0,0,0,0,0,98,50,69,100,103,101,83,101,112,97,114,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,120,23,0,0,7,0,0,0,19,0,0,0,20,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,
+50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,50,51,98,50,67,104,97,105,110,65,110,100,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,88,23,0,0,120,17,0,0,0,0,0,0,0,0,0,0,120,24,0,0,8,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,
+101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,104,97,105,110,0,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,
+58,101,95,112,111,108,121,103,111,110,0,0,0,0,0,50,52,98,50,67,104,97,105,110,65,110,100,80,111,108,121,103,111,110,67,111,110,116,97,99,116,0,0,0,0,0,0,160,27,0,0,88,24,0,0,120,17,0,0,0,0,0,0,0,0,0,0,88,25,0,0,9,0,0,0,23,0,0,0,24,0,0,0,0,0,0,0,109,95,102,105,120,116,117,114,101,65,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,111,110,116,97,99,116,115,47,98,50,67,105,
+114,99,108,101,67,111,110,116,97,99,116,46,99,112,112,0,0,0,0,0,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,109,95,102,105,120,116,117,114,101,66,45,62,71,101,116,84,121,112,101,40,41,32,61,61,32,98,50,83,104,97,112,101,58,58,101,95,99,105,114,99,108,101,0,0,0,0,0,0,49,53,98,50,67,105,114,99,108,101,67,111,110,116,97,99,116,0,0,0,0,0,0,0,160,27,0,0,64,25,0,0,120,17,0,0,0,0,0,0,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,66,111,120,50,68,47,68,121,110,97,109,105,99,115,47,67,
+111,110,116,97,99,116,115,47,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,46,99,112,112,0,0,0,0,0,98,50,67,111,110,116,97,99,116,83,111,108,118,101,114,0,109,97,110,105,102,111,108,100,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,112,111,105,110,116,67,111,117,110,116,32,61,61,32,49,32,124,124,32,112,111,105,110,116,67,111,117,110,116,32,61,61,32,
+50,0,0,0,0,0,0,83,111,108,118,101,86,101,108,111,99,105,116,121,67,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,46,120,32,62,61,32,48,46,48,102,32,38,38,32,97,46,121,32,62,61,32,48,46,48,102,0,0,0,0,0,0,112,99,45,62,112,111,105,110,116,67,111,117,110,116,32,62,32,48,0,0,0,0,0,0,73,110,105,116,105,97,108,105,122,101,0,0,0,0,0,0,66,111,120,50,68,47,67,111,108,108,105,115,105,111,110,47,83,104,97,112,101,115,47,98,50,67,104,97,105,110,83,104,97,112,101,46,99,112,112,0,48,32,60,61,32,105,
+110,100,101,120,32,38,38,32,105,110,100,101,120,32,60,32,109,95,99,111,117,110,116,32,45,32,49,0,0,0,0,0,0,0,71,101,116,67,104,105,108,100,69,100,103,101,0,0,0,0,83,116,57,116,121,112,101,95,105,110,102,111,0,0,0,0,120,27,0,0,232,26,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,0,0,0,0,160,27,0,0,0,27,0,0,248,26,0,0,0,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,
+110,102,111,69,0,0,0,0,0,0,0,160,27,0,0,56,27,0,0,40,27,0,0,0,0,0,0,0,0,0,0,96,27,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,232,27,0,0,25,0,0,0,29,0,0,0,27,0,0,0,28,0,0,0,4,0,0,0,2,0,0,0,2,0,0,0,11,0,0,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,0,0,0,160,27,0,0,192,27,0,0,96,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,30,0,0,30,0,0,0,31,0,0,0,3,0,0,0,0,0,0,0,115,116,100,58,58,98,97,100,95,
+97,108,108,111,99,0,0,83,116,57,98,97,100,95,97,108,108,111,99,0,0,0,0,160,27,0,0,24,30,0,0,0,0,0,0,0,0,0,0],"i8",za,x.Pb);var db=x.U(O(12,"i8",N),8);z(0==db%8);function eb(){return!!eb.Xa}
+function fb(a){var b=n;try{a==__ZTIi&&(b=l)}catch(c){}try{a==__ZTIj&&(b=l)}catch(d){}try{a==__ZTIl&&(b=l)}catch(f){}try{a==__ZTIm&&(b=l)}catch(g){}try{a==__ZTIx&&(b=l)}catch(h){}try{a==__ZTIy&&(b=l)}catch(k){}try{a==__ZTIf&&(b=l)}catch(j){}try{a==__ZTId&&(b=l)}catch(y){}try{a==__ZTIe&&(b=l)}catch(F){}try{a==__ZTIc&&(b=l)}catch(r){}try{a==__ZTIa&&(b=l)}catch(w){}try{a==__ZTIh&&(b=l)}catch(C){}try{a==__ZTIs&&(b=l)}catch(H){}try{a==__ZTIt&&(b=l)}catch(I){}return b}
+function gb(a,b,c){if(0==c)return n;if(0==b||b==a)return l;switch(fb(b)?b:M[M[b>>2]-8>>2]){case 0:return 0==M[M[a>>2]-8>>2]?gb(M[a+8>>2],M[b+8>>2],c):n;case 1:return n;case 2:return gb(a,M[b+8>>2],c);default:return n}}var hb=0,ib=8;
+function jb(a,b,c){if(!jb.gc){try{M[__ZTVN10__cxxabiv119__pointer_type_infoE>>2]=0}catch(d){}try{M[bb>>2]=1}catch(f){}try{M[cb>>2]=2}catch(g){}jb.gc=l}var h=a-ib;M[h>>2]=b;M[h+4>>2]=c;hb=a;"uncaught_exception"in eb?eb.Xa++:eb.Xa=1;e(a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.")}q._memset=kb;function lb(a){q.exit(a)}
+var T={aa:1,ia:2,de:3,bd:4,P:5,cb:6,zc:7,zd:8,ha:9,Mc:10,$:11,ne:11,Mb:12,Fb:13,Xc:14,Ld:15,Za:16,$a:17,oe:18,ab:19,Nb:20,Aa:21,u:22,ud:23,Lb:24,Pd:25,ke:26,Yc:27,Hd:28,Da:29,ae:30,nd:31,Ud:32,Uc:33,Yd:34,Dd:42,$c:43,Nc:44,dd:45,ed:46,fd:47,md:48,le:49,xd:50,cd:51,Sc:35,Ad:37,Ec:52,Hc:53,pe:54,vd:55,Ic:56,Jc:57,Tc:35,Kc:59,Jd:60,yd:61,he:62,Id:63,Ed:64,Fd:65,$d:66,Bd:67,Cc:68,ee:69,Oc:70,Vd:71,pd:72,Vc:73,Gc:74,Qd:76,Fc:77,Zd:78,gd:79,hd:80,ld:81,kd:82,jd:83,Kd:38,bb:39,qd:36,Ba:40,Ca:95,Td:96,Rc:104,
+wd:105,Dc:97,Xd:91,Nd:88,Gd:92,be:108,Qc:111,Ac:98,Pc:103,td:101,rd:100,ie:110,Zc:112,Ib:113,Jb:115,Gb:114,Hb:89,od:90,Wd:93,ce:94,Bc:99,sd:102,Kb:106,ja:107,je:109,me:87,Wc:122,fe:116,Od:95,Cd:123,ad:84,Rd:75,Lc:125,Md:131,Sd:130,ge:86},mb={"0":"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",
+12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",
+34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",
+53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",
+74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can   access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",
+90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",
+107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"},nb=0;function ob(a){return M[nb>>2]=a}
+function pb(a,b){for(var c=0,d=a.length-1;0<=d;d--){var f=a[d];"."===f?a.splice(d,1):".."===f?(a.splice(d,1),c++):c&&(a.splice(d,1),c--)}if(b)for(;c--;c)a.unshift("..");return a}function U(a){var b="/"===a.charAt(0),c="/"===a.substr(-1),a=pb(a.split("/").filter(function(a){return!!a}),!b).join("/");!a&&!b&&(a=".");a&&c&&(a+="/");return(b?"/":"")+a}function rb(a){if("/"===a)return"/";var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)}
+function sb(){for(var a="",b=n,c=arguments.length-1;-1<=c&&!b;c--){var d=0<=c?arguments[c]:"/";"string"!==typeof d&&e(new TypeError("Arguments to path.resolve must be strings"));d&&(a=d+"/"+a,b="/"===d.charAt(0))}a=pb(a.split("/").filter(function(a){return!!a}),!b).join("/");return(b?"/":"")+a||"."}var tb=[];function ub(a,b){tb[a]={input:[],T:[],da:b};vb[a]={k:wb}}
+var wb={open:function(a){var b=tb[a.e.va];b||e(new V(T.ab));a.C=b;a.seekable=n},close:function(a){a.C.T.length&&a.C.da.ua(a.C,10)},O:function(a,b,c,d){(!a.C||!a.C.da.rb)&&e(new V(T.cb));for(var f=0,g=0;g<d;g++){var h;try{h=a.C.da.rb(a.C)}catch(k){e(new V(T.P))}h===i&&0===f&&e(new V(T.$));if(h===m||h===i)break;f++;b[c+g]=h}f&&(a.e.timestamp=Date.now());return f},write:function(a,b,c,d){(!a.C||!a.C.da.ua)&&e(new V(T.cb));for(var f=0;f<d;f++)try{a.C.da.ua(a.C,b[c+f])}catch(g){e(new V(T.P))}d&&(a.e.timestamp=
+Date.now());return f}},W={F:m,Eb:1,za:2,Ya:3,N:function(){return W.createNode(m,"/",16895,0)},createNode:function(a,b,c,d){(24576===(c&61440)||4096===(c&61440))&&e(new V(T.aa));W.F||(W.F={dir:{e:{M:W.n.M,A:W.n.A,Na:W.n.Na,ra:W.n.ra,rename:W.n.rename,Db:W.n.Db,Bb:W.n.Bb,yb:W.n.yb,ya:W.n.ya},G:{S:W.k.S}},file:{e:{M:W.n.M,A:W.n.A},G:{S:W.k.S,O:W.k.O,write:W.k.write,fb:W.k.fb,ub:W.k.ub}},link:{e:{M:W.n.M,A:W.n.A,wa:W.n.wa},G:{}},ib:{e:{M:W.n.M,A:W.n.A},G:xb}});c=yb(a,b,c,d);16384===(c.mode&61440)?(c.n=
+W.F.dir.e,c.k=W.F.dir.G,c.o={}):32768===(c.mode&61440)?(c.n=W.F.file.e,c.k=W.F.file.G,c.o=[],c.ma=W.za):40960===(c.mode&61440)?(c.n=W.F.link.e,c.k=W.F.link.G):8192===(c.mode&61440)&&(c.n=W.F.ib.e,c.k=W.F.ib.G);c.timestamp=Date.now();a&&(a.o[b]=c);return c},Ga:function(a){a.ma!==W.za&&(a.o=Array.prototype.slice.call(a.o),a.ma=W.za)},n:{M:function(a){var b={};b.Ie=8192===(a.mode&61440)?a.id:1;b.Te=a.id;b.mode=a.mode;b.Ze=1;b.uid=0;b.Re=0;b.va=a.va;b.size=16384===(a.mode&61440)?4096:32768===(a.mode&
+61440)?a.o.length:40960===(a.mode&61440)?a.link.length:0;b.Be=new Date(a.timestamp);b.Xe=new Date(a.timestamp);b.Ge=new Date(a.timestamp);b.Ub=4096;b.Ce=Math.ceil(b.size/b.Ub);return b},A:function(a,b){b.mode!==i&&(a.mode=b.mode);b.timestamp!==i&&(a.timestamp=b.timestamp);if(b.size!==i){W.Ga(a);var c=a.o;if(b.size<c.length)c.length=b.size;else for(;b.size>c.length;)c.push(0)}},Na:function(){e(zb[T.ia])},ra:function(a,b,c,d){return W.createNode(a,b,c,d)},rename:function(a,b,c){if(16384===(a.mode&61440)){var d;
+try{d=Ab(b,c)}catch(f){}if(d)for(var g in d.o)e(new V(T.bb))}delete a.parent.o[a.name];a.name=c;b.o[c]=a;a.parent=b},Db:function(a,b){delete a.o[b]},Bb:function(a,b){var c=Ab(a,b),d;for(d in c.o)e(new V(T.bb));delete a.o[b]},yb:function(a){var b=[".",".."],c;for(c in a.o)a.o.hasOwnProperty(c)&&b.push(c);return b},ya:function(a,b,c){a=W.createNode(a,b,41471,0);a.link=c;return a},wa:function(a){40960!==(a.mode&61440)&&e(new V(T.u));return a.link}},k:{O:function(a,b,c,d,f){a=a.e.o;if(f>=a.length)return 0;
+d=Math.min(a.length-f,d);z(0<=d);if(8<d&&a.subarray)b.set(a.subarray(f,f+d),c);else for(var g=0;g<d;g++)b[c+g]=a[f+g];return d},write:function(a,b,c,d,f,g){var h=a.e;h.timestamp=Date.now();a=h.o;if(d&&0===a.length&&0===f&&b.subarray)return g&&0===c?(h.o=b,h.ma=b.buffer===L.buffer?W.Eb:W.Ya):(h.o=new Uint8Array(b.subarray(c,c+d)),h.ma=W.Ya),d;W.Ga(h);for(a=h.o;a.length<f;)a.push(0);for(g=0;g<d;g++)a[f+g]=b[c+g];return d},S:function(a,b,c){1===c?b+=a.position:2===c&&32768===(a.e.mode&61440)&&(b+=a.e.o.length);
+0>b&&e(new V(T.u));a.xc=[];return a.position=b},fb:function(a,b,c){W.Ga(a.e);a=a.e.o;for(b+=c;b>a.length;)a.push(0)},ub:function(a,b,c,d,f,g,h){32768!==(a.e.mode&61440)&&e(new V(T.ab));a=a.e.o;if(!(h&2)&&(a.buffer===b||a.buffer===b.buffer))f=n,d=a.byteOffset;else{if(0<f||f+d<a.length)a=a.subarray?a.subarray(f,f+d):Array.prototype.slice.call(a,f,f+d);f=l;(d=Aa(d))||e(new V(T.Mb));b.set(a,d)}return{df:d,ze:f}}}},Bb=O(1,"i32*",N),Cb=O(1,"i32*",N),Db=O(1,"i32*",N),Eb=m,vb=[m],X=[],Fb=1,Gb=m,Hb=l,Ib={},
+V=m,zb={};function Jb(a){a instanceof V||e(a+" : "+Ca());ob(a.kb)}
+function Y(a,b){var a=sb("/",a),b=b||{},c={ob:l,Qa:0},d;for(d in c)b[d]===i&&(b[d]=c[d]);8<b.Qa&&e(new V(T.Ba));var c=pb(a.split("/").filter(function(a){return!!a}),n),f=Eb,g="/";for(d=0;d<c.length;d++){var h=d===c.length-1;if(h&&b.parent)break;f=Ab(f,c[d]);g=U(g+"/"+c[d]);if(f.sa&&(!h||h&&b.ob))f=f.sa.root;if(!h||b.Ia)for(h=0;40960===(f.mode&61440);){f=Y(g).e;f.n.wa||e(new V(T.u));var f=f.n.wa(f),k=sb;var j=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(g).slice(1),g=j[0],j=
+j[1];!g&&!j?g=".":(j&&(j=j.substr(0,j.length-1)),g+=j);g=k(g,f);f=Y(g,{Qa:b.Qa}).e;40<h++&&e(new V(T.Ba))}}return{path:g,e:f}}function Kb(a){for(var b;;){if(a===a.parent)return a=a.N.oc,!b?a:"/"!==a[a.length-1]?a+"/"+b:a+b;b=b?a.name+"/"+b:a.name;a=a.parent}}function Lb(a,b){for(var c=0,d=0;d<b.length;d++)c=(c<<5)-c+b.charCodeAt(d)|0;return(a+c>>>0)%Gb.length}
+function Ab(a,b){var c=Mb(a,"x");c&&e(new V(c));for(c=Gb[Lb(a.id,b)];c;c=c.qc){var d=c.name;if(c.parent.id===a.id&&d===b)return c}return a.n.Na(a,b)}
+function yb(a,b,c,d){Nb||(Nb=function(a,b,c,d){a||(a=this);this.parent=a;this.N=a.N;this.sa=m;this.id=Fb++;this.name=b;this.mode=c;this.n={};this.k={};this.va=d},Nb.prototype={},Object.defineProperties(Nb.prototype,{O:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},ic:{get:function(){return 16384===(this.mode&61440)}},hc:{get:function(){return 8192===
+(this.mode&61440)}}}));a=new Nb(a,b,c,d);b=Lb(a.parent.id,a.name);a.qc=Gb[b];return Gb[b]=a}var Ob={r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218};function Pb(a){var b=Ob[a];"undefined"===typeof b&&e(Error("Unknown file open mode: "+a));return b}function Mb(a,b){return Hb?0:-1!==b.indexOf("r")&&!(a.mode&292)||-1!==b.indexOf("w")&&!(a.mode&146)||-1!==b.indexOf("x")&&!(a.mode&73)?T.Fb:0}
+function Qb(a,b){try{return Ab(a,b),T.$a}catch(c){}return Mb(a,"wx")}function Rb(a,b,c){Sb||(Sb=p(),Sb.prototype={},Object.defineProperties(Sb.prototype,{object:{get:function(){return this.e},set:function(a){this.e=a}},Ve:{get:function(){return 1!==(this.L&2097155)}},We:{get:function(){return 0!==(this.L&2097155)}},Ue:{get:function(){return this.L&1024}}}));var d=new Sb,f;for(f in a)d[f]=a[f];var a=d,g;a:{b=b||0;for(c=c||4096;b<=c;b++)if(!X[b]){g=b;break a}e(new V(T.Lb))}a.B=g;return X[g]=a}
+var xb={open:function(a){a.k=vb[a.e.va].k;a.k.open&&a.k.open(a)},S:function(){e(new V(T.Da))}};function Tb(a,b){var c="/"===b,d=!b,f;c&&Eb&&e(new V(T.Za));!c&&!d&&(f=Y(b,{ob:n}),b=f.path,f=f.e,f.sa&&e(new V(T.Za)),16384!==(f.mode&61440)&&e(new V(T.Nb)));var d={type:a,af:{},oc:b,pc:[]},g=a.N(d);g.N=d;d.root=g;c?Eb=g:f&&(f.sa=d,f.N&&f.N.pc.push(d));return g}function Ub(a,b,c){var d=Y(a,{parent:l}).e,a=rb(a),f=Qb(d,a);f&&e(new V(f));d.n.ra||e(new V(T.aa));return d.n.ra(d,a,b,c)}
+function Vb(a,b){b=(b!==i?b:438)&4095;b|=32768;return Ub(a,b,0)}function Wb(a,b){b=(b!==i?b:511)&1023;b|=16384;return Ub(a,b,0)}function Xb(a,b,c){"undefined"===typeof c&&(c=b,b=438);return Ub(a,b|8192,c)}function Yb(a,b){var c=Y(b,{parent:l}).e,d=rb(b),f=Qb(c,d);f&&e(new V(f));c.n.ya||e(new V(T.aa));return c.n.ya(c,d,a)}function Zb(a,b){var c;c="string"===typeof a?Y(a,{Ia:l}).e:a;c.n.A||e(new V(T.aa));c.n.A(c,{mode:b&4095|c.mode&-4096,timestamp:Date.now()})}
+function $b(a,b){var c,b="string"===typeof b?Pb(b):b;c=b&64?("undefined"===typeof c?438:c)&4095|32768:0;var d;if("object"===typeof a)d=a;else{a=U(a);try{d=Y(a,{Ia:!(b&131072)}).e}catch(f){}}b&64&&(d?b&128&&e(new V(T.$a)):d=Ub(a,c,0));d||e(new V(T.ia));8192===(d.mode&61440)&&(b&=-513);d?40960===(d.mode&61440)?c=T.Ba:16384===(d.mode&61440)&&(0!==(b&2097155)||b&512)?c=T.Aa:(c=["r","w","rw"][b&2097155],b&512&&(c+="w"),c=Mb(d,c)):c=T.ia;c&&e(new V(c));if(b&512){c=d;c="string"===typeof c?Y(c,{Ia:l}).e:
+c;c.n.A||e(new V(T.aa));16384===(c.mode&61440)&&e(new V(T.Aa));32768!==(c.mode&61440)&&e(new V(T.u));var g=Mb(c,"w");g&&e(new V(g));c.n.A(c,{size:0,timestamp:Date.now()})}b&=-641;d=Rb({e:d,path:Kb(d),L:b,seekable:l,position:0,k:d.k,xc:[],error:n},i,i);d.k.open&&d.k.open(d);q.logReadFiles&&!(b&1)&&(ac||(ac={}),a in ac||(ac[a]=1,q.printErr("read file: "+a)));try{Ib.onOpenFile&&(c=0,1!==(b&2097155)&&(c|=1),0!==(b&2097155)&&(c|=2),Ib.onOpenFile(a,c))}catch(h){console.log("FS.trackingDelegate['onOpenFile']('"+
+a+"', flags) threw an exception: "+h.message)}return d}function bc(a){try{a.k.close&&a.k.close(a)}catch(b){e(b)}finally{X[a.B]=m}}
+function cc(a,b,c,d,f,g){(0>d||0>f)&&e(new V(T.u));0===(a.L&2097155)&&e(new V(T.ha));16384===(a.e.mode&61440)&&e(new V(T.Aa));a.k.write||e(new V(T.u));var h=l;"undefined"===typeof f?(f=a.position,h=n):a.seekable||e(new V(T.Da));a.L&1024&&((!a.seekable||!a.k.S)&&e(new V(T.Da)),a.k.S(a,0,2));b=a.k.write(a,b,c,d,f,g);h||(a.position+=b);try{if(a.path&&Ib.onWriteToFile)Ib.onWriteToFile(a.path)}catch(k){console.log("FS.trackingDelegate['onWriteToFile']('"+path+"') threw an exception: "+k.message)}return b}
+function dc(){V||(V=function(a){this.kb=a;for(var b in T)if(T[b]===a){this.code=b;break}this.message=mb[a]},V.prototype=Error(),[T.ia].forEach(function(a){zb[a]=new V(a);zb[a].stack="<generic error, no stack>"}))}var ec;function fc(a,b){var c=0;a&&(c|=365);b&&(c|=146);return c}
+function gc(a,b,c,d,f,g){a=b?U(("string"===typeof a?a:Kb(a))+"/"+b):a;d=fc(d,f);f=Vb(a,d);if(c){if("string"===typeof c){for(var a=Array(c.length),b=0,h=c.length;b<h;++b)a[b]=c.charCodeAt(b);c=a}Zb(f,d|146);a=$b(f,"w");cc(a,c,0,c.length,0,g);bc(a);Zb(f,d)}return f}
+function hc(a,b,c,d){a=U(("string"===typeof a?a:Kb(a))+"/"+b);b=fc(!!c,!!d);hc.tb||(hc.tb=64);var f;f=hc.tb++<<8|0;vb[f]={k:{open:function(a){a.seekable=n},close:function(){d&&(d.buffer&&d.buffer.length)&&d(10)},O:function(a,b,d,f){for(var y=0,F=0;F<f;F++){var r;try{r=c()}catch(w){e(new V(T.P))}r===i&&0===y&&e(new V(T.$));if(r===m||r===i)break;y++;b[d+F]=r}y&&(a.e.timestamp=Date.now());return y},write:function(a,b,c,f){for(var y=0;y<f;y++)try{d(b[c+y])}catch(F){e(new V(T.P))}f&&(a.e.timestamp=Date.now());
+return y}}};return Xb(a,b,f)}function ic(a){if(a.hc||a.ic||a.link||a.o)return l;var b=l;"undefined"!==typeof XMLHttpRequest&&e(Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."));if(q.read)try{a.o=K(q.read(a.url),l)}catch(c){b=n}else e(Error("Cannot load without read() or XMLHttpRequest."));b||ob(T.P);return b}var Nb,Sb,ac;function jc(){e("TODO")}
+var Z={N:function(){return yb(m,"/",16895,0)},Yb:function(a,b,c){c&&z(1==b==(6==c));a={$b:a,type:b,protocol:c,p:m,ea:{},Oa:[],W:[],Y:Z.q};b=Z.ta();c=yb(Z.root,b,49152,0);c.X=a;b=Rb({path:b,e:c,L:Pb("r+"),seekable:n,k:Z.k});a.G=b;return a},bc:function(a){a=X[a];return!a||49152!==(a.e.mode&49152)?m:a.e.X},k:{xb:function(a){a=a.e.X;return a.Y.xb(a)},sb:function(a,b,c){a=a.e.X;return a.Y.sb(a,b,c)},O:function(a,b,c,d){a=a.e.X;d=a.Y.sc(a,d);if(!d)return 0;b.set(d.buffer,c);return d.buffer.length},write:function(a,
+b,c,d){a=a.e.X;return a.Y.uc(a,b,c,d)},close:function(a){a=a.e.X;a.Y.close(a)}},ta:function(){Z.ta.jb||(Z.ta.jb=0);return"socket["+Z.ta.jb++ +"]"},q:{na:function(a,b,c){var d;"object"===typeof b&&(d=b,c=b=m);if(d)d._socket?(b=d._socket.remoteAddress,c=d._socket.remotePort):((c=/ws[s]?:\/\/([^:]+):(\d+)/.exec(d.url))||e(Error("WebSocket URL must be in the format ws(s)://address:port")),b=c[1],c=parseInt(c[2],10));else try{var f=q.websocket&&"object"===typeof q.websocket,g="ws:#".replace("#","//");
+f&&"string"===typeof q.websocket.url&&(g=q.websocket.url);if("ws://"===g||"wss://"===g)g=g+b+":"+c;var h="binary";f&&"string"===typeof q.websocket.subprotocol&&(h=q.websocket.subprotocol);var h=h.replace(/^ +| +$/g,"").split(/ *, */),k=u?{protocol:h.toString()}:h;d=new (u?require("ws"):window.WebSocket)(g,k);d.binaryType="arraybuffer"}catch(j){e(new V(T.Ib))}b={H:b,port:c,g:d,oa:[]};Z.q.eb(a,b);Z.q.ec(a,b);2===a.type&&"undefined"!==typeof a.Z&&b.oa.push(new Uint8Array([255,255,255,255,112,111,114,
+116,(a.Z&65280)>>8,a.Z&255]));return b},qa:function(a,b,c){return a.ea[b+":"+c]},eb:function(a,b){a.ea[b.H+":"+b.port]=b},zb:function(a,b){delete a.ea[b.H+":"+b.port]},ec:function(a,b){function c(){try{for(var a=b.oa.shift();a;)b.g.send(a),a=b.oa.shift()}catch(c){b.g.close()}}function d(c){z("string"!==typeof c&&c.byteLength!==i);var c=new Uint8Array(c),d=f;f=n;d&&10===c.length&&255===c[0]&&255===c[1]&&255===c[2]&&255===c[3]&&112===c[4]&&111===c[5]&&114===c[6]&&116===c[7]?(c=c[8]<<8|c[9],Z.q.zb(a,
+b),b.port=c,Z.q.eb(a,b)):a.W.push({H:b.H,port:b.port,data:c})}var f=l;u?(b.g.on("open",c),b.g.on("message",function(a,b){b.binary&&d((new Uint8Array(a)).buffer)}),b.g.on("error",p())):(b.g.onopen=c,b.g.onmessage=function(a){d(a.data)})},xb:function(a){if(1===a.type&&a.p)return a.Oa.length?65:0;var b=0,c=1===a.type?Z.q.qa(a,a.I,a.J):m;if(a.W.length||!c||c&&c.g.readyState===c.g.ga||c&&c.g.readyState===c.g.CLOSED)b|=65;if(!c||c&&c.g.readyState===c.g.OPEN)b|=4;if(c&&c.g.readyState===c.g.ga||c&&c.g.readyState===
+c.g.CLOSED)b|=16;return b},sb:function(a,b,c){switch(b){case 21531:return b=0,a.W.length&&(b=a.W[0].data.length),M[c>>2]=b,0;default:return T.u}},close:function(a){if(a.p){try{a.p.close()}catch(b){}a.p=m}for(var c=Object.keys(a.ea),d=0;d<c.length;d++){var f=a.ea[c[d]];try{f.g.close()}catch(g){}Z.q.zb(a,f)}return 0},bind:function(a,b,c){("undefined"!==typeof a.Sa||"undefined"!==typeof a.Z)&&e(new V(T.u));a.Sa=b;a.Z=c||jc();if(2===a.type){a.p&&(a.p.close(),a.p=m);try{a.Y.mc(a,0)}catch(d){d instanceof
+V||e(d),d.kb!==T.Ca&&e(d)}}},Ee:function(a,b,c){a.p&&e(new V(ERRNO_CODS.Ca));if("undefined"!==typeof a.I&&"undefined"!==typeof a.J){var d=Z.q.qa(a,a.I,a.J);d&&(d.g.readyState===d.g.CONNECTING&&e(new V(T.Gb)),e(new V(T.Kb)))}b=Z.q.na(a,b,c);a.I=b.H;a.J=b.port;e(new V(T.Jb))},mc:function(a){u||e(new V(T.Ca));a.p&&e(new V(T.u));var b=require("ws").Server;a.p=new b({host:a.Sa,port:a.Z});a.p.on("connection",function(b){if(1===a.type){var d=Z.Yb(a.$b,a.type,a.protocol),b=Z.q.na(d,b);d.I=b.H;d.J=b.port;
+a.Oa.push(d)}else Z.q.na(a,b)});a.p.on("closed",function(){a.p=m});a.p.on("error",p())},accept:function(a){a.p||e(new V(T.u));var b=a.Oa.shift();b.G.L=a.G.L;return b},Qe:function(a,b){var c,d;b?((a.I===i||a.J===i)&&e(new V(T.ja)),c=a.I,d=a.J):(c=a.Sa||0,d=a.Z||0);return{H:c,port:d}},uc:function(a,b,c,d,f,g){if(2===a.type){if(f===i||g===i)f=a.I,g=a.J;(f===i||g===i)&&e(new V(T.Hb))}else f=a.I,g=a.J;var h=Z.q.qa(a,f,g);1===a.type&&((!h||h.g.readyState===h.g.ga||h.g.readyState===h.g.CLOSED)&&e(new V(T.ja)),
+h.g.readyState===h.g.CONNECTING&&e(new V(T.$)));b=b instanceof Array||b instanceof ArrayBuffer?b.slice(c,c+d):b.buffer.slice(b.byteOffset+c,b.byteOffset+c+d);if(2===a.type&&(!h||h.g.readyState!==h.g.OPEN)){if(!h||h.g.readyState===h.g.ga||h.g.readyState===h.g.CLOSED)h=Z.q.na(a,f,g);h.oa.push(b);return d}try{return h.g.send(b),d}catch(k){e(new V(T.u))}},sc:function(a,b){1===a.type&&a.p&&e(new V(T.ja));var c=a.W.shift();if(!c){if(1===a.type){var d=Z.q.qa(a,a.I,a.J);if(d){if(d.g.readyState===d.g.ga||
+d.g.readyState===d.g.CLOSED)return m;e(new V(T.$))}e(new V(T.ja))}e(new V(T.$))}var d=c.data.byteLength||c.data.length,f=c.data.byteOffset||0,g=c.data.buffer||c.data,h=Math.min(b,d),k={buffer:new Uint8Array(g,f,h),H:c.H,port:c.port};1===a.type&&h<d&&(c.data=new Uint8Array(g,f+h,d-h),a.W.unshift(c));return k}}};function kc(a,b,c){a=X[a];if(!a)return ob(T.ha),-1;try{return cc(a,L,b,c)}catch(d){return Jb(d),-1}}function lc(a){a=X[a-1];return!a?-1:a.B}
+function mc(a,b,c,d){c*=b;if(0==c)return 0;a=kc(lc(d),a,c);if(-1==a){if(b=X[d-1])b.error=l;return 0}return Math.floor(a/b)}q._strlen=nc;function oc(a){return 0>a||0===a&&-Infinity===1/a}
+function pc(a,b){function c(a){var c;"double"===a?c=xa[b+f>>3]:"i64"==a?c=[M[b+f>>2],M[b+(f+4)>>2]]:(a="i32",c=M[b+f>>2]);f+=x.pb(a);return c}for(var d=a,f=0,g=[],h,k;;){var j=d;h=L[d>>0];if(0===h)break;k=L[d+1>>0];if(37==h){var y=n,F=n,r=n,w=n,C=n;a:for(;;){switch(k){case 43:y=l;break;case 45:F=l;break;case 35:r=l;break;case 48:if(w)break a;else{w=l;break}case 32:C=l;break;default:break a}d++;k=L[d+1>>0]}var H=0;if(42==k)H=c("i32"),d++,k=L[d+1>>0];else for(;48<=k&&57>=k;)H=10*H+(k-48),d++,k=L[d+
+1>>0];var I=n,D=-1;if(46==k){D=0;I=l;d++;k=L[d+1>>0];if(42==k)D=c("i32"),d++;else for(;;){k=L[d+1>>0];if(48>k||57<k)break;D=10*D+(k-48);d++}k=L[d+1>>0]}0>D&&(D=6,I=n);var A;switch(String.fromCharCode(k)){case "h":k=L[d+2>>0];104==k?(d++,A=1):A=2;break;case "l":k=L[d+2>>0];108==k?(d++,A=8):A=4;break;case "L":case "q":case "j":A=8;break;case "z":case "t":case "I":A=4;break;default:A=m}A&&d++;k=L[d+1>>0];switch(String.fromCharCode(k)){case "d":case "i":case "u":case "o":case "x":case "X":case "p":j=
+100==k||105==k;A=A||4;h=c("i"+8*A);var t;8==A&&(h=x.nc(h[0],h[1],117==k));4>=A&&(h=(j?Ua:Ta)(h&Math.pow(256,A)-1,8*A));var aa=Math.abs(h),j="";if(100==k||105==k)t=Ua(h,8*A).toString(10);else if(117==k)t=Ta(h,8*A).toString(10),h=Math.abs(h);else if(111==k)t=(r?"0":"")+aa.toString(8);else if(120==k||88==k){j=r&&0!=h?"0x":"";if(0>h){h=-h;t=(aa-1).toString(16);aa=[];for(r=0;r<t.length;r++)aa.push((15-parseInt(t[r],16)).toString(16));for(t=aa.join("");t.length<2*A;)t="f"+t}else t=aa.toString(16);88==k&&
+(j=j.toUpperCase(),t=t.toUpperCase())}else 112==k&&(0===aa?t="(nil)":(j="0x",t=aa.toString(16)));if(I)for(;t.length<D;)t="0"+t;0<=h&&(y?j="+"+j:C&&(j=" "+j));"-"==t.charAt(0)&&(j="-"+j,t=t.substr(1));for(;j.length+t.length<H;)F?t+=" ":w?t="0"+t:j=" "+j;t=j+t;t.split("").forEach(function(a){g.push(a.charCodeAt(0))});break;case "f":case "F":case "e":case "E":case "g":case "G":h=c("double");if(isNaN(h))t="nan",w=n;else if(isFinite(h)){I=n;A=Math.min(D,20);if(103==k||71==k)I=l,D=D||1,A=parseInt(h.toExponential(A).split("e")[1],
+10),D>A&&-4<=A?(k=(103==k?"f":"F").charCodeAt(0),D-=A+1):(k=(103==k?"e":"E").charCodeAt(0),D--),A=Math.min(D,20);if(101==k||69==k)t=h.toExponential(A),/[eE][-+]\d$/.test(t)&&(t=t.slice(0,-1)+"0"+t.slice(-1));else if(102==k||70==k)t=h.toFixed(A),0===h&&oc(h)&&(t="-"+t);j=t.split("e");if(I&&!r)for(;1<j[0].length&&-1!=j[0].indexOf(".")&&("0"==j[0].slice(-1)||"."==j[0].slice(-1));)j[0]=j[0].slice(0,-1);else for(r&&-1==t.indexOf(".")&&(j[0]+=".");D>A++;)j[0]+="0";t=j[0]+(1<j.length?"e"+j[1]:"");69==k&&
+(t=t.toUpperCase());0<=h&&(y?t="+"+t:C&&(t=" "+t))}else t=(0>h?"-":"")+"inf",w=n;for(;t.length<H;)t=F?t+" ":w&&("-"==t[0]||"+"==t[0])?t[0]+"0"+t.slice(1):(w?"0":" ")+t;97>k&&(t=t.toUpperCase());t.split("").forEach(function(a){g.push(a.charCodeAt(0))});break;case "s":w=(y=c("i8*"))?nc(y):6;I&&(w=Math.min(w,D));if(!F)for(;w<H--;)g.push(32);if(y)for(r=0;r<w;r++)g.push(P[y++>>0]);else g=g.concat(K("(null)".substr(0,w),l));if(F)for(;w<H--;)g.push(32);break;case "c":for(F&&g.push(c("i8"));0<--H;)g.push(32);
+F||g.push(c("i8"));break;case "n":F=c("i32*");M[F>>2]=g.length;break;case "%":g.push(h);break;default:for(r=j;r<d+2;r++)g.push(L[r>>0])}d+=2}else g.push(h),d+=1}return g}function qc(a,b,c){c=pc(b,c);b=x.Wa();a=mc(O(c,"i8",ya),1,c.length,a);x.Va(b);return a}var rc=ua;function sc(a,b){return kc(lc(b),a,nc(a))}function tc(a,b){var c=Ta(a&255);L[tc.Ab>>0]=c;if(-1==kc(lc(b),tc.Ab,1)){if(c=X[b-1])c.error=l;return-1}return c}
+function uc(){uc.start===i&&(uc.start=Date.now());return Math.floor(1E3*(Date.now()-uc.start))}var vc=[];q._memcpy=wc;var xc=m,yc="",zc=n,Ac=n,Bc=[],Cc={},Dc,Ec,Fc=n,Gc=n,Hc=n,Ic=i,Jc=i;
+function Kc(a){"undefined"===typeof window?setTimeout(a,1E3/60):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||window.setTimeout),window.requestAnimationFrame(a))}
+function Lc(a){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[a.substr(a.lastIndexOf(".")+1)]}var Mc=[];function Nc(){var a=q.canvas;Mc.forEach(function(b){b(a.width,a.height)})}
+function Oc(a,b,c){b&&c?(a.yc=b,a.fc=c):(b=a.yc,c=a.fc);var d=b,f=c;q.forcedAspectRatio&&0<q.forcedAspectRatio&&(d/f<q.forcedAspectRatio?d=Math.round(f*q.forcedAspectRatio):f=Math.round(d/q.forcedAspectRatio));if((document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===
+a.parentNode&&"undefined"!=typeof screen)var g=Math.min(screen.width/d,screen.height/f),d=Math.round(d*g),f=Math.round(f*g);Jc?(a.width!=d&&(a.width=d),a.height!=f&&(a.height=f),"undefined"!=typeof a.style&&(a.style.removeProperty("width"),a.style.removeProperty("height"))):(a.width!=b&&(a.width=b),a.height!=c&&(a.height=c),"undefined"!=typeof a.style&&(d!=b||f!=c?(a.style.setProperty("width",d+"px","important"),a.style.setProperty("height",f+"px","important")):(a.style.removeProperty("width"),a.style.removeProperty("height"))))}
+var Pc,Qc,Rc,Sc;function Tc(a){Tc.Wb||(G=G+4095&-4096,Tc.Wb=l,z(x.ca),Tc.Tb=x.ca,x.ca=function(){E("cannot dynamically allocate, sbrk now has control")});var b=G;0!=a&&Tc.Tb(a);return b}function Aa(a){return x.ca(a+8)+8&4294967288}q._malloc=Aa;var Uc=O([O([1,0,0,0,0,0,0],"i8",N)+8,0],"i32",N);dc();Gb=Array(4096);Tb(W,"/");Wb("/tmp");Wb("/dev");vb[259]={k:{O:function(){return 0},write:function(){return 0}}};Xb("/dev/null",259);
+ub(1280,{rb:function(a){if(!a.input.length){var b=m;if(u){if(b=process.stdin.read(),!b){if(process.stdin._readableState&&process.stdin._readableState.ended)return m;return}}else"undefined"!=typeof window&&"function"==typeof window.prompt?(b=window.prompt("Input: "),b!==m&&(b+="\n")):"function"==typeof readline&&(b=readline(),b!==m&&(b+="\n"));if(!b)return m;a.input=K(b,l)}return a.input.shift()},ua:function(a,b){b===m||10===b?(q.print(a.T.join("")),a.T=[]):a.T.push(Vc.Pa(b))}});
+ub(1536,{ua:function(a,b){b===m||10===b?(q.printErr(a.T.join("")),a.T=[]):a.T.push(Vc.Pa(b))}});Xb("/dev/tty",1280);Xb("/dev/tty1",1536);Wb("/dev/shm");Wb("/dev/shm/tmp");
+Ma.unshift({R:function(){if(!q.noFSInit&&!ec){z(!ec,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");ec=l;dc();q.stdin=q.stdin;q.stdout=q.stdout;q.stderr=q.stderr;q.stdin?hc("/dev","stdin",q.stdin):Yb("/dev/tty","/dev/stdin");q.stdout?hc("/dev","stdout",m,q.stdout):Yb("/dev/tty","/dev/stdout");q.stderr?hc("/dev","stderr",m,q.stderr):Yb("/dev/tty1","/dev/stderr");var a=$b("/dev/stdin",
+"r");M[Bb>>2]=a?a.B+1:0;z(0===a.B,"invalid handle for stdin ("+a.B+")");a=$b("/dev/stdout","w");M[Cb>>2]=a?a.B+1:0;z(1===a.B,"invalid handle for stdout ("+a.B+")");a=$b("/dev/stderr","w");M[Db>>2]=a?a.B+1:0;z(2===a.B,"invalid handle for stderr ("+a.B+")")}}});Na.push({R:function(){Hb=n}});Oa.push({R:function(){ec=n;for(var a=0;a<X.length;a++){var b=X[a];b&&bc(b)}}});q.FS_createFolder=function(a,b,c,d){a=U(("string"===typeof a?a:Kb(a))+"/"+b);return Wb(a,fc(c,d))};
+q.FS_createPath=function(a,b){for(var a="string"===typeof a?a:Kb(a),c=b.split("/").reverse();c.length;){var d=c.pop();if(d){var f=U(a+"/"+d);try{Wb(f)}catch(g){}a=f}}return f};q.FS_createDataFile=gc;
+q.FS_createPreloadedFile=function(a,b,c,d,f,g,h,k,j){function y(c){function t(c){k||gc(a,b,c,d,f,j);g&&g();ab()}var r=n;q.preloadPlugins.forEach(function(a){!r&&a.canHandle(C)&&(a.handle(c,C,t,function(){h&&h();ab()}),r=l)});r||t(c)}q.preloadPlugins||(q.preloadPlugins=[]);if(!Pc&&!da){Pc=l;try{new Blob,Qc=l}catch(F){Qc=n,console.log("warning: no blob constructor, cannot create blobs with mimetypes")}Rc="undefined"!=typeof MozBlobBuilder?MozBlobBuilder:"undefined"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:
+!Qc?console.log("warning: no BlobBuilder"):m;Sc="undefined"!=typeof window?window.URL?window.URL:window.webkitURL:i;!q.wb&&"undefined"===typeof Sc&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),q.wb=l);q.preloadPlugins.push({canHandle:function(a){return!q.wb&&/\.(jpg|jpeg|png|bmp)$/i.test(a)},handle:function(a,b,c,d){var f=m;if(Qc)try{f=new Blob([a],{type:Lc(b)}),f.size!==a.length&&(f=new Blob([(new Uint8Array(a)).buffer],
+{type:Lc(b)}))}catch(g){x.fa("Blob constructor present but fails: "+g+"; falling back to blob builder")}f||(f=new Rc,f.append((new Uint8Array(a)).buffer),f=f.getBlob());var h=Sc.createObjectURL(f),k=new Image;k.onload=function(){z(k.complete,"Image "+b+" could not be decoded");var d=document.createElement("canvas");d.width=k.width;d.height=k.height;d.getContext("2d").drawImage(k,0,0);q.preloadedImages[b]=d;Sc.revokeObjectURL(h);c&&c(a)};k.onerror=function(){console.log("Image "+h+" could not be decoded");
+d&&d()};k.src=h}});q.preloadPlugins.push({canHandle:function(a){return!q.$e&&a.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},handle:function(a,b,c,d){function f(d){h||(h=l,q.preloadedAudios[b]=d,c&&c(a))}function g(){h||(h=l,q.preloadedAudios[b]=new Audio,d&&d())}var h=n;if(Qc){try{var k=new Blob([a],{type:Lc(b)})}catch(j){return g()}var k=Sc.createObjectURL(k),r=new Audio;r.addEventListener("canplaythrough",function(){f(r)},n);r.onerror=function(){if(!h){console.log("warning: browser could not fully decode audio "+
+b+", trying slower base64 approach");for(var c="",d=0,g=0,k=0;k<a.length;k++){d=d<<8|a[k];for(g+=8;6<=g;)var j=d>>g-6&63,g=g-6,c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[j]}2==g?(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&3)<<4],c+="=="):4==g&&(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&15)<<2],c+="=");r.src="data:audio/x-"+b.substr(-3)+";base64,"+c;f(r)}};r.src=k;q.noExitRuntime=l;setTimeout(function(){J||f(r)},
+1E4)}else return g()}});var r=q.canvas;if(r){r.Ra=r.requestPointerLock||r.mozRequestPointerLock||r.webkitRequestPointerLock||r.msRequestPointerLock||p();r.lb=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||p();r.lb=r.lb.bind(document);var w=function(){Gc=document.pointerLockElement===r||document.mozPointerLockElement===r||document.webkitPointerLockElement===r||document.msPointerLockElement===r};document.addEventListener("pointerlockchange",
+w,n);document.addEventListener("mozpointerlockchange",w,n);document.addEventListener("webkitpointerlockchange",w,n);document.addEventListener("mspointerlockchange",w,n);q.elementPointerLock&&r.addEventListener("click",function(a){!Gc&&r.Ra&&(r.Ra(),a.preventDefault())},n)}}var C=b?sb(U(a+"/"+b)):a;$a();if("string"==typeof c){var H=h,I=function(){H?H():e('Loading data file "'+c+'" failed.')},D=new XMLHttpRequest;D.open("GET",c,l);D.responseType="arraybuffer";D.onload=function(){if(200==D.status||0==
+D.status&&D.response){var a=D.response;z(a,'Loading data file "'+c+'" failed (no arrayBuffer).');a=new Uint8Array(a);y(a);ab()}else I()};D.onerror=I;D.send(m);$a()}else y(c)};
+q.FS_createLazyFile=function(a,b,c,d,f){var g,h;function k(){this.Ma=n;this.la=[]}k.prototype.get=function(a){if(!(a>this.length-1||0>a)){var b=a%this.Xb;return this.dc(Math.floor(a/this.Xb))[b]}};k.prototype.vc=function(a){this.dc=a};k.prototype.gb=function(){var a=new XMLHttpRequest;a.open("HEAD",c,n);a.send(m);200<=a.status&&300>a.status||304===a.status||e(Error("Couldn't load "+c+". Status: "+a.status));var b=Number(a.getResponseHeader("Content-length")),d,f=1048576;if(!((d=a.getResponseHeader("Accept-Ranges"))&&
+"bytes"===d))f=b;var g=this;g.vc(function(a){var d=a*f,h=(a+1)*f-1,h=Math.min(h,b-1);if("undefined"===typeof g.la[a]){var k=g.la;d>h&&e(Error("invalid range ("+d+", "+h+") or no bytes requested!"));h>b-1&&e(Error("only "+b+" bytes available! programmer error!"));var j=new XMLHttpRequest;j.open("GET",c,n);b!==f&&j.setRequestHeader("Range","bytes="+d+"-"+h);"undefined"!=typeof Uint8Array&&(j.responseType="arraybuffer");j.overrideMimeType&&j.overrideMimeType("text/plain; charset=x-user-defined");j.send(m);
+200<=j.status&&300>j.status||304===j.status||e(Error("Couldn't load "+c+". Status: "+j.status));d=j.response!==i?new Uint8Array(j.response||[]):K(j.responseText||"",l);k[a]=d}"undefined"===typeof g.la[a]&&e(Error("doXHR failed!"));return g.la[a]});this.Sb=b;this.Rb=f;this.Ma=l};"undefined"!==typeof XMLHttpRequest?(da||e("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"),g=new k,Object.defineProperty(g,"length",{get:function(){this.Ma||
+this.gb();return this.Sb}}),Object.defineProperty(g,"chunkSize",{get:function(){this.Ma||this.gb();return this.Rb}}),h=i):(h=c,g=i);var j,a=U(("string"===typeof a?a:Kb(a))+"/"+b);j=Vb(a,fc(d,f));g?j.o=g:h&&(j.o=m,j.url=h);var y={};Object.keys(j.k).forEach(function(a){var b=j.k[a];y[a]=function(){ic(j)||e(new V(T.P));return b.apply(m,arguments)}});y.O=function(a,b,c,d,f){ic(j)||e(new V(T.P));a=a.e.o;if(f>=a.length)return 0;d=Math.min(a.length-f,d);z(0<=d);if(a.slice)for(var g=0;g<d;g++)b[c+g]=a[f+
+g];else for(g=0;g<d;g++)b[c+g]=a.get(f+g);return d};j.k=y;return j};q.FS_createLink=function(a,b,c){a=U(("string"===typeof a?a:Kb(a))+"/"+b);return Yb(c,a)};q.FS_createDevice=hc;nb=x.Cb(4);M[nb>>2]=0;Ma.unshift({R:p()});Oa.push({R:p()});var Vc=new x.Ea;u&&(require("fs"),process.platform.match(/^win/));Ma.push({R:function(){Z.root=Tb(Z,m)}});tc.Ab=O([0],"i8",N);
+q.requestFullScreen=function(a,b){function c(){Fc=n;var a=d.parentNode;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===a?(d.hb=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen||document.msExitFullscreen||document.exitFullscreen||
+p(),d.hb=d.hb.bind(document),Ic&&d.Ra(),Fc=l,Jc&&("undefined"!=typeof SDL&&(a=Ea[SDL.screen+0*x.Q>>2],M[SDL.screen+0*x.Q>>2]=a|8388608),Nc())):(a.parentNode.insertBefore(d,a),a.parentNode.removeChild(a),Jc&&("undefined"!=typeof SDL&&(a=Ea[SDL.screen+0*x.Q>>2],M[SDL.screen+0*x.Q>>2]=a&-8388609),Nc()));if(q.onFullScreen)q.onFullScreen(Fc);Oc(d)}Ic=a;Jc=b;"undefined"===typeof Ic&&(Ic=l);"undefined"===typeof Jc&&(Jc=n);var d=q.canvas;Hc||(Hc=l,document.addEventListener("fullscreenchange",c,n),document.addEventListener("mozfullscreenchange",
+c,n),document.addEventListener("webkitfullscreenchange",c,n),document.addEventListener("MSFullscreenChange",c,n));var f=document.createElement("div");d.parentNode.insertBefore(f,d);f.appendChild(d);f.tc=f.requestFullScreen||f.mozRequestFullScreen||f.msRequestFullscreen||(f.webkitRequestFullScreen?function(){f.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:m);f.tc()};q.requestAnimationFrame=function(a){Kc(a)};q.setCanvasSize=function(a,b,c){Oc(q.canvas,a,b);c||Nc()};
+q.pauseMainLoop=function(){zc=l};q.resumeMainLoop=function(){Ac&&(Ac=n,xc());zc=n};q.getUserMedia=function(){window.qb||(window.qb=navigator.getUserMedia||navigator.mozGetUserMedia);window.qb(i)};Ga=v=x.U(ja);Ha=Ga+5242880;Ia=G=x.U(Ha);z(Ia<ka,"TOTAL_MEMORY not big enough for stack");ta=Math.min;
+var $=(function(global,env,buffer) {
+// EMSCRIPTEN_START_ASM
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.__ZTISt9exception|0;var n=0;var o=0;var p=0;var q=0;var r=+env.NaN,s=+env.Infinity;var t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0;var C=0;var D=0;var E=0;var F=0;var G=0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=global.Math.floor;var N=global.Math.abs;var O=global.Math.sqrt;var P=global.Math.pow;var Q=global.Math.cos;var R=global.Math.sin;var S=global.Math.tan;var T=global.Math.acos;var U=global.Math.asin;var V=global.Math.atan;var W=global.Math.atan2;var X=global.Math.exp;var Y=global.Math.log;var Z=global.Math.ceil;var _=global.Math.imul;var $=env.abort;var aa=env.assert;var ba=env.asmPrintInt;var ca=env.asmPrintFloat;var da=env.min;var ea=env.invoke_iiii;var fa=env.invoke_viiiii;var ga=env.invoke_vi;var ha=env.invoke_vii;var ia=env.invoke_ii;var ja=env.invoke_viii;var ka=env.invoke_v;var la=env.invoke_viid;var ma=env.invoke_viiiiii;var na=env.invoke_iii;var oa=env.invoke_iiiiii;var pa=env.invoke_viiii;var qa=env.___cxa_throw;var ra=env._emscripten_run_script;var sa=env._cosf;var ta=env._send;var ua=env.__ZSt9terminatev;var va=env.__reallyNegative;var wa=env.___cxa_is_number_type;var xa=env.___assert_fail;var ya=env.___cxa_allocate_exception;var za=env.___cxa_find_matching_catch;var Aa=env._fflush;var Ba=env._pwrite;var Ca=env.___setErrNo;var Da=env._sbrk;var Ea=env.___cxa_begin_catch;var Fa=env._sinf;var Ga=env._fileno;var Ha=env.___resumeException;var Ia=env.__ZSt18uncaught_exceptionv;var Ja=env._sysconf;var Ka=env._clock;var La=env._emscripten_memcpy_big;var Ma=env._puts;var Na=env._mkport;var Oa=env._floorf;var Pa=env._sqrtf;var Qa=env._write;var Ra=env._emscripten_set_main_loop;var Sa=env.___errno_location;var Ta=env.__ZNSt9exceptionD2Ev;var Ua=env._printf;var Va=env.___cxa_does_inherit;var Wa=env.__exit;var Xa=env._fputc;var Ya=env._abort;var Za=env._fwrite;var _a=env._time;var $a=env._fprintf;var ab=env._emscripten_cancel_main_loop;var bb=env.__formatString;var cb=env._fputs;var db=env._exit;var eb=env.___cxa_pure_virtual;var fb=0.0;
+// EMSCRIPTEN_START_FUNCS
+function sb(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function tb(){return i|0}function ub(a){a=a|0;i=a}function vb(a,b){a=a|0;b=b|0;if((n|0)==0){n=a;o=b}}function wb(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0]}function xb(b){b=b|0;a[k>>0]=a[b>>0];a[k+1>>0]=a[b+1>>0];a[k+2>>0]=a[b+2>>0];a[k+3>>0]=a[b+3>>0];a[k+4>>0]=a[b+4>>0];a[k+5>>0]=a[b+5>>0];a[k+6>>0]=a[b+6>>0];a[k+7>>0]=a[b+7>>0]}function yb(a){a=a|0;C=a}function zb(){return C|0}function Ab(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0.0,j=0.0,k=0,l=0.0,m=0,n=0.0;d=i;e=c[4]|0;f=i;i=i+((4*e|0)+15&-16)|0;k=(e|0)>0;if(k){m=0;j=0.0;do{l=+(c[b+(m<<2)>>2]|0)/1.0e6*1.0e3;g[f+(m<<2)>>2]=l;j=j+l;m=m+1|0}while((m|0)<(e|0));h=+(e|0);j=j/h;g[a>>2]=j;if(k){k=0;l=0.0;do{n=+g[f+(k<<2)>>2]-j;l=l+n*n;k=k+1|0}while((k|0)<(e|0))}else{l=0.0}}else{h=+(e|0);g[a>>2]=0.0/h;l=0.0}g[a+4>>2]=+O(+(l/h));i=d;return}function Bb(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0;f=i;i=i+240|0;j=f;q=f+224|0;h=f+168|0;n=f+160|0;m=f+152|0;a:do{if((d|0)>1){s=a[c[e+4>>2]>>0]|0;switch(s|0){case 49:{c[2]=5;c[4]=35;s=5;t=35;break a};case 50:{c[2]=32;c[4]=161;s=32;t=161;break a};case 51:{r=5;break a};case 52:{c[2]=320;c[4]=2331;s=320;t=2331;break a};case 53:{c[2]=640;c[4]=5661;s=640;t=5661;break a};case 48:{y=0;i=f;return y|0};default:{c[j>>2]=s+ -48;Ua(80,j|0)|0;y=-1;i=f;return y|0}}}else{r=5}}while(0);if((r|0)==5){c[2]=64;c[4]=333;s=64;t=333}r=t+s|0;c[4]=r;c[2]=0;c[8]=Pe(r>>>0>1073741823?-1:r<<2)|0;g[q>>2]=0.0;g[q+4>>2]=-10.0;t=Oe(103028)|0;Ec(t,q);c[6]=t;Gc(t,0);c[j+44>>2]=0;t=j+4|0;s=j+36|0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;a[s>>0]=1;a[j+37>>0]=1;a[j+38>>0]=0;a[j+39>>0]=0;c[j>>2]=0;a[j+40>>0]=1;g[j+48>>2]=1.0;s=Fc(c[6]|0,j)|0;c[h>>2]=240;c[h+4>>2]=1;g[h+8>>2]=.009999999776482582;t=h+28|0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;b[t+16>>1]=0;g[n>>2]=-40.0;g[n+4>>2]=0.0;g[m>>2]=40.0;g[m+4>>2]=0.0;Hb(h,n,m);dc(s,h,0.0)|0;c[j>>2]=504;c[j+4>>2]=2;g[j+8>>2]=.009999999776482582;c[j+148>>2]=0;g[j+12>>2]=0.0;g[j+16>>2]=0.0;Pb(j,.5,.5);s=h+44|0;t=h+4|0;m=h+36|0;v=h+37|0;w=h+38|0;x=h+39|0;y=h+40|0;r=h+48|0;q=h+4|0;n=0;p=-7.0;o=.75;while(1){u=n;l=p;k=o;while(1){c[s>>2]=0;c[t+0>>2]=0;c[t+4>>2]=0;c[t+8>>2]=0;c[t+12>>2]=0;c[t+16>>2]=0;c[t+20>>2]=0;c[t+24>>2]=0;c[t+28>>2]=0;a[m>>0]=1;a[v>>0]=1;a[w>>0]=0;a[x>>0]=0;a[y>>0]=1;g[r>>2]=1.0;c[h>>2]=2;B=+l;A=+k;z=q;g[z>>2]=B;g[z+4>>2]=A;z=Fc(c[6]|0,h)|0;dc(z,j,5.0)|0;c[14]=z;u=u+1|0;if((u|0)>=40){break}else{l=l+1.125;k=k+0.0}}n=n+1|0;if((n|0)>=40){break}else{p=p+.5625;o=o+1.0}}if((c[2]|0)>0){h=0;do{Jc(c[6]|0,.01666666753590107,3,3);h=h+1|0}while((h|0)<(c[2]|0))}if((d|0)>2){z=(a[c[e+8>>2]>>0]|0)+ -48|0;c[18]=z;if((z|0)!=0){Ma(208)|0;Ra(2,60,1);z=0;i=f;return z|0}}else{c[18]=0}while(1){Eb();if((c[16]|0)>(c[4]|0)){e=0;break}}i=f;return e|0}function Cb(a){a=a|0;return}function Db(a){a=a|0;return}function Eb(){var a=0,b=0,d=0,e=0,f=0.0,j=0.0,l=0.0;a=i;i=i+48|0;b=a;d=a+32|0;e=c[16]|0;if((e|0)>=(c[4]|0)){c[16]=e+1;Ab(d,c[8]|0);l=+g[d+4>>2];j=+(c[10]|0)/1.0e6*1.0e3;f=+(c[12]|0)/1.0e6*1.0e3;h[k>>3]=+g[d>>2];c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];e=b+8|0;h[k>>3]=l;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];e=b+16|0;h[k>>3]=j;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];e=b+24|0;h[k>>3]=f;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];Ua(96,b|0)|0;ra(152);if((c[18]|0)==0){i=a;return}ab();i=a;return}d=Ka()|0;Jc(c[6]|0,.01666666753590107,3,3);d=(Ka()|0)-d|0;b=c[16]|0;c[(c[8]|0)+(b<<2)>>2]=d;if((d|0)<(c[10]|0)){c[10]=d}if((d|0)>(c[12]|0)){c[12]=d}c[16]=b+1;i=a;return}function Fb(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Gb(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Hb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0;g=d;d=c[g+4>>2]|0;f=b+12|0;c[f>>2]=c[g>>2];c[f+4>>2]=d;f=e;e=c[f+4>>2]|0;d=b+20|0;c[d>>2]=c[f>>2];c[d+4>>2]=e;a[b+44>>0]=0;a[b+45>>0]=0;return}function Ib(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;d=Xb(d,48)|0;if((d|0)==0){d=0}else{c[d>>2]=240;c[d+4>>2]=1;g[d+8>>2]=.009999999776482582;f=d+28|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;b[f+16>>1]=0}j=a+4|0;h=c[j+4>>2]|0;f=d+4|0;c[f>>2]=c[j>>2];c[f+4>>2]=h;f=d+12|0;a=a+12|0;c[f+0>>2]=c[a+0>>2];c[f+4>>2]=c[a+4>>2];c[f+8>>2]=c[a+8>>2];c[f+12>>2]=c[a+12>>2];c[f+16>>2]=c[a+16>>2];c[f+20>>2]=c[a+20>>2];c[f+24>>2]=c[a+24>>2];c[f+28>>2]=c[a+28>>2];b[f+32>>1]=b[a+32>>1]|0;i=e;return d|0}function Jb(a){a=a|0;return 1}function Kb(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Lb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;e=i;j=+g[d>>2];k=+g[c>>2]-j;m=+g[d+4>>2];f=+g[c+4>>2]-m;o=+g[d+12>>2];h=+g[d+8>>2];l=k*o+f*h;k=o*f-k*h;j=+g[c+8>>2]-j;m=+g[c+12>>2]-m;f=o*j+h*m-l;j=o*m-h*j-k;d=a+12|0;h=+g[d>>2];m=+g[d+4>>2];d=a+20|0;o=+g[d>>2];o=o-h;p=+g[d+4>>2]-m;s=-o;n=o*o+p*p;q=+O(+n);if(q<1.1920928955078125e-7){q=p}else{t=1.0/q;q=p*t;s=t*s}r=(m-k)*s+(h-l)*q;t=j*s+f*q;if(t==0.0){d=0;i=e;return d|0}t=r/t;if(t<0.0){d=0;i=e;return d|0}if(+g[c+16>>2]<t|n==0.0){d=0;i=e;return d|0}p=(o*(l+f*t-h)+p*(k+j*t-m))/n;if(p<0.0|p>1.0){d=0;i=e;return d|0}g[b+8>>2]=t;if(r>0.0){r=+-q;t=+-s;d=b;g[d>>2]=r;g[d+4>>2]=t;d=1;i=e;return d|0}else{r=+q;t=+s;d=b;g[d>>2]=r;g[d+4>>2]=t;d=1;i=e;return d|0}return 0}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0.0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;d=i;k=+g[c+12>>2];l=+g[a+12>>2];m=+g[c+8>>2];e=+g[a+16>>2];j=+g[c>>2];h=j+(k*l-m*e);n=+g[c+4>>2];e=l*m+k*e+n;l=+g[a+20>>2];f=+g[a+24>>2];j=j+(k*l-m*f);f=n+(m*l+k*f);k=+g[a+8>>2];l=+((h<j?h:j)-k);n=+((e<f?e:f)-k);c=b;g[c>>2]=l;g[c+4>>2]=n;h=+(k+(h>j?h:j));n=+(k+(e>f?e:f));c=b+8|0;g[c>>2]=h;g[c+4>>2]=n;i=d;return}function Nb(a,b,c){a=a|0;b=b|0;c=+c;var d=0,e=0.0;d=i;g[b>>2]=0.0;e=+((+g[a+12>>2]+ +g[a+20>>2])*.5);c=+((+g[a+16>>2]+ +g[a+24>>2])*.5);a=b+4|0;g[a>>2]=e;g[a+4>>2]=c;g[b+12>>2]=0.0;i=d;return}function Ob(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0;d=i;b=Xb(b,152)|0;if((b|0)==0){b=0}else{c[b>>2]=504;c[b+4>>2]=2;g[b+8>>2]=.009999999776482582;c[b+148>>2]=0;g[b+12>>2]=0.0;g[b+16>>2]=0.0}h=a+4|0;f=c[h+4>>2]|0;e=b+4|0;c[e>>2]=c[h>>2];c[e+4>>2]=f;Xe(b+12|0,a+12|0,140)|0;i=d;return b|0}function Pb(a,b,d){a=a|0;b=+b;d=+d;var e=0.0,f=0.0;c[a+148>>2]=4;e=-b;f=-d;g[a+20>>2]=e;g[a+24>>2]=f;g[a+28>>2]=b;g[a+32>>2]=f;g[a+36>>2]=b;g[a+40>>2]=d;g[a+44>>2]=e;g[a+48>>2]=d;g[a+84>>2]=0.0;g[a+88>>2]=-1.0;g[a+92>>2]=1.0;g[a+96>>2]=0.0;g[a+100>>2]=0.0;g[a+104>>2]=1.0;g[a+108>>2]=-1.0;g[a+112>>2]=0.0;g[a+12>>2]=0.0;g[a+16>>2]=0.0;return}function Qb(a){a=a|0;return 1}function Rb(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,h=0.0,j=0,k=0.0,l=0.0,m=0.0;e=i;k=+g[d>>2]- +g[b>>2];l=+g[d+4>>2]- +g[b+4>>2];m=+g[b+12>>2];h=+g[b+8>>2];f=k*m+l*h;h=m*l-k*h;b=c[a+148>>2]|0;if((b|0)>0){d=0}else{j=1;i=e;return j|0}while(1){j=d+1|0;if((f- +g[a+(d<<3)+20>>2])*+g[a+(d<<3)+84>>2]+(h- +g[a+(d<<3)+24>>2])*+g[a+(d<<3)+88>>2]>0.0){b=0;a=4;break}if((j|0)<(b|0)){d=j}else{b=1;a=4;break}}if((a|0)==4){i=e;return b|0}return 0}function Sb(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;f=i;m=+g[e>>2];l=+g[d>>2]-m;u=+g[e+4>>2];n=+g[d+4>>2]-u;k=e+12|0;t=+g[k>>2];e=e+8|0;v=+g[e>>2];o=l*t+n*v;l=t*n-l*v;m=+g[d+8>>2]-m;u=+g[d+12>>2]-u;n=t*m+v*u-o;m=t*u-v*m-l;d=d+16|0;q=c[a+148>>2]|0;do{if((q|0)>0){s=0;r=-1;p=0.0;t=+g[d>>2];a:while(1){w=+g[a+(s<<3)+84>>2];v=+g[a+(s<<3)+88>>2];u=(+g[a+(s<<3)+20>>2]-o)*w+(+g[a+(s<<3)+24>>2]-l)*v;v=n*w+m*v;do{if(v==0.0){if(u<0.0){a=0;q=18;break a}}else{if(v<0.0?u<p*v:0){r=s;p=u/v;break}if(v>0.0?u<t*v:0){t=u/v}}}while(0);s=s+1|0;if(t<p){a=0;q=18;break}if((s|0)>=(q|0)){q=13;break}}if((q|0)==13){if(p>=0.0){h=r;j=p;break}xa(376,328,249,424)}else if((q|0)==18){i=f;return a|0}}else{h=-1;j=0.0}}while(0);if(!(j<=+g[d>>2])){xa(376,328,249,424)}if(!((h|0)>-1)){s=0;i=f;return s|0}g[b+8>>2]=j;u=+g[k>>2];p=+g[a+(h<<3)+84>>2];t=+g[e>>2];w=+g[a+(h<<3)+88>>2];v=+(u*p-t*w);w=+(p*t+u*w);s=b;g[s>>2]=v;g[s+4>>2]=w;s=1;i=f;return s|0}function Tb(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0;e=i;h=+g[d+12>>2];r=+g[a+20>>2];j=+g[d+8>>2];n=+g[a+24>>2];f=+g[d>>2];q=f+(h*r-j*n);k=+g[d+4>>2];n=r*j+h*n+k;d=c[a+148>>2]|0;if((d|0)>1){m=n;l=q;o=q;p=1;do{s=+g[a+(p<<3)+20>>2];q=+g[a+(p<<3)+24>>2];r=f+(h*s-j*q);q=s*j+h*q+k;o=o<r?o:r;m=m<q?m:q;l=l>r?l:r;n=n>q?n:q;p=p+1|0}while((p|0)<(d|0))}else{m=n;o=q;l=q}s=+g[a+8>>2];q=+(o-s);r=+(m-s);p=b;g[p>>2]=q;g[p+4>>2]=r;r=+(l+s);s=+(n+s);p=b+8|0;g[p>>2]=r;g[p+4>>2]=s;i=e;return}function Ub(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0;e=i;f=c[a+148>>2]|0;if((f|0)>2){h=0.0;j=0.0;o=0}else{xa(432,328,306,456)}do{h=h+ +g[a+(o<<3)+20>>2];j=j+ +g[a+(o<<3)+24>>2];o=o+1|0}while((o|0)<(f|0));n=1.0/+(f|0);h=h*n;n=j*n;s=a+20|0;v=a+24|0;l=0.0;m=0.0;j=0.0;k=0.0;t=0;do{u=+g[a+(t<<3)+20>>2]-h;p=+g[a+(t<<3)+24>>2]-n;t=t+1|0;o=(t|0)<(f|0);if(o){q=a+(t<<3)+20|0;r=a+(t<<3)+24|0}else{q=s;r=v}x=+g[q>>2]-h;w=+g[r>>2]-n;y=u*w-p*x;z=y*.5;k=k+z;z=z*.3333333432674408;l=l+(u+x)*z;m=m+(p+w)*z;j=j+y*.0833333358168602*(x*x+(u*u+u*x)+(w*w+(p*p+p*w)))}while(o);p=k*d;g[b>>2]=p;if(k>1.1920928955078125e-7){z=1.0/k;y=l*z;z=m*z;w=h+y;x=n+z;n=+w;u=+x;v=b+4|0;g[v>>2]=n;g[v+4>>2]=u;g[b+12>>2]=j*d+p*(w*w+x*x-(y*y+z*z));i=e;return}else{xa(472,328,352,456)}}function Vb(b){b=b|0;var d=0,e=0,f=0,g=0;e=i;f=b+8|0;c[f>>2]=128;c[b+4>>2]=0;g=Zb(1024)|0;c[b>>2]=g;Ve(g|0,0,c[f>>2]<<3|0)|0;f=b+12|0;b=f+56|0;do{c[f>>2]=0;f=f+4|0}while((f|0)<(b|0));if((a[1280]|0)==0){b=1;f=0}else{i=e;return}do{if((f|0)>=14){d=3;break}if((b|0)>(c[576+(f<<2)>>2]|0)){f=f+1|0;a[632+b>>0]=f}else{a[632+b>>0]=f}b=b+1|0}while((b|0)<641);if((d|0)==3){xa(1288,1312,73,1352)}a[1280]=1;i=e;return}function Wb(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=a+4|0;e=c[a>>2]|0;if((c[d>>2]|0)>0){f=0}else{f=e;_b(f);i=b;return}do{_b(c[e+(f<<3)+4>>2]|0);f=f+1|0;e=c[a>>2]|0}while((f|0)<(c[d>>2]|0));_b(e);i=b;return}function Xb(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;if((d|0)==0){l=0;i=e;return l|0}if((d|0)<=0){xa(1376,1312,104,1392)}if((d|0)>640){l=Zb(d)|0;i=e;return l|0}l=a[632+d>>0]|0;g=l&255;if(!((l&255)<14)){xa(1408,1312,112,1392)}d=b+(g<<2)+12|0;f=c[d>>2]|0;if((f|0)!=0){c[d>>2]=c[f>>2];l=f;i=e;return l|0}f=b+4|0;h=c[f>>2]|0;j=b+8|0;if((h|0)==(c[j>>2]|0)){l=c[b>>2]|0;h=h+128|0;c[j>>2]=h;h=Zb(h<<3)|0;c[b>>2]=h;Xe(h|0,l|0,c[f>>2]<<3|0)|0;Ve((c[b>>2]|0)+(c[f>>2]<<3)|0,0,1024)|0;_b(l);h=c[f>>2]|0}l=c[b>>2]|0;j=Zb(16384)|0;b=l+(h<<3)+4|0;c[b>>2]=j;g=c[576+(g<<2)>>2]|0;c[l+(h<<3)>>2]=g;h=16384/(g|0)|0;if((_(h,g)|0)>=16385){xa(1448,1312,140,1392)}h=h+ -1|0;if((h|0)>0){l=0;while(1){k=l+1|0;c[j+(_(l,g)|0)>>2]=j+(_(k,g)|0);j=c[b>>2]|0;if((k|0)==(h|0)){break}else{l=k}}}c[j+(_(h,g)|0)>>2]=0;c[d>>2]=c[c[b>>2]>>2];c[f>>2]=(c[f>>2]|0)+1;l=c[b>>2]|0;i=e;return l|0}function Yb(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=i;if((e|0)==0){i=f;return}if((e|0)<=0){xa(1376,1312,164,1488)}if((e|0)>640){_b(d);i=f;return}e=a[632+e>>0]|0;if(!((e&255)<14)){xa(1408,1312,173,1488)}e=b+((e&255)<<2)+12|0;c[d>>2]=c[e>>2];c[e>>2]=d;i=f;return}function Zb(a){a=a|0;var b=0;b=i;a=Me(a)|0;i=b;return a|0}function _b(a){a=a|0;var b=0;b=i;Ne(a);i=b;return}function $b(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0;h=i;n=e+4|0;r=+g[n>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1496,1520,27,1552)}r=+g[e+8>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1496,1520,27,1552)}k=e+16|0;r=+g[k>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1560,1520,28,1552)}r=+g[e+20>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1560,1520,28,1552)}l=e+12|0;r=+g[l>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1592,1520,29,1552)}m=e+24|0;r=+g[m>>2];if(!(r==r&0.0==0.0&r>-s&r<s)){xa(1616,1520,30,1552)}j=e+32|0;r=+g[j>>2];if(!(r>=0.0)|r==r&0.0==0.0&r>-s&r<s^1){xa(1648,1520,31,1552)}o=e+28|0;r=+g[o>>2];if(!(r>=0.0)|r==r&0.0==0.0&r>-s&r<s^1){xa(1712,1520,32,1552)}p=d+4|0;q=(a[e+39>>0]|0)==0?0:8;b[p>>1]=q;if((a[e+38>>0]|0)!=0){q=(q&65535|16)&65535;b[p>>1]=q}if((a[e+36>>0]|0)!=0){q=(q&65535|4)&65535;b[p>>1]=q}if((a[e+37>>0]|0)!=0){q=(q&65535|2)&65535;b[p>>1]=q}if((a[e+40>>0]|0)!=0){b[p>>1]=q&65535|32}c[d+88>>2]=f;p=n;q=c[p>>2]|0;p=c[p+4>>2]|0;n=d+12|0;c[n>>2]=q;c[n+4>>2]=p;r=+g[l>>2];g[d+20>>2]=+R(+r);g[d+24>>2]=+Q(+r);g[d+28>>2]=0.0;g[d+32>>2]=0.0;n=d+36|0;c[n>>2]=q;c[n+4>>2]=p;n=d+44|0;c[n>>2]=q;c[n+4>>2]=p;g[d+52>>2]=+g[l>>2];g[d+56>>2]=+g[l>>2];g[d+60>>2]=0.0;c[d+108>>2]=0;c[d+112>>2]=0;c[d+92>>2]=0;c[d+96>>2]=0;n=k;p=c[n+4>>2]|0;q=d+64|0;c[q>>2]=c[n>>2];c[q+4>>2]=p;g[d+72>>2]=+g[m>>2];g[d+132>>2]=+g[o>>2];g[d+136>>2]=+g[j>>2];g[d+140>>2]=+g[e+48>>2];g[d+76>>2]=0.0;g[d+80>>2]=0.0;g[d+84>>2]=0.0;g[d+144>>2]=0.0;q=c[e>>2]|0;c[d>>2]=q;j=d+116|0;if((q|0)==2){g[j>>2]=1.0;g[d+120>>2]=1.0;p=d+124|0;g[p>>2]=0.0;p=d+128|0;g[p>>2]=0.0;p=e+44|0;p=c[p>>2]|0;q=d+148|0;c[q>>2]=p;q=d+100|0;c[q>>2]=0;q=d+104|0;c[q>>2]=0;i=h;return}else{g[j>>2]=0.0;g[d+120>>2]=0.0;p=d+124|0;g[p>>2]=0.0;p=d+128|0;g[p>>2]=0.0;p=e+44|0;p=c[p>>2]|0;q=d+148|0;c[q>>2]=p;q=d+100|0;c[q>>2]=0;q=d+104|0;c[q>>2]=0;i=h;return}}function ac(a){a=a|0;var d=0,e=0,f=0,h=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0;k=i;i=i+16|0;n=k;m=a+116|0;l=a+120|0;e=a+124|0;f=a+128|0;d=a+28|0;g[d>>2]=0.0;g[a+32>>2]=0.0;c[m+0>>2]=0;c[m+4>>2]=0;c[m+8>>2]=0;c[m+12>>2]=0;o=c[a>>2]|0;if((o|0)==1|(o|0)==0){q=a+12|0;p=c[q>>2]|0;q=c[q+4>>2]|0;s=a+36|0;c[s>>2]=p;c[s+4>>2]=q;s=a+44|0;c[s>>2]=p;c[s+4>>2]=q;g[a+52>>2]=+g[a+56>>2];i=k;return}else if((o|0)==2){s=3784;v=+g[s>>2];r=+g[s+4>>2];s=c[a+100>>2]|0;if((s|0)!=0){q=n+4|0;o=n+8|0;p=n+12|0;t=0.0;u=0.0;do{w=+g[s>>2];if(!(w==0.0)){x=c[s+12>>2]|0;nb[c[(c[x>>2]|0)+28>>2]&3](x,n,w);t=+g[n>>2];u=t+ +g[m>>2];g[m>>2]=u;v=v+t*+g[q>>2];r=r+t*+g[o>>2];t=+g[p>>2]+ +g[e>>2];g[e>>2]=t}s=c[s+4>>2]|0}while((s|0)!=0);if(u>0.0){w=1.0/u;g[l>>2]=w;v=v*w;r=r*w}else{h=11}}else{t=0.0;h=11}if((h|0)==11){g[m>>2]=1.0;g[l>>2]=1.0;u=1.0}do{if(t>0.0?(b[a+4>>1]&16)==0:0){t=t-(r*r+v*v)*u;g[e>>2]=t;if(t>0.0){j=1.0/t;break}else{xa(1872,1520,319,1856)}}else{h=17}}while(0);if((h|0)==17){g[e>>2]=0.0;j=0.0}g[f>>2]=j;x=a+44|0;s=x;w=+g[s>>2];t=+g[s+4>>2];y=+v;j=+r;s=d;g[s>>2]=y;g[s+4>>2]=j;j=+g[a+24>>2];y=+g[a+20>>2];u=+g[a+12>>2]+(j*v-y*r);r=v*y+j*r+ +g[a+16>>2];j=+u;v=+r;g[x>>2]=j;g[x+4>>2]=v;x=a+36|0;g[x>>2]=j;g[x+4>>2]=v;v=+g[a+72>>2];x=a+64|0;g[x>>2]=+g[x>>2]-v*(r-t);x=a+68|0;g[x>>2]=v*(u-w)+ +g[x>>2];i=k;return}else{xa(1824,1520,284,1856)}}function bc(a){a=a|0;var b=0,d=0,e=0,f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0;b=i;i=i+16|0;e=b;k=+g[a+52>>2];l=+R(+k);g[e+8>>2]=l;k=+Q(+k);g[e+12>>2]=k;m=+g[a+28>>2];h=+g[a+32>>2];j=+(+g[a+36>>2]-(k*m-l*h));h=+(+g[a+40>>2]-(m*l+k*h));d=e;g[d>>2]=j;g[d+4>>2]=h;d=(c[a+88>>2]|0)+102872|0;f=c[a+100>>2]|0;if((f|0)==0){i=b;return}a=a+12|0;do{Dc(f,d,e,a);f=c[f+4>>2]|0}while((f|0)!=0);i=b;return}function cc(a,d){a=a|0;d=d|0;var e=0,f=0,h=0,j=0;f=i;e=a+88|0;h=c[e>>2]|0;if((c[h+102868>>2]&2|0)!=0){xa(1776,1520,153,1808)}j=Xb(h,44)|0;if((j|0)==0){j=0}else{Ac(j)}Bc(j,h,a,d);if(!((b[a+4>>1]&32)==0)){Cc(j,(c[e>>2]|0)+102872|0,a+12|0)}d=a+100|0;c[j+4>>2]=c[d>>2];c[d>>2]=j;d=a+104|0;c[d>>2]=(c[d>>2]|0)+1;c[j+8>>2]=a;if(!(+g[j>>2]>0.0)){d=c[e>>2]|0;d=d+102868|0;h=c[d>>2]|0;h=h|1;c[d>>2]=h;i=f;return j|0}ac(a);d=c[e>>2]|0;d=d+102868|0;h=c[d>>2]|0;h=h|1;c[d>>2]=h;i=f;return j|0}function dc(d,e,f){d=d|0;e=e|0;f=+f;var h=0,j=0;h=i;i=i+32|0;j=h;b[j+22>>1]=1;b[j+24>>1]=-1;b[j+26>>1]=0;c[j+4>>2]=0;g[j+8>>2]=.20000000298023224;g[j+12>>2]=0.0;a[j+20>>0]=0;c[j>>2]=e;g[j+16>>2]=f;e=cc(d,j)|0;i=h;return e|0}function ec(b,d){b=b|0;d=d|0;var e=0,f=0;e=i;if((c[b>>2]|0)!=2?(c[d>>2]|0)!=2:0){d=0}else{f=3}a:do{if((f|0)==3){f=c[b+108>>2]|0;if((f|0)==0){d=1}else{while(1){if((c[f>>2]|0)==(d|0)?(a[(c[f+4>>2]|0)+61>>0]|0)==0:0){d=0;break a}f=c[f+12>>2]|0;if((f|0)==0){d=1;break}}}}}while(0);i=e;return d|0}function fc(a){a=a|0;return}function gc(a){a=a|0;return}function hc(a){a=a|0;var b=0;b=i;Lc(a);c[a+60>>2]=0;c[a+64>>2]=0;c[a+68>>2]=1888;c[a+72>>2]=1896;c[a+76>>2]=0;i=b;return}function ic(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;f=c[(c[b+48>>2]|0)+8>>2]|0;e=c[(c[b+52>>2]|0)+8>>2]|0;g=c[a+72>>2]|0;if((g|0)!=0?(c[b+4>>2]&2|0)!=0:0){jb[c[(c[g>>2]|0)+12>>2]&15](g,b)}h=b+8|0;j=c[h>>2]|0;g=b+12|0;if((j|0)!=0){c[j+12>>2]=c[g>>2]}j=c[g>>2]|0;if((j|0)!=0){c[j+8>>2]=c[h>>2]}h=a+60|0;if((c[h>>2]|0)==(b|0)){c[h>>2]=c[g>>2]}h=b+24|0;j=c[h>>2]|0;g=b+28|0;if((j|0)!=0){c[j+12>>2]=c[g>>2]}j=c[g>>2]|0;if((j|0)!=0){c[j+8>>2]=c[h>>2]}f=f+112|0;if((b+16|0)==(c[f>>2]|0)){c[f>>2]=c[g>>2]}g=b+40|0;h=c[g>>2]|0;f=b+44|0;if((h|0)!=0){c[h+12>>2]=c[f>>2]}h=c[f>>2]|0;if((h|0)!=0){c[h+8>>2]=c[g>>2]}e=e+112|0;if((b+32|0)!=(c[e>>2]|0)){j=a+76|0;j=c[j>>2]|0;md(b,j);j=a+64|0;h=c[j>>2]|0;h=h+ -1|0;c[j>>2]=h;i=d;return}c[e>>2]=c[f>>2];j=a+76|0;j=c[j>>2]|0;md(b,j);j=a+64|0;h=c[j>>2]|0;h=h+ -1|0;c[j>>2]=h;i=d;return}function jc(a){a=a|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=i;l=c[a+60>>2]|0;if((l|0)==0){i=e;return}k=a+12|0;j=a+4|0;h=a+72|0;f=a+68|0;a:while(1){p=c[l+48>>2]|0;n=c[l+52>>2]|0;o=c[l+56>>2]|0;m=c[l+60>>2]|0;s=c[p+8>>2]|0;q=c[n+8>>2]|0;t=l+4|0;do{if((c[t>>2]&8|0)==0){d=11}else{if(!(ec(q,s)|0)){t=c[l+12>>2]|0;ic(a,l);l=t;break}r=c[f>>2]|0;if((r|0)!=0?!(gb[c[(c[r>>2]|0)+8>>2]&7](r,p,n)|0):0){t=c[l+12>>2]|0;ic(a,l);l=t;break}c[t>>2]=c[t>>2]&-9;d=11}}while(0);do{if((d|0)==11){d=0;if((b[s+4>>1]&2)==0){r=0}else{r=(c[s>>2]|0)!=0}if((b[q+4>>1]&2)==0){q=0}else{q=(c[q>>2]|0)!=0}if(!(r|q)){l=c[l+12>>2]|0;break}o=c[(c[p+24>>2]|0)+(o*28|0)+24>>2]|0;m=c[(c[n+24>>2]|0)+(m*28|0)+24>>2]|0;if(!((o|0)>-1)){d=19;break a}n=c[k>>2]|0;if((n|0)<=(o|0)){d=19;break a}p=c[j>>2]|0;if(!((m|0)>-1&(n|0)>(m|0))){d=21;break a}if(+g[p+(m*36|0)>>2]- +g[p+(o*36|0)+8>>2]>0.0|+g[p+(m*36|0)+4>>2]- +g[p+(o*36|0)+12>>2]>0.0|+g[p+(o*36|0)>>2]- +g[p+(m*36|0)+8>>2]>0.0|+g[p+(o*36|0)+4>>2]- +g[p+(m*36|0)+12>>2]>0.0){t=c[l+12>>2]|0;ic(a,l);l=t;break}else{od(l,c[h>>2]|0);l=c[l+12>>2]|0;break}}}while(0);if((l|0)==0){d=25;break}}if((d|0)==19){xa(1904,1952,159,2008)}else if((d|0)==21){xa(1904,1952,159,2008)}else if((d|0)==25){i=e;return}}function kc(a){a=a|0;var b=0;b=i;lc(a,a);i=b;return}function lc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+16|0;g=e;d=a+52|0;c[d>>2]=0;f=a+40|0;n=c[f>>2]|0;do{if((n|0)>0){k=a+32|0;m=a+56|0;j=a+12|0;l=a+4|0;o=0;while(1){p=c[(c[k>>2]|0)+(o<<2)>>2]|0;c[m>>2]=p;if(!((p|0)==-1)){if(!((p|0)>-1)){j=6;break}if((c[j>>2]|0)<=(p|0)){j=6;break}nc(a,a,(c[l>>2]|0)+(p*36|0)|0);n=c[f>>2]|0}o=o+1|0;if((o|0)>=(n|0)){j=9;break}}if((j|0)==6){xa(1904,1952,159,2008)}else if((j|0)==9){h=c[d>>2]|0;break}}else{h=0}}while(0);c[f>>2]=0;f=a+44|0;p=c[f>>2]|0;c[g>>2]=3;pc(p,p+(h*12|0)|0,g);if((c[d>>2]|0)<=0){i=e;return}g=a+12|0;h=a+4|0;k=0;a:while(1){j=c[f>>2]|0;a=j+(k*12|0)|0;l=c[a>>2]|0;if(!((l|0)>-1)){j=14;break}n=c[g>>2]|0;if((n|0)<=(l|0)){j=14;break}m=c[h>>2]|0;j=j+(k*12|0)+4|0;o=c[j>>2]|0;if(!((o|0)>-1&(n|0)>(o|0))){j=16;break}mc(b,c[m+(l*36|0)+16>>2]|0,c[m+(o*36|0)+16>>2]|0);l=c[d>>2]|0;while(1){k=k+1|0;if((k|0)>=(l|0)){j=21;break a}m=c[f>>2]|0;if((c[m+(k*12|0)>>2]|0)!=(c[a>>2]|0)){continue a}if((c[m+(k*12|0)+4>>2]|0)!=(c[j>>2]|0)){continue a}}}if((j|0)==14){xa(1904,1952,153,1992)}else if((j|0)==16){xa(1904,1952,153,1992)}else if((j|0)==21){i=e;return}}function mc(a,d,f){a=a|0;d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;k=c[d+16>>2]|0;j=c[f+16>>2]|0;d=c[d+20>>2]|0;f=c[f+20>>2]|0;m=c[k+8>>2]|0;l=c[j+8>>2]|0;if((m|0)==(l|0)){i=h;return}o=c[l+112>>2]|0;a:do{if((o|0)!=0){while(1){if((c[o>>2]|0)==(m|0)){n=c[o+4>>2]|0;q=c[n+48>>2]|0;r=c[n+52>>2]|0;p=c[n+56>>2]|0;n=c[n+60>>2]|0;if((q|0)==(k|0)&(r|0)==(j|0)&(p|0)==(d|0)&(n|0)==(f|0)){n=22;break}if((q|0)==(j|0)&(r|0)==(k|0)&(p|0)==(f|0)&(n|0)==(d|0)){n=22;break}}o=c[o+12>>2]|0;if((o|0)==0){break a}}if((n|0)==22){i=h;return}}}while(0);if(!(ec(l,m)|0)){i=h;return}l=c[a+68>>2]|0;if((l|0)!=0?!(gb[c[(c[l>>2]|0)+8>>2]&7](l,k,j)|0):0){i=h;return}d=ld(k,d,j,f,c[a+76>>2]|0)|0;if((d|0)==0){i=h;return}k=c[(c[d+48>>2]|0)+8>>2]|0;j=c[(c[d+52>>2]|0)+8>>2]|0;c[d+8>>2]=0;l=a+60|0;c[d+12>>2]=c[l>>2];f=c[l>>2]|0;if((f|0)!=0){c[f+8>>2]=d}c[l>>2]=d;m=d+16|0;c[d+20>>2]=d;c[m>>2]=j;c[d+24>>2]=0;f=k+112|0;c[d+28>>2]=c[f>>2];l=c[f>>2]|0;if((l|0)!=0){c[l+8>>2]=m}c[f>>2]=m;f=d+32|0;c[d+36>>2]=d;c[f>>2]=k;c[d+40>>2]=0;l=j+112|0;c[d+44>>2]=c[l>>2];d=c[l>>2]|0;if((d|0)!=0){c[d+8>>2]=f}c[l>>2]=f;d=k+4|0;f=e[d>>1]|0;if((f&2|0)==0){b[d>>1]=f|2;g[k+144>>2]=0.0}k=j+4|0;d=e[k>>1]|0;if((d&2|0)==0){b[k>>1]=d|2;g[j+144>>2]=0.0}r=a+64|0;c[r>>2]=(c[r>>2]|0)+1;i=h;return}function nc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+1040|0;h=f;e=h+4|0;c[h>>2]=e;j=h+1028|0;c[j>>2]=0;k=h+1032|0;c[k>>2]=256;q=c[h>>2]|0;c[q+(c[j>>2]<<2)>>2]=c[a>>2];r=c[j>>2]|0;s=r+1|0;c[j>>2]=s;a:do{if((r|0)>-1){a=a+4|0;n=d+4|0;o=d+8|0;m=d+12|0;while(1){s=s+ -1|0;c[j>>2]=s;p=c[q+(s<<2)>>2]|0;do{if(!((p|0)==-1)?(l=c[a>>2]|0,!(+g[d>>2]- +g[l+(p*36|0)+8>>2]>0.0|+g[n>>2]- +g[l+(p*36|0)+12>>2]>0.0|+g[l+(p*36|0)>>2]- +g[o>>2]>0.0|+g[l+(p*36|0)+4>>2]- +g[m>>2]>0.0)):0){r=l+(p*36|0)+24|0;if((c[r>>2]|0)==-1){if(!(Oc(b,p)|0)){break a}s=c[j>>2]|0;break}if((s|0)==(c[k>>2]|0)?(c[k>>2]=s<<1,s=Zb(s<<3)|0,c[h>>2]=s,Xe(s|0,q|0,c[j>>2]<<2|0)|0,(q|0)!=(e|0)):0){_b(q)}q=c[h>>2]|0;c[q+(c[j>>2]<<2)>>2]=c[r>>2];r=(c[j>>2]|0)+1|0;c[j>>2]=r;p=l+(p*36|0)+28|0;if((r|0)==(c[k>>2]|0)?(c[k>>2]=r<<1,s=Zb(r<<3)|0,c[h>>2]=s,Xe(s|0,q|0,c[j>>2]<<2|0)|0,(q|0)!=(e|0)):0){_b(q)}c[(c[h>>2]|0)+(c[j>>2]<<2)>>2]=c[p>>2];s=(c[j>>2]|0)+1|0;c[j>>2]=s}}while(0);if((s|0)<=0){break a}q=c[h>>2]|0}}}while(0);b=c[h>>2]|0;if((b|0)==(e|0)){i=f;return}_b(b);c[h>>2]=0;i=f;return}function oc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;f=c[a>>2]|0;e=c[b>>2]|0;if((f|0)>=(e|0)){if((f|0)==(e|0)){a=(c[a+4>>2]|0)<(c[b+4>>2]|0)}else{a=0}}else{a=1}i=d;return a|0}function pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;e=f;a:while(1){j=b;g=b+ -12|0;b:while(1){k=a;m=j-k|0;switch((m|0)/12|0|0){case 3:{h=6;break a};case 5:{h=15;break a};case 2:{h=4;break a};case 4:{h=14;break a};case 1:case 0:{h=67;break a};default:{}}if((m|0)<372){h=21;break a}n=(m|0)/24|0;l=a+(n*12|0)|0;do{if((m|0)>11988){p=(m|0)/48|0;m=a+(p*12|0)|0;p=a+((p+n|0)*12|0)|0;n=qc(a,m,l,p,d)|0;if(pb[c[d>>2]&3](g,p)|0){c[e+0>>2]=c[p+0>>2];c[e+4>>2]=c[p+4>>2];c[e+8>>2]=c[p+8>>2];c[p+0>>2]=c[g+0>>2];c[p+4>>2]=c[g+4>>2];c[p+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];o=n+1|0;if(pb[c[d>>2]&3](p,l)|0){c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[p+0>>2];c[l+4>>2]=c[p+4>>2];c[l+8>>2]=c[p+8>>2];c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];o=n+2|0;if(pb[c[d>>2]&3](l,m)|0){c[e+0>>2]=c[m+0>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[m+0>>2]=c[l+0>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];if(pb[c[d>>2]&3](m,a)|0){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[m+0>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[m+0>>2]=c[e+0>>2];c[m+4>>2]=c[e+4>>2];c[m+8>>2]=c[e+8>>2];n=n+4|0}else{n=n+3|0}}else{n=o}}else{n=o}}}else{q=pb[c[d>>2]&3](l,a)|0;m=pb[c[d>>2]&3](g,l)|0;if(!q){if(!m){n=0;break}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](l,a)|0)){n=1;break}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];n=2;break}if(m){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];n=1;break}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[l+0>>2];c[a+4>>2]=c[l+4>>2];c[a+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];if(pb[c[d>>2]&3](g,l)|0){c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];n=2}else{n=1}}}while(0);do{if(pb[c[d>>2]&3](a,l)|0){o=g}else{o=g;while(1){o=o+ -12|0;if((a|0)==(o|0)){break}if(pb[c[d>>2]&3](o,l)|0){h=50;break}}if((h|0)==50){h=0;c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[o+0>>2];c[a+4>>2]=c[o+4>>2];c[a+8>>2]=c[o+8>>2];c[o+0>>2]=c[e+0>>2];c[o+4>>2]=c[e+4>>2];c[o+8>>2]=c[e+8>>2];n=n+1|0;break}l=a+12|0;if(!(pb[c[d>>2]&3](a,g)|0)){if((l|0)==(g|0)){h=67;break a}while(1){k=l+12|0;if(pb[c[d>>2]&3](a,l)|0){break}if((k|0)==(g|0)){h=67;break a}else{l=k}}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[g+0>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];l=k}if((l|0)==(g|0)){h=67;break a}else{k=g}while(1){while(1){m=l+12|0;if(pb[c[d>>2]&3](a,l)|0){break}else{l=m}}do{k=k+ -12|0}while(pb[c[d>>2]&3](a,k)|0);if(!(l>>>0<k>>>0)){a=l;continue b}c[e+0>>2]=c[l+0>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];l=m}}}while(0);m=a+12|0;c:do{if(m>>>0<o>>>0){while(1){q=m;while(1){m=q+12|0;if(pb[c[d>>2]&3](q,l)|0){q=m}else{p=o;break}}do{p=p+ -12|0}while(!(pb[c[d>>2]&3](p,l)|0));if(q>>>0>p>>>0){m=q;break c}c[e+0>>2]=c[q+0>>2];c[e+4>>2]=c[q+4>>2];c[e+8>>2]=c[q+8>>2];c[q+0>>2]=c[p+0>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[p+0>>2]=c[e+0>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];o=p;l=(l|0)==(q|0)?p:l;n=n+1|0}}}while(0);if((m|0)!=(l|0)?pb[c[d>>2]&3](l,m)|0:0){c[e+0>>2]=c[m+0>>2];c[e+4>>2]=c[m+4>>2];c[e+8>>2]=c[m+8>>2];c[m+0>>2]=c[l+0>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[l+0>>2]=c[e+0>>2];c[l+4>>2]=c[e+4>>2];c[l+8>>2]=c[e+8>>2];n=n+1|0}if((n|0)==0){n=sc(a,m,d)|0;l=m+12|0;if(sc(l,b,d)|0){h=62;break}if(n){a=l;continue}}q=m;if((q-k|0)>=(j-q|0)){h=66;break}pc(a,m,d);a=m+12|0}if((h|0)==62){h=0;if(n){h=67;break}else{b=m;continue}}else if((h|0)==66){h=0;pc(m+12|0,b,d);b=m;continue}}if((h|0)==4){if(!(pb[c[d>>2]&3](g,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==6){h=a+12|0;q=pb[c[d>>2]&3](h,a)|0;j=pb[c[d>>2]&3](g,h)|0;if(!q){if(!j){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](h,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];i=f;return}if(j){c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](g,h)|0)){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==14){qc(a,a+12|0,a+24|0,g,d)|0;i=f;return}else if((h|0)==15){h=a+12|0;j=a+24|0;b=a+36|0;qc(a,h,j,b,d)|0;if(!(pb[c[d>>2]&3](g,b)|0)){i=f;return}c[e+0>>2]=c[b+0>>2];c[e+4>>2]=c[b+4>>2];c[e+8>>2]=c[b+8>>2];c[b+0>>2]=c[g+0>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[g+0>>2]=c[e+0>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](b,j)|0)){i=f;return}c[e+0>>2]=c[j+0>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[j+0>>2]=c[b+0>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[b+0>>2]=c[e+0>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](j,h)|0)){i=f;return}c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[e+0>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];if(!(pb[c[d>>2]&3](h,a)|0)){i=f;return}c[e+0>>2]=c[a+0>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2];i=f;return}else if((h|0)==21){rc(a,b,d);i=f;return}else if((h|0)==67){i=f;return}}function qc(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+16|0;h=g;k=pb[c[f>>2]&3](b,a)|0;j=pb[c[f>>2]&3](d,b)|0;do{if(k){if(j){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[d+0>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];j=1;break}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];if(pb[c[f>>2]&3](d,b)|0){c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];j=2}else{j=1}}else{if(j){c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];if(pb[c[f>>2]&3](b,a)|0){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];j=2}else{j=1}}else{j=0}}}while(0);if(!(pb[c[f>>2]&3](e,d)|0)){k=j;i=g;return k|0}c[h+0>>2]=c[d+0>>2];c[h+4>>2]=c[d+4>>2];c[h+8>>2]=c[d+8>>2];c[d+0>>2]=c[e+0>>2];c[d+4>>2]=c[e+4>>2];c[d+8>>2]=c[e+8>>2];c[e+0>>2]=c[h+0>>2];c[e+4>>2]=c[h+4>>2];c[e+8>>2]=c[h+8>>2];if(!(pb[c[f>>2]&3](d,b)|0)){k=j+1|0;i=g;return k|0}c[h+0>>2]=c[b+0>>2];c[h+4>>2]=c[b+4>>2];c[h+8>>2]=c[b+8>>2];c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[d+0>>2]=c[h+0>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];if(!(pb[c[f>>2]&3](b,a)|0)){k=j+2|0;i=g;return k|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];k=j+3|0;i=g;return k|0}function rc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;f=i;i=i+32|0;g=f+12|0;e=f;h=a+24|0;j=a+12|0;l=pb[c[d>>2]&3](j,a)|0;k=pb[c[d>>2]&3](h,j)|0;do{if(l){if(k){c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[h+0>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];break}c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];if(pb[c[d>>2]&3](h,j)|0){c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2]}}else{if(k){c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];if(pb[c[d>>2]&3](j,a)|0){c[g+0>>2]=c[a+0>>2];c[g+4>>2]=c[a+4>>2];c[g+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[g+0>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2]}}}}while(0);g=a+36|0;if((g|0)==(b|0)){i=f;return}while(1){if(pb[c[d>>2]&3](g,h)|0){c[e+0>>2]=c[g+0>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];j=g;while(1){c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if((h|0)==(a|0)){break}j=h+ -12|0;if(pb[c[d>>2]&3](e,j)|0){l=h;h=j;j=l}else{break}}c[h+0>>2]=c[e+0>>2];c[h+4>>2]=c[e+4>>2];c[h+8>>2]=c[e+8>>2]}h=g+12|0;if((h|0)==(b|0)){break}else{l=g;g=h;h=l}}i=f;return}function sc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+32|0;h=e+12|0;g=e;switch((b-a|0)/12|0|0){case 3:{f=a+12|0;g=b+ -12|0;l=pb[c[d>>2]&3](f,a)|0;b=pb[c[d>>2]&3](g,f)|0;if(!l){if(!b){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](f,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];l=1;i=e;return l|0}if(b){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[f+0>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](g,f)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[g+0>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 2:{b=b+ -12|0;if(!(pb[c[d>>2]&3](b,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[b+0>>2];c[a+4>>2]=c[b+4>>2];c[a+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 5:{g=a+12|0;j=a+24|0;f=a+36|0;b=b+ -12|0;qc(a,g,j,f,d)|0;if(!(pb[c[d>>2]&3](b,f)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[f+0>>2];c[h+4>>2]=c[f+4>>2];c[h+8>>2]=c[f+8>>2];c[f+0>>2]=c[b+0>>2];c[f+4>>2]=c[b+4>>2];c[f+8>>2]=c[b+8>>2];c[b+0>>2]=c[h+0>>2];c[b+4>>2]=c[h+4>>2];c[b+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](f,j)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[f+0>>2];c[j+4>>2]=c[f+4>>2];c[j+8>>2]=c[f+8>>2];c[f+0>>2]=c[h+0>>2];c[f+4>>2]=c[h+4>>2];c[f+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](j,g)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[g+0>>2];c[h+4>>2]=c[g+4>>2];c[h+8>>2]=c[g+8>>2];c[g+0>>2]=c[j+0>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if(!(pb[c[d>>2]&3](g,a)|0)){l=1;i=e;return l|0}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[g+0>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=1;i=e;return l|0};case 4:{qc(a,a+12|0,a+24|0,b+ -12|0,d)|0;l=1;i=e;return l|0};case 1:case 0:{l=1;i=e;return l|0};default:{k=a+24|0;j=a+12|0;m=pb[c[d>>2]&3](j,a)|0;l=pb[c[d>>2]&3](k,j)|0;do{if(m){if(l){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[k+0>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];break}c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];if(pb[c[d>>2]&3](k,j)|0){c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2]}}else{if(l){c[h+0>>2]=c[j+0>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[j+0>>2]=c[k+0>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[k+0>>2]=c[h+0>>2];c[k+4>>2]=c[h+4>>2];c[k+8>>2]=c[h+8>>2];if(pb[c[d>>2]&3](j,a)|0){c[h+0>>2]=c[a+0>>2];c[h+4>>2]=c[a+4>>2];c[h+8>>2]=c[a+8>>2];c[a+0>>2]=c[j+0>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[j+0>>2]=c[h+0>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2]}}}}while(0);h=a+36|0;if((h|0)==(b|0)){m=1;i=e;return m|0}j=0;while(1){if(pb[c[d>>2]&3](h,k)|0){c[g+0>>2]=c[h+0>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];l=h;while(1){c[l+0>>2]=c[k+0>>2];c[l+4>>2]=c[k+4>>2];c[l+8>>2]=c[k+8>>2];if((k|0)==(a|0)){break}l=k+ -12|0;if(pb[c[d>>2]&3](g,l)|0){m=k;k=l;l=m}else{break}}c[k+0>>2]=c[g+0>>2];c[k+4>>2]=c[g+4>>2];c[k+8>>2]=c[g+8>>2];j=j+1|0;if((j|0)==8){break}}k=h+12|0;if((k|0)==(b|0)){d=1;f=35;break}else{m=h;h=k;k=m}}if((f|0)==35){i=e;return d|0}m=(h+12|0)==(b|0);i=e;return m|0}}return 0}function tc(a){a=a|0;Ea(a|0)|0;ua()}function uc(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function vc(a,b){a=a|0;b=b|0;return}function wc(a,b){a=a|0;b=b|0;return}function xc(a,b,c){a=a|0;b=b|0;c=c|0;return}function yc(a,b,c){a=a|0;b=b|0;c=c|0;return}function zc(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ac(a){a=a|0;var d=0;d=i;b[a+32>>1]=1;b[a+34>>1]=-1;b[a+36>>1]=0;c[a+40>>2]=0;c[a+24>>2]=0;c[a+28>>2]=0;c[a+0>>2]=0;c[a+4>>2]=0;c[a+8>>2]=0;c[a+12>>2]=0;i=d;return}function Bc(d,e,f,h){d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0,m=0.0;j=i;c[d+40>>2]=c[h+4>>2];g[d+16>>2]=+g[h+8>>2];g[d+20>>2]=+g[h+12>>2];c[d+8>>2]=f;c[d+4>>2]=0;f=d+32|0;k=h+22|0;b[f+0>>1]=b[k+0>>1]|0;b[f+2>>1]=b[k+2>>1]|0;b[f+4>>1]=b[k+4>>1]|0;a[d+38>>0]=a[h+20>>0]|0;f=c[h>>2]|0;f=pb[c[(c[f>>2]|0)+8>>2]&3](f,e)|0;c[d+12>>2]=f;f=kb[c[(c[f>>2]|0)+12>>2]&3](f)|0;k=Xb(e,f*28|0)|0;e=d+24|0;c[e>>2]=k;if((f|0)>0){l=0}else{l=d+28|0;c[l>>2]=0;l=h+16|0;m=+g[l>>2];g[d>>2]=m;i=j;return}do{c[k+(l*28|0)+16>>2]=0;k=c[e>>2]|0;c[k+(l*28|0)+24>>2]=-1;l=l+1|0}while((l|0)!=(f|0));l=d+28|0;c[l>>2]=0;l=h+16|0;m=+g[l>>2];g[d>>2]=m;i=j;return}function Cc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=a+28|0;if((c[f>>2]|0)!=0){xa(2088,2112,124,2144)}g=a+12|0;j=c[g>>2]|0;j=kb[c[(c[j>>2]|0)+12>>2]&3](j)|0;c[f>>2]=j;if((j|0)<=0){i=e;return}h=a+24|0;j=0;do{k=c[h>>2]|0;l=k+(j*28|0)|0;m=c[g>>2]|0;rb[c[(c[m>>2]|0)+24>>2]&15](m,l,d,j);c[k+(j*28|0)+24>>2]=Mc(b,l,l)|0;c[k+(j*28|0)+16>>2]=a;c[k+(j*28|0)+20>>2]=j;j=j+1|0}while((j|0)<(c[f>>2]|0));i=e;return}function Dc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0;m=i;i=i+48|0;k=m+24|0;l=m+8|0;h=m;j=a+28|0;if((c[j>>2]|0)<=0){i=m;return}f=a+24|0;u=a+12|0;v=k+4|0;w=l+4|0;p=k+8|0;q=l+8|0;r=k+12|0;s=l+12|0;n=e+4|0;y=d+4|0;o=h+4|0;x=0;do{a=c[f>>2]|0;D=c[u>>2]|0;t=a+(x*28|0)+20|0;rb[c[(c[D>>2]|0)+24>>2]&15](D,k,d,c[t>>2]|0);D=c[u>>2]|0;rb[c[(c[D>>2]|0)+24>>2]&15](D,l,e,c[t>>2]|0);t=a+(x*28|0)|0;B=+g[k>>2];C=+g[l>>2];A=+g[v>>2];z=+g[w>>2];B=+(B<C?B:C);C=+(A<z?A:z);D=t;g[D>>2]=B;g[D+4>>2]=C;B=+g[p>>2];C=+g[q>>2];z=+g[r>>2];A=+g[s>>2];B=+(B>C?B:C);C=+(z>A?z:A);D=a+(x*28|0)+8|0;g[D>>2]=B;g[D+4>>2]=C;C=+g[n>>2]- +g[y>>2];g[h>>2]=+g[e>>2]- +g[d>>2];g[o>>2]=C;Nc(b,c[a+(x*28|0)+24>>2]|0,t,h);x=x+1|0}while((x|0)<(c[j>>2]|0));i=m;return}function Ec(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0;e=i;Vb(b);ed(b+68|0);hc(b+102872|0);j=b+102968|0;c[b+102980>>2]=0;c[b+102984>>2]=0;f=b+102952|0;h=b+102992|0;c[f+0>>2]=0;c[f+4>>2]=0;c[f+8>>2]=0;c[f+12>>2]=0;a[h>>0]=1;a[b+102993>>0]=1;a[b+102994>>0]=0;a[b+102995>>0]=1;a[b+102976>>0]=1;h=d;f=c[h+4>>2]|0;d=j;c[d>>2]=c[h>>2];c[d+4>>2]=f;c[b+102868>>2]=4;g[b+102988>>2]=0.0;c[b+102948>>2]=b;d=b+102996|0;c[d+0>>2]=0;c[d+4>>2]=0;c[d+8>>2]=0;c[d+12>>2]=0;c[d+16>>2]=0;c[d+20>>2]=0;c[d+24>>2]=0;c[d+28>>2]=0;i=e;return}function Fc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;if((c[a+102868>>2]&2|0)!=0){xa(2160,2184,109,2216)}e=Xb(a,152)|0;if((e|0)==0){e=0}else{$b(e,b,a)}c[e+92>>2]=0;b=a+102952|0;c[e+96>>2]=c[b>>2];f=c[b>>2]|0;if((f|0)!=0){c[f+92>>2]=e}c[b>>2]=e;f=a+102960|0;c[f>>2]=(c[f>>2]|0)+1;i=d;return e|0}function Gc(f,h){f=f|0;h=h|0;var j=0,k=0;j=i;k=f+102976|0;if((h&1|0)==(d[k>>0]|0|0)){i=j;return}a[k>>0]=h&1;if(h){i=j;return}f=c[f+102952>>2]|0;if((f|0)==0){i=j;return}do{k=f+4|0;h=e[k>>1]|0;if((h&2|0)==0){b[k>>1]=h|2;g[f+144>>2]=0.0}f=c[f+96>>2]|0}while((f|0)!=0);i=j;return}function Hc(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0;j=i;i=i+96|0;k=j+32|0;o=j;h=j+84|0;q=d+103008|0;g[q>>2]=0.0;t=d+103012|0;g[t>>2]=0.0;n=d+103016|0;g[n>>2]=0.0;u=d+102960|0;f=d+102872|0;l=d+68|0;Ld(k,c[u>>2]|0,c[d+102936>>2]|0,c[d+102964>>2]|0,l,c[d+102944>>2]|0);m=d+102952|0;v=c[m>>2]|0;if((v|0)!=0){do{Q=v+4|0;b[Q>>1]=b[Q>>1]&65534;v=c[v+96>>2]|0}while((v|0)!=0)}v=c[d+102932>>2]|0;if((v|0)!=0){do{Q=v+4|0;c[Q>>2]=c[Q>>2]&-2;v=c[v+12>>2]|0}while((v|0)!=0)}v=c[d+102956>>2]|0;if((v|0)!=0){do{a[v+60>>0]=0;v=c[v+12>>2]|0}while((v|0)!=0)}C=c[u>>2]|0;u=gd(l,C<<2)|0;K=c[m>>2]|0;a:do{if((K|0)!=0){w=k+28|0;I=k+36|0;F=k+32|0;v=k+40|0;B=k+8|0;H=k+48|0;G=k+16|0;E=k+44|0;J=k+12|0;D=d+102968|0;A=d+102976|0;z=o+12|0;y=o+16|0;x=o+20|0;b:while(1){L=K+4|0;M=b[L>>1]|0;if((M&35)==34?(c[K>>2]|0)!=0:0){c[w>>2]=0;c[I>>2]=0;c[F>>2]=0;c[u>>2]=K;b[L>>1]=M&65535|1;N=1;do{N=N+ -1|0;L=c[u+(N<<2)>>2]|0;M=L+4|0;O=b[M>>1]|0;if((O&32)==0){n=13;break b}P=c[w>>2]|0;if((P|0)>=(c[v>>2]|0)){n=15;break b}c[L+8>>2]=P;Q=c[w>>2]|0;c[(c[B>>2]|0)+(Q<<2)>>2]=L;c[w>>2]=Q+1;O=O&65535;if((O&2|0)==0){b[M>>1]=O|2;g[L+144>>2]=0.0}if((c[L>>2]|0)!=0){M=c[L+112>>2]|0;if((M|0)!=0){do{Q=c[M+4>>2]|0;O=Q+4|0;if(((c[O>>2]&7|0)==6?(a[(c[Q+48>>2]|0)+38>>0]|0)==0:0)?(a[(c[Q+52>>2]|0)+38>>0]|0)==0:0){P=c[I>>2]|0;if((P|0)>=(c[E>>2]|0)){n=25;break b}c[I>>2]=P+1;c[(c[J>>2]|0)+(P<<2)>>2]=Q;c[O>>2]=c[O>>2]|1;Q=c[M>>2]|0;O=Q+4|0;P=b[O>>1]|0;if((P&1)==0){if((N|0)>=(C|0)){n=28;break b}c[u+(N<<2)>>2]=Q;b[O>>1]=P&65535|1;N=N+1|0}}M=c[M+12>>2]|0}while((M|0)!=0)}L=c[L+108>>2]|0;if((L|0)!=0){do{P=L+4|0;O=c[P>>2]|0;if((a[O+60>>0]|0)==0?(p=c[L>>2]|0,s=p+4|0,r=b[s>>1]|0,!((r&32)==0)):0){M=c[F>>2]|0;if((M|0)>=(c[H>>2]|0)){n=35;break b}c[F>>2]=M+1;c[(c[G>>2]|0)+(M<<2)>>2]=O;a[(c[P>>2]|0)+60>>0]=1;if((r&1)==0){if((N|0)>=(C|0)){n=38;break b}c[u+(N<<2)>>2]=p;b[s>>1]=r&65535|1;N=N+1|0}}L=c[L+12>>2]|0}while((L|0)!=0)}}}while((N|0)>0);Nd(k,o,e,D,(a[A>>0]|0)!=0);g[q>>2]=+g[z>>2]+ +g[q>>2];g[t>>2]=+g[y>>2]+ +g[t>>2];g[n>>2]=+g[x>>2]+ +g[n>>2];N=c[w>>2]|0;if((N|0)>0){L=c[B>>2]|0;O=0;do{M=c[L+(O<<2)>>2]|0;if((c[M>>2]|0)==0){Q=M+4|0;b[Q>>1]=b[Q>>1]&65534}O=O+1|0}while((O|0)<(N|0))}}K=c[K+96>>2]|0;if((K|0)==0){break a}}if((n|0)==13){xa(2232,2184,445,2256)}else if((n|0)==15){xa(2520,2440,54,2472)}else if((n|0)==25){xa(2480,2440,62,2472)}else if((n|0)==28){xa(2264,2184,495,2256)}else if((n|0)==35){xa(2408,2440,68,2472)}else if((n|0)==38){xa(2264,2184,524,2256)}}}while(0);hd(l,u);id(h);l=c[m>>2]|0;if((l|0)==0){kc(f);R=+kd(h);Q=d+103020|0;g[Q>>2]=R;Md(k);i=j;return}do{if(!((b[l+4>>1]&1)==0)?(c[l>>2]|0)!=0:0){bc(l)}l=c[l+96>>2]|0}while((l|0)!=0);kc(f);R=+kd(h);Q=d+103020|0;g[Q>>2]=R;Md(k);i=j;return}function Ic(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0.0,wa=0.0,ya=0.0,za=0.0,Aa=0.0;h=i;i=i+336|0;k=h+284|0;n=h+152|0;m=h+144|0;l=h+108|0;p=h+72|0;o=h+64|0;u=h+24|0;q=h;r=d+102872|0;t=d+102944|0;Ld(k,64,32,0,d+68|0,c[t>>2]|0);j=d+102995|0;if((a[j>>0]|0)!=0){v=c[d+102952>>2]|0;if((v|0)!=0){do{ta=v+4|0;b[ta>>1]=b[ta>>1]&65534;g[v+60>>2]=0.0;v=c[v+96>>2]|0}while((v|0)!=0)}v=d+102932|0;w=c[v>>2]|0;if((w|0)!=0){do{ta=w+4|0;c[ta>>2]=c[ta>>2]&-34;c[w+128>>2]=0;g[w+132>>2]=1.0;w=c[w+12>>2]|0}while((w|0)!=0)}}else{v=d+102932|0}F=k+28|0;G=k+36|0;H=k+32|0;I=k+40|0;J=k+8|0;E=k+44|0;D=k+12|0;C=o+4|0;B=q+4|0;A=q+8|0;z=q+16|0;y=f+12|0;x=q+12|0;w=q+20|0;U=d+102994|0;S=n+16|0;P=n+20|0;O=n+24|0;N=n+44|0;M=n+48|0;L=n+52|0;W=n+28|0;K=n+56|0;V=n+92|0;d=n+128|0;T=m+4|0;a:while(1){aa=c[v>>2]|0;if((aa|0)==0){l=36;break}else{X=1.0;Z=0}do{ba=aa+4|0;Y=c[ba>>2]|0;do{if((Y&4|0)!=0?(c[aa+128>>2]|0)<=8:0){if((Y&32|0)==0){Y=c[aa+48>>2]|0;_=c[aa+52>>2]|0;if((a[Y+38>>0]|0)!=0){break}if((a[_+38>>0]|0)!=0){break}$=c[Y+8>>2]|0;da=c[_+8>>2]|0;ga=c[$>>2]|0;fa=c[da>>2]|0;if(!((ga|0)==2|(fa|0)==2)){l=16;break a}ea=b[$+4>>1]|0;ca=b[da+4>>1]|0;if(!((ea&2)!=0&(ga|0)!=0|(ca&2)!=0&(fa|0)!=0)){break}if(!((ea&8)!=0|(ga|0)!=2|((ca&8)!=0|(fa|0)!=2))){break}ea=$+28|0;fa=$+60|0;va=+g[fa>>2];ca=da+28|0;ga=da+60|0;ua=+g[ga>>2];if(!(va<ua)){if(ua<va){if(!(ua<1.0)){l=25;break a}ua=(va-ua)/(1.0-ua);ta=da+36|0;wa=1.0-ua;za=+(+g[ta>>2]*wa+ua*+g[da+44>>2]);ya=+(wa*+g[da+40>>2]+ua*+g[da+48>>2]);g[ta>>2]=za;g[ta+4>>2]=ya;ta=da+52|0;g[ta>>2]=wa*+g[ta>>2]+ua*+g[da+56>>2];g[ga>>2]=va;ua=va}else{ua=va}}else{if(!(va<1.0)){l=21;break a}za=(ua-va)/(1.0-va);ta=$+36|0;ya=1.0-za;va=+(+g[ta>>2]*ya+za*+g[$+44>>2]);wa=+(ya*+g[$+40>>2]+za*+g[$+48>>2]);g[ta>>2]=va;g[ta+4>>2]=wa;ta=$+52|0;g[ta>>2]=ya*+g[ta>>2]+za*+g[$+56>>2];g[fa>>2]=ua}if(!(ua<1.0)){l=28;break a}ta=c[aa+56>>2]|0;$=c[aa+60>>2]|0;c[S>>2]=0;c[P>>2]=0;g[O>>2]=0.0;c[N>>2]=0;c[M>>2]=0;g[L>>2]=0.0;Pc(n,c[Y+12>>2]|0,ta);Pc(W,c[_+12>>2]|0,$);Y=K+0|0;_=ea+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=V+0|0;_=ca+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));g[d>>2]=1.0;ad(m,n);if((c[m>>2]|0)==3){ua=ua+(1.0-ua)*+g[T>>2];ua=ua<1.0?ua:1.0}else{ua=1.0}g[aa+132>>2]=ua;c[ba>>2]=c[ba>>2]|32}else{ua=+g[aa+132>>2]}if(ua<X){X=ua;Z=aa}}}while(0);aa=c[aa+12>>2]|0}while((aa|0)!=0);if((Z|0)==0|X>.9999988079071045){l=36;break}aa=c[(c[Z+48>>2]|0)+8>>2]|0;ba=c[(c[Z+52>>2]|0)+8>>2]|0;ca=aa+28|0;Y=l+0|0;_=ca+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));da=ba+28|0;Y=p+0|0;_=da+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=aa+60|0;ua=+g[Y>>2];if(!(ua<1.0)){l=38;break}ya=(X-ua)/(1.0-ua);ka=aa+36|0;ua=1.0-ya;fa=aa+44|0;ga=aa+48|0;za=+g[ka>>2]*ua+ya*+g[fa>>2];Aa=ua*+g[aa+40>>2]+ya*+g[ga>>2];wa=+za;va=+Aa;g[ka>>2]=wa;g[ka+4>>2]=va;ka=aa+52|0;ea=aa+56|0;ya=ua*+g[ka>>2]+ya*+g[ea>>2];g[ka>>2]=ya;g[Y>>2]=X;ka=aa+44|0;g[ka>>2]=wa;g[ka+4>>2]=va;g[ea>>2]=ya;va=+R(+ya);ka=aa+20|0;g[ka>>2]=va;ya=+Q(+ya);ja=aa+24|0;g[ja>>2]=ya;la=aa+12|0;ia=aa+28|0;wa=+g[ia>>2];ha=aa+32|0;ua=+g[ha>>2];za=+(za-(ya*wa-va*ua));ua=+(Aa-(va*wa+ya*ua));Y=la;g[Y>>2]=za;g[Y+4>>2]=ua;Y=ba+60|0;ua=+g[Y>>2];if(!(ua<1.0)){l=40;break}ya=(X-ua)/(1.0-ua);ra=ba+36|0;Aa=1.0-ya;oa=ba+44|0;na=ba+48|0;za=+g[ra>>2]*Aa+ya*+g[oa>>2];ua=Aa*+g[ba+40>>2]+ya*+g[na>>2];wa=+za;va=+ua;g[ra>>2]=wa;g[ra+4>>2]=va;ra=ba+52|0;ma=ba+56|0;ya=Aa*+g[ra>>2]+ya*+g[ma>>2];g[ra>>2]=ya;g[Y>>2]=X;ra=ba+44|0;g[ra>>2]=wa;g[ra+4>>2]=va;g[ma>>2]=ya;va=+R(+ya);ra=ba+20|0;g[ra>>2]=va;ya=+Q(+ya);qa=ba+24|0;g[qa>>2]=ya;sa=ba+12|0;pa=ba+28|0;wa=+g[pa>>2];ta=ba+32|0;Aa=+g[ta>>2];za=+(za-(ya*wa-va*Aa));Aa=+(ua-(va*wa+ya*Aa));Y=sa;g[Y>>2]=za;g[Y+4>>2]=Aa;od(Z,c[t>>2]|0);Y=Z+4|0;_=c[Y>>2]|0;c[Y>>2]=_&-33;$=Z+128|0;c[$>>2]=(c[$>>2]|0)+1;if((_&6|0)!=6){c[Y>>2]=_&-37;Y=ca+0|0;_=l+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=da+0|0;_=p+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));wa=+g[ea>>2];za=+R(+wa);g[ka>>2]=za;wa=+Q(+wa);g[ja>>2]=wa;Aa=+g[ia>>2];ya=+g[ha>>2];va=+(+g[fa>>2]-(wa*Aa-za*ya));ya=+(+g[ga>>2]-(za*Aa+wa*ya));g[la>>2]=va;g[la+4>>2]=ya;ya=+g[ma>>2];va=+R(+ya);g[ra>>2]=va;ya=+Q(+ya);g[qa>>2]=ya;wa=+g[pa>>2];Aa=+g[ta>>2];za=+(+g[oa>>2]-(ya*wa-va*Aa));Aa=+(+g[na>>2]-(va*wa+ya*Aa));ta=sa;g[ta>>2]=za;g[ta+4>>2]=Aa;continue}_=aa+4|0;$=e[_>>1]|0;if(($&2|0)==0){b[_>>1]=$|2;g[aa+144>>2]=0.0}$=ba+4|0;ca=e[$>>1]|0;if((ca&2|0)==0){b[$>>1]=ca|2;g[ba+144>>2]=0.0}c[F>>2]=0;c[G>>2]=0;c[H>>2]=0;if((c[I>>2]|0)<=0){l=48;break}ca=aa+8|0;c[ca>>2]=0;ea=c[F>>2]|0;c[(c[J>>2]|0)+(ea<<2)>>2]=aa;ea=ea+1|0;c[F>>2]=ea;if((ea|0)>=(c[I>>2]|0)){l=50;break}da=ba+8|0;c[da>>2]=ea;ea=c[F>>2]|0;c[(c[J>>2]|0)+(ea<<2)>>2]=ba;c[F>>2]=ea+1;ea=c[G>>2]|0;if((ea|0)>=(c[E>>2]|0)){l=52;break}c[G>>2]=ea+1;c[(c[D>>2]|0)+(ea<<2)>>2]=Z;b[_>>1]=e[_>>1]|1;b[$>>1]=e[$>>1]|1;c[Y>>2]=c[Y>>2]|1;c[o>>2]=aa;c[C>>2]=ba;Z=1;while(1){b:do{if((c[aa>>2]|0)==2?(s=c[aa+112>>2]|0,(s|0)!=0):0){aa=aa+4|0;ea=s;do{if((c[F>>2]|0)==(c[I>>2]|0)){break b}if((c[G>>2]|0)==(c[E>>2]|0)){break b}fa=c[ea+4>>2]|0;ga=fa+4|0;do{if((c[ga>>2]&1|0)==0){ba=c[ea>>2]|0;if(((c[ba>>2]|0)==2?(b[aa>>1]&8)==0:0)?(b[ba+4>>1]&8)==0:0){break}if((a[(c[fa+48>>2]|0)+38>>0]|0)==0?(a[(c[fa+52>>2]|0)+38>>0]|0)==0:0){ha=ba+28|0;Y=u+0|0;_=ha+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));Y=ba+4|0;if((b[Y>>1]&1)==0){_=ba+60|0;ua=+g[_>>2];if(!(ua<1.0)){l=67;break a}ya=(X-ua)/(1.0-ua);sa=ba+36|0;Aa=1.0-ya;za=+g[sa>>2]*Aa+ya*+g[ba+44>>2];ua=Aa*+g[ba+40>>2]+ya*+g[ba+48>>2];wa=+za;va=+ua;g[sa>>2]=wa;g[sa+4>>2]=va;sa=ba+52|0;ta=ba+56|0;ya=Aa*+g[sa>>2]+ya*+g[ta>>2];g[sa>>2]=ya;g[_>>2]=X;sa=ba+44|0;g[sa>>2]=wa;g[sa+4>>2]=va;g[ta>>2]=ya;va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(za-(ya*wa-va*Aa));Aa=+(ua-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa}od(fa,c[t>>2]|0);_=c[ga>>2]|0;if((_&4|0)==0){Y=ha+0|0;_=u+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));ya=+g[ba+56>>2];va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(+g[ba+44>>2]-(ya*wa-va*Aa));Aa=+(+g[ba+48>>2]-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa;break}if((_&2|0)==0){Y=ha+0|0;_=u+0|0;$=Y+36|0;do{c[Y>>2]=c[_>>2];Y=Y+4|0;_=_+4|0}while((Y|0)<($|0));ya=+g[ba+56>>2];va=+R(+ya);g[ba+20>>2]=va;ya=+Q(+ya);g[ba+24>>2]=ya;wa=+g[ba+28>>2];Aa=+g[ba+32>>2];za=+(+g[ba+44>>2]-(ya*wa-va*Aa));Aa=+(+g[ba+48>>2]-(va*wa+ya*Aa));ta=ba+12|0;g[ta>>2]=za;g[ta+4>>2]=Aa;break}c[ga>>2]=_|1;_=c[G>>2]|0;if((_|0)>=(c[E>>2]|0)){l=74;break a}c[G>>2]=_+1;c[(c[D>>2]|0)+(_<<2)>>2]=fa;_=e[Y>>1]|0;if((_&1|0)==0){b[Y>>1]=_|1;if((c[ba>>2]|0)!=0?(_&2|0)==0:0){b[Y>>1]=_|3;g[ba+144>>2]=0.0}Y=c[F>>2]|0;if((Y|0)>=(c[I>>2]|0)){l=80;break a}c[ba+8>>2]=Y;ta=c[F>>2]|0;c[(c[J>>2]|0)+(ta<<2)>>2]=ba;c[F>>2]=ta+1}}}}while(0);ea=c[ea+12>>2]|0}while((ea|0)!=0)}}while(0);if((Z|0)>=2){break}aa=c[o+(Z<<2)>>2]|0;Z=Z+1|0}Aa=(1.0-X)*+g[f>>2];g[q>>2]=Aa;g[B>>2]=1.0/Aa;g[A>>2]=1.0;c[z>>2]=20;c[x>>2]=c[y>>2];a[w>>0]=0;Od(k,q,c[ca>>2]|0,c[da>>2]|0);Z=c[F>>2]|0;if((Z|0)>0){Y=0;do{_=c[(c[J>>2]|0)+(Y<<2)>>2]|0;ta=_+4|0;b[ta>>1]=b[ta>>1]&65534;if((c[_>>2]|0)==2){bc(_);Z=c[_+112>>2]|0;if((Z|0)!=0){do{ta=(c[Z+4>>2]|0)+4|0;c[ta>>2]=c[ta>>2]&-34;Z=c[Z+12>>2]|0}while((Z|0)!=0)}Z=c[F>>2]|0}Y=Y+1|0}while((Y|0)<(Z|0))}kc(r);if((a[U>>0]|0)!=0){l=92;break}}switch(l|0){case 16:{xa(2288,2184,641,2344);break};case 21:{xa(2360,2376,723,2400);break};case 25:{xa(2360,2376,723,2400);break};case 28:{xa(2360,2184,676,2344);break};case 36:{a[j>>0]=1;Md(k);i=h;return};case 38:{xa(2360,2376,723,2400);break};case 40:{xa(2360,2376,723,2400);break};case 48:{xa(2520,2440,54,2472);break};case 50:{xa(2520,2440,54,2472);break};case 52:{xa(2480,2440,62,2472);break};case 67:{xa(2360,2376,723,2400);break};case 74:{xa(2480,2440,62,2472);break};case 80:{xa(2520,2440,54,2472);break};case 92:{a[j>>0]=0;Md(k);i=h;return}}}function Jc(b,d,e,f){b=b|0;d=+d;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;k=i;i=i+32|0;j=k+27|0;l=k;o=k+26|0;p=k+25|0;n=k+24|0;id(j);h=b+102868|0;q=c[h>>2]|0;if((q&1|0)!=0){kc(b+102872|0);q=c[h>>2]&-2;c[h>>2]=q}c[h>>2]=q|2;g[l>>2]=d;c[l+12>>2]=e;c[l+16>>2]=f;if(d>0.0){g[l+4>>2]=1.0/d}else{g[l+4>>2]=0.0}e=b+102988|0;g[l+8>>2]=+g[e>>2]*d;a[l+20>>0]=a[b+102992>>0]|0;id(o);jc(b+102872|0);g[b+103e3>>2]=+kd(o);if((a[b+102995>>0]|0)!=0?+g[l>>2]>0.0:0){id(p);Hc(b,l);g[b+103004>>2]=+kd(p)}if((a[b+102993>>0]|0)!=0){d=+g[l>>2];if(d>0.0){id(n);Ic(b,l);g[b+103024>>2]=+kd(n);m=12}}else{m=12}if((m|0)==12){d=+g[l>>2]}if(d>0.0){g[e>>2]=+g[l+4>>2]}l=c[h>>2]|0;if((l&4|0)==0){q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}m=c[b+102952>>2]|0;if((m|0)==0){q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}do{g[m+76>>2]=0.0;g[m+80>>2]=0.0;g[m+84>>2]=0.0;m=c[m+96>>2]|0}while((m|0)!=0);q=l&-3;c[h>>2]=q;d=+kd(j);q=b+102996|0;g[q>>2]=d;i=k;return}function Kc(a,c,d){a=a|0;c=c|0;d=d|0;var e=0;a=i;e=b[c+36>>1]|0;if(!(e<<16>>16!=(b[d+36>>1]|0)|e<<16>>16==0)){e=e<<16>>16>0;i=a;return e|0}if((b[d+32>>1]&b[c+34>>1])<<16>>16==0){e=0;i=a;return e|0}e=(b[d+34>>1]&b[c+32>>1])<<16>>16!=0;i=a;return e|0}function Lc(a){a=a|0;var b=0;b=i;Uc(a);c[a+28>>2]=0;c[a+48>>2]=16;c[a+52>>2]=0;c[a+44>>2]=Zb(192)|0;c[a+36>>2]=16;c[a+40>>2]=0;c[a+32>>2]=Zb(64)|0;i=b;return}function Mc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;d=Xc(a,b,d)|0;b=a+28|0;c[b>>2]=(c[b>>2]|0)+1;b=a+40|0;f=c[b>>2]|0;g=a+36|0;a=a+32|0;if((f|0)==(c[g>>2]|0)){h=c[a>>2]|0;c[g>>2]=f<<1;f=Zb(f<<3)|0;c[a>>2]=f;Xe(f|0,h|0,c[b>>2]<<2|0)|0;_b(h);f=c[b>>2]|0}c[(c[a>>2]|0)+(f<<2)>>2]=d;c[b>>2]=(c[b>>2]|0)+1;i=e;return d|0}function Nc(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=i;if(!(_c(a,b,d,e)|0)){i=f;return}e=a+40|0;d=c[e>>2]|0;g=a+36|0;a=a+32|0;if((d|0)==(c[g>>2]|0)){h=c[a>>2]|0;c[g>>2]=d<<1;d=Zb(d<<3)|0;c[a>>2]=d;Xe(d|0,h|0,c[e>>2]<<2|0)|0;_b(h);d=c[e>>2]|0}c[(c[a>>2]|0)+(d<<2)>>2]=b;c[e>>2]=(c[e>>2]|0)+1;i=f;return}function Oc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;f=a+56|0;h=c[f>>2]|0;if((h|0)==(b|0)){i=d;return 1}e=a+52|0;g=c[e>>2]|0;j=a+48|0;a=a+44|0;if((g|0)==(c[j>>2]|0)){h=c[a>>2]|0;c[j>>2]=g<<1;g=Zb(g*24|0)|0;c[a>>2]=g;Xe(g|0,h|0,(c[e>>2]|0)*12|0)|0;_b(h);h=c[f>>2]|0;g=c[e>>2]|0}a=c[a>>2]|0;c[a+(g*12|0)>>2]=(h|0)>(b|0)?b:h;f=c[f>>2]|0;c[a+((c[e>>2]|0)*12|0)+4>>2]=(f|0)<(b|0)?b:f;c[e>>2]=(c[e>>2]|0)+1;i=d;return 1}function Pc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0;e=i;f=c[b+4>>2]|0;if((f|0)==2){c[a+16>>2]=b+20;c[a+20>>2]=c[b+148>>2];g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==3){if(!((d|0)>-1)){xa(2632,2672,53,2704)}f=b+16|0;if((c[f>>2]|0)<=(d|0)){xa(2632,2672,53,2704)}j=b+12|0;l=(c[j>>2]|0)+(d<<3)|0;k=c[l+4>>2]|0;h=a;c[h>>2]=c[l>>2];c[h+4>>2]=k;h=d+1|0;d=a+8|0;j=c[j>>2]|0;if((h|0)<(c[f>>2]|0)){j=j+(h<<3)|0;k=c[j+4>>2]|0;l=d;c[l>>2]=c[j>>2];c[l+4>>2]=k}else{k=c[j+4>>2]|0;l=d;c[l>>2]=c[j>>2];c[l+4>>2]=k}c[a+16>>2]=a;c[a+20>>2]=2;g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==1){c[a+16>>2]=b+12;c[a+20>>2]=2;g[a+24>>2]=+g[b+8>>2];i=e;return}else if((f|0)==0){c[a+16>>2]=b+12;c[a+20>>2]=1;g[a+24>>2]=+g[b+8>>2];i=e;return}else{xa(2712,2672,81,2704)}}function Qc(a){a=a|0;var b=0,d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0;b=i;d=a+16|0;t=+g[d>>2];r=+g[d+4>>2];d=a+36|0;e=a+52|0;q=+g[e>>2];s=+g[e+4>>2];e=a+72|0;y=a+88|0;u=+g[y>>2];n=+g[y+4>>2];w=q-t;m=s-r;l=t*w+r*m;k=q*w+s*m;f=u-t;v=n-r;j=t*f+r*v;h=u*f+n*v;x=u-q;o=n-s;p=q*x+s*o;o=u*x+n*o;f=w*v-m*f;m=(q*n-s*u)*f;n=(r*u-t*n)*f;f=(t*s-r*q)*f;if(!(!(l>=-0.0)|!(j>=-0.0))){g[a+24>>2]=1.0;c[a+108>>2]=1;i=b;return}if(!(!(l<-0.0)|!(k>0.0)|!(f<=0.0))){x=1.0/(k-l);g[a+24>>2]=k*x;g[a+60>>2]=-(l*x);c[a+108>>2]=2;i=b;return}if(!(!(j<-0.0)|!(h>0.0)|!(n<=0.0))){x=1.0/(h-j);g[a+24>>2]=h*x;g[a+96>>2]=-(j*x);c[a+108>>2]=2;a=d+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(!(k<=0.0)|!(p>=-0.0))){g[a+60>>2]=1.0;c[a+108>>2]=1;a=a+0|0;e=d+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(!(h<=0.0)|!(o<=0.0))){g[a+96>>2]=1.0;c[a+108>>2]=1;a=a+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}if(!(p<-0.0)|!(o>0.0)|!(m<=0.0)){x=1.0/(f+(m+n));g[a+24>>2]=m*x;g[a+60>>2]=n*x;g[a+96>>2]=f*x;c[a+108>>2]=3;i=b;return}else{x=1.0/(o-p);g[a+60>>2]=o*x;g[a+96>>2]=-(p*x);c[a+108>>2]=2;a=a+0|0;e=e+0|0;d=a+36|0;do{c[a>>2]=c[e>>2];a=a+4|0;e=e+4|0}while((a|0)<(d|0));i=b;return}}function Rc(d,e,f){d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,P=0.0,Q=0.0,R=0.0,S=0,T=0,U=0,V=0.0,W=0,X=0,Y=0.0,Z=0.0;h=i;i=i+176|0;p=h+152|0;o=h+136|0;j=h+24|0;s=h+12|0;t=h;c[652]=(c[652]|0)+1;n=f+28|0;J=f+56|0;c[p+0>>2]=c[J+0>>2];c[p+4>>2]=c[J+4>>2];c[p+8>>2]=c[J+8>>2];c[p+12>>2]=c[J+12>>2];J=f+72|0;c[o+0>>2]=c[J+0>>2];c[o+4>>2]=c[J+4>>2];c[o+8>>2]=c[J+8>>2];c[o+12>>2]=c[J+12>>2];Sc(j,e,f,p,n,o);n=j+108|0;J=c[n>>2]|0;if((J|0)==3|(J|0)==2|(J|0)==1){m=j+16|0;k=j+20|0;v=+g[p+12>>2];w=+g[p+8>>2];r=f+16|0;q=f+20|0;u=+g[p>>2];z=+g[p+4>>2];x=+g[o+12>>2];A=+g[o+8>>2];B=f+44|0;y=f+48|0;C=+g[o>>2];D=+g[o+4>>2];p=j+52|0;o=j+56|0;I=j+16|0;F=j+36|0;E=j+52|0;H=j+24|0;G=j+60|0;L=0;a:while(1){K=(J|0)>0;if(K){M=0;do{c[s+(M<<2)>>2]=c[j+(M*36|0)+28>>2];c[t+(M<<2)>>2]=c[j+(M*36|0)+32>>2];M=M+1|0}while((M|0)!=(J|0))}do{if((J|0)==2){X=I;Z=+g[X>>2];P=+g[X+4>>2];X=E;V=+g[X>>2];R=+g[X+4>>2];Y=V-Z;Q=R-P;P=Z*Y+P*Q;if(P>=-0.0){g[H>>2]=1.0;c[n>>2]=1;N=17;break}Q=V*Y+R*Q;if(!(Q<=0.0)){Z=1.0/(Q-P);g[H>>2]=Q*Z;g[G>>2]=-(P*Z);c[n>>2]=2;N=18;break}else{g[G>>2]=1.0;c[n>>2]=1;M=j+0|0;N=F+0|0;S=M+36|0;do{c[M>>2]=c[N>>2];M=M+4|0;N=N+4|0}while((M|0)<(S|0));N=17;break}}else if((J|0)==3){Qc(j);M=c[n>>2]|0;if((M|0)==0){N=15;break a}else if((M|0)==2){N=18}else if((M|0)==3){N=42;break a}else if((M|0)==1){N=17}else{N=16;break a}}else if((J|0)==1){N=17}else{N=13;break a}}while(0);do{if((N|0)==17){M=1;P=-+g[m>>2];Q=-+g[k>>2]}else if((N|0)==18){Y=+g[m>>2];Q=+g[p>>2]-Y;Z=+g[k>>2];P=+g[o>>2]-Z;if(Y*P-Q*Z>0.0){M=2;P=-P;break}else{M=2;Q=-Q;break}}}while(0);if(Q*Q+P*P<1.4210854715202004e-14){N=42;break}S=j+(M*36|0)|0;Z=-P;Y=-Q;R=v*Z+w*Y;Z=v*Y-w*Z;U=c[r>>2]|0;T=c[q>>2]|0;if((T|0)>1){W=0;Y=Z*+g[U+4>>2]+R*+g[U>>2];X=1;while(1){V=R*+g[U+(X<<3)>>2]+Z*+g[U+(X<<3)+4>>2];N=V>Y;W=N?X:W;X=X+1|0;if((X|0)==(T|0)){break}else{Y=N?V:Y}}N=j+(M*36|0)+28|0;c[N>>2]=W;if(!((W|0)>-1)){N=28;break}}else{N=j+(M*36|0)+28|0;c[N>>2]=0;W=0}if((T|0)<=(W|0)){N=28;break}Y=+g[U+(W<<3)>>2];V=+g[U+(W<<3)+4>>2];R=u+(v*Y-w*V);Z=+R;V=+(Y*w+v*V+z);g[S>>2]=Z;g[S+4>>2]=V;V=P*x+Q*A;P=Q*x-P*A;S=c[B>>2]|0;T=c[y>>2]|0;if((T|0)>1){U=0;Q=P*+g[S+4>>2]+V*+g[S>>2];W=1;while(1){Y=V*+g[S+(W<<3)>>2]+P*+g[S+(W<<3)+4>>2];X=Y>Q;U=X?W:U;W=W+1|0;if((W|0)==(T|0)){break}else{Q=X?Y:Q}}W=j+(M*36|0)+32|0;c[W>>2]=U;if(!((U|0)>-1)){N=35;break}}else{W=j+(M*36|0)+32|0;c[W>>2]=0;U=0}if((T|0)<=(U|0)){N=35;break}Q=+g[S+(U<<3)>>2];Z=+g[S+(U<<3)+4>>2];Y=C+(x*Q-A*Z);V=+Y;Z=+(Q*A+x*Z+D);X=j+(M*36|0)+8|0;g[X>>2]=V;g[X+4>>2]=Z;Y=+(Y-R);Z=+(+g[j+(M*36|0)+12>>2]- +g[j+(M*36|0)+4>>2]);X=j+(M*36|0)+16|0;g[X>>2]=Y;g[X+4>>2]=Z;L=L+1|0;c[654]=(c[654]|0)+1;if(K){M=c[N>>2]|0;K=0;do{if((M|0)==(c[s+(K<<2)>>2]|0)?(c[W>>2]|0)==(c[t+(K<<2)>>2]|0):0){N=42;break a}K=K+1|0}while((K|0)<(J|0))}J=(c[n>>2]|0)+1|0;c[n>>2]=J;if((L|0)>=20){N=42;break}}if((N|0)==13){xa(2712,2672,498,2720)}else if((N|0)==15){xa(2712,2672,194,2856)}else if((N|0)==16){xa(2712,2672,207,2856)}else if((N|0)==28){xa(2776,2808,103,2840)}else if((N|0)==35){xa(2776,2808,103,2840)}else if((N|0)==42){q=c[656]|0;c[656]=(q|0)>(L|0)?q:L;r=d+8|0;Tc(j,d,r);Y=+g[d>>2]- +g[r>>2];q=d+4|0;s=d+12|0;Z=+g[q>>2]- +g[s>>2];t=d+16|0;g[t>>2]=+O(+(Y*Y+Z*Z));c[d+20>>2]=L;n=c[n>>2]|0;if((n|0)==0){xa(2712,2672,246,2736)}else if((n|0)==2){Z=+g[m>>2]- +g[p>>2];l=+g[k>>2]- +g[o>>2];l=+O(+(Z*Z+l*l))}else if((n|0)==1){l=0.0}else if((n|0)==3){l=+g[m>>2];Z=+g[k>>2];l=(+g[p>>2]-l)*(+g[j+92>>2]-Z)-(+g[o>>2]-Z)*(+g[j+88>>2]-l)}else{xa(2712,2672,259,2736)}g[e>>2]=l;b[e+4>>1]=n;k=0;do{a[e+k+6>>0]=c[j+(k*36|0)+28>>2];a[e+k+9>>0]=c[j+(k*36|0)+32>>2];k=k+1|0}while((k|0)<(n|0));if((a[f+88>>0]|0)==0){i=h;return}l=+g[f+24>>2];u=+g[f+52>>2];v=+g[t>>2];w=l+u;if(!(v>w&v>1.1920928955078125e-7)){Y=+((+g[d>>2]+ +g[r>>2])*.5);Z=+((+g[q>>2]+ +g[s>>2])*.5);X=d;g[X>>2]=Y;g[X+4>>2]=Z;X=r;g[X>>2]=Y;g[X+4>>2]=Z;g[t>>2]=0.0;i=h;return}g[t>>2]=v-w;w=+g[r>>2];z=+g[d>>2];D=w-z;v=+g[s>>2];x=+g[q>>2];A=v-x;C=+O(+(D*D+A*A));if(C<1.1920928955078125e-7){C=D}else{Z=1.0/C;C=D*Z;A=A*Z}g[d>>2]=l*C+z;g[q>>2]=l*A+x;g[r>>2]=w-u*C;g[s>>2]=v-u*A;i=h;return}}else if((J|0)==0){xa(2712,2672,194,2856)}else{xa(2712,2672,207,2856)}}function Sc(a,e,f,h,j,k){a=a|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;l=i;r=b[e+4>>1]|0;if(!((r&65535)<4)){xa(2872,2672,102,2896)}q=r&65535;m=a+108|0;c[m>>2]=q;a:do{if(!(r<<16>>16==0)){v=f+20|0;z=f+16|0;r=j+20|0;s=j+16|0;t=h+12|0;u=h+8|0;q=h+4|0;w=k+12|0;x=k+8|0;y=k+4|0;A=0;while(1){E=d[e+A+6>>0]|0;c[a+(A*36|0)+28>>2]=E;B=d[e+A+9>>0]|0;c[a+(A*36|0)+32>>2]=B;if((c[v>>2]|0)<=(E|0)){p=6;break}E=(c[z>>2]|0)+(E<<3)|0;D=+g[E>>2];C=+g[E+4>>2];if((c[r>>2]|0)<=(B|0)){p=8;break}B=(c[s>>2]|0)+(B<<3)|0;H=+g[B>>2];J=+g[B+4>>2];K=+g[t>>2];I=+g[u>>2];F=+g[h>>2]+(D*K-C*I);G=+F;I=+(C*K+D*I+ +g[q>>2]);B=a+(A*36|0)|0;g[B>>2]=G;g[B+4>>2]=I;I=+g[w>>2];D=+g[x>>2];C=+g[k>>2]+(H*I-J*D);G=+C;D=+(J*I+H*D+ +g[y>>2]);B=a+(A*36|0)+8|0;g[B>>2]=G;g[B+4>>2]=D;C=+(C-F);D=+(+g[a+(A*36|0)+12>>2]- +g[a+(A*36|0)+4>>2]);B=a+(A*36|0)+16|0;g[B>>2]=C;g[B+4>>2]=D;g[a+(A*36|0)+24>>2]=0.0;A=A+1|0;B=c[m>>2]|0;if((A|0)>=(B|0)){n=B;break a}}if((p|0)==6){xa(2776,2808,103,2840)}else if((p|0)==8){xa(2776,2808,103,2840)}}else{n=q}}while(0);do{if((n|0)>1){C=+g[e>>2];if((n|0)==2){K=+g[a+16>>2]- +g[a+52>>2];o=+g[a+20>>2]- +g[a+56>>2];o=+O(+(K*K+o*o))}else if((n|0)==3){o=+g[a+16>>2];K=+g[a+20>>2];o=(+g[a+52>>2]-o)*(+g[a+92>>2]-K)-(+g[a+56>>2]-K)*(+g[a+88>>2]-o)}else{xa(2712,2672,259,2736)}if(!(o<C*.5)?!(C*2.0<o|o<1.1920928955078125e-7):0){p=18;break}c[m>>2]=0}else{p=18}}while(0);if((p|0)==18?(n|0)!=0:0){i=l;return}c[a+28>>2]=0;c[a+32>>2]=0;if((c[f+20>>2]|0)<=0){xa(2776,2808,103,2840)}E=c[f+16>>2]|0;o=+g[E>>2];C=+g[E+4>>2];if((c[j+20>>2]|0)<=0){xa(2776,2808,103,2840)}E=c[j+16>>2]|0;F=+g[E>>2];D=+g[E+4>>2];I=+g[h+12>>2];K=+g[h+8>>2];J=+g[h>>2]+(o*I-C*K);K=C*I+o*K+ +g[h+4>>2];I=+J;G=+K;E=a;g[E>>2]=I;g[E+4>>2]=G;G=+g[k+12>>2];I=+g[k+8>>2];H=+g[k>>2]+(F*G-D*I);I=D*G+F*I+ +g[k+4>>2];F=+H;G=+I;E=a+8|0;g[E>>2]=F;g[E+4>>2]=G;J=+(H-J);K=+(I-K);E=a+16|0;g[E>>2]=J;g[E+4>>2]=K;c[m>>2]=1;i=l;return}function Tc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0.0,j=0.0,k=0.0,l=0,m=0,n=0.0;e=i;f=c[a+108>>2]|0;if((f|0)==2){l=a+24|0;j=+g[l>>2];f=a+60|0;k=+g[f>>2];h=+(j*+g[a>>2]+k*+g[a+36>>2]);k=+(j*+g[a+4>>2]+k*+g[a+40>>2]);g[b>>2]=h;g[b+4>>2]=k;k=+g[l>>2];h=+g[f>>2];j=+(k*+g[a+8>>2]+h*+g[a+44>>2]);h=+(k*+g[a+12>>2]+h*+g[a+48>>2]);g[d>>2]=j;g[d+4>>2]=h;i=e;return}else if((f|0)==1){m=a;l=c[m+4>>2]|0;f=b;c[f>>2]=c[m>>2];c[f+4>>2]=l;f=a+8|0;b=c[f+4>>2]|0;l=d;c[l>>2]=c[f>>2];c[l+4>>2]=b;i=e;return}else if((f|0)==3){n=+g[a+24>>2];h=+g[a+60>>2];k=+g[a+96>>2];j=+(n*+g[a>>2]+h*+g[a+36>>2]+k*+g[a+72>>2]);k=+(n*+g[a+4>>2]+h*+g[a+40>>2]+k*+g[a+76>>2]);m=b;g[m>>2]=j;g[m+4>>2]=k;m=d;g[m>>2]=j;g[m+4>>2]=k;i=e;return}else if((f|0)==0){xa(2712,2672,217,2752)}else{xa(2712,2672,236,2752)}}function Uc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;e=i;c[a>>2]=-1;d=a+12|0;c[d>>2]=16;c[a+8>>2]=0;g=Zb(576)|0;b=a+4|0;c[b>>2]=g;Ve(g|0,0,(c[d>>2]|0)*36|0)|0;g=(c[d>>2]|0)+ -1|0;b=c[b>>2]|0;if((g|0)>0){g=0;while(1){f=g+1|0;c[b+(g*36|0)+20>>2]=f;c[b+(g*36|0)+32>>2]=-1;g=(c[d>>2]|0)+ -1|0;if((f|0)<(g|0)){g=f}else{break}}}c[b+(g*36|0)+20>>2]=-1;c[b+(((c[d>>2]|0)+ -1|0)*36|0)+32>>2]=-1;c[a+16>>2]=0;c[a+20>>2]=0;c[a+24>>2]=0;i=e;return}function Vc(a){a=a|0;var b=0;b=i;_b(c[a+4>>2]|0);i=b;return}function Wc(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;d=a+16|0;f=c[d>>2]|0;if((f|0)==-1){e=a+8|0;g=c[e>>2]|0;f=a+12|0;if((g|0)!=(c[f>>2]|0)){xa(2912,2944,61,2984)}j=a+4|0;a=c[j>>2]|0;c[f>>2]=g<<1;h=Zb(g*72|0)|0;c[j>>2]=h;Xe(h|0,a|0,(c[e>>2]|0)*36|0)|0;_b(a);a=c[e>>2]|0;h=(c[f>>2]|0)+ -1|0;g=c[j>>2]|0;if((a|0)<(h|0)){h=a;while(1){a=h+1|0;c[g+(h*36|0)+20>>2]=a;c[g+(h*36|0)+32>>2]=-1;h=(c[f>>2]|0)+ -1|0;if((a|0)<(h|0)){h=a}else{break}}}c[g+(h*36|0)+20>>2]=-1;c[g+(((c[f>>2]|0)+ -1|0)*36|0)+32>>2]=-1;f=c[e>>2]|0;c[d>>2]=f}else{g=c[a+4>>2]|0;e=a+8|0}j=g+(f*36|0)+20|0;c[d>>2]=c[j>>2];c[j>>2]=-1;c[g+(f*36|0)+24>>2]=-1;c[g+(f*36|0)+28>>2]=-1;c[g+(f*36|0)+32>>2]=0;c[g+(f*36|0)+16>>2]=0;c[e>>2]=(c[e>>2]|0)+1;i=b;return f|0}function Xc(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0.0,k=0.0,l=0;f=i;e=Wc(a)|0;h=a+4|0;j=+(+g[b>>2]+-.10000000149011612);k=+(+g[b+4>>2]+-.10000000149011612);l=(c[h>>2]|0)+(e*36|0)|0;g[l>>2]=j;g[l+4>>2]=k;k=+(+g[b+8>>2]+.10000000149011612);j=+(+g[b+12>>2]+.10000000149011612);b=(c[h>>2]|0)+(e*36|0)+8|0;g[b>>2]=k;g[b+4>>2]=j;c[(c[h>>2]|0)+(e*36|0)+16>>2]=d;c[(c[h>>2]|0)+(e*36|0)+32>>2]=0;Yc(a,e);i=f;return e|0}function Yc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,h=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0;d=i;n=a+24|0;c[n>>2]=(c[n>>2]|0)+1;n=c[a>>2]|0;if((n|0)==-1){c[a>>2]=b;c[(c[a+4>>2]|0)+(b*36|0)+20>>2]=-1;i=d;return}e=a+4|0;l=c[e>>2]|0;k=+g[l+(b*36|0)>>2];j=+g[l+(b*36|0)+4>>2];h=+g[l+(b*36|0)+8>>2];f=+g[l+(b*36|0)+12>>2];m=c[l+(n*36|0)+24>>2]|0;a:do{if(!((m|0)==-1)){do{o=c[l+(n*36|0)+28>>2]|0;q=+g[l+(n*36|0)+8>>2];r=+g[l+(n*36|0)>>2];t=+g[l+(n*36|0)+12>>2];s=+g[l+(n*36|0)+4>>2];x=((q>h?q:h)-(r<k?r:k)+((t>f?t:f)-(s<j?s:j)))*2.0;p=x*2.0;q=(x-(q-r+(t-s))*2.0)*2.0;x=+g[l+(m*36|0)>>2];s=k<x?k:x;t=+g[l+(m*36|0)+4>>2];u=j<t?j:t;v=+g[l+(m*36|0)+8>>2];w=h>v?h:v;r=+g[l+(m*36|0)+12>>2];y=f>r?f:r;if((c[l+(m*36|0)+24>>2]|0)==-1){r=(w-s+(y-u))*2.0}else{r=(w-s+(y-u))*2.0-(v-x+(r-t))*2.0}r=q+r;t=+g[l+(o*36|0)>>2];u=k<t?k:t;z=+g[l+(o*36|0)+4>>2];y=j<z?j:z;x=+g[l+(o*36|0)+8>>2];w=h>x?h:x;v=+g[l+(o*36|0)+12>>2];s=f>v?f:v;if((c[l+(o*36|0)+24>>2]|0)==-1){s=(w-u+(s-y))*2.0}else{s=(w-u+(s-y))*2.0-(x-t+(v-z))*2.0}q=q+s;if(p<r&p<q){break a}n=r<q?m:o;m=c[l+(n*36|0)+24>>2]|0}while(!((m|0)==-1))}}while(0);l=c[l+(n*36|0)+20>>2]|0;m=Wc(a)|0;o=c[e>>2]|0;c[o+(m*36|0)+20>>2]=l;c[o+(m*36|0)+16>>2]=0;o=c[e>>2]|0;q=+g[o+(n*36|0)>>2];p=+g[o+(n*36|0)+4>>2];k=+(k<q?k:q);j=+(j<p?j:p);A=o+(m*36|0)|0;g[A>>2]=k;g[A+4>>2]=j;k=+g[o+(n*36|0)+8>>2];j=+g[o+(n*36|0)+12>>2];h=+(h>k?h:k);z=+(f>j?f:j);o=o+(m*36|0)+8|0;g[o>>2]=h;g[o+4>>2]=z;o=c[e>>2]|0;c[o+(m*36|0)+32>>2]=(c[o+(n*36|0)+32>>2]|0)+1;if((l|0)==-1){c[o+(m*36|0)+24>>2]=n;c[o+(m*36|0)+28>>2]=b;c[o+(n*36|0)+20>>2]=m;A=o+(b*36|0)+20|0;c[A>>2]=m;c[a>>2]=m;m=c[A>>2]|0}else{A=o+(l*36|0)+24|0;if((c[A>>2]|0)==(n|0)){c[A>>2]=m}else{c[o+(l*36|0)+28>>2]=m}c[o+(m*36|0)+24>>2]=n;c[o+(m*36|0)+28>>2]=b;c[o+(n*36|0)+20>>2]=m;c[o+(b*36|0)+20>>2]=m}if((m|0)==-1){i=d;return}while(1){l=$c(a,m)|0;b=c[e>>2]|0;n=c[b+(l*36|0)+24>>2]|0;m=c[b+(l*36|0)+28>>2]|0;if((n|0)==-1){e=20;break}if((m|0)==-1){e=22;break}o=c[b+(n*36|0)+32>>2]|0;A=c[b+(m*36|0)+32>>2]|0;c[b+(l*36|0)+32>>2]=((o|0)>(A|0)?o:A)+1;j=+g[b+(n*36|0)>>2];k=+g[b+(m*36|0)>>2];f=+g[b+(n*36|0)+4>>2];h=+g[b+(m*36|0)+4>>2];j=+(j<k?j:k);f=+(f<h?f:h);A=b+(l*36|0)|0;g[A>>2]=j;g[A+4>>2]=f;f=+g[b+(n*36|0)+8>>2];h=+g[b+(m*36|0)+8>>2];j=+g[b+(n*36|0)+12>>2];k=+g[b+(m*36|0)+12>>2];f=+(f>h?f:h);z=+(j>k?j:k);m=b+(l*36|0)+8|0;g[m>>2]=f;g[m+4>>2]=z;m=c[(c[e>>2]|0)+(l*36|0)+20>>2]|0;if((m|0)==-1){e=24;break}}if((e|0)==20){xa(3168,2944,307,3184)}else if((e|0)==22){xa(3200,2944,308,3184)}else if((e|0)==24){i=d;return}}function Zc(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;d=i;if((c[a>>2]|0)==(b|0)){c[a>>2]=-1;i=d;return}e=a+4|0;h=c[e>>2]|0;j=c[h+(b*36|0)+20>>2]|0;f=h+(j*36|0)+20|0;k=c[f>>2]|0;p=c[h+(j*36|0)+24>>2]|0;if((p|0)==(b|0)){p=c[h+(j*36|0)+28>>2]|0}if((k|0)==-1){c[a>>2]=p;c[h+(p*36|0)+20>>2]=-1;if(!((j|0)>-1)){xa(3e3,2944,97,3040)}if((c[a+12>>2]|0)<=(j|0)){xa(3e3,2944,97,3040)}e=a+8|0;if((c[e>>2]|0)<=0){xa(3056,2944,98,3040)}p=a+16|0;c[f>>2]=c[p>>2];c[h+(j*36|0)+32>>2]=-1;c[p>>2]=j;c[e>>2]=(c[e>>2]|0)+ -1;i=d;return}b=h+(k*36|0)+24|0;if((c[b>>2]|0)==(j|0)){c[b>>2]=p}else{c[h+(k*36|0)+28>>2]=p}c[h+(p*36|0)+20>>2]=k;if(!((j|0)>-1)){xa(3e3,2944,97,3040)}if((c[a+12>>2]|0)<=(j|0)){xa(3e3,2944,97,3040)}b=a+8|0;if((c[b>>2]|0)<=0){xa(3056,2944,98,3040)}p=a+16|0;c[f>>2]=c[p>>2];c[h+(j*36|0)+32>>2]=-1;c[p>>2]=j;c[b>>2]=(c[b>>2]|0)+ -1;do{f=$c(a,k)|0;k=c[e>>2]|0;j=c[k+(f*36|0)+24>>2]|0;h=c[k+(f*36|0)+28>>2]|0;n=+g[k+(j*36|0)>>2];o=+g[k+(h*36|0)>>2];m=+g[k+(j*36|0)+4>>2];l=+g[k+(h*36|0)+4>>2];n=+(n<o?n:o);o=+(m<l?m:l);p=k+(f*36|0)|0;g[p>>2]=n;g[p+4>>2]=o;o=+g[k+(j*36|0)+8>>2];n=+g[k+(h*36|0)+8>>2];m=+g[k+(j*36|0)+12>>2];l=+g[k+(h*36|0)+12>>2];n=+(o>n?o:n);o=+(m>l?m:l);k=k+(f*36|0)+8|0;g[k>>2]=n;g[k+4>>2]=o;k=c[e>>2]|0;j=c[k+(j*36|0)+32>>2]|0;h=c[k+(h*36|0)+32>>2]|0;c[k+(f*36|0)+32>>2]=((j|0)>(h|0)?j:h)+1;k=c[k+(f*36|0)+20>>2]|0}while(!((k|0)==-1));i=d;return}function _c(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;h=i;if(!((b|0)>-1)){xa(3072,2944,135,3152)}if((c[a+12>>2]|0)<=(b|0)){xa(3072,2944,135,3152)}f=a+4|0;p=c[f>>2]|0;if(!((c[p+(b*36|0)+24>>2]|0)==-1)){xa(3120,2944,137,3152)}if(((+g[p+(b*36|0)>>2]<=+g[d>>2]?+g[p+(b*36|0)+4>>2]<=+g[d+4>>2]:0)?+g[d+8>>2]<=+g[p+(b*36|0)+8>>2]:0)?+g[d+12>>2]<=+g[p+(b*36|0)+12>>2]:0){d=0;i=h;return d|0}Zc(a,b);p=d;k=+g[p>>2];m=+g[p+4>>2];d=d+8|0;n=+g[d>>2];k=k+-.10000000149011612;m=m+-.10000000149011612;n=n+.10000000149011612;j=+g[d+4>>2]+.10000000149011612;o=+g[e>>2]*2.0;l=+g[e+4>>2]*2.0;if(o<0.0){k=k+o}else{n=o+n}if(l<0.0){m=m+l}else{j=l+j}d=c[f>>2]|0;l=+k;o=+m;p=d+(b*36|0)|0;g[p>>2]=l;g[p+4>>2]=o;n=+n;o=+j;d=d+(b*36|0)+8|0;g[d>>2]=n;g[d+4>>2]=o;Yc(a,b);d=1;i=h;return d|0}function $c(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0;d=i;if((b|0)==-1){xa(3216,2944,382,3232)}j=c[a+4>>2]|0;p=j+(b*36|0)|0;u=j+(b*36|0)+24|0;l=c[u>>2]|0;if((l|0)==-1){x=b;i=d;return x|0}e=j+(b*36|0)+32|0;if((c[e>>2]|0)<2){x=b;i=d;return x|0}w=j+(b*36|0)+28|0;k=c[w>>2]|0;if(!((l|0)>-1)){xa(3240,2944,392,3232)}o=c[a+12>>2]|0;if((l|0)>=(o|0)){xa(3240,2944,392,3232)}if(!((k|0)>-1&(k|0)<(o|0))){xa(3272,2944,393,3232)}m=j+(l*36|0)|0;n=j+(k*36|0)|0;f=j+(k*36|0)+32|0;h=j+(l*36|0)+32|0;q=(c[f>>2]|0)-(c[h>>2]|0)|0;if((q|0)>1){x=j+(k*36|0)+24|0;q=c[x>>2]|0;u=j+(k*36|0)+28|0;r=c[u>>2]|0;s=j+(q*36|0)|0;t=j+(r*36|0)|0;if(!((q|0)>-1&(q|0)<(o|0))){xa(3304,2944,407,3232)}if(!((r|0)>-1&(r|0)<(o|0))){xa(3336,2944,408,3232)}c[x>>2]=b;x=j+(b*36|0)+20|0;o=j+(k*36|0)+20|0;c[o>>2]=c[x>>2];c[x>>2]=k;o=c[o>>2]|0;do{if(!((o|0)==-1)){a=j+(o*36|0)+24|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=k;break}a=j+(o*36|0)+28|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=k;break}else{xa(3368,2944,424,3232)}}else{c[a>>2]=k}}while(0);a=j+(q*36|0)+32|0;o=j+(r*36|0)+32|0;if((c[a>>2]|0)>(c[o>>2]|0)){c[u>>2]=q;c[w>>2]=r;c[j+(r*36|0)+20>>2]=b;v=+g[m>>2];y=+g[t>>2];v=v<y?v:y;z=+g[j+(l*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];A=+v;z=+(z<y?z:y);x=p;g[x>>2]=A;g[x+4>>2]=z;z=+g[j+(l*36|0)+8>>2];A=+g[j+(r*36|0)+8>>2];y=+g[j+(l*36|0)+12>>2];B=+g[j+(r*36|0)+12>>2];z=+(z>A?z:A);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[s>>2];y=+g[j+(b*36|0)+4>>2];z=+g[j+(q*36|0)+4>>2];v=+(v<A?v:A);y=+(y<z?y:z);x=n;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];v=+g[j+(q*36|0)+8>>2];z=+g[j+(b*36|0)+12>>2];A=+g[j+(q*36|0)+12>>2];v=+(y>v?y:v);B=+(z>A?z:A);j=j+(k*36|0)+8|0;g[j>>2]=v;g[j+4>>2]=B;h=c[h>>2]|0;j=c[o>>2]|0;h=((h|0)>(j|0)?h:j)+1|0;c[e>>2]=h;e=c[a>>2]|0;e=(h|0)>(e|0)?h:e}else{c[u>>2]=r;c[w>>2]=q;c[j+(q*36|0)+20>>2]=b;v=+g[m>>2];y=+g[s>>2];v=v<y?v:y;z=+g[j+(l*36|0)+4>>2];A=+g[j+(q*36|0)+4>>2];y=+v;z=+(z<A?z:A);x=p;g[x>>2]=y;g[x+4>>2]=z;z=+g[j+(l*36|0)+8>>2];A=+g[j+(q*36|0)+8>>2];y=+g[j+(l*36|0)+12>>2];B=+g[j+(q*36|0)+12>>2];z=+(z>A?z:A);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[t>>2];y=+g[j+(b*36|0)+4>>2];z=+g[j+(r*36|0)+4>>2];v=+(v<A?v:A);z=+(y<z?y:z);x=n;g[x>>2]=v;g[x+4>>2]=z;z=+g[j+(b*36|0)+8>>2];v=+g[j+(r*36|0)+8>>2];y=+g[j+(b*36|0)+12>>2];A=+g[j+(r*36|0)+12>>2];v=+(z>v?z:v);B=+(y>A?y:A);j=j+(k*36|0)+8|0;g[j>>2]=v;g[j+4>>2]=B;h=c[h>>2]|0;j=c[a>>2]|0;h=((h|0)>(j|0)?h:j)+1|0;c[e>>2]=h;e=c[o>>2]|0;e=(h|0)>(e|0)?h:e}c[f>>2]=e+1;x=k;i=d;return x|0}if(!((q|0)<-1)){x=b;i=d;return x|0}x=j+(l*36|0)+24|0;q=c[x>>2]|0;w=j+(l*36|0)+28|0;r=c[w>>2]|0;t=j+(q*36|0)|0;s=j+(r*36|0)|0;if(!((q|0)>-1&(q|0)<(o|0))){xa(3400,2944,467,3232)}if(!((r|0)>-1&(r|0)<(o|0))){xa(3432,2944,468,3232)}c[x>>2]=b;x=j+(b*36|0)+20|0;o=j+(l*36|0)+20|0;c[o>>2]=c[x>>2];c[x>>2]=l;o=c[o>>2]|0;do{if(!((o|0)==-1)){a=j+(o*36|0)+24|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=l;break}a=j+(o*36|0)+28|0;if((c[a>>2]|0)==(b|0)){c[a>>2]=l;break}else{xa(3464,2944,484,3232)}}else{c[a>>2]=l}}while(0);o=j+(q*36|0)+32|0;a=j+(r*36|0)+32|0;if((c[o>>2]|0)>(c[a>>2]|0)){c[w>>2]=q;c[u>>2]=r;c[j+(r*36|0)+20>>2]=b;v=+g[n>>2];y=+g[s>>2];v=v<y?v:y;z=+g[j+(k*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];A=+v;z=+(z<y?z:y);x=p;g[x>>2]=A;g[x+4>>2]=z;z=+g[j+(k*36|0)+8>>2];y=+g[j+(r*36|0)+8>>2];A=+g[j+(k*36|0)+12>>2];B=+g[j+(r*36|0)+12>>2];y=+(z>y?z:y);A=+(A>B?A:B);x=j+(b*36|0)+8|0;g[x>>2]=y;g[x+4>>2]=A;A=+g[t>>2];z=+g[j+(b*36|0)+4>>2];y=+g[j+(q*36|0)+4>>2];v=+(v<A?v:A);y=+(z<y?z:y);x=m;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];z=+g[j+(q*36|0)+8>>2];v=+g[j+(b*36|0)+12>>2];A=+g[j+(q*36|0)+12>>2];y=+(y>z?y:z);B=+(v>A?v:A);j=j+(l*36|0)+8|0;g[j>>2]=y;g[j+4>>2]=B;f=c[f>>2]|0;j=c[a>>2]|0;f=((f|0)>(j|0)?f:j)+1|0;c[e>>2]=f;e=c[o>>2]|0;e=(f|0)>(e|0)?f:e}else{c[w>>2]=r;c[u>>2]=q;c[j+(q*36|0)+20>>2]=b;v=+g[n>>2];y=+g[t>>2];v=v<y?v:y;z=+g[j+(k*36|0)+4>>2];A=+g[j+(q*36|0)+4>>2];y=+v;A=+(z<A?z:A);x=p;g[x>>2]=y;g[x+4>>2]=A;A=+g[j+(k*36|0)+8>>2];z=+g[j+(q*36|0)+8>>2];y=+g[j+(k*36|0)+12>>2];B=+g[j+(q*36|0)+12>>2];z=+(A>z?A:z);A=+(y>B?y:B);x=j+(b*36|0)+8|0;g[x>>2]=z;g[x+4>>2]=A;A=+g[s>>2];z=+g[j+(b*36|0)+4>>2];y=+g[j+(r*36|0)+4>>2];v=+(v<A?v:A);y=+(z<y?z:y);x=m;g[x>>2]=v;g[x+4>>2]=y;y=+g[j+(b*36|0)+8>>2];z=+g[j+(r*36|0)+8>>2];v=+g[j+(b*36|0)+12>>2];A=+g[j+(r*36|0)+12>>2];y=+(y>z?y:z);B=+(v>A?v:A);j=j+(l*36|0)+8|0;g[j>>2]=y;g[j+4>>2]=B;f=c[f>>2]|0;j=c[o>>2]|0;f=((f|0)>(j|0)?f:j)+1|0;c[e>>2]=f;e=c[a>>2]|0;e=(f|0)>(e|0)?f:e}c[h>>2]=e+1;x=l;i=d;return x|0}function ad(d,e){d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0.0,J=0.0,K=0,L=0,N=0,O=0,P=0,S=0,T=0,U=0,V=0.0,W=0,X=0.0,Y=0.0,Z=0,_=0,$=0.0,aa=0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0;f=i;i=i+320|0;q=f+276|0;p=f+240|0;r=f+228|0;k=f+136|0;m=f+112|0;n=f+8|0;o=f+4|0;j=f;c[874]=(c[874]|0)+1;c[d>>2]=0;x=e+128|0;h=d+4|0;g[h>>2]=+g[x>>2];l=e+28|0;u=q+0|0;t=e+56|0;v=u+36|0;do{c[u>>2]=c[t>>2];u=u+4|0;t=t+4|0}while((u|0)<(v|0));u=p+0|0;t=e+92|0;v=u+36|0;do{c[u>>2]=c[t>>2];u=u+4|0;t=t+4|0}while((u|0)<(v|0));t=q+24|0;X=+g[t>>2];Y=+M(+(X/6.2831854820251465))*6.2831854820251465;X=X-Y;g[t>>2]=X;u=q+28|0;Y=+g[u>>2]-Y;g[u>>2]=Y;v=p+24|0;$=+g[v>>2];V=+M(+($/6.2831854820251465))*6.2831854820251465;$=$-V;g[v>>2]=$;w=p+28|0;V=+g[w>>2]-V;g[w>>2]=V;s=+g[x>>2];G=+g[e+24>>2]+ +g[e+52>>2]+-.014999999664723873;G=G<.004999999888241291?.004999999888241291:G;if(!(G>.0012499999720603228)){xa(3536,3560,280,3600)}b[r+4>>1]=0;c[k+0>>2]=c[e+0>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];T=k+28|0;c[T+0>>2]=c[l+0>>2];c[T+4>>2]=c[l+4>>2];c[T+8>>2]=c[l+8>>2];c[T+12>>2]=c[l+12>>2];c[T+16>>2]=c[l+16>>2];c[T+20>>2]=c[l+20>>2];c[T+24>>2]=c[l+24>>2];a[k+88>>0]=0;T=q+8|0;F=q+12|0;H=q+16|0;A=q+20|0;K=q+4|0;N=p+8|0;P=p+12|0;O=p+16|0;S=p+20|0;L=p+4|0;E=k+56|0;D=k+64|0;C=k+68|0;B=k+72|0;y=k+80|0;x=k+84|0;z=m+16|0;I=G+.0012499999720603228;J=G+-.0012499999720603228;ba=V;U=0;V=0.0;a:while(1){ja=1.0-V;ca=ja*X+V*Y;Y=+R(+ca);ca=+Q(+ca);ia=+g[q>>2];ha=+g[K>>2];X=ja*$+V*ba;ga=+R(+X);X=+Q(+X);$=+g[p>>2];ea=+g[L>>2];da=ja*+g[N>>2]+V*+g[O>>2]-(X*$-ga*ea);ea=ja*+g[P>>2]+V*+g[S>>2]-(ga*$+X*ea);$=+(ja*+g[T>>2]+V*+g[H>>2]-(ca*ia-Y*ha));ba=+(ja*+g[F>>2]+V*+g[A>>2]-(Y*ia+ca*ha));fa=E;g[fa>>2]=$;g[fa+4>>2]=ba;g[D>>2]=Y;g[C>>2]=ca;da=+da;ea=+ea;fa=B;g[fa>>2]=da;g[fa+4>>2]=ea;g[y>>2]=ga;g[x>>2]=X;Rc(m,r,k);X=+g[z>>2];if(X<=0.0){j=5;break}if(X<I){j=7;break}+bd(n,r,e,q,l,p,V);W=0;X=s;do{da=+cd(n,o,j,X);if(da>I){j=10;break a}if(da>J){V=X;break}_=c[o>>2]|0;Z=c[j>>2]|0;ba=+dd(n,_,Z,V);if(ba<J){j=13;break a}if(!(ba<=I)){Y=V;$=X;aa=0}else{j=15;break a}while(1){if((aa&1|0)==0){ca=(Y+$)*.5}else{ca=Y+(G-ba)*($-Y)/(da-ba)}ea=+dd(n,_,Z,ca);ga=ea-G;if(!(ga>0.0)){ga=-ga}if(ga<.0012499999720603228){X=ca;break}fa=ea>G;aa=aa+1|0;c[880]=(c[880]|0)+1;if((aa|0)==50){aa=50;break}else{Y=fa?ca:Y;$=fa?$:ca;ba=fa?ea:ba;da=fa?da:ea}}Z=c[882]|0;c[882]=(Z|0)>(aa|0)?Z:aa;W=W+1|0}while((W|0)!=8);U=U+1|0;c[876]=(c[876]|0)+1;if((U|0)==20){j=27;break}X=+g[t>>2];Y=+g[u>>2];$=+g[v>>2];ba=+g[w>>2]}if((j|0)==5){c[d>>2]=2;g[h>>2]=0.0;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}else if((j|0)==7){c[d>>2]=3;g[h>>2]=V;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}else if((j|0)==10){c[d>>2]=4;g[h>>2]=s}else if((j|0)==13){c[d>>2]=1;g[h>>2]=V}else if((j|0)==15){c[d>>2]=3;g[h>>2]=V}else if((j|0)==27){c[d>>2]=1;g[h>>2]=V;U=20;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}c[876]=(c[876]|0)+1;U=U+1|0;h=c[878]|0;fa=(h|0)>(U|0);fa=fa?h:U;c[878]=fa;i=f;return}function bd(e,f,h,j,k,l,m){e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;l=l|0;m=+m;var n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0.0,I=0.0;n=i;c[e>>2]=h;c[e+4>>2]=k;v=b[f+4>>1]|0;if(!(v<<16>>16!=0&(v&65535)<3)){xa(3744,3560,50,3768)}D=e+8|0;E=D+0|0;G=j+0|0;F=E+36|0;do{c[E>>2]=c[G>>2];E=E+4|0;G=G+4|0}while((E|0)<(F|0));j=e+44|0;E=j+0|0;G=l+0|0;F=E+36|0;do{c[E>>2]=c[G>>2];E=E+4|0;G=G+4|0}while((E|0)<(F|0));A=1.0-m;p=A*+g[e+32>>2]+ +g[e+36>>2]*m;o=+R(+p);p=+Q(+p);s=+g[D>>2];q=+g[e+12>>2];t=A*+g[e+16>>2]+ +g[e+24>>2]*m-(p*s-o*q);q=A*+g[e+20>>2]+ +g[e+28>>2]*m-(o*s+p*q);s=A*+g[e+68>>2]+ +g[e+72>>2]*m;r=+R(+s);s=+Q(+s);B=+g[j>>2];C=+g[e+48>>2];u=A*+g[e+52>>2]+ +g[e+60>>2]*m-(s*B-r*C);m=A*+g[e+56>>2]+ +g[e+64>>2]*m-(r*B+s*C);if(v<<16>>16==1){c[e+80>>2]=0;v=d[f+6>>0]|0;if((c[h+20>>2]|0)<=(v|0)){xa(3640,3672,103,3704)}G=(c[h+16>>2]|0)+(v<<3)|0;w=+g[G>>2];x=+g[G+4>>2];f=d[f+9>>0]|0;if((c[k+20>>2]|0)<=(f|0)){xa(3640,3672,103,3704)}f=(c[k+16>>2]|0)+(f<<3)|0;B=+g[f>>2];C=+g[f+4>>2];f=e+92|0;t=u+(s*B-r*C)-(t+(p*w-o*x));p=m+(r*B+s*C)-(q+(o*w+p*x));C=+t;o=+p;G=f;g[G>>2]=C;g[G+4>>2]=o;o=+O(+(t*t+p*p));if(o<1.1920928955078125e-7){C=0.0;i=n;return+C}C=1.0/o;g[f>>2]=t*C;g[e+96>>2]=p*C;C=o;i=n;return+C}v=f+6|0;j=f+7|0;D=e+80|0;if((a[v>>0]|0)==(a[j>>0]|0)){c[D>>2]=2;D=d[f+9>>0]|0;j=c[k+20>>2]|0;if((j|0)<=(D|0)){xa(3640,3672,103,3704)}k=c[k+16>>2]|0;G=k+(D<<3)|0;x=+g[G>>2];w=+g[G+4>>2];f=d[f+10>>0]|0;if((j|0)<=(f|0)){xa(3640,3672,103,3704)}f=k+(f<<3)|0;B=+g[f>>2];z=+g[f+4>>2];f=e+92|0;C=B-x;A=z-w;y=-C;I=+A;H=+y;G=f;g[G>>2]=I;g[G+4>>2]=H;C=+O(+(A*A+C*C));if(!(C<1.1920928955078125e-7)){I=1.0/C;A=A*I;g[f>>2]=A;y=I*y;g[e+96>>2]=y}x=(x+B)*.5;w=(w+z)*.5;H=+x;I=+w;e=e+84|0;g[e>>2]=H;g[e+4>>2]=I;e=d[v>>0]|0;if((c[h+20>>2]|0)<=(e|0)){xa(3640,3672,103,3704)}G=(c[h+16>>2]|0)+(e<<3)|0;H=+g[G>>2];I=+g[G+4>>2];o=(s*A-r*y)*(t+(p*H-o*I)-(u+(s*x-r*w)))+(r*A+s*y)*(q+(o*H+p*I)-(m+(r*x+s*w)));if(!(o<0.0)){I=o;i=n;return+I}H=+-A;I=+-y;G=f;g[G>>2]=H;g[G+4>>2]=I;I=-o;i=n;return+I}else{c[D>>2]=1;D=d[v>>0]|0;v=c[h+20>>2]|0;if((v|0)<=(D|0)){xa(3640,3672,103,3704)}h=c[h+16>>2]|0;G=h+(D<<3)|0;x=+g[G>>2];w=+g[G+4>>2];j=d[j>>0]|0;if((v|0)<=(j|0)){xa(3640,3672,103,3704)}h=h+(j<<3)|0;B=+g[h>>2];z=+g[h+4>>2];h=e+92|0;C=B-x;A=z-w;y=-C;H=+A;I=+y;G=h;g[G>>2]=H;g[G+4>>2]=I;C=+O(+(A*A+C*C));if(!(C<1.1920928955078125e-7)){I=1.0/C;A=A*I;g[h>>2]=A;y=I*y;g[e+96>>2]=y}x=(x+B)*.5;w=(w+z)*.5;H=+x;I=+w;e=e+84|0;g[e>>2]=H;g[e+4>>2]=I;e=d[f+9>>0]|0;if((c[k+20>>2]|0)<=(e|0)){xa(3640,3672,103,3704)}G=(c[k+16>>2]|0)+(e<<3)|0;H=+g[G>>2];I=+g[G+4>>2];o=(p*A-o*y)*(u+(s*H-r*I)-(t+(p*x-o*w)))+(o*A+p*y)*(m+(r*H+s*I)-(q+(o*x+p*w)));if(!(o<0.0)){I=o;i=n;return+I}H=+-A;I=+-y;G=h;g[G>>2]=H;g[G+4>>2]=I;I=-o;i=n;return+I}return 0.0}function cd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0;f=i;x=1.0-e;m=x*+g[a+32>>2]+ +g[a+36>>2]*e;k=+R(+m);m=+Q(+m);j=+g[a+8>>2];l=+g[a+12>>2];o=x*+g[a+16>>2]+ +g[a+24>>2]*e-(m*j-k*l);l=x*+g[a+20>>2]+ +g[a+28>>2]*e-(k*j+m*l);j=x*+g[a+68>>2]+ +g[a+72>>2]*e;h=+R(+j);j=+Q(+j);y=+g[a+44>>2];z=+g[a+48>>2];n=x*+g[a+52>>2]+ +g[a+60>>2]*e-(j*y-h*z);e=x*+g[a+56>>2]+ +g[a+64>>2]*e-(h*y+j*z);v=c[a+80>>2]|0;if((v|0)==0){p=+g[a+92>>2];q=+g[a+96>>2];z=m*p+k*q;w=m*q-k*p;u=-p;y=-q;t=j*u+h*y;u=j*y-h*u;s=c[a>>2]|0;r=c[s+16>>2]|0;s=s+20|0;A=c[s>>2]|0;if((A|0)>1){B=0;x=w*+g[r+4>>2]+z*+g[r>>2];C=1;while(1){y=z*+g[r+(C<<3)>>2]+w*+g[r+(C<<3)+4>>2];v=y>x;B=v?C:B;C=C+1|0;if((C|0)==(A|0)){break}else{x=v?y:x}}}else{B=0}c[b>>2]=B;a=c[a+4>>2]|0;v=c[a+16>>2]|0;a=a+20|0;A=c[a>>2]|0;if((A|0)>1){C=0;w=u*+g[v+4>>2]+t*+g[v>>2];D=1;while(1){x=t*+g[v+(D<<3)>>2]+u*+g[v+(D<<3)+4>>2];B=x>w;C=B?D:C;D=D+1|0;if((D|0)==(A|0)){break}else{w=B?x:w}}}else{C=0}c[d>>2]=C;d=c[b>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[s>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}D=r+(d<<3)|0;t=+g[D>>2];u=+g[D+4>>2];if(!((C|0)>-1)){xa(3640,3672,103,3704)}if((c[a>>2]|0)<=(C|0)){xa(3640,3672,103,3704)}D=v+(C<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=p*(n+(j*y-h*z)-(o+(m*t-k*u)))+q*(e+(h*y+j*z)-(l+(k*t+m*u)));i=f;return+z}else if((v|0)==1){y=+g[a+92>>2];p=+g[a+96>>2];q=m*y-k*p;p=k*y+m*p;y=+g[a+84>>2];z=+g[a+88>>2];o=o+(m*y-k*z);k=l+(k*y+m*z);m=-q;z=-p;l=j*m+h*z;m=j*z-h*m;c[b>>2]=-1;A=a+4|0;B=c[A>>2]|0;a=c[B+16>>2]|0;B=c[B+20>>2]|0;if((B|0)>1){v=0;t=m*+g[a+4>>2]+l*+g[a>>2];s=1;while(1){u=l*+g[a+(s<<3)>>2]+m*+g[a+(s<<3)+4>>2];b=u>t;v=b?s:v;s=s+1|0;if((s|0)==(B|0)){break}else{t=b?u:t}}c[d>>2]=v;if((v|0)>-1){r=v}else{xa(3640,3672,103,3704)}}else{c[d>>2]=0;r=0}d=c[A>>2]|0;if((c[d+20>>2]|0)<=(r|0)){xa(3640,3672,103,3704)}D=(c[d+16>>2]|0)+(r<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=q*(n+(j*y-h*z)-o)+p*(e+(h*y+j*z)-k);i=f;return+z}else if((v|0)==2){y=+g[a+92>>2];q=+g[a+96>>2];p=j*y-h*q;q=h*y+j*q;y=+g[a+84>>2];z=+g[a+88>>2];n=n+(j*y-h*z);h=e+(h*y+j*z);j=-p;z=-q;e=m*j+k*z;j=m*z-k*j;c[d>>2]=-1;B=c[a>>2]|0;A=c[B+16>>2]|0;B=c[B+20>>2]|0;if((B|0)>1){d=0;u=j*+g[A+4>>2]+e*+g[A>>2];r=1;while(1){t=e*+g[A+(r<<3)>>2]+j*+g[A+(r<<3)+4>>2];v=t>u;d=v?r:d;r=r+1|0;if((r|0)==(B|0)){break}else{u=v?t:u}}c[b>>2]=d;if((d|0)>-1){s=d}else{xa(3640,3672,103,3704)}}else{c[b>>2]=0;s=0}d=c[a>>2]|0;if((c[d+20>>2]|0)<=(s|0)){xa(3640,3672,103,3704)}D=(c[d+16>>2]|0)+(s<<3)|0;y=+g[D>>2];z=+g[D+4>>2];z=p*(o+(m*y-k*z)-n)+q*(l+(k*y+m*z)-h);i=f;return+z}else{xa(3616,3560,183,3720)}return 0.0}function dd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0.0,h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0;o=i;q=1.0-e;j=q*+g[a+32>>2]+ +g[a+36>>2]*e;k=+R(+j);j=+Q(+j);h=+g[a+8>>2];f=+g[a+12>>2];m=q*+g[a+16>>2]+ +g[a+24>>2]*e-(j*h-k*f);f=q*+g[a+20>>2]+ +g[a+28>>2]*e-(k*h+j*f);h=q*+g[a+68>>2]+ +g[a+72>>2]*e;n=+R(+h);h=+Q(+h);r=+g[a+44>>2];s=+g[a+48>>2];l=q*+g[a+52>>2]+ +g[a+60>>2]*e-(h*r-n*s);e=q*+g[a+56>>2]+ +g[a+64>>2]*e-(n*r+h*s);t=c[a+80>>2]|0;if((t|0)==2){s=+g[a+92>>2];p=+g[a+96>>2];q=+g[a+84>>2];r=+g[a+88>>2];a=c[a>>2]|0;if(!((b|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(b|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(b<<3)|0;v=+g[t>>2];u=+g[t+4>>2];s=(h*s-n*p)*(m+(j*v-k*u)-(l+(h*q-n*r)))+(n*s+h*p)*(f+(k*v+j*u)-(e+(n*q+h*r)));i=o;return+s}else if((t|0)==0){p=+g[a+92>>2];q=+g[a+96>>2];t=c[a>>2]|0;if(!((b|0)>-1)){xa(3640,3672,103,3704)}if((c[t+20>>2]|0)<=(b|0)){xa(3640,3672,103,3704)}t=(c[t+16>>2]|0)+(b<<3)|0;s=+g[t>>2];r=+g[t+4>>2];a=c[a+4>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(d<<3)|0;u=+g[t>>2];v=+g[t+4>>2];v=p*(l+(h*u-n*v)-(m+(j*s-k*r)))+q*(e+(n*u+h*v)-(f+(k*s+j*r)));i=o;return+v}else if((t|0)==1){p=+g[a+92>>2];s=+g[a+96>>2];r=+g[a+84>>2];q=+g[a+88>>2];a=c[a+4>>2]|0;if(!((d|0)>-1)){xa(3640,3672,103,3704)}if((c[a+20>>2]|0)<=(d|0)){xa(3640,3672,103,3704)}t=(c[a+16>>2]|0)+(d<<3)|0;u=+g[t>>2];v=+g[t+4>>2];v=(j*p-k*s)*(l+(h*u-n*v)-(m+(j*r-k*q)))+(k*p+j*s)*(e+(n*u+h*v)-(f+(k*r+j*q)));i=o;return+v}else{xa(3616,3560,242,3624)}return 0.0}function ed(a){a=a|0;c[a+102400>>2]=0;c[a+102404>>2]=0;c[a+102408>>2]=0;c[a+102796>>2]=0;return}function fd(a){a=a|0;var b=0;b=i;if((c[a+102400>>2]|0)!=0){xa(3792,3808,32,3848)}if((c[a+102796>>2]|0)==0){i=b;return}else{xa(3872,3808,33,3848)}}function gd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;f=i;g=b+102796|0;h=c[g>>2]|0;if((h|0)>=32){xa(3896,3808,38,3936)}e=b+(h*12|0)+102412|0;c[b+(h*12|0)+102416>>2]=d;j=b+102400|0;k=c[j>>2]|0;if((k+d|0)>102400){c[e>>2]=Zb(d)|0;a[b+(h*12|0)+102420>>0]=1}else{c[e>>2]=b+k;a[b+(h*12|0)+102420>>0]=0;c[j>>2]=(c[j>>2]|0)+d}h=b+102404|0;d=(c[h>>2]|0)+d|0;c[h>>2]=d;b=b+102408|0;h=c[b>>2]|0;c[b>>2]=(h|0)>(d|0)?h:d;c[g>>2]=(c[g>>2]|0)+1;i=f;return c[e>>2]|0}function hd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;f=i;e=b+102796|0;h=c[e>>2]|0;if((h|0)<=0){xa(3952,3808,63,3976)}g=h+ -1|0;if((c[b+(g*12|0)+102412>>2]|0)!=(d|0)){xa(3984,3808,65,3976)}if((a[b+(g*12|0)+102420>>0]|0)==0){g=b+(g*12|0)+102416|0;d=b+102400|0;c[d>>2]=(c[d>>2]|0)-(c[g>>2]|0)}else{_b(d);h=c[e>>2]|0;g=b+(g*12|0)+102416|0}d=b+102404|0;c[d>>2]=(c[d>>2]|0)-(c[g>>2]|0);c[e>>2]=h+ -1;i=f;return}function id(a){a=a|0;return}function jd(a){a=a|0;return}function kd(a){a=a|0;return 0.0}function ld(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0;h=i;if((a[4200]|0)==0){c[1002]=3;c[4012>>2]=3;a[4016>>0]=1;c[4104>>2]=4;c[4108>>2]=4;a[4112>>0]=1;c[4032>>2]=4;c[4036>>2]=4;a[4040>>0]=0;c[4128>>2]=5;c[4132>>2]=5;a[4136>>0]=1;c[4056>>2]=6;c[4060>>2]=6;a[4064>>0]=1;c[4020>>2]=6;c[4024>>2]=6;a[4028>>0]=0;c[4080>>2]=7;c[4084>>2]=7;a[4088>>0]=1;c[4116>>2]=7;c[4120>>2]=7;a[4124>>0]=0;c[4152>>2]=8;c[4156>>2]=8;a[4160>>0]=1;c[4044>>2]=8;c[4048>>2]=8;a[4052>>0]=0;c[4176>>2]=9;c[4180>>2]=9;a[4184>>0]=1;c[4140>>2]=9;c[4144>>2]=9;a[4148>>0]=0;a[4200]=1}j=c[(c[b+12>>2]|0)+4>>2]|0;k=c[(c[e+12>>2]|0)+4>>2]|0;if(!(j>>>0<4)){xa(4208,4256,80,4344)}if(!(k>>>0<4)){xa(4296,4256,81,4344)}l=c[4008+(j*48|0)+(k*12|0)>>2]|0;if((l|0)==0){l=0;i=h;return l|0}if((a[4008+(j*48|0)+(k*12|0)+8>>0]|0)==0){l=qb[l&15](e,f,b,d,g)|0;i=h;return l|0}else{l=qb[l&15](b,d,e,f,g)|0;i=h;return l|0}return 0}function md(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;if((a[4200]|0)==0){xa(4352,4256,103,4376)}j=c[d+48>>2]|0;if((c[d+124>>2]|0)>0){m=c[j+8>>2]|0;l=m+4|0;k=e[l>>1]|0;if((k&2|0)==0){b[l>>1]=k|2;g[m+144>>2]=0.0}m=c[d+52>>2]|0;l=c[m+8>>2]|0;k=l+4|0;n=e[k>>1]|0;if((n&2|0)==0){b[k>>1]=n|2;g[l+144>>2]=0.0}}else{m=c[d+52>>2]|0}j=c[(c[j+12>>2]|0)+4>>2]|0;k=c[(c[m+12>>2]|0)+4>>2]|0;if((j|0)>-1&(k|0)<4){jb[c[4008+(j*48|0)+(k*12|0)+4>>2]&15](d,f);i=h;return}else{xa(4384,4256,114,4376)}}function nd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0.0;h=i;c[a>>2]=4440;c[a+4>>2]=4;c[a+48>>2]=b;c[a+52>>2]=e;c[a+56>>2]=d;c[a+60>>2]=f;c[a+124>>2]=0;c[a+128>>2]=0;f=b+16|0;d=a+8|0;j=d+40|0;do{c[d>>2]=0;d=d+4|0}while((d|0)<(j|0));g[a+136>>2]=+O(+(+g[f>>2]*+g[e+16>>2]));k=+g[b+20>>2];l=+g[e+20>>2];g[a+140>>2]=k>l?k:l;i=h;return}function od(d,f){d=d|0;f=f|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+64|0;h=j;p=d+64|0;l=h+0|0;m=p+0|0;k=l+64|0;do{c[l>>2]=c[m>>2];l=l+4|0;m=m+4|0}while((l|0)<(k|0));l=d+4|0;q=c[l>>2]|0;c[l>>2]=q|4;q=q>>>1;t=c[d+48>>2]|0;u=c[d+52>>2]|0;k=(a[u+38>>0]|a[t+38>>0])<<24>>24!=0;n=c[t+8>>2]|0;m=c[u+8>>2]|0;r=n+12|0;s=m+12|0;if(!k){rb[c[c[d>>2]>>2]&15](d,p,r,s);r=d+124|0;p=(c[r>>2]|0)>0;a:do{if(p){y=c[h+60>>2]|0;if((y|0)>0){x=0}else{o=0;while(1){g[d+(o*20|0)+72>>2]=0.0;g[d+(o*20|0)+76>>2]=0.0;o=o+1|0;if((o|0)>=(c[r>>2]|0)){break a}}}do{v=d+(x*20|0)+72|0;g[v>>2]=0.0;u=d+(x*20|0)+76|0;g[u>>2]=0.0;t=c[d+(x*20|0)+80>>2]|0;w=0;while(1){s=w+1|0;if((c[h+(w*20|0)+16>>2]|0)==(t|0)){o=7;break}if((s|0)<(y|0)){w=s}else{break}}if((o|0)==7){o=0;g[v>>2]=+g[h+(w*20|0)+8>>2];g[u>>2]=+g[h+(w*20|0)+12>>2]}x=x+1|0}while((x|0)<(c[r>>2]|0))}}while(0);o=q&1;if(p^(o|0)!=0){q=n+4|0;r=e[q>>1]|0;if((r&2|0)==0){b[q>>1]=r|2;g[n+144>>2]=0.0}n=m+4|0;q=e[n>>1]|0;if((q&2|0)==0){b[n>>1]=q|2;g[m+144>>2]=0.0}}}else{p=_d(c[t+12>>2]|0,c[d+56>>2]|0,c[u+12>>2]|0,c[d+60>>2]|0,r,s)|0;c[d+124>>2]=0;o=q&1}m=c[l>>2]|0;c[l>>2]=p?m|2:m&-3;n=(o|0)==0;l=p^1;m=(f|0)==0;if(!(n^1|l|m)){jb[c[(c[f>>2]|0)+8>>2]&15](f,d)}if(!(n|p|m)){jb[c[(c[f>>2]|0)+12>>2]&15](f,d)}if(k|l|m){i=j;return}lb[c[(c[f>>2]|0)+16>>2]&3](f,d,h);i=j;return}function pd(a){a=a|0;return}function qd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function rd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4488;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=1){xa(4504,4552,41,4608)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(4632,4552,42,4608)}return 0}function sd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function td(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Rd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function ud(a){a=a|0;return}function vd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function wd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4736;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=1){xa(4752,4800,41,4856)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){e=f;i=b;return e|0}else{xa(4880,4800,42,4856)}return 0}function xd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function yd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Ud(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function zd(a){a=a|0;return}function Ad(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Bd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=4984;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=2){xa(5e3,5048,41,5104)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(5136,5048,42,5104)}return 0}function Cd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function Dd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Qd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function Ed(a){a=a|0;return}function Fd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Gd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=5240;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=2){xa(5256,5304,44,5352)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){e=f;i=b;return e|0}else{xa(5376,5304,45,5352)}return 0}function Hd(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function Id(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Vd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function Jd(a){a=a|0;return}function Kd(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ld(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;h=i;j=a+40|0;c[j>>2]=b;c[a+44>>2]=d;c[a+48>>2]=e;c[a+28>>2]=0;c[a+36>>2]=0;c[a+32>>2]=0;c[a>>2]=f;c[a+4>>2]=g;c[a+8>>2]=gd(f,b<<2)|0;c[a+12>>2]=gd(c[a>>2]|0,d<<2)|0;c[a+16>>2]=gd(c[a>>2]|0,e<<2)|0;c[a+24>>2]=gd(c[a>>2]|0,(c[j>>2]|0)*12|0)|0;c[a+20>>2]=gd(c[a>>2]|0,(c[j>>2]|0)*12|0)|0;i=h;return}function Md(a){a=a|0;var b=0;b=i;hd(c[a>>2]|0,c[a+20>>2]|0);hd(c[a>>2]|0,c[a+24>>2]|0);hd(c[a>>2]|0,c[a+16>>2]|0);hd(c[a>>2]|0,c[a+12>>2]|0);hd(c[a>>2]|0,c[a+8>>2]|0);i=b;return}function Nd(d,e,f,h,j){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0;n=i;i=i+160|0;p=n+128|0;q=n+148|0;r=n+96|0;w=n+52|0;m=n;id(q);o=+g[f>>2];l=d+28|0;if((c[l>>2]|0)>0){t=d+8|0;s=h+4|0;u=d+20|0;v=d+24|0;y=0;do{B=c[(c[t>>2]|0)+(y<<2)>>2]|0;x=B+44|0;z=c[x>>2]|0;x=c[x+4>>2]|0;A=+g[B+56>>2];J=B+64|0;G=+g[J>>2];D=+g[J+4>>2];C=+g[B+72>>2];J=B+36|0;c[J>>2]=z;c[J+4>>2]=x;g[B+52>>2]=A;if((c[B>>2]|0)==2){E=+g[B+140>>2];F=+g[B+120>>2];H=1.0-o*+g[B+132>>2];H=H<1.0?H:1.0;H=H<0.0?0.0:H;I=1.0-o*+g[B+136>>2];I=I<1.0?I:1.0;G=(G+o*(E*+g[h>>2]+F*+g[B+76>>2]))*H;D=(D+o*(E*+g[s>>2]+F*+g[B+80>>2]))*H;C=(C+o*+g[B+128>>2]*+g[B+84>>2])*(I<0.0?0.0:I)}J=(c[u>>2]|0)+(y*12|0)|0;c[J>>2]=z;c[J+4>>2]=x;g[(c[u>>2]|0)+(y*12|0)+8>>2]=A;H=+G;I=+D;J=(c[v>>2]|0)+(y*12|0)|0;g[J>>2]=H;g[J+4>>2]=I;g[(c[v>>2]|0)+(y*12|0)+8>>2]=C;y=y+1|0}while((y|0)<(c[l>>2]|0))}else{u=d+20|0;v=d+24|0}c[r+0>>2]=c[f+0>>2];c[r+4>>2]=c[f+4>>2];c[r+8>>2]=c[f+8>>2];c[r+12>>2]=c[f+12>>2];c[r+16>>2]=c[f+16>>2];c[r+20>>2]=c[f+20>>2];B=c[u>>2]|0;c[r+24>>2]=B;J=c[v>>2]|0;c[r+28>>2]=J;c[w+0>>2]=c[f+0>>2];c[w+4>>2]=c[f+4>>2];c[w+8>>2]=c[f+8>>2];c[w+12>>2]=c[f+12>>2];c[w+16>>2]=c[f+16>>2];c[w+20>>2]=c[f+20>>2];t=d+12|0;c[w+24>>2]=c[t>>2];s=d+36|0;c[w+28>>2]=c[s>>2];c[w+32>>2]=B;c[w+36>>2]=J;c[w+40>>2]=c[d>>2];oe(m,w);qe(m);if((a[f+20>>0]|0)!=0){re(m)}w=d+32|0;if((c[w>>2]|0)>0){x=d+16|0;h=0;do{J=c[(c[x>>2]|0)+(h<<2)>>2]|0;jb[c[(c[J>>2]|0)+28>>2]&15](J,r);h=h+1|0}while((h|0)<(c[w>>2]|0))}g[e+12>>2]=+kd(q);h=f+12|0;if((c[h>>2]|0)>0){z=d+16|0;y=0;do{if((c[w>>2]|0)>0){x=0;do{J=c[(c[z>>2]|0)+(x<<2)>>2]|0;jb[c[(c[J>>2]|0)+32>>2]&15](J,r);x=x+1|0}while((x|0)<(c[w>>2]|0))}se(m);y=y+1|0}while((y|0)<(c[h>>2]|0))}te(m);g[e+16>>2]=+kd(q);if((c[l>>2]|0)>0){y=c[v>>2]|0;x=0;do{J=c[u>>2]|0;h=J+(x*12|0)|0;B=h;C=+g[B>>2];A=+g[B+4>>2];D=+g[J+(x*12|0)+8>>2];J=y+(x*12|0)|0;F=+g[J>>2];G=+g[J+4>>2];E=+g[y+(x*12|0)+8>>2];I=o*F;H=o*G;H=I*I+H*H;if(H>4.0){I=2.0/+O(+H);F=F*I;G=G*I}H=o*E;if(H*H>2.4674012660980225){if(!(H>0.0)){H=-H}E=E*(1.5707963705062866/H)}I=+(C+o*F);H=+(A+o*G);y=h;g[y>>2]=I;g[y+4>>2]=H;g[(c[u>>2]|0)+(x*12|0)+8>>2]=D+o*E;H=+F;I=+G;y=(c[v>>2]|0)+(x*12|0)|0;g[y>>2]=H;g[y+4>>2]=I;y=c[v>>2]|0;g[y+(x*12|0)+8>>2]=E;x=x+1|0}while((x|0)<(c[l>>2]|0))}f=f+16|0;a:do{if((c[f>>2]|0)>0){h=d+16|0;y=0;while(1){x=ue(m)|0;if((c[w>>2]|0)>0){z=0;B=1;do{J=c[(c[h>>2]|0)+(z<<2)>>2]|0;B=B&(pb[c[(c[J>>2]|0)+36>>2]&3](J,r)|0);z=z+1|0}while((z|0)<(c[w>>2]|0))}else{B=1}y=y+1|0;if(x&B){r=0;break a}if((y|0)>=(c[f>>2]|0)){r=1;break}}}else{r=1}}while(0);if((c[l>>2]|0)>0){f=d+8|0;w=0;do{J=c[(c[f>>2]|0)+(w<<2)>>2]|0;B=(c[u>>2]|0)+(w*12|0)|0;z=c[B>>2]|0;B=c[B+4>>2]|0;h=J+44|0;c[h>>2]=z;c[h+4>>2]=B;G=+g[(c[u>>2]|0)+(w*12|0)+8>>2];g[J+56>>2]=G;h=(c[v>>2]|0)+(w*12|0)|0;x=c[h+4>>2]|0;y=J+64|0;c[y>>2]=c[h>>2];c[y+4>>2]=x;g[J+72>>2]=+g[(c[v>>2]|0)+(w*12|0)+8>>2];E=+R(+G);g[J+20>>2]=E;G=+Q(+G);g[J+24>>2]=G;F=+g[J+28>>2];I=+g[J+32>>2];H=(c[k>>2]=z,+g[k>>2])-(G*F-E*I);I=(c[k>>2]=B,+g[k>>2])-(E*F+G*I);H=+H;I=+I;J=J+12|0;g[J>>2]=H;g[J+4>>2]=I;w=w+1|0}while((w|0)<(c[l>>2]|0))}g[e+20>>2]=+kd(q);q=c[m+40>>2]|0;e=d+4|0;if((c[e>>2]|0)!=0?(c[s>>2]|0)>0:0){f=p+16|0;u=0;do{v=c[(c[t>>2]|0)+(u<<2)>>2]|0;w=c[q+(u*152|0)+144>>2]|0;c[f>>2]=w;if((w|0)>0){h=0;do{g[p+(h<<2)>>2]=+g[q+(u*152|0)+(h*36|0)+16>>2];g[p+(h<<2)+8>>2]=+g[q+(u*152|0)+(h*36|0)+20>>2];h=h+1|0}while((h|0)!=(w|0))}J=c[e>>2]|0;lb[c[(c[J>>2]|0)+20>>2]&3](J,v,p);u=u+1|0}while((u|0)<(c[s>>2]|0))}if(!j){pe(m);i=n;return}j=c[l>>2]|0;p=(j|0)>0;if(p){e=c[d+8>>2]|0;q=0;A=3.4028234663852886e+38;do{f=c[e+(q<<2)>>2]|0;do{if((c[f>>2]|0)!=0){if((!((b[f+4>>1]&4)==0)?(I=+g[f+72>>2],!(I*I>.001218469929881394)):0)?(H=+g[f+64>>2],I=+g[f+68>>2],!(H*H+I*I>9999999747378752.0e-20)):0){J=f+144|0;C=o+ +g[J>>2];g[J>>2]=C;A=A<C?A:C;break}g[f+144>>2]=0.0;A=0.0}}while(0);q=q+1|0}while((q|0)<(j|0))}else{A=3.4028234663852886e+38}if(!(A>=.5)|r|p^1){pe(m);i=n;return}d=d+8|0;p=0;do{J=c[(c[d>>2]|0)+(p<<2)>>2]|0;B=J+4|0;b[B>>1]=b[B>>1]&65533;g[J+144>>2]=0.0;J=J+64|0;c[J+0>>2]=0;c[J+4>>2]=0;c[J+8>>2]=0;c[J+12>>2]=0;c[J+16>>2]=0;c[J+20>>2]=0;p=p+1|0}while((p|0)<(c[l>>2]|0));pe(m);i=n;return}function Od(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0.0;f=i;i=i+128|0;h=f+96|0;p=f+52|0;j=f;m=a+28|0;k=c[m>>2]|0;if((k|0)<=(d|0)){xa(5464,5488,386,5520)}if((k|0)<=(e|0)){xa(5536,5488,387,5520)}if((k|0)>0){l=a+8|0;n=a+20|0;k=a+24|0;o=0;do{z=c[(c[l>>2]|0)+(o<<2)>>2]|0;y=z+44|0;A=c[y+4>>2]|0;B=(c[n>>2]|0)+(o*12|0)|0;c[B>>2]=c[y>>2];c[B+4>>2]=A;g[(c[n>>2]|0)+(o*12|0)+8>>2]=+g[z+56>>2];B=z+64|0;A=c[B+4>>2]|0;y=(c[k>>2]|0)+(o*12|0)|0;c[y>>2]=c[B>>2];c[y+4>>2]=A;y=c[k>>2]|0;g[y+(o*12|0)+8>>2]=+g[z+72>>2];o=o+1|0}while((o|0)<(c[m>>2]|0))}else{y=c[a+24>>2]|0;n=a+20|0}l=a+12|0;c[p+24>>2]=c[l>>2];k=a+36|0;c[p+28>>2]=c[k>>2];c[p+40>>2]=c[a>>2];c[p+0>>2]=c[b+0>>2];c[p+4>>2]=c[b+4>>2];c[p+8>>2]=c[b+8>>2];c[p+12>>2]=c[b+12>>2];c[p+16>>2]=c[b+16>>2];c[p+20>>2]=c[b+20>>2];c[p+32>>2]=c[n>>2];o=a+24|0;c[p+36>>2]=y;oe(j,p);y=b+16|0;a:do{if((c[y>>2]|0)>0){p=0;do{p=p+1|0;if(we(j,d,e)|0){break a}}while((p|0)<(c[y>>2]|0))}}while(0);p=a+8|0;A=(c[n>>2]|0)+(d*12|0)|0;B=c[A+4>>2]|0;z=(c[(c[p>>2]|0)+(d<<2)>>2]|0)+36|0;c[z>>2]=c[A>>2];c[z+4>>2]=B;z=c[n>>2]|0;B=c[p>>2]|0;g[(c[B+(d<<2)>>2]|0)+52>>2]=+g[z+(d*12|0)+8>>2];z=z+(e*12|0)|0;A=c[z+4>>2]|0;B=(c[B+(e<<2)>>2]|0)+36|0;c[B>>2]=c[z>>2];c[B+4>>2]=A;g[(c[(c[p>>2]|0)+(e<<2)>>2]|0)+52>>2]=+g[(c[n>>2]|0)+(e*12|0)+8>>2];qe(j);e=b+12|0;if((c[e>>2]|0)>0){d=0;do{se(j);d=d+1|0}while((d|0)<(c[e>>2]|0))}s=+g[b>>2];if((c[m>>2]|0)>0){b=0;do{B=c[n>>2]|0;d=B+(b*12|0)|0;A=d;r=+g[A>>2];q=+g[A+4>>2];t=+g[B+(b*12|0)+8>>2];B=c[o>>2]|0;A=B+(b*12|0)|0;v=+g[A>>2];w=+g[A+4>>2];u=+g[B+(b*12|0)+8>>2];C=s*v;x=s*w;x=C*C+x*x;if(x>4.0){C=2.0/+O(+x);v=v*C;w=w*C}x=s*u;if(x*x>2.4674012660980225){if(!(x>0.0)){x=-x}u=u*(1.5707963705062866/x)}x=r+s*v;r=q+s*w;C=t+s*u;q=+x;t=+r;B=d;g[B>>2]=q;g[B+4>>2]=t;g[(c[n>>2]|0)+(b*12|0)+8>>2]=C;v=+v;w=+w;B=(c[o>>2]|0)+(b*12|0)|0;g[B>>2]=v;g[B+4>>2]=w;g[(c[o>>2]|0)+(b*12|0)+8>>2]=u;B=c[(c[p>>2]|0)+(b<<2)>>2]|0;A=B+44|0;g[A>>2]=q;g[A+4>>2]=t;g[B+56>>2]=C;A=B+64|0;g[A>>2]=v;g[A+4>>2]=w;g[B+72>>2]=u;u=+R(+C);g[B+20>>2]=u;w=+Q(+C);g[B+24>>2]=w;v=+g[B+28>>2];C=+g[B+32>>2];x=+(x-(w*v-u*C));C=+(r-(u*v+w*C));B=B+12|0;g[B>>2]=x;g[B+4>>2]=C;b=b+1|0}while((b|0)<(c[m>>2]|0))}m=c[j+40>>2]|0;a=a+4|0;if((c[a>>2]|0)==0){pe(j);i=f;return}if((c[k>>2]|0)<=0){pe(j);i=f;return}n=h+16|0;o=0;do{p=c[(c[l>>2]|0)+(o<<2)>>2]|0;b=c[m+(o*152|0)+144>>2]|0;c[n>>2]=b;if((b|0)>0){d=0;do{g[h+(d<<2)>>2]=+g[m+(o*152|0)+(d*36|0)+16>>2];g[h+(d<<2)+8>>2]=+g[m+(o*152|0)+(d*36|0)+20>>2];d=d+1|0}while((d|0)!=(b|0))}B=c[a>>2]|0;lb[c[(c[B>>2]|0)+20>>2]&3](B,p,h);o=o+1|0}while((o|0)<(c[k>>2]|0));pe(j);i=f;return}function Pd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;h=i;k=a+60|0;c[k>>2]=0;j=b+12|0;m=+g[d+12>>2];q=+g[j>>2];p=+g[d+8>>2];n=+g[b+16>>2];l=e+12|0;s=+g[f+12>>2];u=+g[l>>2];t=+g[f+8>>2];r=+g[e+16>>2];o=+g[f>>2]+(s*u-t*r)-(+g[d>>2]+(m*q-p*n));n=u*t+s*r+ +g[f+4>>2]-(q*p+m*n+ +g[d+4>>2]);m=+g[b+8>>2]+ +g[e+8>>2];if(o*o+n*n>m*m){i=h;return}c[a+56>>2]=0;f=j;d=c[f+4>>2]|0;b=a+48|0;c[b>>2]=c[f>>2];c[b+4>>2]=d;g[a+40>>2]=0.0;g[a+44>>2]=0.0;c[k>>2]=1;b=l;d=c[b+4>>2]|0;f=a;c[f>>2]=c[b>>2];c[f+4>>2]=d;c[a+16>>2]=0;i=h;return}
+
+
+
+function Qd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0;j=i;l=a+60|0;c[l>>2]=0;h=e+12|0;x=+g[f+12>>2];n=+g[h>>2];m=+g[f+8>>2];y=+g[e+16>>2];o=+g[f>>2]+(x*n-m*y)- +g[d>>2];y=n*m+x*y+ +g[f+4>>2]- +g[d+4>>2];x=+g[d+12>>2];m=+g[d+8>>2];n=o*x+y*m;m=x*y-o*m;o=+g[b+8>>2]+ +g[e+8>>2];p=c[b+148>>2]|0;do{if((p|0)>0){f=0;e=0;q=-3.4028234663852886e+38;while(1){r=(n- +g[b+(f<<3)+20>>2])*+g[b+(f<<3)+84>>2]+(m- +g[b+(f<<3)+24>>2])*+g[b+(f<<3)+88>>2];if(r>o){f=19;break}d=r>q;q=d?r:q;e=d?f:e;f=f+1|0;if((f|0)>=(p|0)){f=4;break}}if((f|0)==4){z=q<1.1920928955078125e-7;break}else if((f|0)==19){i=j;return}}else{e=0;z=1}}while(0);s=e+1|0;d=b+(e<<3)+20|0;f=c[d>>2]|0;d=c[d+4>>2]|0;r=(c[k>>2]=f,+g[k>>2]);q=(c[k>>2]=d,+g[k>>2]);p=b+(((s|0)<(p|0)?s:0)<<3)+20|0;s=c[p>>2]|0;p=c[p+4>>2]|0;y=(c[k>>2]=s,+g[k>>2]);v=(c[k>>2]=p,+g[k>>2]);if(z){c[l>>2]=1;c[a+56>>2]=1;z=b+(e<<3)+84|0;s=c[z+4>>2]|0;p=a+40|0;c[p>>2]=c[z>>2];c[p+4>>2]=s;x=+((r+y)*.5);y=+((q+v)*.5);p=a+48|0;g[p>>2]=x;g[p+4>>2]=y;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}t=n-r;x=m-q;w=n-y;u=m-v;if(t*(y-r)+x*(v-q)<=0.0){if(t*t+x*x>o*o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;b=a+40|0;y=+t;m=+x;z=b;g[z>>2]=y;g[z+4>>2]=m;m=+O(+(t*t+x*x));if(!(m<1.1920928955078125e-7)){y=1.0/m;g[b>>2]=t*y;g[a+44>>2]=x*y}p=a+48|0;c[p>>2]=f;c[p+4>>2]=d;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}if(!(w*(r-y)+u*(q-v)<=0.0)){r=(r+y)*.5;q=(q+v)*.5;f=b+(e<<3)+84|0;if((n-r)*+g[f>>2]+(m-q)*+g[b+(e<<3)+88>>2]>o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;z=f;s=c[z+4>>2]|0;p=a+40|0;c[p>>2]=c[z>>2];c[p+4>>2]=s;x=+r;y=+q;p=a+48|0;g[p>>2]=x;g[p+4>>2]=y;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}if(w*w+u*u>o*o){i=j;return}c[l>>2]=1;c[a+56>>2]=1;b=a+40|0;y=+w;m=+u;z=b;g[z>>2]=y;g[z+4>>2]=m;m=+O(+(w*w+u*u));if(!(m<1.1920928955078125e-7)){y=1.0/m;g[b>>2]=w*y;g[a+44>>2]=u*y}z=a+48|0;c[z>>2]=s;c[z+4>>2]=p;p=h;s=c[p+4>>2]|0;z=a;c[z>>2]=c[p>>2];c[z+4>>2]=s;c[a+16>>2]=0;i=j;return}function Rd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;m=i;j=b+60|0;c[j>>2]=0;l=f+12|0;o=+g[h+12>>2];B=+g[l>>2];w=+g[h+8>>2];x=+g[f+16>>2];A=+g[h>>2]+(o*B-w*x)- +g[e>>2];x=B*w+o*x+ +g[h+4>>2]- +g[e+4>>2];o=+g[e+12>>2];w=+g[e+8>>2];B=A*o+x*w;w=o*x-A*w;e=d+12|0;h=c[e>>2]|0;e=c[e+4>>2]|0;A=(c[k>>2]=h,+g[k>>2]);x=(c[k>>2]=e,+g[k>>2]);u=d+20|0;t=c[u>>2]|0;u=c[u+4>>2]|0;o=(c[k>>2]=t,+g[k>>2]);p=(c[k>>2]=u,+g[k>>2]);n=o-A;v=p-x;y=n*(o-B)+v*(p-w);s=B-A;r=w-x;z=s*n+r*v;q=+g[d+8>>2]+ +g[f+8>>2];if(z<=0.0){if(s*s+r*r>q*q){i=m;return}if((a[d+44>>0]|0)!=0?(f=d+28|0,C=+g[f>>2],(A-B)*(A-C)+(x-w)*(x- +g[f+4>>2])>0.0):0){i=m;return}c[j>>2]=1;c[b+56>>2]=0;g[b+40>>2]=0.0;g[b+44>>2]=0.0;t=b+48|0;c[t>>2]=h;c[t+4>>2]=e;t=b+16|0;c[t>>2]=0;a[t>>0]=0;a[t+1>>0]=0;a[t+2>>0]=0;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}if(y<=0.0){n=B-o;r=w-p;if(n*n+r*r>q*q){i=m;return}if((a[d+45>>0]|0)!=0?(f=d+36|0,C=+g[f>>2],n*(C-o)+r*(+g[f+4>>2]-p)>0.0):0){i=m;return}c[j>>2]=1;c[b+56>>2]=0;g[b+40>>2]=0.0;g[b+44>>2]=0.0;f=b+48|0;c[f>>2]=t;c[f+4>>2]=u;t=b+16|0;c[t>>2]=0;a[t>>0]=1;a[t+1>>0]=0;a[t+2>>0]=0;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}C=n*n+v*v;if(!(C>0.0)){xa(5560,5576,127,5616)}C=1.0/C;B=B-(A*y+o*z)*C;C=w-(x*y+p*z)*C;if(B*B+C*C>q*q){i=m;return}o=-v;if(n*r+s*o<0.0){n=-n}else{v=o}o=+O(+(n*n+v*v));if(!(o<1.1920928955078125e-7)){C=1.0/o;v=v*C;n=n*C}c[j>>2]=1;c[b+56>>2]=1;B=+v;C=+n;t=b+40|0;g[t>>2]=B;g[t+4>>2]=C;t=b+48|0;c[t>>2]=h;c[t+4>>2]=e;t=b+16|0;c[t>>2]=0;a[t>>0]=0;a[t+1>>0]=0;a[t+2>>0]=1;a[t+3>>0]=0;t=l;u=c[t+4>>2]|0;f=b;c[f>>2]=c[t>>2];c[f+4>>2]=u;i=m;return}function Sd(b,d,e,f,h,j){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,P=0.0,Q=0.0,R=0,S=0.0,T=0,U=0;l=i;i=i+144|0;w=l+128|0;r=l+24|0;p=l+72|0;q=l+48|0;m=l;n=b+132|0;G=+g[f+12>>2];Q=+g[j+8>>2];B=+g[f+8>>2];F=+g[j+12>>2];A=G*Q-B*F;F=Q*B+G*F;Q=+A;E=+F;D=+g[j>>2]- +g[f>>2];P=+g[j+4>>2]- +g[f+4>>2];C=G*D+B*P;D=G*P-B*D;B=+C;P=+D;f=n;g[f>>2]=B;g[f+4>>2]=P;f=b+140|0;g[f>>2]=Q;g[f+4>>2]=E;f=b+144|0;E=+g[h+12>>2];o=b+140|0;Q=+g[h+16>>2];C=C+(F*E-A*Q);j=b+136|0;D=E*A+F*Q+D;Q=+C;F=+D;M=b+148|0;g[M>>2]=Q;g[M+4>>2]=F;M=e+28|0;H=c[M>>2]|0;M=c[M+4>>2]|0;t=b+156|0;c[t>>2]=H;c[t+4>>2]=M;t=b+164|0;v=e+12|0;T=c[v>>2]|0;v=c[v+4>>2]|0;s=t;c[s>>2]=T;c[s+4>>2]=v;s=b+172|0;y=e+20|0;U=c[y>>2]|0;y=c[y+4>>2]|0;R=s;c[R>>2]=U;c[R+4>>2]=y;R=e+36|0;N=c[R>>2]|0;R=c[R+4>>2]|0;x=b+180|0;c[x>>2]=N;c[x+4>>2]=R;x=(a[e+44>>0]|0)!=0;z=(a[e+45>>0]|0)!=0;F=(c[k>>2]=U,+g[k>>2]);Q=(c[k>>2]=T,+g[k>>2]);A=F-Q;E=(c[k>>2]=y,+g[k>>2]);y=b+168|0;P=(c[k>>2]=v,+g[k>>2]);B=E-P;G=+O(+(A*A+B*B));L=(c[k>>2]=H,+g[k>>2]);K=(c[k>>2]=M,+g[k>>2]);J=(c[k>>2]=N,+g[k>>2]);I=(c[k>>2]=R,+g[k>>2]);if(!(G<1.1920928955078125e-7)){S=1.0/G;B=B*S;A=A*S}e=b+196|0;G=-A;g[e>>2]=B;v=b+200|0;g[v>>2]=G;G=(C-Q)*B+(D-P)*G;if(x){Q=Q-L;P=P-K;S=+O(+(Q*Q+P*P));if(!(S<1.1920928955078125e-7)){S=1.0/S;Q=Q*S;P=P*S}S=-Q;g[b+188>>2]=P;g[b+192>>2]=S;H=B*Q-A*P>=0.0;K=(C-L)*P+(D-K)*S}else{H=0;K=0.0}a:do{if(!z){if(!x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){u=64;break}else{u=65;break}}x=K>=0.0;if(H){if(!x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;R=x;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R>>2]|0;R=c[R+4>>2]|0;U=b+228|0;c[U>>2]=T;c[U+4>>2]=R;U=b+236|0;g[U>>2]=-(c[k>>2]=T,+g[k>>2]);g[U+4>>2]=S;break}}else{a[b+248>>0]=1;x=b+212|0}U=e;T=c[U+4>>2]|0;R=x;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+188|0;T=c[R+4>>2]|0;U=b+228|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;Q=+-+g[e>>2];S=+-+g[v>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}else{if(x){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){R=e;U=c[R>>2]|0;R=c[R+4>>2]|0;T=x;c[T>>2]=U;c[T+4>>2]=R;T=b+228|0;c[T>>2]=U;c[T+4>>2]=R;Q=+-(c[k>>2]=U,+g[k>>2]);S=+A;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{a[b+248>>0]=0;x=b+212|0}S=+-B;Q=+A;R=x;g[R>>2]=S;g[R+4>>2]=Q;R=e;T=c[R+4>>2]|0;U=b+228|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{L=J-F;J=I-E;I=+O(+(L*L+J*J));if(I<1.1920928955078125e-7){I=L}else{S=1.0/I;I=L*S;J=J*S}S=-I;M=b+204|0;g[M>>2]=J;N=b+208|0;g[N>>2]=S;R=A*J-B*I>0.0;C=(C-F)*J+(D-E)*S;if(!x){x=G>=0.0;if(!z){a[b+248>>0]=x&1;u=b+212|0;if(x){x=u;u=64;break}else{x=u;u=65;break}}if(R){if(!x){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;R=x;g[R>>2]=Q;g[R+4>>2]=S;R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}}else{a[b+248>>0]=1;x=b+212|0}U=e;T=c[U+4>>2]|0;R=x;c[R>>2]=c[U>>2];c[R+4>>2]=T;Q=+-+g[e>>2];S=+-+g[v>>2];R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}else{if(x){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=x;c[U>>2]=R;c[U+4>>2]=T;Q=+-(c[k>>2]=R,+g[k>>2]);S=+A;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T;break}}else{a[b+248>>0]=0;x=b+212|0}S=+-B;Q=+A;R=x;g[R>>2]=S;g[R+4>>2]=Q;Q=+-+g[b+204>>2];S=+-+g[b+208>>2];R=b+228|0;g[R>>2]=Q;g[R+4>>2]=S;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}}if(H&R){if(!(K>=0.0)&!(G>=0.0)){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(!U){Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}}else{a[b+248>>0]=1;x=b+212|0}R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=b+188|0;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}if(H){do{if(!(K>=0.0)){if(G>=0.0){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[M>>2];Q=+-+g[N>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[e>>2];S=+-+g[v>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break a}else{a[b+248>>0]=1;x=b+212|0}}while(0);R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=b+188|0;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=e;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;break}if(!R){if(!(!(K>=0.0)|!(G>=0.0))){U=C>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=x;c[U>>2]=R;c[U+4>>2]=T;U=b+228|0;c[U>>2]=R;c[U+4>>2]=T;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T;break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[M>>2];Q=+-+g[N>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break}do{if(!(C>=0.0)){if(K>=0.0){U=G>=0.0;a[b+248>>0]=U&1;x=b+212|0;if(U){break}}else{a[b+248>>0]=0;x=b+212|0}Q=+-B;S=+A;U=x;g[U>>2]=Q;g[U+4>>2]=S;S=+-+g[e>>2];Q=+-+g[v>>2];U=b+228|0;g[U>>2]=S;g[U+4>>2]=Q;Q=+-+g[b+188>>2];S=+-+g[b+192>>2];U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S;break a}else{a[b+248>>0]=1;x=b+212|0}}while(0);R=e;T=c[R+4>>2]|0;U=x;c[U>>2]=c[R>>2];c[U+4>>2]=T;U=e;T=c[U+4>>2]|0;R=b+228|0;c[R>>2]=c[U>>2];c[R+4>>2]=T;R=b+204|0;T=c[R+4>>2]|0;U=b+236|0;c[U>>2]=c[R>>2];c[U+4>>2]=T}}while(0);if((u|0)==64){R=e;U=c[R>>2]|0;R=c[R+4>>2]|0;T=x;c[T>>2]=U;c[T+4>>2]=R;Q=+-(c[k>>2]=U,+g[k>>2]);S=+A;U=b+228|0;g[U>>2]=Q;g[U+4>>2]=S;U=b+236|0;g[U>>2]=Q;g[U+4>>2]=S}else if((u|0)==65){Q=+-B;S=+A;T=x;g[T>>2]=Q;g[T+4>>2]=S;T=e;R=c[T>>2]|0;T=c[T+4>>2]|0;U=b+228|0;c[U>>2]=R;c[U+4>>2]=T;U=b+236|0;c[U>>2]=R;c[U+4>>2]=T}z=h+148|0;M=b+128|0;c[M>>2]=c[z>>2];if((c[z>>2]|0)>0){x=0;do{L=+g[f>>2];Q=+g[h+(x<<3)+20>>2];S=+g[o>>2];P=+g[h+(x<<3)+24>>2];K=+(+g[n>>2]+(L*Q-S*P));P=+(Q*S+L*P+ +g[j>>2]);U=b+(x<<3)|0;g[U>>2]=K;g[U+4>>2]=P;P=+g[f>>2];K=+g[h+(x<<3)+84>>2];L=+g[o>>2];S=+g[h+(x<<3)+88>>2];Q=+(P*K-L*S);S=+(K*L+P*S);U=b+(x<<3)+64|0;g[U>>2]=Q;g[U+4>>2]=S;x=x+1|0}while((x|0)<(c[z>>2]|0))}z=b+244|0;g[z>>2]=.019999999552965164;x=d+60|0;c[x>>2]=0;H=b+248|0;N=c[M>>2]|0;if((N|0)<=0){i=l;return}B=+g[b+164>>2];E=+g[y>>2];C=+g[b+212>>2];F=+g[b+216>>2];A=3.4028234663852886e+38;y=0;do{D=C*(+g[b+(y<<3)>>2]-B)+F*(+g[b+(y<<3)+4>>2]-E);A=D<A?D:A;y=y+1|0}while((y|0)!=(N|0));if(A>.019999999552965164){i=l;return}Td(w,b);y=c[w>>2]|0;if((y|0)!=0){B=+g[w+8>>2];if(B>+g[z>>2]){i=l;return}if(B>A*.9800000190734863+.0010000000474974513){w=c[w+4>>2]|0;N=d+56|0;if((y|0)==1){w=r;u=77}else{c[N>>2]=2;T=t;U=c[T+4>>2]|0;R=r;c[R>>2]=c[T>>2];c[R+4>>2]=U;R=r+8|0;a[R>>0]=0;U=w&255;a[R+1>>0]=U;a[R+2>>0]=0;a[R+3>>0]=1;R=s;T=c[R+4>>2]|0;s=r+12|0;c[s>>2]=c[R>>2];c[s+4>>2]=T;s=r+20|0;a[s>>0]=0;a[s+1>>0]=U;a[s+2>>0]=0;a[s+3>>0]=1;c[p>>2]=w;s=w+1|0;v=(s|0)<(c[M>>2]|0)?s:0;c[p+4>>2]=v;y=b+(w<<3)|0;t=c[y>>2]|0;y=c[y+4>>2]|0;M=p+8|0;c[M>>2]=t;c[M+4>>2]=y;v=b+(v<<3)|0;M=c[v>>2]|0;v=c[v+4>>2]|0;H=p+16|0;c[H>>2]=M;c[H+4>>2]=v;H=b+(w<<3)+64|0;b=c[H>>2]|0;H=c[H+4>>2]|0;s=p+24|0;c[s>>2]=b;c[s+4>>2]=H;s=w;e=0}}else{u=75}}else{u=75}if((u|0)==75){w=r;N=d+56|0;u=77}do{if((u|0)==77){c[N>>2]=1;u=c[M>>2]|0;if((u|0)>1){B=+g[b+216>>2];A=+g[b+212>>2];M=0;C=A*+g[b+64>>2]+B*+g[b+68>>2];N=1;while(1){D=A*+g[b+(N<<3)+64>>2]+B*+g[b+(N<<3)+68>>2];y=D<C;M=y?N:M;N=N+1|0;if((N|0)<(u|0)){C=y?D:C}else{break}}}else{M=0}y=M+1|0;T=(y|0)<(u|0)?y:0;U=b+(M<<3)|0;R=c[U+4>>2]|0;N=r;c[N>>2]=c[U>>2];c[N+4>>2]=R;N=r+8|0;a[N>>0]=0;a[N+1>>0]=M;a[N+2>>0]=1;a[N+3>>0]=0;N=b+(T<<3)|0;R=c[N+4>>2]|0;U=r+12|0;c[U>>2]=c[N>>2];c[U+4>>2]=R;U=r+20|0;a[U>>0]=0;a[U+1>>0]=T;a[U+2>>0]=1;a[U+3>>0]=0;if((a[H>>0]|0)==0){c[p>>2]=1;c[p+4>>2]=0;y=s;s=c[y>>2]|0;y=c[y+4>>2]|0;M=p+8|0;c[M>>2]=s;c[M+4>>2]=y;M=c[t>>2]|0;t=c[t+4>>2]|0;b=p+16|0;c[b>>2]=M;c[b+4>>2]=t;b=(g[k>>2]=-+g[e>>2],c[k>>2]|0);H=(g[k>>2]=-+g[v>>2],c[k>>2]|0);v=p+24|0;c[v>>2]=b;c[v+4>>2]=H;v=t;t=s;s=1;r=w;e=1;break}else{c[p>>2]=0;c[p+4>>2]=1;y=t;t=c[y>>2]|0;y=c[y+4>>2]|0;v=p+8|0;c[v>>2]=t;c[v+4>>2]=y;v=s;M=c[v>>2]|0;v=c[v+4>>2]|0;H=p+16|0;c[H>>2]=M;c[H+4>>2]=v;H=e;b=c[H>>2]|0;H=c[H+4>>2]|0;s=p+24|0;c[s>>2]=b;c[s+4>>2]=H;s=0;r=w;e=1;break}}}while(0);I=(c[k>>2]=H,+g[k>>2]);S=(c[k>>2]=b,+g[k>>2]);J=(c[k>>2]=t,+g[k>>2]);K=(c[k>>2]=y,+g[k>>2]);L=(c[k>>2]=M,+g[k>>2]);Q=(c[k>>2]=v,+g[k>>2]);U=p+32|0;v=p+24|0;t=p+28|0;S=-S;g[U>>2]=I;g[p+36>>2]=S;y=p+44|0;P=-I;w=y;g[w>>2]=P;c[w+4>>2]=b;w=p+8|0;u=p+12|0;S=I*J+K*S;g[p+40>>2]=S;H=p+52|0;g[H>>2]=L*P+(c[k>>2]=b,+g[k>>2])*Q;if((Zd(q,r,U,S,s)|0)<2){i=l;return}if((Zd(m,q,y,+g[H>>2],c[p+4>>2]|0)|0)<2){i=l;return}q=d+40|0;if(e){T=v;U=c[T>>2]|0;T=c[T+4>>2]|0;N=q;c[N>>2]=U;c[N+4>>2]=T;N=w;T=c[N>>2]|0;N=c[N+4>>2]|0;R=d+48|0;c[R>>2]=T;c[R+4>>2]=N;B=(c[k>>2]=T,+g[k>>2]);A=(c[k>>2]=U,+g[k>>2]);C=+g[u>>2];D=+g[t>>2];G=+g[m>>2];F=+g[m+4>>2];E=+g[z>>2];if(!((G-B)*A+(F-C)*D<=E)){G=E;h=0}else{Q=G- +g[n>>2];P=F- +g[j>>2];L=+g[f>>2];G=+g[o>>2];S=+(Q*L+P*G);G=+(L*P-Q*G);h=d;g[h>>2]=S;g[h+4>>2]=G;c[d+16>>2]=c[m+8>>2];G=+g[z>>2];h=1}E=+g[m+12>>2];F=+g[m+16>>2];if((E-B)*A+(F-C)*D<=G){P=E- +g[n>>2];L=F- +g[j>>2];K=+g[f>>2];S=+g[o>>2];Q=+(P*K+L*S);S=+(K*L-P*S);U=d+(h*20|0)|0;g[U>>2]=Q;g[U+4>>2]=S;c[d+(h*20|0)+16>>2]=c[m+20>>2];h=h+1|0}}else{R=c[p>>2]|0;N=h+(R<<3)+84|0;U=c[N+4>>2]|0;T=q;c[T>>2]=c[N>>2];c[T+4>>2]=U;R=h+(R<<3)+20|0;T=c[R+4>>2]|0;U=d+48|0;c[U>>2]=c[R>>2];c[U+4>>2]=T;A=+g[w>>2];B=+g[v>>2];C=+g[u>>2];D=+g[t>>2];E=+g[z>>2];if(!((+g[m>>2]-A)*B+(+g[m+4>>2]-C)*D<=E)){h=0}else{T=m;h=c[T+4>>2]|0;U=d;c[U>>2]=c[T>>2];c[U+4>>2]=h;U=m+8|0;h=d+16|0;a[h+2>>0]=a[U+3>>0]|0;a[h+3>>0]=a[U+2>>0]|0;a[h>>0]=a[U+1>>0]|0;a[h+1>>0]=a[U>>0]|0;E=+g[z>>2];h=1}n=m+12|0;if((+g[n>>2]-A)*B+(+g[m+16>>2]-C)*D<=E){R=n;U=c[R+4>>2]|0;T=d+(h*20|0)|0;c[T>>2]=c[R>>2];c[T+4>>2]=U;T=m+20|0;U=d+(h*20|0)+16|0;a[U+2>>0]=a[T+3>>0]|0;a[U+3>>0]=a[T+2>>0]|0;a[U>>0]=a[T+1>>0]|0;a[U+1>>0]=a[T>>0]|0;h=h+1|0}}c[x>>2]=h;i=l;return}function Td(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;r=i;c[a>>2]=0;e=a+4|0;c[e>>2]=-1;f=a+8|0;g[f>>2]=-3.4028234663852886e+38;k=+g[b+216>>2];j=+g[b+212>>2];h=c[b+128>>2]|0;if((h|0)<=0){i=r;return}t=+g[b+164>>2];u=+g[b+168>>2];n=+g[b+172>>2];m=+g[b+176>>2];s=+g[b+244>>2];o=b+228|0;p=b+232|0;q=b+236|0;d=b+240|0;v=-3.4028234663852886e+38;w=0;while(1){z=+g[b+(w<<3)+64>>2];x=-z;y=-+g[b+(w<<3)+68>>2];C=+g[b+(w<<3)>>2];B=+g[b+(w<<3)+4>>2];A=(C-t)*x+(B-u)*y;B=(C-n)*x+(B-m)*y;A=A<B?A:B;if(A>s){break}if(!(k*z+j*y>=0.0)){if(!((x- +g[o>>2])*j+(y- +g[p>>2])*k<-.03490658849477768)&A>v){l=8}}else{if(!((x- +g[q>>2])*j+(y- +g[d>>2])*k<-.03490658849477768)&A>v){l=8}}if((l|0)==8){l=0;c[a>>2]=2;c[e>>2]=w;g[f>>2]=A;v=A}w=w+1|0;if((w|0)>=(h|0)){l=10;break}}if((l|0)==10){i=r;return}c[a>>2]=2;c[e>>2]=w;g[f>>2]=A;i=r;return}function Ud(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0;f=i;i=i+256|0;Sd(f,a,b,c,d,e);i=f;return}function Vd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=f|0;h=h|0;var j=0,k=0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,P=0.0,Q=0.0;j=i;i=i+96|0;v=j+92|0;A=j+88|0;u=j;s=j+80|0;t=j+56|0;m=j+32|0;r=j+24|0;k=b+60|0;c[k>>2]=0;l=+g[d+8>>2]+ +g[f+8>>2];c[v>>2]=0;o=+Wd(v,d,e,f,h);if(o>l){i=j;return}c[A>>2]=0;n=+Wd(A,f,h,d,e);if(n>l){i=j;return}if(n>o*.9800000190734863+.0010000000474974513){y=+g[h>>2];x=+g[h+4>>2];z=+g[h+8>>2];w=+g[h+12>>2];q=+g[e>>2];n=+g[e+4>>2];o=+g[e+8>>2];p=+g[e+12>>2];v=c[A>>2]|0;c[b+56>>2]=2;h=1;A=f}else{y=+g[e>>2];x=+g[e+4>>2];z=+g[e+8>>2];w=+g[e+12>>2];q=+g[h>>2];n=+g[h+4>>2];o=+g[h+8>>2];p=+g[h+12>>2];v=c[v>>2]|0;c[b+56>>2]=1;h=0;A=d;d=f}e=c[d+148>>2]|0;if(!((v|0)>-1)){xa(5640,5688,151,5728)}f=c[A+148>>2]|0;if((f|0)<=(v|0)){xa(5640,5688,151,5728)}B=+g[A+(v<<3)+84>>2];N=+g[A+(v<<3)+88>>2];C=w*B-z*N;N=z*B+w*N;B=p*C+o*N;C=p*N-o*C;if((e|0)>0){J=0;K=0;D=3.4028234663852886e+38;while(1){E=B*+g[d+(J<<3)+84>>2]+C*+g[d+(J<<3)+88>>2];I=E<D;K=I?J:K;J=J+1|0;if((J|0)==(e|0)){break}else{D=I?E:D}}}else{K=0}I=K+1|0;J=(I|0)<(e|0)?I:0;M=+g[d+(K<<3)+20>>2];L=+g[d+(K<<3)+24>>2];N=+(q+(p*M-o*L));L=+(n+(o*M+p*L));I=u;g[I>>2]=N;g[I+4>>2]=L;I=v&255;e=u+8|0;a[e>>0]=I;a[e+1>>0]=K;a[e+2>>0]=1;a[e+3>>0]=0;L=+g[d+(J<<3)+20>>2];N=+g[d+(J<<3)+24>>2];M=+(q+(p*L-o*N));N=+(n+(o*L+p*N));d=u+12|0;g[d>>2]=M;g[d+4>>2]=N;d=u+20|0;a[d>>0]=I;a[d+1>>0]=J;a[d+2>>0]=1;a[d+3>>0]=0;d=v+1|0;f=(d|0)<(f|0)?d:0;K=A+(v<<3)+20|0;F=+g[K>>2];E=+g[K+4>>2];K=A+(f<<3)+20|0;H=+g[K>>2];G=+g[K+4>>2];L=H-F;M=G-E;B=+O(+(L*L+M*M));if(!(B<1.1920928955078125e-7)){N=1.0/B;L=L*N;M=M*N}N=w*L-z*M;B=w*M+z*L;g[s>>2]=N;g[s+4>>2]=B;C=-N;Q=y+(w*F-z*E);P=x+(z*F+w*E);D=Q*B+P*C;g[r>>2]=C;g[r+4>>2]=-B;if((Zd(t,u,r,l-(Q*N+P*B),v)|0)<2){i=j;return}if((Zd(m,t,s,l+((y+(w*H-z*G))*N+(x+(z*H+w*G))*B),f)|0)<2){i=j;return}x=+M;w=+-L;r=b+40|0;g[r>>2]=x;g[r+4>>2]=w;w=+((F+H)*.5);x=+((E+G)*.5);r=b+48|0;g[r>>2]=w;g[r+4>>2]=x;x=+g[m>>2];w=+g[m+4>>2];r=!(B*x+w*C-D<=l);if(h<<24>>24==0){if(r){r=0}else{Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);r=b;g[r>>2]=P;g[r+4>>2]=Q;c[b+16>>2]=c[m+8>>2];r=1}x=+g[m+12>>2];w=+g[m+16>>2];if(B*x+w*C-D<=l){Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);K=b+(r*20|0)|0;g[K>>2]=P;g[K+4>>2]=Q;c[b+(r*20|0)+16>>2]=c[m+20>>2];r=r+1|0}}else{if(r){r=0}else{Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);r=b;g[r>>2]=P;g[r+4>>2]=Q;r=b+16|0;K=c[m+8>>2]|0;c[r>>2]=K;a[r>>0]=K>>>8;a[r+1>>0]=K;a[r+2>>0]=K>>>24;a[r+3>>0]=K>>>16;r=1}x=+g[m+12>>2];w=+g[m+16>>2];if(B*x+w*C-D<=l){Q=x-q;N=w-n;P=+(p*Q+o*N);Q=+(p*N-o*Q);K=b+(r*20|0)|0;g[K>>2]=P;g[K+4>>2]=Q;K=b+(r*20|0)+16|0;J=c[m+20>>2]|0;c[K>>2]=J;a[K>>0]=J>>>8;a[K+1>>0]=J;a[K+2>>0]=J>>>24;a[K+3>>0]=J>>>16;r=r+1|0}}c[k>>2]=r;i=j;return}function Wd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;h=i;j=c[b+148>>2]|0;t=+g[f+12>>2];v=+g[e+12>>2];u=+g[f+8>>2];s=+g[e+16>>2];r=+g[d+12>>2];m=+g[b+12>>2];k=+g[d+8>>2];l=+g[b+16>>2];n=+g[f>>2]+(t*v-u*s)-(+g[d>>2]+(r*m-k*l));l=v*u+t*s+ +g[f+4>>2]-(m*k+r*l+ +g[d+4>>2]);m=r*n+k*l;k=r*l-n*k;if((j|0)>0){q=0;p=0;l=-3.4028234663852886e+38;while(1){n=m*+g[b+(p<<3)+84>>2]+k*+g[b+(p<<3)+88>>2];o=n>l;q=o?p:q;p=p+1|0;if((p|0)==(j|0)){break}else{l=o?n:l}}}else{q=0}l=+Xd(b,d,q,e,f);o=((q|0)>0?q:j)+ -1|0;k=+Xd(b,d,o,e,f);p=q+1|0;p=(p|0)<(j|0)?p:0;m=+Xd(b,d,p,e,f);if(k>l&k>m){while(1){p=((o|0)>0?o:j)+ -1|0;l=+Xd(b,d,p,e,f);if(l>k){o=p;k=l}else{break}}c[a>>2]=o;i=h;return+k}if(m>l){o=p;k=m}else{v=l;c[a>>2]=q;i=h;return+v}while(1){p=o+1|0;p=(p|0)<(j|0)?p:0;l=+Xd(b,d,p,e,f);if(l>k){o=p;k=l}else{break}}c[a>>2]=o;i=h;return+k}function Xd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0;o=i;p=c[e+148>>2]|0;if(!((d|0)>-1)){xa(5640,5688,32,5752)}if((c[a+148>>2]|0)<=(d|0)){xa(5640,5688,32,5752)}n=+g[b+12>>2];l=+g[a+(d<<3)+84>>2];h=+g[b+8>>2];j=+g[a+(d<<3)+88>>2];k=n*l-h*j;j=l*h+n*j;l=+g[f+12>>2];m=+g[f+8>>2];s=l*k+m*j;q=l*j-k*m;if((p|0)>0){v=0;w=0;r=3.4028234663852886e+38;while(1){t=s*+g[e+(v<<3)+20>>2]+q*+g[e+(v<<3)+24>>2];u=t<r;w=u?v:w;v=v+1|0;if((v|0)==(p|0)){break}else{r=u?t:r}}}else{w=0}s=+g[a+(d<<3)+20>>2];t=+g[a+(d<<3)+24>>2];q=+g[e+(w<<3)+20>>2];r=+g[e+(w<<3)+24>>2];i=o;return+(k*(+g[f>>2]+(l*q-m*r)-(+g[b>>2]+(n*s-h*t)))+j*(q*m+l*r+ +g[f+4>>2]-(s*h+n*t+ +g[b+4>>2])))}function Yd(a,b,d,e,f,h){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;h=+h;var j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0;j=i;k=b+60|0;if((c[k>>2]|0)==0){i=j;return}m=c[b+56>>2]|0;if((m|0)==0){g[a>>2]=1.0;k=a+4|0;g[k>>2]=0.0;u=+g[d+12>>2];v=+g[b+48>>2];t=+g[d+8>>2];o=+g[b+52>>2];l=+g[d>>2]+(u*v-t*o);o=v*t+u*o+ +g[d+4>>2];u=+g[f+12>>2];t=+g[b>>2];v=+g[f+8>>2];r=+g[b+4>>2];q=+g[f>>2]+(u*t-v*r);r=t*v+u*r+ +g[f+4>>2];u=l-q;v=o-r;if(u*u+v*v>1.4210854715202004e-14){u=q-l;t=r-o;w=+u;v=+t;s=a;g[s>>2]=w;g[s+4>>2]=v;v=+O(+(u*u+t*t));if(!(v<1.1920928955078125e-7)){w=1.0/v;u=u*w;g[a>>2]=u;t=t*w;g[k>>2]=t}}else{u=1.0;t=0.0}v=+((l+u*e+(q-u*h))*.5);w=+((o+t*e+(r-t*h))*.5);s=a+8|0;g[s>>2]=v;g[s+4>>2]=w;i=j;return}else if((m|0)==2){p=f+12|0;u=+g[p>>2];v=+g[b+40>>2];s=f+8|0;w=+g[s>>2];r=+g[b+44>>2];q=u*v-w*r;r=v*w+u*r;u=+q;w=+r;n=a;g[n>>2]=u;g[n+4>>2]=w;w=+g[p>>2];u=+g[b+48>>2];v=+g[s>>2];o=+g[b+52>>2];l=+g[f>>2]+(w*u-v*o);o=u*v+w*o+ +g[f+4>>2];if((c[k>>2]|0)>0){n=d+12|0;m=d+8|0;f=d+4|0;p=a+4|0;s=0;do{v=+g[n>>2];y=+g[b+(s*20|0)>>2];t=+g[m>>2];u=+g[b+(s*20|0)+4>>2];w=+g[d>>2]+(v*y-t*u);u=y*t+v*u+ +g[f>>2];v=h-(q*(w-l)+(u-o)*r);w=+((w-q*e+(w+q*v))*.5);q=+((u-r*e+(u+r*v))*.5);x=a+(s<<3)+8|0;g[x>>2]=w;g[x+4>>2]=q;s=s+1|0;q=+g[a>>2];r=+g[p>>2]}while((s|0)<(c[k>>2]|0))}w=+-q;y=+-r;x=a;g[x>>2]=w;g[x+4>>2]=y;i=j;return}else if((m|0)==1){s=d+12|0;v=+g[s>>2];w=+g[b+40>>2];x=d+8|0;y=+g[x>>2];r=+g[b+44>>2];q=v*w-y*r;r=w*y+v*r;v=+q;y=+r;p=a;g[p>>2]=v;g[p+4>>2]=y;y=+g[s>>2];v=+g[b+48>>2];w=+g[x>>2];o=+g[b+52>>2];l=+g[d>>2]+(y*v-w*o);o=v*w+y*o+ +g[d+4>>2];if((c[k>>2]|0)<=0){i=j;return}d=f+12|0;m=f+8|0;n=f+4|0;p=a+4|0;s=0;while(1){y=+g[d>>2];t=+g[b+(s*20|0)>>2];u=+g[m>>2];v=+g[b+(s*20|0)+4>>2];w=+g[f>>2]+(y*t-u*v);v=t*u+y*v+ +g[n>>2];y=e-(q*(w-l)+(v-o)*r);w=+((w-q*h+(w+q*y))*.5);y=+((v-r*h+(v+r*y))*.5);x=a+(s<<3)+8|0;g[x>>2]=w;g[x+4>>2]=y;s=s+1|0;if((s|0)>=(c[k>>2]|0)){break}q=+g[a>>2];r=+g[p>>2]}i=j;return}else{i=j;return}}function Zd(b,d,e,f,h){b=b|0;d=d|0;e=e|0;f=+f;h=h|0;var j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0;j=i;p=+g[e>>2];o=+g[e+4>>2];e=d+4|0;l=p*+g[d>>2]+o*+g[e>>2]-f;k=d+12|0;m=d+16|0;f=p*+g[k>>2]+o*+g[m>>2]-f;if(!(l<=0.0)){n=0}else{c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];n=1}if(f<=0.0){q=n+1|0;n=b+(n*12|0)|0;c[n+0>>2]=c[k+0>>2];c[n+4>>2]=c[k+4>>2];c[n+8>>2]=c[k+8>>2];n=q}if(!(l*f<0.0)){q=n;i=j;return q|0}f=l/(l-f);o=+g[d>>2];p=+g[e>>2];o=+(o+f*(+g[k>>2]-o));p=+(p+f*(+g[m>>2]-p));q=b+(n*12|0)|0;g[q>>2]=o;g[q+4>>2]=p;q=b+(n*12|0)+8|0;a[q>>0]=h;a[q+1>>0]=a[d+9>>0]|0;a[q+2>>0]=0;a[q+3>>0]=1;q=n+1|0;i=j;return q|0}function _d(d,e,f,h,j,k){d=d|0;e=e|0;f=f|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0;m=i;i=i+128|0;n=m+36|0;o=m+24|0;l=m;c[n+16>>2]=0;c[n+20>>2]=0;g[n+24>>2]=0.0;c[n+44>>2]=0;c[n+48>>2]=0;g[n+52>>2]=0.0;Pc(n,d,e);Pc(n+28|0,f,h);d=n+56|0;c[d+0>>2]=c[j+0>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];d=n+72|0;c[d+0>>2]=c[k+0>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];a[n+88>>0]=1;b[o+4>>1]=0;Rc(l,o,n);i=m;return+g[l+16>>2]<11920928955078125.0e-22|0}function $d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;f=Xb(f,144)|0;if((f|0)==0){f=0;i=g;return f|0}nd(f,a,b,d,e);c[f>>2]=5784;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=3){xa(5800,5848,43,5904)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){i=g;return f|0}else{xa(5928,5848,44,5904)}return 0}function ae(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function be(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;h=i;i=i+48|0;j=h;k=c[(c[a+48>>2]|0)+12>>2]|0;c[j>>2]=240;c[j+4>>2]=1;g[j+8>>2]=.009999999776482582;l=j+28|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;b[l+16>>1]=0;xe(k,j,c[a+56>>2]|0);Rd(d,j,e,c[(c[a+52>>2]|0)+12>>2]|0,f);i=h;return}function ce(a){a=a|0;return}function de(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=i;f=Xb(f,144)|0;if((f|0)==0){f=0;i=g;return f|0}nd(f,a,b,d,e);c[f>>2]=6032;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=3){xa(6048,6096,43,6152)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==2){i=g;return f|0}else{xa(6184,6096,44,6152)}return 0}function fe(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function ge(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0;h=i;i=i+48|0;j=h;k=c[(c[a+48>>2]|0)+12>>2]|0;c[j>>2]=240;c[j+4>>2]=1;g[j+8>>2]=.009999999776482582;l=j+28|0;c[l+0>>2]=0;c[l+4>>2]=0;c[l+8>>2]=0;c[l+12>>2]=0;b[l+16>>1]=0;xe(k,j,c[a+56>>2]|0);Ud(d,j,e,c[(c[a+52>>2]|0)+12>>2]|0,f);i=h;return}function he(a){a=a|0;return}function ie(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;b=i;f=Xb(f,144)|0;if((f|0)==0){e=0;i=b;return e|0}nd(f,a,0,d,0);c[f>>2]=6288;if((c[(c[(c[f+48>>2]|0)+12>>2]|0)+4>>2]|0)!=0){xa(6304,6352,44,6400)}if((c[(c[(c[f+52>>2]|0)+12>>2]|0)+4>>2]|0)==0){e=f;i=b;return e|0}else{xa(6416,6352,45,6400)}return 0}function ke(a,b){a=a|0;b=b|0;var d=0;d=i;ib[c[(c[a>>2]|0)+4>>2]&31](a);Yb(b,a,144);i=d;return}function le(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=i;Pd(b,c[(c[a+48>>2]|0)+12>>2]|0,d,c[(c[a+52>>2]|0)+12>>2]|0,e);i=f;return}function me(a){a=a|0;return}function ne(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function oe(b,d){b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;c[b+0>>2]=c[d+0>>2];c[b+4>>2]=c[d+4>>2];c[b+8>>2]=c[d+8>>2];c[b+12>>2]=c[d+12>>2];c[b+16>>2]=c[d+16>>2];c[b+20>>2]=c[d+20>>2];r=c[d+40>>2]|0;m=b+32|0;c[m>>2]=r;f=c[d+28>>2]|0;j=b+48|0;c[j>>2]=f;h=b+36|0;c[h>>2]=gd(r,f*88|0)|0;f=b+40|0;c[f>>2]=gd(c[m>>2]|0,(c[j>>2]|0)*152|0)|0;c[b+24>>2]=c[d+32>>2];c[b+28>>2]=c[d+36>>2];m=c[d+24>>2]|0;d=b+44|0;c[d>>2]=m;if((c[j>>2]|0)<=0){i=e;return}k=b+20|0;b=b+8|0;l=0;while(1){n=c[m+(l<<2)>>2]|0;o=c[n+48>>2]|0;p=c[n+52>>2]|0;r=c[o+8>>2]|0;q=c[p+8>>2]|0;m=c[n+124>>2]|0;if((m|0)<=0){f=4;break}s=+g[(c[p+12>>2]|0)+8>>2];t=+g[(c[o+12>>2]|0)+8>>2];p=c[f>>2]|0;g[p+(l*152|0)+136>>2]=+g[n+136>>2];g[p+(l*152|0)+140>>2]=+g[n+140>>2];z=r+8|0;c[p+(l*152|0)+112>>2]=c[z>>2];y=q+8|0;c[p+(l*152|0)+116>>2]=c[y>>2];w=r+120|0;g[p+(l*152|0)+120>>2]=+g[w>>2];x=q+120|0;g[p+(l*152|0)+124>>2]=+g[x>>2];v=r+128|0;g[p+(l*152|0)+128>>2]=+g[v>>2];u=q+128|0;g[p+(l*152|0)+132>>2]=+g[u>>2];c[p+(l*152|0)+148>>2]=l;c[p+(l*152|0)+144>>2]=m;o=p+(l*152|0)+80|0;c[o+0>>2]=0;c[o+4>>2]=0;c[o+8>>2]=0;c[o+12>>2]=0;c[o+16>>2]=0;c[o+20>>2]=0;c[o+24>>2]=0;c[o+28>>2]=0;o=c[h>>2]|0;c[o+(l*88|0)+32>>2]=c[z>>2];c[o+(l*88|0)+36>>2]=c[y>>2];g[o+(l*88|0)+40>>2]=+g[w>>2];g[o+(l*88|0)+44>>2]=+g[x>>2];x=r+28|0;r=c[x+4>>2]|0;w=o+(l*88|0)+48|0;c[w>>2]=c[x>>2];c[w+4>>2]=r;w=q+28|0;r=c[w+4>>2]|0;q=o+(l*88|0)+56|0;c[q>>2]=c[w>>2];c[q+4>>2]=r;g[o+(l*88|0)+64>>2]=+g[v>>2];g[o+(l*88|0)+68>>2]=+g[u>>2];q=n+104|0;r=c[q+4>>2]|0;u=o+(l*88|0)+16|0;c[u>>2]=c[q>>2];c[u+4>>2]=r;u=n+112|0;r=c[u+4>>2]|0;q=o+(l*88|0)+24|0;c[q>>2]=c[u>>2];c[q+4>>2]=r;c[o+(l*88|0)+84>>2]=m;g[o+(l*88|0)+76>>2]=t;g[o+(l*88|0)+80>>2]=s;c[o+(l*88|0)+72>>2]=c[n+120>>2];q=0;do{r=n+(q*20|0)+64|0;if((a[k>>0]|0)==0){g[p+(l*152|0)+(q*36|0)+16>>2]=0.0;g[p+(l*152|0)+(q*36|0)+20>>2]=0.0}else{g[p+(l*152|0)+(q*36|0)+16>>2]=+g[b>>2]*+g[n+(q*20|0)+72>>2];g[p+(l*152|0)+(q*36|0)+20>>2]=+g[b>>2]*+g[n+(q*20|0)+76>>2]}x=p+(l*152|0)+(q*36|0)|0;g[p+(l*152|0)+(q*36|0)+24>>2]=0.0;g[p+(l*152|0)+(q*36|0)+28>>2]=0.0;g[p+(l*152|0)+(q*36|0)+32>>2]=0.0;z=o+(l*88|0)+(q<<3)|0;c[x+0>>2]=0;c[x+4>>2]=0;c[x+8>>2]=0;c[x+12>>2]=0;x=r;y=c[x+4>>2]|0;c[z>>2]=c[x>>2];c[z+4>>2]=y;q=q+1|0}while((q|0)!=(m|0));l=l+1|0;if((l|0)>=(c[j>>2]|0)){f=12;break}m=c[d>>2]|0}if((f|0)==4){xa(6504,6520,71,6568)}else if((f|0)==12){i=e;return}}function pe(a){a=a|0;var b=0,d=0;b=i;d=a+32|0;hd(c[d>>2]|0,c[a+40>>2]|0);hd(c[d>>2]|0,c[a+36>>2]|0);i=b;return}function qe(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,S=0.0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0;b=i;i=i+64|0;l=b+40|0;e=b+24|0;h=b;f=a+48|0;if((c[f>>2]|0)<=0){i=b;return}m=a+40|0;d=a+36|0;k=a+44|0;j=a+24|0;p=a+28|0;q=l+8|0;o=l+12|0;n=e+8|0;a=e+12|0;s=0;while(1){r=c[m>>2]|0;J=c[d>>2]|0;H=c[(c[k>>2]|0)+(c[r+(s*152|0)+148>>2]<<2)>>2]|0;L=c[r+(s*152|0)+112>>2]|0;U=c[r+(s*152|0)+116>>2]|0;G=+g[r+(s*152|0)+120>>2];A=+g[r+(s*152|0)+124>>2];t=+g[r+(s*152|0)+128>>2];u=+g[r+(s*152|0)+132>>2];M=J+(s*88|0)+48|0;P=+g[M>>2];S=+g[M+4>>2];M=J+(s*88|0)+56|0;T=+g[M>>2];V=+g[M+4>>2];M=c[j>>2]|0;N=M+(L*12|0)|0;C=+g[N>>2];D=+g[N+4>>2];I=+g[M+(L*12|0)+8>>2];N=c[p>>2]|0;K=N+(L*12|0)|0;y=+g[K>>2];B=+g[K+4>>2];z=+g[N+(L*12|0)+8>>2];L=M+(U*12|0)|0;E=+g[L>>2];F=+g[L+4>>2];O=+g[M+(U*12|0)+8>>2];M=N+(U*12|0)|0;w=+g[M>>2];v=+g[M+4>>2];x=+g[N+(U*12|0)+8>>2];if((c[H+124>>2]|0)<=0){d=4;break}W=+g[J+(s*88|0)+80>>2];X=+g[J+(s*88|0)+76>>2];Z=+R(+I);g[q>>2]=Z;_=+Q(+I);g[o>>2]=_;I=+R(+O);g[n>>2]=I;O=+Q(+O);g[a>>2]=O;Y=+(C-(P*_-S*Z));S=+(D-(S*_+P*Z));N=l;g[N>>2]=Y;g[N+4>>2]=S;S=+(E-(T*O-V*I));V=+(F-(V*O+T*I));N=e;g[N>>2]=S;g[N+4>>2]=V;Yd(h,H+64|0,l,X,e,W);N=r+(s*152|0)+72|0;U=h;J=c[U+4>>2]|0;H=N;c[H>>2]=c[U>>2];c[H+4>>2]=J;H=r+(s*152|0)+144|0;J=c[H>>2]|0;do{if((J|0)>0){M=r+(s*152|0)+76|0;I=G+A;L=r+(s*152|0)+140|0;K=0;do{$=h+(K<<3)+8|0;T=+g[$>>2]-C;U=h+(K<<3)+12|0;P=+T;S=+(+g[U>>2]-D);aa=r+(s*152|0)+(K*36|0)|0;g[aa>>2]=P;g[aa+4>>2]=S;S=+g[$>>2]-E;P=+S;Z=+(+g[U>>2]-F);U=r+(s*152|0)+(K*36|0)+8|0;g[U>>2]=P;g[U+4>>2]=Z;Z=+g[M>>2];P=+g[r+(s*152|0)+(K*36|0)+4>>2];V=+g[N>>2];_=T*Z-P*V;O=+g[r+(s*152|0)+(K*36|0)+12>>2];V=Z*S-V*O;V=I+_*t*_+V*u*V;if(V>0.0){V=1.0/V}else{V=0.0}g[r+(s*152|0)+(K*36|0)+24>>2]=V;V=+g[M>>2];Z=-+g[N>>2];_=T*Z-V*P;V=S*Z-V*O;V=I+_*t*_+V*u*V;if(V>0.0){V=1.0/V}else{V=0.0}g[r+(s*152|0)+(K*36|0)+28>>2]=V;U=r+(s*152|0)+(K*36|0)+32|0;g[U>>2]=0.0;O=+g[N>>2]*(w-x*O-y+z*P)+ +g[M>>2]*(v+x*S-B-z*T);if(O<-1.0){g[U>>2]=-(O*+g[L>>2])}K=K+1|0}while((K|0)!=(J|0));if((c[H>>2]|0)==2){X=+g[r+(s*152|0)+76>>2];w=+g[N>>2];W=+g[r+(s*152|0)>>2]*X- +g[r+(s*152|0)+4>>2]*w;v=X*+g[r+(s*152|0)+8>>2]-w*+g[r+(s*152|0)+12>>2];Z=X*+g[r+(s*152|0)+36>>2]-w*+g[r+(s*152|0)+40>>2];w=X*+g[r+(s*152|0)+44>>2]-w*+g[r+(s*152|0)+48>>2];X=G+A;Y=t*W;_=u*v;v=X+W*Y+v*_;u=X+Z*t*Z+w*u*w;t=X+Y*Z+_*w;w=v*u-t*t;if(!(v*v<w*1.0e3)){c[H>>2]=1;break}g[r+(s*152|0)+96>>2]=v;g[r+(s*152|0)+100>>2]=t;g[r+(s*152|0)+104>>2]=t;g[r+(s*152|0)+108>>2]=u;if(w!=0.0){w=1.0/w}_=-(w*t);g[r+(s*152|0)+80>>2]=u*w;g[r+(s*152|0)+84>>2]=_;g[r+(s*152|0)+88>>2]=_;g[r+(s*152|0)+92>>2]=v*w}}}while(0);s=s+1|0;if((s|0)>=(c[f>>2]|0)){d=21;break}}if((d|0)==4){xa(6584,6520,168,6616)}else if((d|0)==21){i=b;return}}function re(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0;b=i;d=a+48|0;if((c[d>>2]|0)<=0){i=b;return}e=a+40|0;k=a+28|0;t=c[k>>2]|0;a=0;do{m=c[e>>2]|0;h=c[m+(a*152|0)+112>>2]|0;j=c[m+(a*152|0)+116>>2]|0;o=+g[m+(a*152|0)+120>>2];l=+g[m+(a*152|0)+128>>2];q=+g[m+(a*152|0)+124>>2];p=+g[m+(a*152|0)+132>>2];n=c[m+(a*152|0)+144>>2]|0;f=t+(h*12|0)|0;A=f;v=+g[A>>2];x=+g[A+4>>2];w=+g[t+(h*12|0)+8>>2];A=t+(j*12|0)|0;y=+g[A>>2];z=+g[A+4>>2];u=+g[t+(j*12|0)+8>>2];t=m+(a*152|0)+72|0;s=+g[t>>2];r=+g[t+4>>2];if((n|0)>0){t=0;do{D=+g[m+(a*152|0)+(t*36|0)+16>>2];B=+g[m+(a*152|0)+(t*36|0)+20>>2];C=s*D+r*B;B=r*D-s*B;w=w-l*(+g[m+(a*152|0)+(t*36|0)>>2]*B- +g[m+(a*152|0)+(t*36|0)+4>>2]*C);v=v-o*C;x=x-o*B;u=u+p*(B*+g[m+(a*152|0)+(t*36|0)+8>>2]-C*+g[m+(a*152|0)+(t*36|0)+12>>2]);y=y+q*C;z=z+q*B;t=t+1|0}while((t|0)!=(n|0))}D=+v;C=+x;t=f;g[t>>2]=D;g[t+4>>2]=C;t=c[k>>2]|0;g[t+(h*12|0)+8>>2]=w;C=+y;D=+z;t=t+(j*12|0)|0;g[t>>2]=C;g[t+4>>2]=D;t=c[k>>2]|0;g[t+(j*12|0)+8>>2]=u;a=a+1|0}while((a|0)<(c[d>>2]|0));i=b;return}function se(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0,T=0.0,U=0.0;b=i;d=a+48|0;if((c[d>>2]|0)<=0){i=b;return}e=a+40|0;a=a+28|0;S=c[a>>2]|0;h=0;a:while(1){x=c[e>>2]|0;y=x+(h*152|0)|0;k=c[x+(h*152|0)+112>>2]|0;f=c[x+(h*152|0)+116>>2]|0;o=+g[x+(h*152|0)+120>>2];m=+g[x+(h*152|0)+128>>2];n=+g[x+(h*152|0)+124>>2];l=+g[x+(h*152|0)+132>>2];J=x+(h*152|0)+144|0;K=c[J>>2]|0;j=S+(k*12|0)|0;I=j;v=+g[I>>2];w=+g[I+4>>2];I=S+(f*12|0)|0;t=+g[I>>2];u=+g[I+4>>2];I=x+(h*152|0)+72|0;r=+g[I>>2];p=+g[I+4>>2];z=-r;A=+g[x+(h*152|0)+136>>2];if((K+ -1|0)>>>0<2){I=0;s=+g[S+(k*12|0)+8>>2];q=+g[S+(f*12|0)+8>>2]}else{d=4;break}do{G=+g[x+(h*152|0)+(I*36|0)+12>>2];C=+g[x+(h*152|0)+(I*36|0)+8>>2];D=+g[x+(h*152|0)+(I*36|0)+4>>2];E=+g[x+(h*152|0)+(I*36|0)>>2];L=A*+g[x+(h*152|0)+(I*36|0)+16>>2];S=x+(h*152|0)+(I*36|0)+20|0;F=+g[S>>2];H=F- +g[x+(h*152|0)+(I*36|0)+28>>2]*(p*(t-q*G-v+s*D)+(u+q*C-w-s*E)*z);B=-L;H=H<L?H:L;R=H<B?B:H;Q=R-F;g[S>>2]=R;R=p*Q;Q=Q*z;v=v-o*R;w=w-o*Q;s=s-m*(E*Q-D*R);t=t+n*R;u=u+n*Q;q=q+l*(C*Q-G*R);I=I+1|0}while((I|0)!=(K|0));do{if((c[J>>2]|0)!=1){I=x+(h*152|0)+16|0;H=+g[I>>2];J=x+(h*152|0)+52|0;L=+g[J>>2];if(!(H>=0.0)|!(L>=0.0)){d=9;break a}z=+g[x+(h*152|0)+12>>2];A=+g[x+(h*152|0)+8>>2];C=+g[x+(h*152|0)+4>>2];G=+g[y>>2];D=+g[x+(h*152|0)+48>>2];B=+g[x+(h*152|0)+44>>2];E=+g[x+(h*152|0)+40>>2];F=+g[x+(h*152|0)+36>>2];O=+g[x+(h*152|0)+104>>2];P=+g[x+(h*152|0)+100>>2];M=r*(t-q*z-v+s*C)+p*(u+q*A-w-s*G)- +g[x+(h*152|0)+32>>2]-(H*+g[x+(h*152|0)+96>>2]+L*O);N=r*(t-q*D-v+s*E)+p*(u+q*B-w-s*F)- +g[x+(h*152|0)+68>>2]-(H*P+L*+g[x+(h*152|0)+108>>2]);U=+g[x+(h*152|0)+80>>2]*M+ +g[x+(h*152|0)+88>>2]*N;T=M*+g[x+(h*152|0)+84>>2]+N*+g[x+(h*152|0)+92>>2];Q=-U;R=-T;if(!(!(U<=-0.0)|!(T<=-0.0))){O=Q-H;T=R-L;P=r*O;O=p*O;U=r*T;T=p*T;M=P+U;N=O+T;g[I>>2]=Q;g[J>>2]=R;v=v-o*M;w=w-o*N;t=t+n*M;u=u+n*N;s=s-m*(G*O-C*P+(F*T-E*U));q=q+l*(A*O-z*P+(B*T-D*U));break}U=M*+g[x+(h*152|0)+24>>2];Q=-U;if(U<=-0.0?N+P*Q>=0.0:0){P=Q-H;T=0.0-L;R=r*P;P=p*P;U=r*T;T=p*T;N=U+R;O=T+P;g[I>>2]=Q;g[J>>2]=0.0;v=v-o*N;w=w-o*O;t=t+n*N;u=u+n*O;s=s-m*(P*G-R*C+(T*F-U*E));q=q+l*(P*A-R*z+(T*B-U*D));break}U=N*+g[x+(h*152|0)+60>>2];P=-U;if(U<=-0.0?M+O*P>=0.0:0){Q=0.0-H;T=P-L;R=r*Q;Q=p*Q;U=r*T;T=p*T;N=R+U;O=Q+T;g[I>>2]=0.0;g[J>>2]=P;v=v-o*N;w=w-o*O;t=t+n*N;u=u+n*O;s=s-m*(Q*G-R*C+(T*F-U*E));q=q+l*(Q*A-R*z+(T*B-U*D));break}if(!(!(M>=0.0)|!(N>=0.0))){Q=0.0-H;T=0.0-L;R=r*Q;Q=p*Q;U=r*T;T=p*T;O=R+U;P=Q+T;g[I>>2]=0.0;g[J>>2]=0.0;v=v-o*O;w=w-o*P;t=t+n*O;u=u+n*P;s=s-m*(Q*G-R*C+(T*F-U*E));q=q+l*(Q*A-R*z+(T*B-U*D))}}else{z=+g[x+(h*152|0)+12>>2];A=+g[x+(h*152|0)+8>>2];B=+g[x+(h*152|0)+4>>2];C=+g[y>>2];y=x+(h*152|0)+16|0;D=+g[y>>2];E=D- +g[x+(h*152|0)+24>>2]*(r*(t-q*z-v+s*B)+p*(u+q*A-w-s*C)- +g[x+(h*152|0)+32>>2]);U=E>0.0?E:0.0;T=U-D;g[y>>2]=U;U=r*T;T=p*T;v=v-o*U;w=w-o*T;t=t+n*U;u=u+n*T;s=s-m*(C*T-B*U);q=q+l*(A*T-z*U)}}while(0);U=+v;T=+w;S=j;g[S>>2]=U;g[S+4>>2]=T;S=c[a>>2]|0;g[S+(k*12|0)+8>>2]=s;T=+t;U=+u;S=S+(f*12|0)|0;g[S>>2]=T;g[S+4>>2]=U;S=c[a>>2]|0;g[S+(f*12|0)+8>>2]=q;h=h+1|0;if((h|0)>=(c[d>>2]|0)){d=21;break}}if((d|0)==4){xa(6648,6520,311,6688)}else if((d|0)==9){xa(6720,6520,406,6688)}else if((d|0)==21){i=b;return}}function te(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0;b=i;d=c[a+48>>2]|0;if((d|0)<=0){i=b;return}e=c[a+40>>2]|0;a=c[a+44>>2]|0;f=0;do{h=c[a+(c[e+(f*152|0)+148>>2]<<2)>>2]|0;j=c[e+(f*152|0)+144>>2]|0;if((j|0)>0){k=0;do{g[h+(k*20|0)+72>>2]=+g[e+(f*152|0)+(k*36|0)+16>>2];g[h+(k*20|0)+76>>2]=+g[e+(f*152|0)+(k*36|0)+20>>2];k=k+1|0}while((k|0)<(j|0))}f=f+1|0}while((f|0)<(d|0));i=b;return}function ue(a){a=a|0;var b=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0;b=i;i=i+64|0;f=b+40|0;h=b+24|0;e=b;d=a+48|0;if((c[d>>2]|0)<=0){V=0.0;L=V>=-.014999999664723873;i=b;return L|0}j=a+36|0;l=a+24|0;p=f+8|0;a=f+12|0;k=h+8|0;o=h+12|0;m=e+8|0;n=e+16|0;L=c[l>>2]|0;r=0;D=0.0;do{x=c[j>>2]|0;C=x+(r*88|0)|0;s=c[x+(r*88|0)+32>>2]|0;q=c[x+(r*88|0)+36>>2]|0;W=x+(r*88|0)+48|0;y=+g[W>>2];z=+g[W+4>>2];A=+g[x+(r*88|0)+40>>2];u=+g[x+(r*88|0)+64>>2];W=x+(r*88|0)+56|0;v=+g[W>>2];B=+g[W+4>>2];t=+g[x+(r*88|0)+44>>2];w=+g[x+(r*88|0)+68>>2];x=c[x+(r*88|0)+84>>2]|0;W=L+(s*12|0)|0;F=+g[W>>2];G=+g[W+4>>2];H=+g[L+(s*12|0)+8>>2];W=L+(q*12|0)|0;I=+g[W>>2];J=+g[W+4>>2];K=+g[L+(q*12|0)+8>>2];if((x|0)>0){E=A+t;L=0;do{T=+R(+H);g[p>>2]=T;U=+Q(+H);g[a>>2]=U;P=+R(+K);g[k>>2]=P;O=+Q(+K);g[o>>2]=O;S=+(F-(y*U-z*T));T=+(G-(z*U+y*T));W=f;g[W>>2]=S;g[W+4>>2]=T;T=+(I-(v*O-B*P));P=+(J-(B*O+v*P));W=h;g[W>>2]=T;g[W+4>>2]=P;ve(e,C,f,h,L);W=e;P=+g[W>>2];T=+g[W+4>>2];W=m;O=+g[W>>2];S=+g[W+4>>2];U=+g[n>>2];M=O-F;N=S-G;O=O-I;S=S-J;D=D<U?D:U;U=(U+.004999999888241291)*.20000000298023224;V=U<0.0?U:0.0;U=T*M-P*N;X=T*O-P*S;U=X*w*X+(E+U*u*U);if(U>0.0){U=-(V<-.20000000298023224?-.20000000298023224:V)/U}else{U=0.0}X=P*U;V=T*U;F=F-A*X;G=G-A*V;H=H-u*(M*V-N*X);I=I+t*X;J=J+t*V;K=K+w*(O*V-S*X);L=L+1|0}while((L|0)!=(x|0));x=c[l>>2]|0}else{x=L}X=+F;V=+G;L=x+(s*12|0)|0;g[L>>2]=X;g[L+4>>2]=V;L=c[l>>2]|0;g[L+(s*12|0)+8>>2]=H;V=+I;X=+J;L=L+(q*12|0)|0;g[L>>2]=V;g[L+4>>2]=X;L=c[l>>2]|0;g[L+(q*12|0)+8>>2]=K;r=r+1|0}while((r|0)<(c[d>>2]|0));W=D>=-.014999999664723873;i=b;return W|0}function ve(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0,w=0;h=i;if((c[b+84>>2]|0)<=0){xa(6752,6520,617,6776)}r=c[b+72>>2]|0;if((r|0)==1){v=d+12|0;k=+g[v>>2];l=+g[b+16>>2];r=d+8|0;m=+g[r>>2];o=+g[b+20>>2];j=k*l-m*o;o=l*m+k*o;k=+j;m=+o;w=a;g[w>>2]=k;g[w+4>>2]=m;m=+g[v>>2];k=+g[b+24>>2];l=+g[r>>2];n=+g[b+28>>2];s=+g[e+12>>2];u=+g[b+(f<<3)>>2];t=+g[e+8>>2];q=+g[b+(f<<3)+4>>2];p=+g[e>>2]+(s*u-t*q);q=u*t+s*q+ +g[e+4>>2];g[a+16>>2]=j*(p-(+g[d>>2]+(m*k-l*n)))+(q-(k*l+m*n+ +g[d+4>>2]))*o- +g[b+76>>2]- +g[b+80>>2];p=+p;q=+q;f=a+8|0;g[f>>2]=p;g[f+4>>2]=q;i=h;return}else if((r|0)==2){v=e+12|0;m=+g[v>>2];n=+g[b+16>>2];w=e+8|0;o=+g[w>>2];u=+g[b+20>>2];t=m*n-o*u;u=n*o+m*u;m=+t;o=+u;r=a;g[r>>2]=m;g[r+4>>2]=o;o=+g[v>>2];m=+g[b+24>>2];n=+g[w>>2];p=+g[b+28>>2];l=+g[d+12>>2];j=+g[b+(f<<3)>>2];k=+g[d+8>>2];s=+g[b+(f<<3)+4>>2];q=+g[d>>2]+(l*j-k*s);s=j*k+l*s+ +g[d+4>>2];g[a+16>>2]=t*(q-(+g[e>>2]+(o*m-n*p)))+(s-(m*n+o*p+ +g[e+4>>2]))*u- +g[b+76>>2]- +g[b+80>>2];q=+q;s=+s;w=a+8|0;g[w>>2]=q;g[w+4>>2]=s;t=+-t;u=+-u;w=a;g[w>>2]=t;g[w+4>>2]=u;i=h;return}else if((r|0)==0){m=+g[d+12>>2];n=+g[b+24>>2];u=+g[d+8>>2];l=+g[b+28>>2];j=+g[d>>2]+(m*n-u*l);l=n*u+m*l+ +g[d+4>>2];m=+g[e+12>>2];u=+g[b>>2];n=+g[e+8>>2];o=+g[b+4>>2];k=+g[e>>2]+(m*u-n*o);o=u*n+m*o+ +g[e+4>>2];m=k-j;n=o-l;u=+m;p=+n;w=a;g[w>>2]=u;g[w+4>>2]=p;p=+O(+(m*m+n*n));if(p<1.1920928955078125e-7){p=m;q=n}else{q=1.0/p;p=m*q;g[a>>2]=p;q=n*q;g[a+4>>2]=q}t=+((j+k)*.5);u=+((l+o)*.5);w=a+8|0;g[w>>2]=t;g[w+4>>2]=u;g[a+16>>2]=m*p+n*q- +g[b+76>>2]- +g[b+80>>2];i=h;return}else{i=h;return}}function we(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0,O=0.0,P=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0.0;e=i;i=i+64|0;l=e+40|0;f=e+24|0;h=e;j=a+48|0;if((c[j>>2]|0)<=0){X=0.0;N=X>=-.007499999832361937;i=e;return N|0}k=a+36|0;q=a+24|0;a=l+8|0;r=l+12|0;m=f+8|0;n=f+12|0;o=h+8|0;p=h+16|0;s=0;M=0.0;do{N=c[k>>2]|0;v=N+(s*88|0)|0;t=c[N+(s*88|0)+32>>2]|0;u=c[N+(s*88|0)+36>>2]|0;w=N+(s*88|0)+48|0;x=+g[w>>2];y=+g[w+4>>2];w=N+(s*88|0)+56|0;z=+g[w>>2];A=+g[w+4>>2];w=c[N+(s*88|0)+84>>2]|0;if((t|0)==(b|0)|(t|0)==(d|0)){C=+g[N+(s*88|0)+64>>2];D=+g[N+(s*88|0)+40>>2]}else{C=0.0;D=0.0}B=+g[N+(s*88|0)+44>>2];E=+g[N+(s*88|0)+68>>2];N=c[q>>2]|0;Y=N+(t*12|0)|0;J=+g[Y>>2];I=+g[Y+4>>2];F=+g[N+(t*12|0)+8>>2];Y=N+(u*12|0)|0;K=+g[Y>>2];L=+g[Y+4>>2];H=+g[N+(u*12|0)+8>>2];if((w|0)>0){G=D+B;N=0;do{O=+R(+F);g[a>>2]=O;W=+Q(+F);g[r>>2]=W;V=+R(+H);g[m>>2]=V;T=+Q(+H);g[n>>2]=T;S=+(J-(x*W-y*O));O=+(I-(y*W+x*O));Y=l;g[Y>>2]=S;g[Y+4>>2]=O;O=+(K-(z*T-A*V));V=+(L-(A*T+z*V));Y=f;g[Y>>2]=O;g[Y+4>>2]=V;ve(h,v,l,f,N);Y=h;V=+g[Y>>2];O=+g[Y+4>>2];Y=o;T=+g[Y>>2];S=+g[Y+4>>2];W=+g[p>>2];P=T-J;U=S-I;T=T-K;S=S-L;M=M<W?M:W;W=(W+.004999999888241291)*.75;W=W<0.0?W:0.0;X=O*P-V*U;Z=O*T-V*S;X=Z*E*Z+(G+X*C*X);if(X>0.0){W=-(W<-.20000000298023224?-.20000000298023224:W)/X}else{W=0.0}Z=V*W;X=O*W;J=J-D*Z;I=I-D*X;F=F-C*(P*X-U*Z);K=K+B*Z;L=L+B*X;H=H+E*(T*X-S*Z);N=N+1|0}while((N|0)!=(w|0));v=c[q>>2]|0}else{v=N}Z=+J;X=+I;Y=v+(t*12|0)|0;g[Y>>2]=Z;g[Y+4>>2]=X;Y=c[q>>2]|0;g[Y+(t*12|0)+8>>2]=F;X=+K;Z=+L;Y=Y+(u*12|0)|0;g[Y>>2]=X;g[Y+4>>2]=Z;g[(c[q>>2]|0)+(u*12|0)+8>>2]=H;s=s+1|0}while((s|0)<(c[j>>2]|0));Y=M>=-.007499999832361937;i=e;return Y|0}function xe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;if(!((e|0)>-1)){xa(6832,6792,89,6872)}h=b+16|0;if(((c[h>>2]|0)+ -1|0)<=(e|0)){xa(6832,6792,89,6872)}c[d+4>>2]=1;g[d+8>>2]=+g[b+8>>2];j=b+12|0;k=(c[j>>2]|0)+(e<<3)|0;l=c[k+4>>2]|0;m=d+12|0;c[m>>2]=c[k>>2];c[m+4>>2]=l;m=(c[j>>2]|0)+(e+1<<3)|0;l=c[m+4>>2]|0;k=d+20|0;c[k>>2]=c[m>>2];c[k+4>>2]=l;k=d+28|0;if((e|0)>0){n=(c[j>>2]|0)+(e+ -1<<3)|0;l=c[n+4>>2]|0;m=k;c[m>>2]=c[n>>2];c[m+4>>2]=l;a[d+44>>0]=1}else{l=b+20|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+44>>0]=a[b+36>>0]|0}k=d+36|0;if(((c[h>>2]|0)+ -2|0)>(e|0)){l=(c[j>>2]|0)+(e+2<<3)|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+45>>0]=1;i=f;return}else{l=b+28|0;m=c[l+4>>2]|0;n=k;c[n>>2]=c[l>>2];c[n+4>>2]=m;a[d+45>>0]=a[b+37>>0]|0;i=f;return}}function ye(a){a=a|0;return}function ze(a){a=a|0;return}function Ae(a){a=a|0;return}function Be(a){a=a|0;return}function Ce(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function De(a){a=a|0;var b=0;b=i;Qe(a);i=b;return}function Ee(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+64|0;f=e;if((a|0)==(b|0)){h=1;i=e;return h|0}if((b|0)==0){h=0;i=e;return h|0}b=He(b,6952,7008,0)|0;if((b|0)==0){h=0;i=e;return h|0}h=f+0|0;g=h+56|0;do{c[h>>2]=0;h=h+4|0}while((h|0)<(g|0));c[f>>2]=b;c[f+8>>2]=a;c[f+12>>2]=-1;c[f+48>>2]=1;rb[c[(c[b>>2]|0)+28>>2]&15](b,f,c[d>>2]|0,1);if((c[f+24>>2]|0)!=1){h=0;i=e;return h|0}c[d>>2]=c[f+16>>2];h=1;i=e;return h|0}function Fe(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((c[d+8>>2]|0)!=(b|0)){i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function Ge(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=i;if((b|0)!=(c[d+8>>2]|0)){h=c[b+8>>2]|0;rb[c[(c[h>>2]|0)+28>>2]&15](h,d,e,f);i=g;return}b=d+16|0;h=c[b>>2]|0;if((h|0)==0){c[b>>2]=e;c[d+24>>2]=f;c[d+36>>2]=1;i=g;return}if((h|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;c[d+24>>2]=2;a[d+54>>0]=1;i=g;return}e=d+24|0;if((c[e>>2]|0)!=2){i=g;return}c[e>>2]=f;i=g;return}function He(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=i;i=i+64|0;j=h;k=c[d>>2]|0;l=d+(c[k+ -8>>2]|0)|0;k=c[k+ -4>>2]|0;c[j>>2]=f;c[j+4>>2]=d;c[j+8>>2]=e;c[j+12>>2]=g;n=j+16|0;o=j+20|0;e=j+24|0;m=j+28|0;g=j+32|0;d=j+40|0;p=(k|0)==(f|0);q=n+0|0;f=q+36|0;do{c[q>>2]=0;q=q+4|0}while((q|0)<(f|0));b[n+36>>1]=0;a[n+38>>0]=0;if(p){c[j+48>>2]=1;ob[c[(c[k>>2]|0)+20>>2]&3](k,j,l,l,1,0);q=(c[e>>2]|0)==1?l:0;i=h;return q|0}hb[c[(c[k>>2]|0)+24>>2]&3](k,j,l,1,0);j=c[j+36>>2]|0;if((j|0)==1){if((c[e>>2]|0)!=1){if((c[d>>2]|0)!=0){q=0;i=h;return q|0}if((c[m>>2]|0)!=1){q=0;i=h;return q|0}if((c[g>>2]|0)!=1){q=0;i=h;return q|0}}q=c[n>>2]|0;i=h;return q|0}else if((j|0)==0){if((c[d>>2]|0)!=1){q=0;i=h;return q|0}if((c[m>>2]|0)!=1){q=0;i=h;return q|0}q=(c[g>>2]|0)==1?c[o>>2]|0:0;i=h;return q|0}else{q=0;i=h;return q|0}return 0}function Ie(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;if((b|0)==(c[d+8>>2]|0)){if((c[d+4>>2]|0)!=(e|0)){i=h;return}j=d+28|0;if((c[j>>2]|0)==1){i=h;return}c[j>>2]=f;i=h;return}if((b|0)!=(c[d>>2]|0)){l=c[b+8>>2]|0;hb[c[(c[l>>2]|0)+24>>2]&3](l,d,e,f,g);i=h;return}if((c[d+16>>2]|0)!=(e|0)?(k=d+20|0,(c[k>>2]|0)!=(e|0)):0){c[d+32>>2]=f;f=d+44|0;if((c[f>>2]|0)==4){i=h;return}l=d+52|0;a[l>>0]=0;m=d+53|0;a[m>>0]=0;b=c[b+8>>2]|0;ob[c[(c[b>>2]|0)+20>>2]&3](b,d,e,e,1,g);if((a[m>>0]|0)!=0){if((a[l>>0]|0)==0){b=1;j=13}}else{b=0;j=13}do{if((j|0)==13){c[k>>2]=e;m=d+40|0;c[m>>2]=(c[m>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1;if(b){break}}else{j=16}if((j|0)==16?b:0){break}c[f>>2]=4;i=h;return}}while(0);c[f>>2]=3;i=h;return}if((f|0)!=1){i=h;return}c[d+32>>2]=1;i=h;return}function Je(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;g=i;if((c[d+8>>2]|0)==(b|0)){if((c[d+4>>2]|0)!=(e|0)){i=g;return}d=d+28|0;if((c[d>>2]|0)==1){i=g;return}c[d>>2]=f;i=g;return}if((c[d>>2]|0)!=(b|0)){i=g;return}if((c[d+16>>2]|0)!=(e|0)?(h=d+20|0,(c[h>>2]|0)!=(e|0)):0){c[d+32>>2]=f;c[h>>2]=e;b=d+40|0;c[b>>2]=(c[b>>2]|0)+1;if((c[d+36>>2]|0)==1?(c[d+24>>2]|0)==2:0){a[d+54>>0]=1}c[d+44>>2]=4;i=g;return}if((f|0)!=1){i=g;return}c[d+32>>2]=1;i=g;return}function Ke(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0;j=i;if((b|0)!=(c[d+8>>2]|0)){b=c[b+8>>2]|0;ob[c[(c[b>>2]|0)+20>>2]&3](b,d,e,f,g,h);i=j;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=j;return}a[d+52>>0]=1;b=d+16|0;f=c[b>>2]|0;if((f|0)==0){c[b>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54>>0]=1;i=j;return}if((f|0)!=(e|0)){h=d+36|0;c[h>>2]=(c[h>>2]|0)+1;a[d+54>>0]=1;i=j;return}e=d+24|0;b=c[e>>2]|0;if((b|0)==2){c[e>>2]=g}else{g=b}if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=j;return}a[d+54>>0]=1;i=j;return}function Le(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;h=i;if((c[d+8>>2]|0)!=(b|0)){i=h;return}a[d+53>>0]=1;if((c[d+4>>2]|0)!=(f|0)){i=h;return}a[d+52>>0]=1;f=d+16|0;b=c[f>>2]|0;if((b|0)==0){c[f>>2]=e;c[d+24>>2]=g;c[d+36>>2]=1;if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54>>0]=1;i=h;return}if((b|0)!=(e|0)){b=d+36|0;c[b>>2]=(c[b>>2]|0)+1;a[d+54>>0]=1;i=h;return}e=d+24|0;f=c[e>>2]|0;if((f|0)==2){c[e>>2]=g}else{g=f}if(!((c[d+48>>2]|0)==1&(g|0)==1)){i=h;return}a[d+54>>0]=1;i=h;return}function Me(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;do{if(a>>>0<245){if(a>>>0<11){a=16}else{a=a+11&-8}v=a>>>3;r=c[1790]|0;w=r>>>v;if((w&3|0)!=0){j=(w&1^1)+v|0;h=j<<1;f=7200+(h<<2)|0;h=7200+(h+2<<2)|0;d=c[h>>2]|0;e=d+8|0;g=c[e>>2]|0;do{if((f|0)!=(g|0)){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}k=g+12|0;if((c[k>>2]|0)==(d|0)){c[k>>2]=f;c[h>>2]=g;break}else{Ya()}}else{c[1790]=r&~(1<<j)}}while(0);H=j<<3;c[d+4>>2]=H|3;H=d+(H|4)|0;c[H>>2]=c[H>>2]|1;H=e;i=b;return H|0}if(a>>>0>(c[7168>>2]|0)>>>0){if((w|0)!=0){f=2<<v;f=w<<v&(f|0-f);f=(f&0-f)+ -1|0;d=f>>>12&16;f=f>>>d;e=f>>>5&8;f=f>>>e;g=f>>>2&4;f=f>>>g;j=f>>>1&2;f=f>>>j;h=f>>>1&1;h=(e|d|g|j|h)+(f>>>h)|0;f=h<<1;j=7200+(f<<2)|0;f=7200+(f+2<<2)|0;g=c[f>>2]|0;d=g+8|0;e=c[d>>2]|0;do{if((j|0)!=(e|0)){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}k=e+12|0;if((c[k>>2]|0)==(g|0)){c[k>>2]=j;c[f>>2]=e;break}else{Ya()}}else{c[1790]=r&~(1<<h)}}while(0);h=h<<3;f=h-a|0;c[g+4>>2]=a|3;e=g+a|0;c[g+(a|4)>>2]=f|1;c[g+h>>2]=f;h=c[7168>>2]|0;if((h|0)!=0){g=c[7180>>2]|0;l=h>>>3;j=l<<1;h=7200+(j<<2)|0;k=c[1790]|0;l=1<<l;if((k&l|0)!=0){j=7200+(j+2<<2)|0;k=c[j>>2]|0;if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}else{D=j;C=k}}else{c[1790]=k|l;D=7200+(j+2<<2)|0;C=h}c[D>>2]=g;c[C+12>>2]=g;c[g+8>>2]=C;c[g+12>>2]=h}c[7168>>2]=f;c[7180>>2]=e;H=d;i=b;return H|0}r=c[7164>>2]|0;if((r|0)!=0){d=(r&0-r)+ -1|0;G=d>>>12&16;d=d>>>G;F=d>>>5&8;d=d>>>F;H=d>>>2&4;d=d>>>H;h=d>>>1&2;d=d>>>h;e=d>>>1&1;e=c[7464+((F|G|H|h|e)+(d>>>e)<<2)>>2]|0;d=(c[e+4>>2]&-8)-a|0;h=e;while(1){g=c[h+16>>2]|0;if((g|0)==0){g=c[h+20>>2]|0;if((g|0)==0){break}}h=(c[g+4>>2]&-8)-a|0;f=h>>>0<d>>>0;d=f?h:d;h=g;e=f?g:e}h=c[7176>>2]|0;if(e>>>0<h>>>0){Ya()}f=e+a|0;if(!(e>>>0<f>>>0)){Ya()}g=c[e+24>>2]|0;k=c[e+12>>2]|0;do{if((k|0)==(e|0)){k=e+20|0;j=c[k>>2]|0;if((j|0)==0){k=e+16|0;j=c[k>>2]|0;if((j|0)==0){B=0;break}}while(1){l=j+20|0;m=c[l>>2]|0;if((m|0)!=0){j=m;k=l;continue}l=j+16|0;m=c[l>>2]|0;if((m|0)==0){break}else{j=m;k=l}}if(k>>>0<h>>>0){Ya()}else{c[k>>2]=0;B=j;break}}else{j=c[e+8>>2]|0;if(j>>>0<h>>>0){Ya()}h=j+12|0;if((c[h>>2]|0)!=(e|0)){Ya()}l=k+8|0;if((c[l>>2]|0)==(e|0)){c[h>>2]=k;c[l>>2]=j;B=k;break}else{Ya()}}}while(0);do{if((g|0)!=0){j=c[e+28>>2]|0;h=7464+(j<<2)|0;if((e|0)==(c[h>>2]|0)){c[h>>2]=B;if((B|0)==0){c[7164>>2]=c[7164>>2]&~(1<<j);break}}else{if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}h=g+16|0;if((c[h>>2]|0)==(e|0)){c[h>>2]=B}else{c[g+20>>2]=B}if((B|0)==0){break}}if(B>>>0<(c[7176>>2]|0)>>>0){Ya()}c[B+24>>2]=g;g=c[e+16>>2]|0;do{if((g|0)!=0){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[B+16>>2]=g;c[g+24>>2]=B;break}}}while(0);g=c[e+20>>2]|0;if((g|0)!=0){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[B+20>>2]=g;c[g+24>>2]=B;break}}}}while(0);if(d>>>0<16){H=d+a|0;c[e+4>>2]=H|3;H=e+(H+4)|0;c[H>>2]=c[H>>2]|1}else{c[e+4>>2]=a|3;c[e+(a|4)>>2]=d|1;c[e+(d+a)>>2]=d;h=c[7168>>2]|0;if((h|0)!=0){g=c[7180>>2]|0;j=h>>>3;k=j<<1;h=7200+(k<<2)|0;l=c[1790]|0;j=1<<j;if((l&j|0)!=0){k=7200+(k+2<<2)|0;j=c[k>>2]|0;if(j>>>0<(c[7176>>2]|0)>>>0){Ya()}else{z=k;A=j}}else{c[1790]=l|j;z=7200+(k+2<<2)|0;A=h}c[z>>2]=g;c[A+12>>2]=g;c[g+8>>2]=A;c[g+12>>2]=h}c[7168>>2]=d;c[7180>>2]=f}H=e+8|0;i=b;return H|0}}}else{if(!(a>>>0>4294967231)){z=a+11|0;a=z&-8;B=c[7164>>2]|0;if((B|0)!=0){A=0-a|0;z=z>>>8;if((z|0)!=0){if(a>>>0>16777215){C=31}else{G=(z+1048320|0)>>>16&8;H=z<<G;F=(H+520192|0)>>>16&4;H=H<<F;C=(H+245760|0)>>>16&2;C=14-(F|G|C)+(H<<C>>>15)|0;C=a>>>(C+7|0)&1|C<<1}}else{C=0}F=c[7464+(C<<2)>>2]|0;a:do{if((F|0)==0){D=0;z=0}else{if((C|0)==31){z=0}else{z=25-(C>>>1)|0}D=0;E=a<<z;z=0;while(1){H=c[F+4>>2]&-8;G=H-a|0;if(G>>>0<A>>>0){if((H|0)==(a|0)){A=G;D=F;z=F;break a}else{A=G;z=F}}G=c[F+20>>2]|0;F=c[F+(E>>>31<<2)+16>>2]|0;D=(G|0)==0|(G|0)==(F|0)?D:G;if((F|0)==0){break}else{E=E<<1}}}}while(0);if((D|0)==0&(z|0)==0){H=2<<C;B=B&(H|0-H);if((B|0)==0){break}H=(B&0-B)+ -1|0;E=H>>>12&16;H=H>>>E;C=H>>>5&8;H=H>>>C;F=H>>>2&4;H=H>>>F;G=H>>>1&2;H=H>>>G;D=H>>>1&1;D=c[7464+((C|E|F|G|D)+(H>>>D)<<2)>>2]|0}if((D|0)!=0){while(1){C=(c[D+4>>2]&-8)-a|0;B=C>>>0<A>>>0;A=B?C:A;z=B?D:z;B=c[D+16>>2]|0;if((B|0)!=0){D=B;continue}D=c[D+20>>2]|0;if((D|0)==0){break}}}if((z|0)!=0?A>>>0<((c[7168>>2]|0)-a|0)>>>0:0){f=c[7176>>2]|0;if(z>>>0<f>>>0){Ya()}d=z+a|0;if(!(z>>>0<d>>>0)){Ya()}e=c[z+24>>2]|0;g=c[z+12>>2]|0;do{if((g|0)==(z|0)){h=z+20|0;g=c[h>>2]|0;if((g|0)==0){h=z+16|0;g=c[h>>2]|0;if((g|0)==0){x=0;break}}while(1){j=g+20|0;k=c[j>>2]|0;if((k|0)!=0){g=k;h=j;continue}j=g+16|0;k=c[j>>2]|0;if((k|0)==0){break}else{g=k;h=j}}if(h>>>0<f>>>0){Ya()}else{c[h>>2]=0;x=g;break}}else{h=c[z+8>>2]|0;if(h>>>0<f>>>0){Ya()}j=h+12|0;if((c[j>>2]|0)!=(z|0)){Ya()}f=g+8|0;if((c[f>>2]|0)==(z|0)){c[j>>2]=g;c[f>>2]=h;x=g;break}else{Ya()}}}while(0);do{if((e|0)!=0){g=c[z+28>>2]|0;f=7464+(g<<2)|0;if((z|0)==(c[f>>2]|0)){c[f>>2]=x;if((x|0)==0){c[7164>>2]=c[7164>>2]&~(1<<g);break}}else{if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}f=e+16|0;if((c[f>>2]|0)==(z|0)){c[f>>2]=x}else{c[e+20>>2]=x}if((x|0)==0){break}}if(x>>>0<(c[7176>>2]|0)>>>0){Ya()}c[x+24>>2]=e;e=c[z+16>>2]|0;do{if((e|0)!=0){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[x+16>>2]=e;c[e+24>>2]=x;break}}}while(0);e=c[z+20>>2]|0;if((e|0)!=0){if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[x+20>>2]=e;c[e+24>>2]=x;break}}}}while(0);b:do{if(!(A>>>0<16)){c[z+4>>2]=a|3;c[z+(a|4)>>2]=A|1;c[z+(A+a)>>2]=A;f=A>>>3;if(A>>>0<256){g=f<<1;e=7200+(g<<2)|0;h=c[1790]|0;f=1<<f;if((h&f|0)!=0){f=7200+(g+2<<2)|0;g=c[f>>2]|0;if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{w=f;v=g}}else{c[1790]=h|f;w=7200+(g+2<<2)|0;v=e}c[w>>2]=d;c[v+12>>2]=d;c[z+(a+8)>>2]=v;c[z+(a+12)>>2]=e;break}e=A>>>8;if((e|0)!=0){if(A>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=A>>>(e+7|0)&1|e<<1}}else{e=0}f=7464+(e<<2)|0;c[z+(a+28)>>2]=e;c[z+(a+20)>>2]=0;c[z+(a+16)>>2]=0;h=c[7164>>2]|0;g=1<<e;if((h&g|0)==0){c[7164>>2]=h|g;c[f>>2]=d;c[z+(a+24)>>2]=f;c[z+(a+12)>>2]=d;c[z+(a+8)>>2]=d;break}f=c[f>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}c:do{if((c[f+4>>2]&-8|0)!=(A|0)){e=A<<e;g=f;while(1){h=g+(e>>>31<<2)+16|0;f=c[h>>2]|0;if((f|0)==0){break}if((c[f+4>>2]&-8|0)==(A|0)){r=f;break c}else{e=e<<1;g=f}}if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[h>>2]=d;c[z+(a+24)>>2]=g;c[z+(a+12)>>2]=d;c[z+(a+8)>>2]=d;break b}}else{r=f}}while(0);f=r+8|0;e=c[f>>2]|0;g=c[7176>>2]|0;if(r>>>0<g>>>0){Ya()}if(e>>>0<g>>>0){Ya()}else{c[e+12>>2]=d;c[f>>2]=d;c[z+(a+8)>>2]=e;c[z+(a+12)>>2]=r;c[z+(a+24)>>2]=0;break}}else{H=A+a|0;c[z+4>>2]=H|3;H=z+(H+4)|0;c[H>>2]=c[H>>2]|1}}while(0);H=z+8|0;i=b;return H|0}}}else{a=-1}}}while(0);r=c[7168>>2]|0;if(!(a>>>0>r>>>0)){e=r-a|0;d=c[7180>>2]|0;if(e>>>0>15){c[7180>>2]=d+a;c[7168>>2]=e;c[d+(a+4)>>2]=e|1;c[d+r>>2]=e;c[d+4>>2]=a|3}else{c[7168>>2]=0;c[7180>>2]=0;c[d+4>>2]=r|3;H=d+(r+4)|0;c[H>>2]=c[H>>2]|1}H=d+8|0;i=b;return H|0}r=c[7172>>2]|0;if(a>>>0<r>>>0){G=r-a|0;c[7172>>2]=G;H=c[7184>>2]|0;c[7184>>2]=H+a;c[H+(a+4)>>2]=G|1;c[H+4>>2]=a|3;H=H+8|0;i=b;return H|0}do{if((c[1908]|0)==0){r=Ja(30)|0;if((r+ -1&r|0)==0){c[7640>>2]=r;c[7636>>2]=r;c[7644>>2]=-1;c[7648>>2]=-1;c[7652>>2]=0;c[7604>>2]=0;c[1908]=(_a(0)|0)&-16^1431655768;break}else{Ya()}}}while(0);w=a+48|0;A=c[7640>>2]|0;x=a+47|0;z=A+x|0;A=0-A|0;v=z&A;if(!(v>>>0>a>>>0)){H=0;i=b;return H|0}r=c[7600>>2]|0;if((r|0)!=0?(G=c[7592>>2]|0,H=G+v|0,H>>>0<=G>>>0|H>>>0>r>>>0):0){H=0;i=b;return H|0}d:do{if((c[7604>>2]&4|0)==0){B=c[7184>>2]|0;e:do{if((B|0)!=0){r=7608|0;while(1){C=c[r>>2]|0;if(!(C>>>0>B>>>0)?(y=r+4|0,(C+(c[y>>2]|0)|0)>>>0>B>>>0):0){break}r=c[r+8>>2]|0;if((r|0)==0){o=182;break e}}if((r|0)!=0){A=z-(c[7172>>2]|0)&A;if(A>>>0<2147483647){o=Da(A|0)|0;B=(o|0)==((c[r>>2]|0)+(c[y>>2]|0)|0);y=o;z=A;r=B?o:-1;A=B?A:0;o=191}else{A=0}}else{o=182}}else{o=182}}while(0);do{if((o|0)==182){r=Da(0)|0;if((r|0)!=(-1|0)){A=r;y=c[7636>>2]|0;z=y+ -1|0;if((z&A|0)==0){A=v}else{A=v-A+(z+A&0-y)|0}B=c[7592>>2]|0;z=B+A|0;if(A>>>0>a>>>0&A>>>0<2147483647){y=c[7600>>2]|0;if((y|0)!=0?z>>>0<=B>>>0|z>>>0>y>>>0:0){A=0;break}y=Da(A|0)|0;o=(y|0)==(r|0);z=A;r=o?r:-1;A=o?A:0;o=191}else{A=0}}else{A=0}}}while(0);f:do{if((o|0)==191){o=0-z|0;if((r|0)!=(-1|0)){p=A;o=202;break d}do{if((y|0)!=(-1|0)&z>>>0<2147483647&z>>>0<w>>>0?(u=c[7640>>2]|0,u=x-z+u&0-u,u>>>0<2147483647):0){if((Da(u|0)|0)==(-1|0)){Da(o|0)|0;break f}else{z=u+z|0;break}}}while(0);if((y|0)!=(-1|0)){r=y;p=z;o=202;break d}}}while(0);c[7604>>2]=c[7604>>2]|4;o=199}else{A=0;o=199}}while(0);if((((o|0)==199?v>>>0<2147483647:0)?(s=Da(v|0)|0,t=Da(0)|0,(t|0)!=(-1|0)&(s|0)!=(-1|0)&s>>>0<t>>>0):0)?(p=t-s|0,q=p>>>0>(a+40|0)>>>0,q):0){r=s;p=q?p:A;o=202}if((o|0)==202){q=(c[7592>>2]|0)+p|0;c[7592>>2]=q;if(q>>>0>(c[7596>>2]|0)>>>0){c[7596>>2]=q}q=c[7184>>2]|0;g:do{if((q|0)!=0){v=7608|0;while(1){w=c[v>>2]|0;t=v+4|0;u=c[t>>2]|0;if((r|0)==(w+u|0)){o=214;break}s=c[v+8>>2]|0;if((s|0)==0){break}else{v=s}}if(((o|0)==214?(c[v+12>>2]&8|0)==0:0)?q>>>0>=w>>>0&q>>>0<r>>>0:0){c[t>>2]=u+p;d=(c[7172>>2]|0)+p|0;e=q+8|0;if((e&7|0)==0){e=0}else{e=0-e&7}H=d-e|0;c[7184>>2]=q+e;c[7172>>2]=H;c[q+(e+4)>>2]=H|1;c[q+(d+4)>>2]=40;c[7188>>2]=c[7648>>2];break}if(r>>>0<(c[7176>>2]|0)>>>0){c[7176>>2]=r}t=r+p|0;s=7608|0;while(1){if((c[s>>2]|0)==(t|0)){o=224;break}u=c[s+8>>2]|0;if((u|0)==0){break}else{s=u}}if((o|0)==224?(c[s+12>>2]&8|0)==0:0){c[s>>2]=r;h=s+4|0;c[h>>2]=(c[h>>2]|0)+p;h=r+8|0;if((h&7|0)==0){h=0}else{h=0-h&7}j=r+(p+8)|0;if((j&7|0)==0){n=0}else{n=0-j&7}o=r+(n+p)|0;j=h+a|0;k=r+j|0;m=o-(r+h)-a|0;c[r+(h+4)>>2]=a|3;h:do{if((o|0)!=(c[7184>>2]|0)){if((o|0)==(c[7180>>2]|0)){H=(c[7168>>2]|0)+m|0;c[7168>>2]=H;c[7180>>2]=k;c[r+(j+4)>>2]=H|1;c[r+(H+j)>>2]=H;break}q=p+4|0;t=c[r+(q+n)>>2]|0;if((t&3|0)==1){a=t&-8;s=t>>>3;do{if(!(t>>>0<256)){l=c[r+((n|24)+p)>>2]|0;v=c[r+(p+12+n)>>2]|0;do{if((v|0)==(o|0)){u=n|16;t=r+(q+u)|0;s=c[t>>2]|0;if((s|0)==0){t=r+(u+p)|0;s=c[t>>2]|0;if((s|0)==0){g=0;break}}while(1){v=s+20|0;u=c[v>>2]|0;if((u|0)!=0){s=u;t=v;continue}v=s+16|0;u=c[v>>2]|0;if((u|0)==0){break}else{s=u;t=v}}if(t>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[t>>2]=0;g=s;break}}else{s=c[r+((n|8)+p)>>2]|0;if(s>>>0<(c[7176>>2]|0)>>>0){Ya()}t=s+12|0;if((c[t>>2]|0)!=(o|0)){Ya()}u=v+8|0;if((c[u>>2]|0)==(o|0)){c[t>>2]=v;c[u>>2]=s;g=v;break}else{Ya()}}}while(0);if((l|0)!=0){s=c[r+(p+28+n)>>2]|0;t=7464+(s<<2)|0;if((o|0)==(c[t>>2]|0)){c[t>>2]=g;if((g|0)==0){c[7164>>2]=c[7164>>2]&~(1<<s);break}}else{if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}s=l+16|0;if((c[s>>2]|0)==(o|0)){c[s>>2]=g}else{c[l+20>>2]=g}if((g|0)==0){break}}if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}c[g+24>>2]=l;l=n|16;o=c[r+(l+p)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g+16>>2]=o;c[o+24>>2]=g;break}}}while(0);l=c[r+(q+l)>>2]|0;if((l|0)!=0){if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g+20>>2]=l;c[l+24>>2]=g;break}}}}else{q=c[r+((n|8)+p)>>2]|0;g=c[r+(p+12+n)>>2]|0;t=7200+(s<<1<<2)|0;if((q|0)!=(t|0)){if(q>>>0<(c[7176>>2]|0)>>>0){Ya()}if((c[q+12>>2]|0)!=(o|0)){Ya()}}if((g|0)==(q|0)){c[1790]=c[1790]&~(1<<s);break}if((g|0)!=(t|0)){if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}s=g+8|0;if((c[s>>2]|0)==(o|0)){l=s}else{Ya()}}else{l=g+8|0}c[q+12>>2]=g;c[l>>2]=q}}while(0);o=r+((a|n)+p)|0;m=a+m|0}g=o+4|0;c[g>>2]=c[g>>2]&-2;c[r+(j+4)>>2]=m|1;c[r+(m+j)>>2]=m;g=m>>>3;if(m>>>0<256){l=g<<1;d=7200+(l<<2)|0;m=c[1790]|0;g=1<<g;if((m&g|0)!=0){l=7200+(l+2<<2)|0;g=c[l>>2]|0;if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{f=l;e=g}}else{c[1790]=m|g;f=7200+(l+2<<2)|0;e=d}c[f>>2]=k;c[e+12>>2]=k;c[r+(j+8)>>2]=e;c[r+(j+12)>>2]=d;break}e=m>>>8;if((e|0)!=0){if(m>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=m>>>(e+7|0)&1|e<<1}}else{e=0}f=7464+(e<<2)|0;c[r+(j+28)>>2]=e;c[r+(j+20)>>2]=0;c[r+(j+16)>>2]=0;l=c[7164>>2]|0;g=1<<e;if((l&g|0)==0){c[7164>>2]=l|g;c[f>>2]=k;c[r+(j+24)>>2]=f;c[r+(j+12)>>2]=k;c[r+(j+8)>>2]=k;break}f=c[f>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}i:do{if((c[f+4>>2]&-8|0)!=(m|0)){e=m<<e;while(1){g=f+(e>>>31<<2)+16|0;l=c[g>>2]|0;if((l|0)==0){break}if((c[l+4>>2]&-8|0)==(m|0)){d=l;break i}else{e=e<<1;f=l}}if(g>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[g>>2]=k;c[r+(j+24)>>2]=f;c[r+(j+12)>>2]=k;c[r+(j+8)>>2]=k;break h}}else{d=f}}while(0);f=d+8|0;e=c[f>>2]|0;g=c[7176>>2]|0;if(d>>>0<g>>>0){Ya()}if(e>>>0<g>>>0){Ya()}else{c[e+12>>2]=k;c[f>>2]=k;c[r+(j+8)>>2]=e;c[r+(j+12)>>2]=d;c[r+(j+24)>>2]=0;break}}else{H=(c[7172>>2]|0)+m|0;c[7172>>2]=H;c[7184>>2]=k;c[r+(j+4)>>2]=H|1}}while(0);H=r+(h|8)|0;i=b;return H|0}e=7608|0;while(1){d=c[e>>2]|0;if(!(d>>>0>q>>>0)?(n=c[e+4>>2]|0,m=d+n|0,m>>>0>q>>>0):0){break}e=c[e+8>>2]|0}e=d+(n+ -39)|0;if((e&7|0)==0){e=0}else{e=0-e&7}d=d+(n+ -47+e)|0;d=d>>>0<(q+16|0)>>>0?q:d;e=d+8|0;f=r+8|0;if((f&7|0)==0){f=0}else{f=0-f&7}H=p+ -40-f|0;c[7184>>2]=r+f;c[7172>>2]=H;c[r+(f+4)>>2]=H|1;c[r+(p+ -36)>>2]=40;c[7188>>2]=c[7648>>2];c[d+4>>2]=27;c[e+0>>2]=c[7608>>2];c[e+4>>2]=c[7612>>2];c[e+8>>2]=c[7616>>2];c[e+12>>2]=c[7620>>2];c[7608>>2]=r;c[7612>>2]=p;c[7620>>2]=0;c[7616>>2]=e;e=d+28|0;c[e>>2]=7;if((d+32|0)>>>0<m>>>0){do{H=e;e=e+4|0;c[e>>2]=7}while((H+8|0)>>>0<m>>>0)}if((d|0)!=(q|0)){d=d-q|0;e=q+(d+4)|0;c[e>>2]=c[e>>2]&-2;c[q+4>>2]=d|1;c[q+d>>2]=d;e=d>>>3;if(d>>>0<256){f=e<<1;d=7200+(f<<2)|0;g=c[1790]|0;e=1<<e;if((g&e|0)!=0){f=7200+(f+2<<2)|0;e=c[f>>2]|0;if(e>>>0<(c[7176>>2]|0)>>>0){Ya()}else{k=f;j=e}}else{c[1790]=g|e;k=7200+(f+2<<2)|0;j=d}c[k>>2]=q;c[j+12>>2]=q;c[q+8>>2]=j;c[q+12>>2]=d;break}e=d>>>8;if((e|0)!=0){if(d>>>0>16777215){e=31}else{G=(e+1048320|0)>>>16&8;H=e<<G;F=(H+520192|0)>>>16&4;H=H<<F;e=(H+245760|0)>>>16&2;e=14-(F|G|e)+(H<<e>>>15)|0;e=d>>>(e+7|0)&1|e<<1}}else{e=0}j=7464+(e<<2)|0;c[q+28>>2]=e;c[q+20>>2]=0;c[q+16>>2]=0;f=c[7164>>2]|0;g=1<<e;if((f&g|0)==0){c[7164>>2]=f|g;c[j>>2]=q;c[q+24>>2]=j;c[q+12>>2]=q;c[q+8>>2]=q;break}f=c[j>>2]|0;if((e|0)==31){e=0}else{e=25-(e>>>1)|0}j:do{if((c[f+4>>2]&-8|0)!=(d|0)){e=d<<e;while(1){j=f+(e>>>31<<2)+16|0;g=c[j>>2]|0;if((g|0)==0){break}if((c[g+4>>2]&-8|0)==(d|0)){h=g;break j}else{e=e<<1;f=g}}if(j>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[j>>2]=q;c[q+24>>2]=f;c[q+12>>2]=q;c[q+8>>2]=q;break g}}else{h=f}}while(0);f=h+8|0;e=c[f>>2]|0;d=c[7176>>2]|0;if(h>>>0<d>>>0){Ya()}if(e>>>0<d>>>0){Ya()}else{c[e+12>>2]=q;c[f>>2]=q;c[q+8>>2]=e;c[q+12>>2]=h;c[q+24>>2]=0;break}}}else{H=c[7176>>2]|0;if((H|0)==0|r>>>0<H>>>0){c[7176>>2]=r}c[7608>>2]=r;c[7612>>2]=p;c[7620>>2]=0;c[7196>>2]=c[1908];c[7192>>2]=-1;d=0;do{H=d<<1;G=7200+(H<<2)|0;c[7200+(H+3<<2)>>2]=G;c[7200+(H+2<<2)>>2]=G;d=d+1|0}while((d|0)!=32);d=r+8|0;if((d&7|0)==0){d=0}else{d=0-d&7}H=p+ -40-d|0;c[7184>>2]=r+d;c[7172>>2]=H;c[r+(d+4)>>2]=H|1;c[r+(p+ -36)>>2]=40;c[7188>>2]=c[7648>>2]}}while(0);d=c[7172>>2]|0;if(d>>>0>a>>>0){G=d-a|0;c[7172>>2]=G;H=c[7184>>2]|0;c[7184>>2]=H+a;c[H+(a+4)>>2]=G|1;c[H+4>>2]=a|3;H=H+8|0;i=b;return H|0}}c[(Sa()|0)>>2]=12;H=0;i=b;return H|0}function Ne(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;b=i;if((a|0)==0){i=b;return}q=a+ -8|0;r=c[7176>>2]|0;if(q>>>0<r>>>0){Ya()}o=c[a+ -4>>2]|0;n=o&3;if((n|0)==1){Ya()}j=o&-8;h=a+(j+ -8)|0;do{if((o&1|0)==0){u=c[q>>2]|0;if((n|0)==0){i=b;return}q=-8-u|0;o=a+q|0;n=u+j|0;if(o>>>0<r>>>0){Ya()}if((o|0)==(c[7180>>2]|0)){d=a+(j+ -4)|0;if((c[d>>2]&3|0)!=3){d=o;m=n;break}c[7168>>2]=n;c[d>>2]=c[d>>2]&-2;c[a+(q+4)>>2]=n|1;c[h>>2]=n;i=b;return}t=u>>>3;if(u>>>0<256){d=c[a+(q+8)>>2]|0;m=c[a+(q+12)>>2]|0;p=7200+(t<<1<<2)|0;if((d|0)!=(p|0)){if(d>>>0<r>>>0){Ya()}if((c[d+12>>2]|0)!=(o|0)){Ya()}}if((m|0)==(d|0)){c[1790]=c[1790]&~(1<<t);d=o;m=n;break}if((m|0)!=(p|0)){if(m>>>0<r>>>0){Ya()}p=m+8|0;if((c[p>>2]|0)==(o|0)){s=p}else{Ya()}}else{s=m+8|0}c[d+12>>2]=m;c[s>>2]=d;d=o;m=n;break}s=c[a+(q+24)>>2]|0;t=c[a+(q+12)>>2]|0;do{if((t|0)==(o|0)){u=a+(q+20)|0;t=c[u>>2]|0;if((t|0)==0){u=a+(q+16)|0;t=c[u>>2]|0;if((t|0)==0){p=0;break}}while(1){w=t+20|0;v=c[w>>2]|0;if((v|0)!=0){t=v;u=w;continue}v=t+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{t=w;u=v}}if(u>>>0<r>>>0){Ya()}else{c[u>>2]=0;p=t;break}}else{u=c[a+(q+8)>>2]|0;if(u>>>0<r>>>0){Ya()}r=u+12|0;if((c[r>>2]|0)!=(o|0)){Ya()}v=t+8|0;if((c[v>>2]|0)==(o|0)){c[r>>2]=t;c[v>>2]=u;p=t;break}else{Ya()}}}while(0);if((s|0)!=0){t=c[a+(q+28)>>2]|0;r=7464+(t<<2)|0;if((o|0)==(c[r>>2]|0)){c[r>>2]=p;if((p|0)==0){c[7164>>2]=c[7164>>2]&~(1<<t);d=o;m=n;break}}else{if(s>>>0<(c[7176>>2]|0)>>>0){Ya()}r=s+16|0;if((c[r>>2]|0)==(o|0)){c[r>>2]=p}else{c[s+20>>2]=p}if((p|0)==0){d=o;m=n;break}}if(p>>>0<(c[7176>>2]|0)>>>0){Ya()}c[p+24>>2]=s;r=c[a+(q+16)>>2]|0;do{if((r|0)!=0){if(r>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[p+16>>2]=r;c[r+24>>2]=p;break}}}while(0);q=c[a+(q+20)>>2]|0;if((q|0)!=0){if(q>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[p+20>>2]=q;c[q+24>>2]=p;d=o;m=n;break}}else{d=o;m=n}}else{d=o;m=n}}else{d=q;m=j}}while(0);if(!(d>>>0<h>>>0)){Ya()}n=a+(j+ -4)|0;o=c[n>>2]|0;if((o&1|0)==0){Ya()}if((o&2|0)==0){if((h|0)==(c[7184>>2]|0)){w=(c[7172>>2]|0)+m|0;c[7172>>2]=w;c[7184>>2]=d;c[d+4>>2]=w|1;if((d|0)!=(c[7180>>2]|0)){i=b;return}c[7180>>2]=0;c[7168>>2]=0;i=b;return}if((h|0)==(c[7180>>2]|0)){w=(c[7168>>2]|0)+m|0;c[7168>>2]=w;c[7180>>2]=d;c[d+4>>2]=w|1;c[d+w>>2]=w;i=b;return}m=(o&-8)+m|0;n=o>>>3;do{if(!(o>>>0<256)){l=c[a+(j+16)>>2]|0;q=c[a+(j|4)>>2]|0;do{if((q|0)==(h|0)){o=a+(j+12)|0;n=c[o>>2]|0;if((n|0)==0){o=a+(j+8)|0;n=c[o>>2]|0;if((n|0)==0){k=0;break}}while(1){p=n+20|0;q=c[p>>2]|0;if((q|0)!=0){n=q;o=p;continue}p=n+16|0;q=c[p>>2]|0;if((q|0)==0){break}else{n=q;o=p}}if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[o>>2]=0;k=n;break}}else{o=c[a+j>>2]|0;if(o>>>0<(c[7176>>2]|0)>>>0){Ya()}p=o+12|0;if((c[p>>2]|0)!=(h|0)){Ya()}n=q+8|0;if((c[n>>2]|0)==(h|0)){c[p>>2]=q;c[n>>2]=o;k=q;break}else{Ya()}}}while(0);if((l|0)!=0){n=c[a+(j+20)>>2]|0;o=7464+(n<<2)|0;if((h|0)==(c[o>>2]|0)){c[o>>2]=k;if((k|0)==0){c[7164>>2]=c[7164>>2]&~(1<<n);break}}else{if(l>>>0<(c[7176>>2]|0)>>>0){Ya()}n=l+16|0;if((c[n>>2]|0)==(h|0)){c[n>>2]=k}else{c[l+20>>2]=k}if((k|0)==0){break}}if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}c[k+24>>2]=l;h=c[a+(j+8)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[k+16>>2]=h;c[h+24>>2]=k;break}}}while(0);h=c[a+(j+12)>>2]|0;if((h|0)!=0){if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[k+20>>2]=h;c[h+24>>2]=k;break}}}}else{k=c[a+j>>2]|0;a=c[a+(j|4)>>2]|0;j=7200+(n<<1<<2)|0;if((k|0)!=(j|0)){if(k>>>0<(c[7176>>2]|0)>>>0){Ya()}if((c[k+12>>2]|0)!=(h|0)){Ya()}}if((a|0)==(k|0)){c[1790]=c[1790]&~(1<<n);break}if((a|0)!=(j|0)){if(a>>>0<(c[7176>>2]|0)>>>0){Ya()}j=a+8|0;if((c[j>>2]|0)==(h|0)){l=j}else{Ya()}}else{l=a+8|0}c[k+12>>2]=a;c[l>>2]=k}}while(0);c[d+4>>2]=m|1;c[d+m>>2]=m;if((d|0)==(c[7180>>2]|0)){c[7168>>2]=m;i=b;return}}else{c[n>>2]=o&-2;c[d+4>>2]=m|1;c[d+m>>2]=m}h=m>>>3;if(m>>>0<256){a=h<<1;e=7200+(a<<2)|0;j=c[1790]|0;h=1<<h;if((j&h|0)!=0){h=7200+(a+2<<2)|0;a=c[h>>2]|0;if(a>>>0<(c[7176>>2]|0)>>>0){Ya()}else{f=h;g=a}}else{c[1790]=j|h;f=7200+(a+2<<2)|0;g=e}c[f>>2]=d;c[g+12>>2]=d;c[d+8>>2]=g;c[d+12>>2]=e;i=b;return}f=m>>>8;if((f|0)!=0){if(m>>>0>16777215){f=31}else{v=(f+1048320|0)>>>16&8;w=f<<v;u=(w+520192|0)>>>16&4;w=w<<u;f=(w+245760|0)>>>16&2;f=14-(u|v|f)+(w<<f>>>15)|0;f=m>>>(f+7|0)&1|f<<1}}else{f=0}g=7464+(f<<2)|0;c[d+28>>2]=f;c[d+20>>2]=0;c[d+16>>2]=0;a=c[7164>>2]|0;h=1<<f;a:do{if((a&h|0)!=0){g=c[g>>2]|0;if((f|0)==31){f=0}else{f=25-(f>>>1)|0}b:do{if((c[g+4>>2]&-8|0)!=(m|0)){f=m<<f;a=g;while(1){h=a+(f>>>31<<2)+16|0;g=c[h>>2]|0;if((g|0)==0){break}if((c[g+4>>2]&-8|0)==(m|0)){e=g;break b}else{f=f<<1;a=g}}if(h>>>0<(c[7176>>2]|0)>>>0){Ya()}else{c[h>>2]=d;c[d+24>>2]=a;c[d+12>>2]=d;c[d+8>>2]=d;break a}}else{e=g}}while(0);g=e+8|0;f=c[g>>2]|0;h=c[7176>>2]|0;if(e>>>0<h>>>0){Ya()}if(f>>>0<h>>>0){Ya()}else{c[f+12>>2]=d;c[g>>2]=d;c[d+8>>2]=f;c[d+12>>2]=e;c[d+24>>2]=0;break}}else{c[7164>>2]=a|h;c[g>>2]=d;c[d+24>>2]=g;c[d+12>>2]=d;c[d+8>>2]=d}}while(0);w=(c[7192>>2]|0)+ -1|0;c[7192>>2]=w;if((w|0)==0){d=7616|0}else{i=b;return}while(1){d=c[d>>2]|0;if((d|0)==0){break}else{d=d+8|0}}c[7192>>2]=-1;i=b;return}function Oe(a){a=a|0;var b=0,d=0;b=i;a=(a|0)==0?1:a;while(1){d=Me(a)|0;if((d|0)!=0){a=6;break}d=c[1914]|0;c[1914]=d+0;if((d|0)==0){a=5;break}mb[d&3]()}if((a|0)==5){d=ya(4)|0;c[d>>2]=7672;qa(d|0,7720,30)}else if((a|0)==6){i=b;return d|0}return 0}function Pe(a){a=a|0;var b=0;b=i;a=Oe(a)|0;i=b;return a|0}function Qe(a){a=a|0;var b=0;b=i;if((a|0)!=0){Ne(a)}i=b;return}function Re(a){a=a|0;var b=0;b=i;Ta(a|0);Qe(a);i=b;return}function Se(a){a=a|0;var b=0;b=i;Ta(a|0);i=b;return}function Te(a){a=a|0;return 7688}function Ue(){c[1932]=m}function Ve(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;i=b&3;h=d|d<<8|d<<16|d<<24;g=f&~3;if(i){i=b+4-i|0;while((b|0)<(i|0)){a[b>>0]=d;b=b+1|0}}while((b|0)<(g|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b>>0]=d;b=b+1|0}return b-e|0}function We(b){b=b|0;var c=0;c=b;while(a[c>>0]|0){c=c+1|0}return c-b|0}function Xe(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;if((e|0)>=4096)return La(b|0,d|0,e|0)|0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b>>0]=a[d>>0]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function Ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return gb[a&7](b|0,c|0,d|0)|0}function Ze(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;hb[a&3](b|0,c|0,d|0,e|0,f|0)}function _e(a,b){a=a|0;b=b|0;ib[a&31](b|0)}function $e(a,b,c){a=a|0;b=b|0;c=c|0;jb[a&15](b|0,c|0)}function af(a,b){a=a|0;b=b|0;return kb[a&3](b|0)|0}function bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;lb[a&3](b|0,c|0,d|0)}function cf(a){a=a|0;mb[a&3]()}function df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=+d;nb[a&3](b|0,c|0,+d)}function ef(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;ob[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function ff(a,b,c){a=a|0;b=b|0;c=c|0;return pb[a&3](b|0,c|0)|0}function gf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return qb[a&15](b|0,c|0,d|0,e|0,f|0)|0}function hf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;rb[a&15](b|0,c|0,d|0,e|0)}function jf(a,b,c){a=a|0;b=b|0;c=c|0;$(0);return 0}function kf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;$(1)}function lf(a){a=a|0;$(2)}function mf(a,b){a=a|0;b=b|0;$(3)}function nf(a){a=a|0;$(4);return 0}function of(a,b,c){a=a|0;b=b|0;c=c|0;$(5)}function pf(){$(6)}function qf(){eb()}function rf(a,b,c){a=a|0;b=b|0;c=+c;$(7)}function sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;$(8)}function tf(a,b){a=a|0;b=b|0;$(9);return 0}function uf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;$(10);return 0}function vf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;$(11)}
+
+
+
+
+// EMSCRIPTEN_END_FUNCS
+var gb=[jf,Kb,Rb,Kc,Ee,jf,jf,jf];var hb=[kf,Je,Ie,kf];var ib=[lf,Cb,Gb,Db,Fb,gc,uc,fc,zc,pd,qd,ud,vd,zd,Ad,Ed,Fd,Jd,Kd,ce,de,he,ie,me,ne,ze,Ce,Ae,Be,De,Se,Re];var jb=[mf,vc,wc,ke,Cd,Hd,sd,xd,ae,fe,mf,mf,mf,mf,mf,mf];var kb=[nf,Jb,Qb,Te];var lb=[of,xc,yc,of];var mb=[pf,qf,Eb,pf];var nb=[rf,Nb,Ub,rf];var ob=[sf,Le,Ke,sf];var pb=[tf,Ib,Ob,oc];var qb=[uf,Lb,Sb,je,Bd,Gd,rd,wd,$d,ee,uf,uf,uf,uf,uf,uf];var rb=[vf,Mb,Tb,td,yd,Dd,Id,be,ge,le,Fe,Ge,vf,vf,vf,vf];return{_strlen:We,_free:Ne,_main:Bb,_memset:Ve,_malloc:Me,_memcpy:Xe,runPostSets:Ue,stackAlloc:sb,stackSave:tb,stackRestore:ub,setThrew:vb,setTempRet0:yb,getTempRet0:zb,dynCall_iiii:Ye,dynCall_viiiii:Ze,dynCall_vi:_e,dynCall_vii:$e,dynCall_ii:af,dynCall_viii:bf,dynCall_v:cf,dynCall_viid:df,dynCall_viiiiii:ef,dynCall_iii:ff,dynCall_iiiiii:gf,dynCall_viiii:hf}
+// EMSCRIPTEN_END_ASM
+
+})({Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array},{abort:E,assert:z,asmPrintInt:function(a,b){q.print("int "+a+","+b)},asmPrintFloat:function(a,b){q.print("float "+a+","+b)},min:ta,invoke_iiii:function(a,b,c,d){try{return q.dynCall_iiii(a,b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_viiiii:function(a,
+b,c,d,f,g){try{q.dynCall_viiiii(a,b,c,d,f,g)}catch(h){"number"!==typeof h&&"longjmp"!==h&&e(h),$.setThrew(1,0)}},invoke_vi:function(a,b){try{q.dynCall_vi(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&e(c),$.setThrew(1,0)}},invoke_vii:function(a,b,c){try{q.dynCall_vii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&e(d),$.setThrew(1,0)}},invoke_ii:function(a,b){try{return q.dynCall_ii(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&e(c),$.setThrew(1,0)}},invoke_viii:function(a,b,c,d){try{q.dynCall_viii(a,
+b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_v:function(a){try{q.dynCall_v(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&e(b),$.setThrew(1,0)}},invoke_viid:function(a,b,c,d){try{q.dynCall_viid(a,b,c,d)}catch(f){"number"!==typeof f&&"longjmp"!==f&&e(f),$.setThrew(1,0)}},invoke_viiiiii:function(a,b,c,d,f,g,h){try{q.dynCall_viiiiii(a,b,c,d,f,g,h)}catch(k){"number"!==typeof k&&"longjmp"!==k&&e(k),$.setThrew(1,0)}},invoke_iii:function(a,b,c){try{return q.dynCall_iii(a,
+b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&e(d),$.setThrew(1,0)}},invoke_iiiiii:function(a,b,c,d,f,g){try{return q.dynCall_iiiiii(a,b,c,d,f,g)}catch(h){"number"!==typeof h&&"longjmp"!==h&&e(h),$.setThrew(1,0)}},invoke_viiii:function(a,b,c,d,f){try{q.dynCall_viiii(a,b,c,d,f)}catch(g){"number"!==typeof g&&"longjmp"!==g&&e(g),$.setThrew(1,0)}},___cxa_throw:jb,_emscripten_run_script:function(a){eval(B(a))},_cosf:Va,_send:function(a,b,c){return!Z.bc(a)?(ob(T.ha),-1):kc(a,b,c)},__ZSt9terminatev:function(){lb(-1234)},
+__reallyNegative:oc,___cxa_is_number_type:fb,___assert_fail:function(a,b,c,d){J=l;e("Assertion failed: "+B(a)+", at: "+[b?B(b):"unknown filename",c,d?B(d):"unknown function"]+" at "+Ca())},___cxa_allocate_exception:function(a){return Aa(a+ib)+ib},___cxa_find_matching_catch:function(a,b){-1==a&&(a=hb);header=a-ib;-1==b&&(b=M[header>>2]);var c=Array.prototype.slice.call(arguments,2);0!=b&&!fb(b)&&0==M[M[b>>2]-8>>2]&&(a=M[a>>2]);for(var d=0;d<c.length;d++)if(gb(c[d],b,a))return($.setTempRet0(c[d]),a)|
+0;return($.setTempRet0(b),a)|0},_fflush:p(),_pwrite:function(a,b,c,d){a=X[a];if(!a)return ob(T.ha),-1;try{return cc(a,L,b,c,d)}catch(f){return Jb(f),-1}},___setErrNo:ob,_sbrk:Tc,___cxa_begin_catch:function(a){eb.Xa--;vc.push(hb);return a},_sinf:Wa,_fileno:lc,___resumeException:function(a){hb||(hb=a);e(a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch.")},__ZSt18uncaught_exceptionv:eb,_sysconf:function(a){switch(a){case 30:return 4096;
+case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;
+case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;
+case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return 1}ob(T.u);return-1},_clock:uc,_emscripten_memcpy_big:function(a,b,c){P.set(P.subarray(b,b+c),a);return a},_puts:function(a){var b=M[Cb>>2],a=sc(a,b);return 0>a?a:0>tc(10,b)?-1:a+1},_mkport:jc,_floorf:rc,_sqrtf:Xa,_write:kc,_emscripten_set_main_loop:function(a,b,c,d){q.noExitRuntime=l;z(!xc,"there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one, if you want to");
+Dc=function(){if(!J)if(0<Bc.length){var b=Date.now(),c=Bc.shift();c.R(c.ka);if(Ec){var h=Ec,k=0==h%1?h-1:Math.floor(h);Ec=c.Fe?k:(8*h+(k+0.5))/9}console.log('main loop blocker "'+c.name+'" took '+(Date.now()-b)+" ms");q.setStatus&&(b=q.statusMessage||"Please wait...",c=Ec,h=Cc.Ke,c?c<h?q.setStatus(b+" ("+(h-c)+"/"+h+")"):q.setStatus(b):q.setStatus(""));setTimeout(Dc,0)}else if(zc)Ac=l,zc=n;else{"timeout"===yc&&q.He&&(q.K("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),
+yc="");q.preMainLoop&&q.preMainLoop();try{"undefined"!==typeof d?x.ba("vi",a,[d]):x.ba("v",a)}catch(j){if(j instanceof Wc)return;j&&("object"===typeof j&&j.stack)&&q.K("exception thrown: "+[j,j.stack]);e(j)}q.postMainLoop&&q.postMainLoop();zc?(Ac=l,zc=n):xc()}};b&&0<b?(xc=function(){setTimeout(Dc,1E3/b)},yc="timeout"):(xc=function(){Kc(Dc)},yc="rAF");xc();c&&e("SimulateInfiniteLoop")},___errno_location:function(){return nb},__ZNSt9exceptionD2Ev:p(),_printf:function(a,b){return qc(M[Cb>>2],a,b)},___cxa_does_inherit:gb,
+__exit:lb,_fputc:tc,_abort:function(){q.abort()},_fwrite:mc,_time:function(a){var b=Math.floor(Date.now()/1E3);a&&(M[a>>2]=b);return b},_fprintf:qc,_emscripten_cancel_main_loop:function(){xc=m;zc=l},__formatString:pc,_fputs:sc,_exit:function(a){lb(a)},___cxa_pure_virtual:function(){J=l;e("Pure virtual function called!")},STACKTOP:v,STACK_MAX:Ha,tempDoublePtr:db,ABORT:J,NaN:NaN,Infinity:Infinity,__ZTISt9exception:Uc},R),nc=q._strlen=$._strlen;q._free=$._free;q._main=$._main;
+var kb=q._memset=$._memset,Aa=q._malloc=$._malloc,wc=q._memcpy=$._memcpy;q.runPostSets=$.runPostSets;q.dynCall_iiii=$.dynCall_iiii;q.dynCall_viiiii=$.dynCall_viiiii;q.dynCall_vi=$.dynCall_vi;q.dynCall_vii=$.dynCall_vii;q.dynCall_ii=$.dynCall_ii;q.dynCall_viii=$.dynCall_viii;q.dynCall_v=$.dynCall_v;q.dynCall_viid=$.dynCall_viid;q.dynCall_viiiiii=$.dynCall_viiiiii;q.dynCall_iii=$.dynCall_iii;q.dynCall_iiiiii=$.dynCall_iiiiii;q.dynCall_viiii=$.dynCall_viiii;x.Ua=$.stackAlloc;x.Wa=$.stackSave;x.Va=$.stackRestore;
+x.wc=$.setTempRet0;x.cc=$.getTempRet0;function Wc(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}Wc.prototype=Error();var Xc,Yc=m,Za=function Zc(){!q.calledRun&&$c&&ad([].concat(q.arguments));q.calledRun||(Za=Zc)};
+q.callMain=q.De=function(a){function b(){for(var a=0;3>a;a++)d.push(0)}z(0==S,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");z(0==La.length,"cannot call main when preRun functions remain to be called");a=a||[];Qa||(Qa=l,Ka(Ma));var c=a.length+1,d=[O(K("/bin/this.program"),"i8",0)];b();for(var f=0;f<c-1;f+=1)d.push(O(K(a[f]),"i8",0)),b();d.push(0);d=O(d,"i32",0);Xc=v;try{var g=q._main(c,d,0);q.noExitRuntime||bd(g)}catch(h){h instanceof Wc||("SimulateInfiniteLoop"==h?q.noExitRuntime=
+l:(h&&("object"===typeof h&&h.stack)&&q.K("exception thrown: "+[h,h.stack]),e(h)))}finally{}};
+function ad(a){function b(){if(!q.calledRun){q.calledRun=l;Qa||(Qa=l,Ka(Ma));Ka(Na);ca&&Yc!==m&&q.K("pre-main prep time: "+(Date.now()-Yc)+" ms");q._main&&$c&&q.callMain(a);if(q.postRun)for("function"==typeof q.postRun&&(q.postRun=[q.postRun]);q.postRun.length;)Sa(q.postRun.shift());Ka(Pa)}}a=a||q.arguments;Yc===m&&(Yc=Date.now());if(0<S)q.K("run() called, but dependencies remain, so not running");else{if(q.preRun)for("function"==typeof q.preRun&&(q.preRun=[q.preRun]);q.preRun.length;)Ra(q.preRun.shift());
+Ka(La);!(0<S)&&!q.calledRun&&(q.setStatus?(q.setStatus("Running..."),setTimeout(function(){setTimeout(function(){q.setStatus("")},1);J||b()},1)):b())}}q.run=q.ff=ad;function bd(a){J=l;v=Xc;Ka(Oa);e(new Wc(a))}q.exit=q.Je=bd;function E(a){a&&(q.print(a),q.K(a));J=l;e("abort() at "+Ca()+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.")}q.abort=q.abort=E;if(q.preInit)for("function"==typeof q.preInit&&(q.preInit=[q.preInit]);0<q.preInit.length;)q.preInit.pop()();
+var $c=l;q.noInitialRun&&($c=n);ad([].concat(q.arguments));
+
new file mode 100644
--- /dev/null
+++ b/third_party/webkit/PerformanceTests/asmjs-apps/bullet.js
@@ -0,0 +1,2793 @@
+function g(a){throw a;}var j=void 0,l=!0,m=null,p=!1;function q(){return function(){}}var s,t;t||(t=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var aa={},ba;for(ba in t)t.hasOwnProperty(ba)&&(aa[ba]=t[ba]);var ca="object"===typeof process&&"function"===typeof require,da="object"===typeof window,ea="function"===typeof importScripts,fa=!da&&!ca&&!ea;
+if(ca){t.print||(t.print=function(a){process.stdout.write(a+"\n")});t.printErr||(t.printErr=function(a){process.stderr.write(a+"\n")});var ga=require("fs"),ha=require("path");t.read=function(a,b){var a=ha.normalize(a),c=ga.readFileSync(a);!c&&a!=ha.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=ga.readFileSync(a));c&&!b&&(c=c.toString());return c};t.readBinary=function(a){return t.read(a,l)};t.load=function(a){ia(read(a))};t.arguments=process.argv.slice(2);module.exports=t}else fa?(t.print||(t.print=
+print),"undefined"!=typeof printErr&&(t.printErr=printErr),t.read="undefined"!=typeof read?read:function(){g("no read() available (jsc?)")},t.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?t.arguments=scriptArgs:"undefined"!=typeof arguments&&(t.arguments=arguments),this.Module=t,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):da||ea?(t.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,p);b.send(m);return b.responseText},
+"undefined"!=typeof arguments&&(t.arguments=arguments),"undefined"!==typeof console?(t.print||(t.print=function(a){console.log(a)}),t.printErr||(t.printErr=function(a){console.log(a)})):t.print||(t.print=q()),da?window.Module=t:t.load=importScripts):g("Unknown runtime environment. Where are we?");function ia(a){eval.call(m,a)}"undefined"==!t.load&&t.read&&(t.load=function(a){ia(t.read(a))});t.print||(t.print=q());t.printErr||(t.printErr=t.print);t.arguments||(t.arguments=[]);t.print=t.print;
+t.la=t.printErr;t.preRun=[];t.postRun=[];for(ba in aa)aa.hasOwnProperty(ba)&&(t[ba]=aa[ba]);
+var v={zd:function(a){ja=a},$c:function(){return ja},Ab:function(){return u},zb:function(a){u=a},Qf:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},jd:function(a){return a in v.Ic||a in v.Gc},kd:function(a){return"*"==a[a.length-1]},ld:function(a){return isPointerType(a)?p:isArrayType(a)||/<?\{ ?[^}]* ?\}>?/.test(a)?l:"%"==a[0]},Ic:{i1:0,i8:0,i16:0,i32:0,i64:0},Gc:{"float":0,"double":0},
+hg:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},If:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},pg:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},ob:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?v.ga:"i"===
+a[0]?(a=parseInt(a.substr(1)),y(0===a%8),a/8):0}},cc:function(a){return Math.max(v.ob(a),v.ga)},Sc:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?p:c[a[b]]=l}):a.filter(function(a){return c[a]?p:c[a]=l})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},vf:8,nb:function(a,b,c){return!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?v.cc(a):0),v.ga)},Pc:function(a){a.P=0;a.na=0;var b=[],c=-1,
+d=0;a.ac=a.kb.map(function(e){d++;var f,h;v.jd(e)||v.kd(e)?(f=v.ob(e),h=v.nb(e,f)):v.ld(e)?"0"===e[1]?(f=0,h=Types.types[e]?v.nb(m,Types.types[e].na):a.na||QUANTUM_SIZE):(f=Types.types[e].P,h=v.nb(m,Types.types[e].na)):"b"==e[0]?(f=e.substr(1)|0,h=1):"<"===e[0]?f=h=Types.types[e].P:"i"===e[0]?(f=h=parseInt(e.substr(1))/8,y(0===f%1,"cannot handle non-byte-size field "+e)):y(p,"invalid type for calculateStructAlignment");a.ig&&(h=1);a.na=Math.max(a.na,h);e=v.ma(a.P,h);a.P=e+f;0<=c&&b.push(e-c);return c=
+e});a.mc&&"["===a.mc[0]&&(a.P=parseInt(a.mc.substr(1))*a.P/2);a.P=v.ma(a.P,a.na);0==b.length?a.$b=a.P:1==v.Sc(b).length&&(a.$b=b[0]);a.dg=1!=a.$b;return a.ac},Xc:function(a,b,c){var d,e;if(b){c=c||0;d=("undefined"===typeof Types?v.og:Types.types)[b];if(!d)return m;if(d.kb.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),m;e=d.ac}else d={kb:a.map(function(a){return a[0]})},e=v.Pc(d);var f={Af:d.P};b?
+a.forEach(function(a,b){if("string"===typeof a)f[a]=e[b]+c;else{var k,r;for(r in a)k=r;f[k]=v.Xc(a[k],d.kb[b],e[b])}}):a.forEach(function(a,b){f[a[1]]=e[b]});return f},ib:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),t["dynCall_"+a].apply(m,c)):t["dynCall_"+a].call(m,b)},Ma:[],Bf:function(a){for(var b=0;b<v.Ma.length;b++)if(!v.Ma[b])return v.Ma[b]=a,2*(1+b);g("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},
+kg:function(a){v.Ma[(a-2)/2]=m},Rf:function(a,b){v.fb||(v.fb={});var c=v.fb[a];if(c)return c;for(var c=[],d=0;d<b;d++)c.push(String.fromCharCode(36)+d);d=ka(a);'"'===d[0]&&(d.indexOf('"',1)===d.length-1?d=d.substr(1,d.length-2):A("invalid EM_ASM input |"+d+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));try{var e=eval("(function("+c.join(",")+"){ "+d+" })")}catch(f){t.la("error in executing inline EM_ASM code: "+f+" on: \n\n"+d+"\n\nwith args |"+
+c+"| (make sure to use the right one out of EM_ASM, EM_ASM_ARGS, etc.)"),g(f)}return v.fb[a]=e},Aa:function(a){v.Aa.wb||(v.Aa.wb={});v.Aa.wb[a]||(v.Aa.wb[a]=1,t.la(a))},mb:{},Tf:function(a,b){y(b);v.mb[a]||(v.mb[a]=function(){return v.ib(b,a,arguments)});return v.mb[a]},bb:function(){var a=[],b=0;this.sb=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],d=a[1],e=a[2],f=a[3];
+2==a.length?c=String.fromCharCode((c&31)<<6|d&63):3==a.length?c=String.fromCharCode((c&15)<<12|(d&63)<<6|e&63):(c=(c&7)<<18|(d&63)<<12|(e&63)<<6|f&63,c=String.fromCharCode(Math.floor((c-65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.td=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],e=0;e<a.length;e++)b.push(a.charCodeAt(e));return b}},Sf:function(){g("You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work")},
+yb:function(a){var b=u;u=u+a|0;u=u+7&-8;return b},tc:function(a){var b=la;la=la+a|0;la=la+7&-8;return b},va:function(a){var b=B;B=B+a|0;B=B+7&-8;B>=ma&&A("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ma+", (2) compile with ALLOW_MEMORY_GROWTH which adjusts the size at runtime but prevents some optimizations, or (3) set Module.TOTAL_MEMORY before the program runs.");return b},ma:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},nd:function(a,
+b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},k:8,ga:4,zf:0};t.Runtime=v;var na=p,oa,pa,ja;function y(a,b){a||A("Assertion failed: "+b)}t.ccall=function(a,b,c,d){return qa(ra(a),b,c,d)};function ra(a){try{var b=t["_"+a];b||(b=eval("_"+a))}catch(c){}y(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}
+function qa(a,b,c,d){function e(a,b){if("string"==b){if(a===m||a===j||0===a)return 0;a=C(a);b="array"}if("array"==b){f||(f=v.Ab());var c=v.yb(a.length);sa(a,c);return c}return a}var f=0,h=0,d=d?d.map(function(a){return e(a,c[h++])}):[];a=a.apply(m,d);"string"==b?b=ka(a):(y("array"!=b),b=a);f&&v.zb(f);return b}t.cwrap=function(a,b,c){var d=ra(a);return function(){return qa(d,b,c,Array.prototype.slice.call(arguments))}};
+function ta(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":D[a>>0]=b;break;case "i8":D[a>>0]=b;break;case "i16":ua[a>>1]=b;break;case "i32":F[a>>2]=b;break;case "i64":pa=[b>>>0,(oa=b,1<=+va(oa)?0<oa?(wa(+xa(oa/4294967296),4294967295)|0)>>>0:~~+ya((oa-+(~~oa>>>0))/4294967296)>>>0:0)];F[a>>2]=pa[0];F[a+4>>2]=pa[1];break;case "float":za[a>>2]=b;break;case "double":Aa[a>>3]=b;break;default:A("invalid type for setValue: "+c)}}t.setValue=ta;
+t.getValue=function(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return D[a>>0];case "i8":return D[a>>0];case "i16":return ua[a>>1];case "i32":return F[a>>2];case "i64":return F[a>>2];case "float":return za[a>>2];case "double":return Aa[a>>3];default:A("invalid type for setValue: "+b)}return m};var Ba=1,H=2,I=4;t.ALLOC_NORMAL=0;t.ALLOC_STACK=Ba;t.ALLOC_STATIC=H;t.ALLOC_DYNAMIC=3;t.ALLOC_NONE=I;
+function K(a,b,c,d){var e,f;"number"===typeof a?(e=l,f=a):(e=p,f=a.length);var h="string"===typeof b?b:m,c=c==I?d:[Ca,v.yb,v.tc,v.va][c===j?H:c](Math.max(f,h?1:b.length));if(e){d=c;y(0==(c&3));for(a=c+(f&-4);d<a;d+=4)F[d>>2]=0;for(a=c+f;d<a;)D[d++>>0]=0;return c}if("i8"===h)return a.subarray||a.slice?M.set(a,c):M.set(new Uint8Array(a),c),c;for(var d=0,i,k;d<f;){var r=a[d];"function"===typeof r&&(r=v.Uf(r));e=h||b[d];0===e?d++:("i64"==e&&(e="i32"),ta(c+d,r,e),k!==e&&(i=v.ob(e),k=e),d+=i)}return c}
+t.allocate=K;function ka(a,b){for(var c=p,d,e=0;;){d=M[a+e>>0];if(128<=d)c=l;else if(0==d&&!b)break;e++;if(b&&e==b)break}b||(b=e);var f="";if(!c){for(;0<b;)d=String.fromCharCode.apply(String,M.subarray(a,a+Math.min(b,1024))),f=f?f+d:d,a+=1024,b-=1024;return f}c=new v.bb;for(e=0;e<b;e++)d=M[a+e>>0],f+=c.sb(d);return f}t.Pointer_stringify=ka;t.UTF16ToString=function(a){for(var b=0,c="";;){var d=ua[a+2*b>>1];if(0==d)return c;++b;c+=String.fromCharCode(d)}};
+t.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ua[b+2*c>>1]=a.charCodeAt(c);ua[b+2*a.length>>1]=0};t.UTF32ToString=function(a){for(var b=0,c="";;){var d=F[a+4*b>>2];if(0==d)return c;++b;65536<=d?(d-=65536,c+=String.fromCharCode(55296|d>>10,56320|d&1023)):c+=String.fromCharCode(d)}};t.stringToUTF32=function(a,b){for(var c=0,d=0;d<a.length;++d){var e=a.charCodeAt(d);if(55296<=e&&57343>=e)var f=a.charCodeAt(++d),e=65536+((e&1023)<<10)|f&1023;F[b+4*c>>2]=e;++c}F[b+4*c>>2]=0};
+function Da(a){function b(h,k,r){var k=k||Infinity,z="",n=[],x;if("N"===a[c]){c++;"K"===a[c]&&c++;for(x=[];"E"!==a[c];)if("S"===a[c]){c++;var E=a.indexOf("_",c);x.push(e[a.substring(c,E)||0]||"?");c=E+1}else if("C"===a[c])x.push(x[x.length-1]),c+=2;else{var E=parseInt(a.substr(c)),L=E.toString().length;if(!E||!L){c--;break}var O=a.substr(c+L,E);x.push(O);e.push(O);c+=L+E}c++;x=x.join("::");k--;if(0===k)return h?[x]:x}else if(("K"===a[c]||f&&"L"===a[c])&&c++,E=parseInt(a.substr(c)))L=E.toString().length,
+x=a.substr(c+L,E),c+=L+E;f=p;"I"===a[c]?(c++,E=b(l),L=b(l,1,l),z+=L[0]+" "+x+"<"+E.join(", ")+">"):z=x;a:for(;c<a.length&&0<k--;)if(x=a[c++],x in d)n.push(d[x]);else switch(x){case "P":n.push(b(l,1,l)[0]+"*");break;case "R":n.push(b(l,1,l)[0]+"&");break;case "L":c++;E=a.indexOf("E",c)-c;n.push(a.substr(c,E));c+=E+2;break;case "A":E=parseInt(a.substr(c));c+=E.toString().length;"_"!==a[c]&&g("?");c++;n.push(b(l,1,l)[0]+" ["+E+"]");break;case "E":break a;default:z+="?"+x;break a}!r&&(1===n.length&&"void"===
+n[0])&&(n=[]);return h?(z&&n.push(z+"?"),n):z+("("+n.join(", ")+")")}var c=3,d={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},e=[],f=l;try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=ka(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}return b()}catch(h){return a}}
+function Ea(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=Da(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}for(var D,M,ua,Fa,F,Ha,za,Aa,Ia=0,la=0,Ja=0,u=0,Ka=0,La=0,B=0,Ma=t.TOTAL_STACK||5242880,ma=t.TOTAL_MEMORY||134217728,N=4096;N<ma||N<2*Ma;)N=16777216>N?2*N:N+16777216;N!==ma&&(t.la("increasing TOTAL_MEMORY to "+N+" to be more reasonable"),ma=N);
+y("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"JS engine does not provide full typed array support");var P=new ArrayBuffer(ma);D=new Int8Array(P);ua=new Int16Array(P);F=new Int32Array(P);M=new Uint8Array(P);Fa=new Uint16Array(P);Ha=new Uint32Array(P);za=new Float32Array(P);Aa=new Float64Array(P);F[0]=255;y(255===M[0]&&0===M[3],"Typed arrays 2 must be run on a little-endian system");t.HEAP=j;t.HEAP8=D;t.HEAP16=ua;
+t.HEAP32=F;t.HEAPU8=M;t.HEAPU16=Fa;t.HEAPU32=Ha;t.HEAPF32=za;t.HEAPF64=Aa;function Na(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.Y;"number"===typeof c?b.Fa===j?v.ib("v",c):v.ib("vi",c,[b.Fa]):c(b.Fa===j?m:b.Fa)}}}var Oa=[],Pa=[],Qa=[],Ra=[],Sa=[],Ta=p;function Ua(a){Oa.unshift(a)}t.addOnPreRun=t.Gf=Ua;t.addOnInit=t.Df=function(a){Pa.unshift(a)};t.addOnPreMain=t.Ff=function(a){Qa.unshift(a)};t.addOnExit=t.Cf=function(a){Ra.unshift(a)};
+function Va(a){Sa.unshift(a)}t.addOnPostRun=t.Ef=Va;function C(a,b,c){a=(new v.bb).td(a);c&&(a.length=c);b||a.push(0);return a}t.intArrayFromString=C;t.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c];255<d&&(d&=255);b.push(String.fromCharCode(d))}return b.join("")};t.writeStringToMemory=function(a,b,c){a=C(a,c);for(c=0;c<a.length;)D[b+c>>0]=a[c],c+=1};function sa(a,b){for(var c=0;c<a.length;c++)D[b+c>>0]=a[c]}t.writeArrayToMemory=sa;
+t.writeAsciiToMemory=function(a,b,c){for(var d=0;d<a.length;d++)D[b+d>>0]=a.charCodeAt(d);c||(D[b+a.length>>0]=0)};function Wa(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function Xa(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,d=b&65535;return c*d+((a>>>16)*d+c*(b>>>16)<<16)|0};Math.Xf=Math.imul;
+var va=Math.abs,Ya=Math.cos,Za=Math.sin,$a=Math.acos,ab=Math.atan2,bb=Math.sqrt,ya=Math.ceil,xa=Math.floor,cb=Math.pow,wa=Math.min,db=0,eb=m,fb=m;function gb(){db++;t.monitorRunDependencies&&t.monitorRunDependencies(db)}t.addRunDependency=gb;function hb(){db--;t.monitorRunDependencies&&t.monitorRunDependencies(db);if(0==db&&(eb!==m&&(clearInterval(eb),eb=m),fb)){var a=fb;fb=m;a()}}t.removeRunDependency=hb;t.preloadedImages={};t.preloadedAudios={};var ib=460016,jb=460056,Ia=8,la=Ia+v.ma(460819);
+Pa.push({Y:function(){kb()}},{Y:function(){lb()}});
+K([0,0,122,195,158,123,63,64,223,143,226,66,0,0,122,195,42,198,11,64,66,96,234,66,16,24,118,195,3,178,207,63,223,143,226,66,16,24,118,195,119,21,194,63,66,96,234,66,33,48,114,195,237,239,88,63,223,143,226,66,33,48,114,195,10,218,32,63,66,96,234,66,240,71,110,195,42,139,50,191,223,143,226,66,240,71,110,195,15,100,17,191,66,96,234,66,0,96,106,195,113,172,41,192,223,143,226,66,0,96,106,195,231,0,1,192,66,96,234,66,16,120,102,195,208,155,116,192,223,143,226,66,16,120,102,195,6,76,90,192,66,96,234,66,
+33,144,98,195,197,114,127,192,223,143,226,66,33,144,98,195,18,247,116,192,66,96,234,66,240,167,94,195,84,87,176,192,223,143,226,66,240,167,94,195,237,129,160,192,66,96,234,66,0,192,90,195,24,33,180,192,223,143,226,66,0,192,90,195,107,241,151,192,66,96,234,66,16,216,86,195,232,246,156,192,223,143,226,66,16,216,86,195,245,190,83,192,66,96,234,66,33,240,82,195,196,66,61,192,223,143,226,66,33,240,82,195,163,204,20,192,66,96,234,66,240,7,79,195,156,80,28,192,223,143,226,66,240,7,79,195,18,136,219,191,
+66,96,234,66,0,32,75,195,206,25,193,191,223,143,226,66,0,32,75,195,112,148,152,191,66,96,234,66,16,56,71,195,102,250,5,190,223,143,226,66,16,56,71,195,21,196,96,62,66,96,234,66,33,80,67,195,74,68,124,63,223,143,226,66,33,80,67,195,127,222,212,63,66,96,234,66,240,103,63,195,73,215,76,64,223,143,226,66,240,103,63,195,205,59,139,64,66,96,234,66,0,128,59,195,91,177,149,64,223,143,226,66,0,128,59,195,10,162,202,64,66,96,234,66,16,152,55,195,157,104,197,64,223,143,226,66,16,152,55,195,208,39,0,65,66,96,
+234,66,33,176,51,195,123,3,3,65,223,143,226,66,33,176,51,195,17,112,27,65,66,96,234,66,240,199,47,195,245,156,21,65,223,143,226,66,240,199,47,195,251,92,44,65,66,96,234,66,0,224,43,195,61,27,24,65,223,143,226,66,0,224,43,195,94,186,53,65,66,96,234,66,16,248,39,195,228,20,66,65,223,143,226,66,16,248,39,195,229,97,72,65,66,96,234,66,33,16,36,195,253,246,109,65,223,143,226,66,33,16,36,195,120,11,106,65,66,96,234,66,240,39,32,195,65,2,131,65,223,143,226,66,240,39,32,195,187,167,137,65,66,96,234,66,0,
+64,28,195,41,75,148,65,223,143,226,66,0,64,28,195,189,210,159,65,66,96,234,66,16,88,24,195,116,181,179,65,223,143,226,66,16,88,24,195,131,175,187,65,66,96,234,66,33,112,20,195,206,42,209,65,223,143,226,66,33,112,20,195,235,226,212,65,66,96,234,66,240,135,16,195,87,219,228,65,223,143,226,66,240,135,16,195,63,181,227,65,66,96,234,66,0,160,12,195,106,60,242,65,223,143,226,66,0,160,12,195,252,41,238,65,66,96,234,66,16,184,8,195,64,228,0,66,223,143,226,66,16,184,8,195,21,140,248,65,66,96,234,66,33,208,
+4,195,78,145,3,66,223,143,226,66,33,208,4,195,76,183,254,65,66,96,234,66,240,231,0,195,165,14,6,66,223,143,226,66,240,231,0,195,199,169,0,66,66,96,234,66,0,0,250,194,3,201,10,66,223,143,226,66,0,0,250,194,191,253,10,66,66,96,234,66,33,48,242,194,23,153,21,66,223,143,226,66,33,48,242,194,230,63,16,66,66,96,234,66,66,96,234,194,131,47,24,66,223,143,226,66,66,96,234,194,175,20,21,66,66,96,234,66,223,143,226,194,4,103,23,66,223,143,226,66,223,143,226,194,189,99,21,66,66,96,234,66,0,192,218,194,246,151,
+23,66,223,143,226,66,0,192,218,194,207,247,20,66,66,96,234,66,33,240,210,194,131,47,16,66,223,143,226,66,33,240,210,194,27,158,16,66,66,96,234,66,66,32,203,194,84,116,8,66,223,143,226,66,66,32,203,194,172,156,5,66,66,96,234,66,7,80,195,194,184,94,0,66,223,143,226,66,7,80,195,194,29,90,250,65,66,96,234,66,0,128,187,194,18,165,238,65,223,143,226,66,0,128,187,194,3,248,235,65,66,96,234,66,7,176,179,194,255,50,241,65,223,143,226,66,7,176,179,194,222,113,232,65,66,96,234,66,0,224,171,194,156,179,230,65,
+223,143,226,66,0,224,171,194,162,52,226,65,66,96,234,66,7,16,164,194,227,199,215,65,223,143,226,66,7,16,164,194,191,14,213,65,66,96,234,66,0,64,156,194,119,173,203,65,223,143,226,66,0,64,156,194,249,160,198,65,66,96,234,66,7,112,148,194,140,219,186,65,223,143,226,66,7,112,148,194,126,157,181,65,66,96,234,66,0,160,140,194,193,74,169,65,223,143,226,66,0,160,140,194,174,199,163,65,66,96,234,66,7,208,132,194,56,248,144,65,223,143,226,66,7,208,132,194,59,223,143,65,66,96,234,66,0,0,122,194,147,186,130,
+65,223,143,226,66,0,0,122,194,41,109,130,65,66,96,234,66,13,96,106,194,51,51,113,65,223,143,226,66,13,96,106,194,214,86,99,65,66,96,234,66,0,192,90,194,161,248,99,65,223,143,226,66,0,192,90,194,7,240,76,65,66,96,234,66,13,32,75,194,70,182,92,65,223,143,226,66,13,32,75,194,165,189,72,65,66,96,234,66,0,128,59,194,109,86,75,65,223,143,226,66,0,128,59,194,127,217,66,65,66,96,234,66,13,224,43,194,168,53,41,65,223,143,226,66,13,224,43,194,193,57,50,65,66,96,234,66,0,64,28,194,23,229,31,65,223,143,226,66,
+0,64,28,194,149,101,39,65,66,96,234,66,13,160,12,194,99,127,49,65,223,143,226,66,13,160,12,194,69,216,48,65,66,96,234,66,0,0,250,193,233,72,63,65,223,143,226,66,0,0,250,193,150,67,55,65,66,96,234,66,26,192,218,193,165,44,57,65,223,143,226,66,26,192,218,193,87,236,40,65,66,96,234,66,0,128,187,193,156,162,48,65,223,143,226,66,0,128,187,193,243,31,42,65,66,96,234,66,26,64,156,193,254,67,72,65,223,143,226,66,26,64,156,193,16,233,72,65,66,96,234,66,0,0,122,193,45,178,93,65,223,143,226,66,0,0,122,193,86,
+159,88,65,66,96,234,66,52,128,59,193,102,102,104,65,223,143,226,66,52,128,59,193,52,17,102,65,66,96,234,66,0,0,250,192,30,22,108,65,223,143,226,66,0,0,250,192,196,177,119,65,66,96,234,66,0,0,122,192,54,171,126,65,223,143,226,66,0,0,122,192,112,206,128,65,66,96,234,66,0,0,0,0,24,149,136,65,223,143,226,66,0,0,0,0,164,240,138,65,66,96,234,66,0,0,122,64,100,204,146,65,223,143,226,66,0,0,122,64,29,90,151,65,66,96,234,66,0,0,122,195,43,48,149,64,0,192,218,66,16,24,118,195,205,88,16,64,0,192,218,66,33,48,
+114,195,218,255,120,63,0,192,218,66,240,71,110,195,45,38,250,191,0,192,218,66,0,96,106,195,34,113,47,192,0,192,218,66,16,120,102,195,25,4,104,192,0,192,218,66,33,144,98,195,150,178,145,192,0,192,218,66,240,167,94,195,97,50,205,192,0,192,218,66,0,192,90,195,29,119,215,192,0,192,218,66,16,216,86,195,79,88,189,192,0,192,218,66,33,240,82,195,193,173,151,192,0,192,218,66,240,7,79,195,62,232,83,192,0,192,218,66,0,32,75,195,55,84,4,192,0,192,218,66,16,56,71,195,62,32,120,191,0,192,218,66,33,80,67,195,69,
+157,137,62,0,192,218,66,240,103,63,195,188,87,249,63,0,192,218,66,0,128,59,195,188,174,51,64,0,192,218,66,16,152,55,195,249,20,135,64,0,192,218,66,33,176,51,195,161,161,166,64,0,192,218,66,240,199,47,195,97,26,239,64,0,192,218,66,0,224,43,195,35,62,23,65,0,192,218,66,16,248,39,195,174,71,74,65,0,192,218,66,33,16,36,195,222,2,111,65,0,192,218,66,240,39,32,195,164,95,134,65,0,192,218,66,0,64,28,195,86,31,156,65,0,192,218,66,16,88,24,195,57,52,171,65,0,192,218,66,33,112,20,195,216,1,201,65,0,192,218,
+66,240,135,16,195,23,72,227,65,0,192,218,66,0,160,12,195,191,14,246,65,0,192,218,66,16,184,8,195,222,19,4,66,0,192,218,66,33,208,4,195,186,73,4,66,0,192,218,66,240,231,0,195,15,139,4,66,0,192,218,66,0,0,250,194,56,56,12,66,0,192,218,66,33,48,242,194,83,197,17,66,0,192,218,66,66,96,234,194,86,78,25,66,0,192,218,66,223,143,226,194,183,34,26,66,0,192,218,66,0,192,218,194,231,12,20,66,0,192,218,66,33,240,210,194,13,160,11,66,0,192,218,66,66,32,203,194,84,244,3,66,0,192,218,66,7,80,195,194,212,43,247,
+65,0,192,218,66,0,128,187,194,213,9,244,65,0,192,218,66,7,176,179,194,84,244,243,65,0,192,218,66,0,224,171,194,142,6,231,65,0,192,218,66,7,16,164,194,163,146,225,65,0,192,218,66,0,64,156,194,202,84,207,65,0,192,218,66,7,112,148,194,14,190,186,65,0,192,218,66,0,160,140,194,7,223,167,65,0,192,218,66,7,208,132,194,166,27,147,65,0,192,218,66,0,0,122,194,42,58,135,65,0,192,218,66,13,96,106,194,199,41,116,65,0,192,218,66,0,192,90,194,36,40,101,65,0,192,218,66,13,32,75,194,247,6,86,65,0,192,218,66,0,128,
+59,194,220,70,73,65,0,192,218,66,13,224,43,194,217,61,53,65,0,192,218,66,0,64,28,194,57,69,48,65,0,192,218,66,13,160,12,194,161,248,59,65,0,192,218,66,0,0,250,193,40,15,72,65,0,192,218,66,26,192,218,193,150,33,70,65,0,192,218,66,0,128,187,193,136,244,68,65,0,192,218,66,26,64,156,193,47,221,73,65,0,192,218,66,0,0,122,193,241,99,92,65,0,192,218,66,52,128,59,193,217,206,101,65,0,192,218,66,0,0,250,192,125,63,109,65,0,192,218,66,0,0,122,192,129,149,121,65,0,192,218,66,0,0,0,0,166,27,131,65,0,192,218,
+66,0,0,122,64,123,3,144,65,0,192,218,66,0,0,122,195,60,165,167,64,33,240,210,66,16,24,118,195,104,232,57,64,33,240,210,66,33,48,114,195,208,127,135,62,33,240,210,66,240,71,110,195,61,238,147,190,33,240,210,66,0,96,106,195,24,9,105,191,33,240,210,66,16,120,102,195,95,70,13,192,33,240,210,66,33,144,98,195,95,152,108,192,33,240,210,66,240,167,94,195,47,221,166,192,33,240,210,66,0,192,90,195,169,77,194,192,33,240,210,66,16,216,86,195,120,156,173,192,33,240,210,66,33,240,82,195,89,76,154,192,33,240,210,
+66,240,7,79,195,68,23,78,192,33,240,210,66,0,32,75,195,149,241,17,192,33,240,210,66,16,56,71,195,56,132,194,191,33,240,210,66,33,80,67,195,252,25,62,189,33,240,210,66,240,103,63,195,4,28,222,63,33,240,210,66,0,128,59,195,153,100,46,64,33,240,210,66,16,152,55,195,121,204,140,64,33,240,210,66,33,176,51,195,188,92,175,64,33,240,210,66,240,199,47,195,214,226,232,64,33,240,210,66,0,224,43,195,180,200,33,65,33,240,210,66,16,248,39,195,38,228,80,65,33,240,210,66,33,16,36,195,53,94,123,65,33,240,210,66,240,
+39,32,195,39,194,142,65,33,240,210,66,0,64,28,195,233,183,158,65,33,240,210,66,16,88,24,195,109,86,173,65,33,240,210,66,33,112,20,195,20,46,193,65,33,240,210,66,240,135,16,195,164,95,227,65,33,240,210,66,0,160,12,195,108,137,253,65,33,240,210,66,16,184,8,195,142,134,9,66,33,240,210,66,33,208,4,195,186,154,11,66,33,240,210,66,240,231,0,195,239,56,7,66,33,240,210,66,0,0,250,194,88,74,9,66,33,240,210,66,33,48,242,194,165,108,14,66,33,240,210,66,66,96,234,194,186,218,23,66,33,240,210,66,223,143,226,194,
+81,171,26,66,33,240,210,66,0,192,218,194,75,136,19,66,33,240,210,66,33,240,210,194,161,86,10,66,33,240,210,66,66,32,203,194,110,227,0,66,33,240,210,66,7,80,195,194,145,15,243,65,33,240,210,66,0,128,187,194,247,100,243,65,33,240,210,66,7,176,179,194,116,53,246,65,33,240,210,66,0,224,171,194,2,171,238,65,33,240,210,66,7,16,164,194,153,42,224,65,33,240,210,66,0,64,156,194,162,197,205,65,33,240,210,66,7,112,148,194,23,55,183,65,33,240,210,66,0,160,140,194,220,70,167,65,33,240,210,66,7,208,132,194,225,
+11,146,65,33,240,210,66,0,0,122,194,18,131,133,65,33,240,210,66,13,96,106,194,232,217,124,65,33,240,210,66,0,192,90,194,48,76,109,65,33,240,210,66,13,32,75,194,110,52,92,65,33,240,210,66,0,128,59,194,169,19,80,65,33,240,210,66,13,224,43,194,85,193,62,65,33,240,210,66,0,64,28,194,4,86,64,65,33,240,210,66,13,160,12,194,251,92,68,65,33,240,210,66,0,0,250,193,58,35,74,65,33,240,210,66,26,192,218,193,231,251,74,65,33,240,210,66,0,128,187,193,71,3,70,65,33,240,210,66,26,64,156,193,8,61,80,65,33,240,210,
+66,0,0,122,193,128,183,96,65,33,240,210,66,52,128,59,193,208,179,105,65,33,240,210,66,0,0,250,192,156,196,113,65,33,240,210,66,0,0,122,192,32,99,125,65,33,240,210,66,0,0,0,0,117,147,134,65,33,240,210,66,0,0,122,64,184,175,143,65,33,240,210,66,0,0,122,195,177,225,136,64,66,32,203,66,16,24,118,195,65,43,54,64,66,32,203,66,33,48,114,195,42,0,0,64,66,32,203,66,240,71,110,195,182,16,204,63,66,32,203,66,0,96,106,195,101,53,253,62,66,32,203,66,16,120,102,195,224,161,228,191,66,32,203,66,33,144,98,195,167,
+121,55,192,66,32,203,66,240,167,94,195,66,33,160,192,66,32,203,66,0,192,90,195,252,140,192,192,66,32,203,66,16,216,86,195,144,131,169,192,66,32,203,66,33,240,82,195,72,220,130,192,66,32,203,66,240,7,79,195,25,28,113,192,66,32,203,66,0,32,75,195,26,139,34,192,66,32,203,66,16,56,71,195,206,223,136,191,66,32,203,66,33,80,67,195,180,0,229,190,66,32,203,66,240,103,63,195,251,5,195,63,66,32,203,66,0,128,59,195,227,25,90,64,66,32,203,66,16,152,55,195,103,126,143,64,66,32,203,66,33,176,51,195,223,79,217,
+64,66,32,203,66,240,199,47,195,148,251,10,65,66,32,203,66,0,224,43,195,232,106,50,65,66,32,203,66,16,248,39,195,242,65,103,65,66,32,203,66,33,16,36,195,8,189,140,65,66,32,203,66,240,39,32,195,82,73,155,65,66,32,203,66,0,64,28,195,156,34,166,65,66,32,203,66,16,88,24,195,122,37,178,65,66,32,203,66,33,112,20,195,104,51,192,65,66,32,203,66,240,135,16,195,222,241,221,65,66,32,203,66,0,160,12,195,146,220,251,65,66,32,203,66,16,184,8,195,248,147,9,66,66,32,203,66,33,208,4,195,98,97,13,66,66,32,203,66,240,
+231,0,195,253,246,11,66,66,32,203,66,0,0,250,194,181,230,8,66,66,32,203,66,33,48,242,194,188,180,12,66,66,32,203,66,66,96,234,194,238,60,21,66,66,32,203,66,223,143,226,194,4,231,22,66,66,32,203,66,0,192,218,194,178,238,16,66,66,32,203,66,33,240,210,194,113,189,9,66,66,32,203,66,66,32,203,194,141,104,0,66,66,32,203,66,7,80,195,194,24,149,248,65,66,32,203,66,0,128,187,194,56,248,245,65,66,32,203,66,7,176,179,194,0,128,246,65,66,32,203,66,0,224,171,194,13,113,237,65,66,32,203,66,7,16,164,194,28,107,
+218,65,66,32,203,66,0,64,156,194,241,227,200,65,66,32,203,66,7,112,148,194,20,46,181,65,66,32,203,66,0,160,140,194,80,13,161,65,66,32,203,66,7,208,132,194,9,27,144,65,66,32,203,66,0,0,122,194,150,33,137,65,66,32,203,66,13,96,106,194,165,78,134,65,66,32,203,66,0,192,90,194,7,95,123,65,66,32,203,66,13,32,75,194,207,247,106,65,66,32,203,66,0,128,59,194,54,205,85,65,66,32,203,66,13,224,43,194,128,183,57,65,66,32,203,66,0,64,28,194,217,95,53,65,66,32,203,66,13,160,12,194,97,195,70,65,66,32,203,66,0,0,
+250,193,135,22,81,65,66,32,203,66,26,192,218,193,14,45,71,65,66,32,203,66,0,128,187,193,234,149,61,65,66,32,203,66,26,64,156,193,123,20,91,65,66,32,203,66,0,0,122,193,229,97,107,65,66,32,203,66,52,128,59,193,115,104,111,65,66,32,203,66,0,0,250,192,117,2,113,65,66,32,203,66,0,0,122,192,161,248,128,65,66,32,203,66,0,0,0,0,135,167,136,65,66,32,203,66,0,0,122,64,193,168,141,65,66,32,203,66,0,0,122,195,45,236,135,64,7,80,195,66,16,24,118,195,151,86,123,64,7,80,195,66,33,48,114,195,148,251,71,64,7,80,195,
+66,240,71,110,195,95,181,4,64,7,80,195,66,0,96,106,195,157,215,208,62,7,80,195,66,16,120,102,195,225,150,103,191,7,80,195,66,33,144,98,195,230,203,39,192,7,80,195,66,240,167,94,195,47,23,121,192,7,80,195,66,0,192,90,195,116,210,179,192,7,80,195,66,16,216,86,195,79,6,128,192,7,80,195,66,33,240,82,195,81,160,25,192,7,80,195,66,240,7,79,195,152,163,25,192,7,80,195,66,0,32,75,195,255,62,251,191,7,80,195,66,16,56,71,195,245,132,189,191,7,80,195,66,33,80,67,195,115,47,208,189,7,80,195,66,240,103,63,195,
+173,47,222,63,7,80,195,66,0,128,59,195,255,62,107,64,7,80,195,66,16,152,55,195,125,232,163,64,7,80,195,66,33,176,51,195,37,93,244,64,7,80,195,66,240,199,47,195,39,194,34,65,7,80,195,66,0,224,43,195,204,127,68,65,7,80,195,66,16,248,39,195,197,143,116,65,7,80,195,66,33,16,36,195,82,201,145,65,7,80,195,66,240,39,32,195,16,250,163,65,7,80,195,66,0,64,28,195,37,6,175,65,7,80,195,66,16,88,24,195,69,216,185,65,7,80,195,66,33,112,20,195,24,38,194,65,7,80,195,66,240,135,16,195,204,127,225,65,7,80,195,66,0,
+160,12,195,222,19,250,65,7,80,195,66,16,184,8,195,210,64,5,66,7,80,195,66,33,208,4,195,168,70,13,66,7,80,195,66,240,231,0,195,82,103,12,66,7,80,195,66,0,0,250,194,86,78,11,66,7,80,195,66,33,48,242,194,139,44,9,66,7,80,195,66,66,96,234,194,148,246,17,66,7,80,195,66,223,143,226,194,29,201,20,66,7,80,195,66,0,192,218,194,166,138,16,66,7,80,195,66,33,240,210,194,114,138,9,66,7,80,195,66,66,32,203,194,46,16,247,65,7,80,195,66,7,80,195,194,112,223,240,65,7,80,195,66,0,128,187,194,148,118,247,65,7,80,195,
+66,7,176,179,194,52,0,247,65,7,80,195,66,0,224,171,194,221,36,232,65,7,80,195,66,7,16,164,194,231,123,218,65,7,80,195,66,0,64,156,194,209,17,200,65,7,80,195,66,7,112,148,194,61,44,173,65,7,80,195,66,0,160,140,194,206,8,148,65,7,80,195,66,7,208,132,194,174,71,149,65,7,80,195,66,0,0,122,194,11,70,145,65,7,80,195,66,13,96,106,194,2,43,140,65,7,80,195,66,0,192,90,194,17,182,130,65,7,80,195,66,13,32,75,194,198,220,109,65,7,80,195,66,0,128,59,194,234,149,89,65,7,80,195,66,13,224,43,194,207,247,61,65,7,
+80,195,66,0,64,28,194,207,247,55,65,7,80,195,66,13,160,12,194,11,70,56,65,7,80,195,66,0,0,250,193,216,240,72,65,7,80,195,66,26,192,218,193,167,121,67,65,7,80,195,66,0,128,187,193,80,252,51,65,7,80,195,66,26,64,156,193,251,203,83,65,7,80,195,66,0,0,122,193,194,23,89,65,7,80,195,66,52,128,59,193,102,102,97,65,7,80,195,66,0,0,250,192,172,139,106,65,7,80,195,66,0,0,122,192,61,10,114,65,7,80,195,66,0,0,0,0,85,48,125,65,7,80,195,66,0,0,122,64,11,36,144,65,7,80,195,66,0,0,122,195,69,245,157,64,0,128,187,
+66,16,24,118,195,158,12,96,64,0,128,187,66,33,48,114,195,21,169,56,64,0,128,187,66,240,71,110,195,44,154,12,64,0,128,187,66,0,96,106,195,255,9,186,63,0,128,187,66,16,120,102,195,34,222,26,190,0,128,187,66,33,144,98,195,241,244,138,191,0,128,187,66,240,167,94,195,242,176,18,192,0,128,187,66,0,192,90,195,206,141,117,192,0,128,187,66,16,216,86,195,145,68,47,192,0,128,187,66,33,240,82,195,1,135,12,192,0,128,187,66,240,7,79,195,17,86,99,190,0,128,187,66,0,32,75,195,137,149,241,189,0,128,187,66,16,56,71,
+195,178,75,52,190,0,128,187,66,33,80,67,195,58,59,169,63,0,128,187,66,240,103,63,195,154,37,41,64,0,128,187,66,0,128,59,195,144,131,110,64,0,128,187,66,16,152,55,195,123,49,185,64,0,128,187,66,33,176,51,195,223,137,17,65,0,128,187,66,240,199,47,195,153,187,55,65,0,128,187,66,0,224,43,195,169,19,83,65,0,128,187,66,16,248,39,195,72,225,122,65,0,128,187,66,33,16,36,195,13,224,143,65,0,128,187,66,240,39,32,195,129,38,166,65,0,128,187,66,0,64,28,195,164,240,187,65,0,128,187,66,16,88,24,195,54,205,201,
+65,0,128,187,66,33,112,20,195,151,127,207,65,0,128,187,66,240,135,16,195,132,141,225,65,0,128,187,66,0,160,12,195,179,234,255,65,0,128,187,66,16,184,8,195,116,70,6,66,0,128,187,66,33,208,4,195,237,222,10,66,0,128,187,66,240,231,0,195,103,149,12,66,0,128,187,66,0,0,250,194,252,233,11,66,0,128,187,66,33,48,242,194,161,150,9,66,0,128,187,66,66,96,234,194,100,251,12,66,0,128,187,66,223,143,226,194,103,21,16,66,0,128,187,66,0,192,218,194,219,249,12,66,0,128,187,66,33,240,210,194,26,209,5,66,0,128,187,
+66,66,32,203,194,50,247,242,65,0,128,187,66,7,80,195,194,8,172,245,65,0,128,187,66,0,128,187,194,191,253,249,65,0,128,187,66,7,176,179,194,124,97,244,65,0,128,187,66,0,224,171,194,29,201,228,65,0,128,187,66,7,16,164,194,108,120,213,65,0,128,187,66,0,64,156,194,26,81,193,65,0,128,187,66,7,112,148,194,135,22,170,65,0,128,187,66,0,160,140,194,151,144,158,65,0,128,187,66,7,208,132,194,43,246,155,65,0,128,187,66,0,0,122,194,237,158,146,65,0,128,187,66,13,96,106,194,137,210,144,65,0,128,187,66,0,192,90,
+194,208,179,136,65,0,128,187,66,13,32,75,194,251,58,112,65,0,128,187,66,0,128,59,194,109,231,88,65,0,128,187,66,13,224,43,194,109,86,48,65,0,128,187,66,0,64,28,194,119,45,51,65,0,128,187,66,13,160,12,194,34,142,38,65,0,128,187,66,0,0,250,193,253,135,51,65,0,128,187,66,26,192,218,193,45,67,55,65,0,128,187,66,0,128,187,193,34,108,54,65,0,128,187,66,26,64,156,193,26,192,67,65,0,128,187,66,0,0,122,193,138,142,88,65,0,128,187,66,52,128,59,193,105,111,100,65,0,128,187,66,0,0,250,192,23,183,96,65,0,128,
+187,66,0,0,122,192,9,138,98,65,0,128,187,66,0,0,0,0,193,57,117,65,0,128,187,66,0,0,122,64,57,86,137,65,0,128,187,66,0,0,122,195,174,245,172,64,7,176,179,66,16,24,118,195,67,28,123,64,7,176,179,66,33,48,114,195,69,240,49,64,7,176,179,66,240,71,110,195,104,145,21,64,7,176,179,66,0,96,106,195,204,98,186,63,7,176,179,66,16,120,102,195,193,140,249,62,7,176,179,66,33,144,98,195,109,141,80,63,7,176,179,66,240,167,94,195,157,245,121,190,7,176,179,66,0,192,90,195,179,7,6,192,7,176,179,66,16,216,86,195,38,
+1,190,191,7,176,179,66,33,240,82,195,142,31,50,191,7,176,179,66,240,7,79,195,74,8,62,63,7,176,179,66,0,32,75,195,11,41,167,63,7,176,179,66,16,56,71,195,237,187,190,63,7,176,179,66,33,80,67,195,149,101,36,64,7,176,179,66,240,103,63,195,149,72,110,64,7,176,179,66,0,128,59,195,86,14,149,64,7,176,179,66,16,152,55,195,200,152,230,64,7,176,179,66,33,176,51,195,62,162,29,65,7,176,179,66,240,199,47,195,58,146,77,65,7,176,179,66,0,224,43,195,119,45,106,65,7,176,179,66,16,248,39,195,44,212,132,65,7,176,179,
+66,33,16,36,195,174,216,157,65,7,176,179,66,240,39,32,195,135,167,181,65,7,176,179,66,0,64,28,195,53,94,195,65,7,176,179,66,16,88,24,195,54,43,207,65,7,176,179,66,33,112,20,195,204,255,216,65,7,176,179,66,240,135,16,195,67,28,232,65,7,176,179,66,0,160,12,195,113,27,253,65,7,176,179,66,16,184,8,195,36,168,7,66,7,176,179,66,33,208,4,195,169,83,9,66,7,176,179,66,240,231,0,195,168,87,16,66,7,176,179,66,0,0,250,194,185,13,14,66,7,176,179,66,33,48,242,194,98,208,10,66,7,176,179,66,66,96,234,194,34,189,
+6,66,7,176,179,66,223,143,226,194,179,12,9,66,7,176,179,66,0,192,218,194,218,219,8,66,7,176,179,66,33,240,210,194,133,43,1,66,7,176,179,66,66,32,203,194,68,233,243,65,7,176,179,66,7,80,195,194,127,217,246,65,7,176,179,66,0,128,187,194,11,198,251,65,7,176,179,66,7,176,179,194,49,25,242,65,7,176,179,66,0,224,171,194,202,178,227,65,7,176,179,66,7,16,164,194,195,228,212,65,7,176,179,66,0,64,156,194,109,103,193,65,7,176,179,66,7,112,148,194,54,205,179,65,7,176,179,66,0,160,140,194,200,152,162,65,7,176,
+179,66,7,208,132,194,109,231,155,65,7,176,179,66,0,0,122,194,88,40,149,65,7,176,179,66,13,96,106,194,122,37,143,65,7,176,179,66,0,192,90,194,127,106,129,65,7,176,179,66,13,32,75,194,40,15,116,65,7,176,179,66,0,128,59,194,7,95,88,65,7,176,179,66,13,224,43,194,213,120,61,65,7,176,179,66,0,64,28,194,104,145,35,65,7,176,179,66,13,160,12,194,231,181,24,65,7,176,179,66,0,0,250,193,18,194,27,65,7,176,179,66,26,192,218,193,140,74,43,65,7,176,179,66,0,128,187,193,45,178,62,65,7,176,179,66,26,64,156,193,158,
+94,83,65,7,176,179,66,0,0,122,193,140,74,81,65,7,176,179,66,52,128,59,193,173,250,76,65,7,176,179,66,0,0,250,192,85,193,76,65,7,176,179,66,0,0,122,192,172,173,97,65,7,176,179,66,0,0,0,0,120,122,111,65,7,176,179,66,0,0,122,64,128,72,122,65,7,176,179,66,0,0,122,195,43,222,198,64,0,224,171,66,16,24,118,195,197,32,149,64,0,224,171,66,33,48,114,195,244,55,87,64,0,224,171,66,240,71,110,195,141,180,252,63,0,224,171,66,0,96,106,195,7,69,23,63,0,224,171,66,16,120,102,195,54,200,0,64,0,224,171,66,33,144,98,
+195,15,185,9,64,0,224,171,66,240,167,94,195,3,178,71,63,0,224,171,66,0,192,90,195,104,149,217,190,0,224,171,66,16,216,86,195,98,75,3,191,0,224,171,66,33,240,82,195,245,86,81,59,0,224,171,66,240,7,79,195,177,80,135,63,0,224,171,66,0,32,75,195,245,161,7,64,0,224,171,66,16,56,71,195,141,69,31,64,0,224,171,66,33,80,67,195,109,144,121,64,0,224,171,66,240,103,63,195,247,1,183,64,0,224,171,66,0,128,59,195,239,85,205,64,0,224,171,66,16,152,55,195,165,44,254,64,0,224,171,66,33,176,51,195,152,76,47,65,0,224,
+171,66,240,199,47,195,33,31,83,65,0,224,171,66,0,224,43,195,240,133,124,65,0,224,171,66,16,248,39,195,145,143,141,65,0,224,171,66,33,16,36,195,14,207,161,65,0,224,171,66,240,39,32,195,54,43,180,65,0,224,171,66,0,64,28,195,127,123,198,65,0,224,171,66,16,88,24,195,50,85,213,65,0,224,171,66,33,112,20,195,64,164,221,65,0,224,171,66,240,135,16,195,134,201,233,65,0,224,171,66,0,160,12,195,5,180,251,65,0,224,171,66,16,184,8,195,203,97,8,66,0,224,171,66,33,208,4,195,127,217,10,66,0,224,171,66,240,231,0,195,
+79,175,16,66,0,224,171,66,0,0,250,194,175,229,17,66,0,224,171,66,33,48,242,194,57,150,13,66,0,224,171,66,66,96,234,194,233,102,9,66,0,224,171,66,223,143,226,194,236,17,6,66,0,224,171,66,0,192,218,194,139,253,3,66,0,224,171,66,33,240,210,194,60,78,254,65,0,224,171,66,66,32,203,194,149,101,249,65,0,224,171,66,7,80,195,194,128,55,248,65,0,224,171,66,0,128,187,194,14,62,252,65,0,224,171,66,7,176,179,194,197,254,246,65,0,224,171,66,0,224,171,194,175,37,225,65,0,224,171,66,7,16,164,194,87,91,207,65,0,224,
+171,66,0,64,156,194,54,60,195,65,0,224,171,66,7,112,148,194,185,252,175,65,0,224,171,66,0,160,140,194,44,84,160,65,0,224,171,66,7,208,132,194,40,143,159,65,0,224,171,66,0,0,122,194,73,29,147,65,0,224,171,66,13,96,106,194,118,224,135,65,0,224,171,66,0,192,90,194,23,217,121,65,0,224,171,66,13,32,75,194,220,215,105,65,0,224,171,66,0,128,59,194,214,197,75,65,0,224,171,66,13,224,43,194,243,142,66,65,0,224,171,66,0,64,28,194,8,172,33,65,0,224,171,66,13,160,12,194,153,211,25,65,0,224,171,66,0,0,250,193,
+32,65,33,65,0,224,171,66,26,192,218,193,52,128,35,65,0,224,171,66,0,128,187,193,27,47,57,65,0,224,171,66,26,64,156,193,111,240,61,65,0,224,171,66,0,0,122,193,12,147,62,65,0,224,171,66,52,128,59,193,221,36,56,65,0,224,171,66,0,0,250,192,102,247,95,65,0,224,171,66,0,0,122,192,89,134,109,65,0,224,171,66,0,0,0,0,162,180,108,65,0,224,171,66,0,0,122,64,50,119,121,65,0,224,171,66,0,0,122,195,6,47,222,64,7,16,164,66,16,24,118,195,146,174,152,64,7,16,164,66,33,48,114,195,130,197,103,64,7,16,164,66,240,71,
+110,195,22,53,32,64,7,16,164,66,0,96,106,195,64,164,179,63,7,16,164,66,16,120,102,195,139,195,3,64,7,16,164,66,33,144,98,195,111,187,26,64,7,16,164,66,240,167,94,195,208,97,158,63,7,16,164,66,0,192,90,195,181,55,204,63,7,16,164,66,16,216,86,195,144,102,160,63,7,16,164,66,33,240,82,195,175,153,196,63,7,16,164,66,240,7,79,195,174,42,21,64,7,16,164,66,0,32,75,195,152,52,38,64,7,16,164,66,16,56,71,195,229,39,136,64,7,16,164,66,33,80,67,195,67,144,187,64,7,16,164,66,240,103,63,195,95,123,241,64,7,16,164,
+66,0,128,59,195,57,180,11,65,7,16,164,66,16,152,55,195,150,132,26,65,7,16,164,66,33,176,51,195,89,134,56,65,7,16,164,66,240,199,47,195,16,233,100,65,7,16,164,66,0,224,43,195,171,79,130,65,7,16,164,66,16,248,39,195,107,26,141,65,7,16,164,66,33,16,36,195,160,137,163,65,7,16,164,66,240,39,32,195,70,165,183,65,7,16,164,66,0,64,28,195,181,149,200,65,7,16,164,66,16,88,24,195,212,26,219,65,7,16,164,66,33,112,20,195,47,93,230,65,7,16,164,66,240,135,16,195,92,15,242,65,7,16,164,66,0,160,12,195,238,90,2,66,
+7,16,164,66,16,184,8,195,31,244,7,66,7,16,164,66,33,208,4,195,105,239,9,66,7,16,164,66,240,231,0,195,157,17,15,66,7,16,164,66,0,0,250,194,155,102,16,66,7,16,164,66,33,48,242,194,42,186,15,66,7,16,164,66,66,96,234,194,209,226,11,66,7,16,164,66,223,143,226,194,89,70,5,66,7,16,164,66,0,192,218,194,228,148,255,65,7,16,164,66,33,240,210,194,179,140,251,65,7,16,164,66,66,32,203,194,236,64,250,65,7,16,164,66,7,80,195,194,236,81,0,66,7,16,164,66,0,128,187,194,199,58,251,65,7,16,164,66,7,176,179,194,23,55,
+242,65,7,16,164,66,0,224,171,194,101,25,225,65,7,16,164,66,7,16,164,194,232,217,203,65,7,16,164,66,0,64,156,194,253,118,193,65,7,16,164,66,7,112,148,194,28,235,180,65,7,16,164,66,0,160,140,194,104,17,154,65,7,16,164,66,7,208,132,194,145,109,149,65,7,16,164,66,0,0,122,194,171,79,142,65,7,16,164,66,13,96,106,194,27,175,132,65,7,16,164,66,0,192,90,194,157,17,107,65,7,16,164,66,13,32,75,194,79,64,79,65,7,16,164,66,0,128,59,194,56,103,66,65,7,16,164,66,13,224,43,194,30,167,53,65,7,16,164,66,0,64,28,194,
+128,72,29,65,7,16,164,66,13,160,12,194,240,63,31,65,7,16,164,66,0,0,250,193,168,53,44,65,7,16,164,66,26,192,218,193,204,127,35,65,7,16,164,66,0,128,187,193,23,183,33,65,7,16,164,66,26,64,156,193,180,200,52,65,7,16,164,66,0,0,122,193,155,230,56,65,7,16,164,66,52,128,59,193,104,179,94,65,7,16,164,66,0,0,250,192,182,243,115,65,7,16,164,66,0,0,122,192,80,252,122,65,7,16,164,66,0,0,0,0,170,130,127,65,7,16,164,66,0,0,122,64,23,183,135,65,7,16,164,66,0,0,122,195,23,183,204,64,0,64,156,66,16,24,118,195,51,
+254,162,64,0,64,156,66,33,48,114,195,247,30,145,64,0,64,156,66,240,71,110,195,1,106,110,64,0,64,156,66,0,96,106,195,217,177,65,64,0,64,156,66,16,120,102,195,5,81,65,64,0,64,156,66,33,144,98,195,100,93,120,64,0,64,156,66,240,167,94,195,137,41,143,64,0,64,156,66,0,192,90,195,97,195,117,64,0,64,156,66,16,216,86,195,83,5,47,64,0,64,156,66,33,240,82,195,19,155,145,64,0,64,156,66,240,7,79,195,29,119,161,64,0,64,156,66,0,32,75,195,41,179,142,64,0,64,156,66,16,56,71,195,46,115,170,64,0,64,156,66,33,80,67,
+195,194,105,228,64,0,64,156,66,240,103,63,195,28,95,14,65,0,64,156,66,0,128,59,195,242,65,38,65,0,64,156,66,16,152,55,195,235,226,53,65,0,64,156,66,33,176,51,195,65,130,86,65,0,64,156,66,240,199,47,195,227,182,130,65,0,64,156,66,0,224,43,195,115,104,142,65,0,64,156,66,16,248,39,195,47,93,152,65,0,64,156,66,33,16,36,195,168,87,171,65,0,64,156,66,240,39,32,195,164,112,188,65,0,64,156,66,0,64,28,195,147,41,203,65,0,64,156,66,16,88,24,195,193,185,215,65,0,64,156,66,33,112,20,195,34,142,230,65,0,64,156,
+66,240,135,16,195,227,165,251,65,0,64,156,66,0,160,12,195,76,102,5,66,0,64,156,66,16,184,8,195,28,235,8,66,0,64,156,66,33,208,4,195,183,98,10,66,0,64,156,66,240,231,0,195,168,245,14,66,0,64,156,66,0,0,250,194,149,212,13,66,0,64,156,66,33,48,242,194,196,49,15,66,0,64,156,66,66,96,234,194,61,219,9,66,0,64,156,66,223,143,226,194,51,179,7,66,0,64,156,66,0,192,218,194,199,58,0,66,0,64,156,66,33,240,210,194,247,100,253,65,0,64,156,66,66,32,203,194,51,51,253,65,0,64,156,66,7,80,195,194,157,145,255,65,0,
+64,156,66,0,128,187,194,14,207,249,65,0,64,156,66,7,176,179,194,196,194,243,65,0,64,156,66,0,224,171,194,34,14,222,65,0,64,156,66,7,16,164,194,116,164,203,65,0,64,156,66,0,64,156,194,52,34,187,65,0,64,156,66,7,112,148,194,34,142,173,65,0,64,156,66,0,160,140,194,84,116,149,65,0,64,156,66,7,208,132,194,184,64,139,65,0,64,156,66,0,0,122,194,185,13,137,65,0,64,156,66,13,96,106,194,12,19,132,65,0,64,156,66,0,192,90,194,29,56,111,65,0,64,156,66,13,32,75,194,227,165,83,65,0,64,156,66,0,128,59,194,186,107,
+55,65,0,64,156,66,13,224,43,194,5,52,38,65,0,64,156,66,0,64,28,194,220,104,27,65,0,64,156,66,13,160,12,194,97,195,32,65,0,64,156,66,0,0,250,193,51,51,37,65,0,64,156,66,26,192,218,193,111,18,37,65,0,64,156,66,0,128,187,193,136,133,46,65,0,64,156,66,26,64,156,193,40,126,60,65,0,64,156,66,0,0,122,193,74,12,99,65,0,64,156,66,52,128,59,193,240,167,121,65,0,64,156,66,0,0,250,192,128,200,128,65,0,64,156,66,0,0,122,192,215,35,133,65,0,64,156,66,0,0,0,0,5,69,138,65,0,64,156,66,0,0,122,64,95,152,150,65,0,64,
+156,66,0,0,122,195,66,38,193,64,7,112,148,66,16,24,118,195,73,162,165,64,7,112,148,66,33,48,114,195,200,7,109,64,7,112,148,66,240,71,110,195,246,40,108,64,7,112,148,66,0,96,106,195,65,101,147,64,7,112,148,66,16,120,102,195,182,219,144,64,7,112,148,66,33,144,98,195,10,46,179,64,7,112,148,66,240,167,94,195,145,68,200,64,7,112,148,66,0,192,90,195,121,175,163,64,7,112,148,66,16,216,86,195,119,132,149,64,7,112,148,66,33,240,82,195,24,96,184,64,7,112,148,66,240,7,79,195,93,191,217,64,7,112,148,66,0,32,
+75,195,51,109,222,64,7,112,148,66,16,56,71,195,91,124,235,64,7,112,148,66,33,80,67,195,90,59,10,65,7,112,148,66,240,103,63,195,98,161,38,65,7,112,148,66,0,128,59,195,207,247,60,65,7,112,148,66,16,152,55,195,50,85,87,65,7,112,148,66,33,176,51,195,98,16,121,65,7,112,148,66,240,199,47,195,237,13,146,65,7,112,148,66,0,224,43,195,183,98,153,65,7,112,148,66,16,248,39,195,120,122,170,65,7,112,148,66,33,16,36,195,83,22,189,65,7,112,148,66,240,39,32,195,240,133,202,65,7,112,148,66,0,64,28,195,253,7,221,65,
+7,112,148,66,16,88,24,195,147,41,231,65,7,112,148,66,33,112,20,195,18,20,244,65,7,112,148,66,240,135,16,195,169,147,1,66,7,112,148,66,0,160,12,195,123,84,5,66,7,112,148,66,16,184,8,195,31,52,7,66,7,112,148,66,33,208,4,195,58,82,12,66,7,112,148,66,240,231,0,195,176,242,10,66,7,112,148,66,0,0,250,194,96,118,9,66,7,112,148,66,33,48,242,194,194,215,8,66,7,112,148,66,66,96,234,194,115,168,4,66,7,112,148,66,223,143,226,194,250,62,0,66,7,112,148,66,0,192,218,194,175,84,0,66,7,112,148,66,33,240,210,194,251,
+220,1,66,7,112,148,66,66,32,203,194,80,13,253,65,7,112,148,66,7,80,195,194,39,194,247,65,7,112,148,66,0,128,187,194,212,43,245,65,7,112,148,66,7,176,179,194,76,183,239,65,7,112,148,66,0,224,171,194,176,131,219,65,7,112,148,66,7,16,164,194,224,62,202,65,7,112,148,66,0,64,156,194,92,143,188,65,7,112,148,66,7,112,148,194,88,57,165,65,7,112,148,66,0,160,140,194,178,29,145,65,7,112,148,66,7,208,132,194,156,68,141,65,7,112,148,66,0,0,122,194,8,61,138,65,7,112,148,66,13,96,106,194,50,213,132,65,7,112,148,
+66,0,192,90,194,145,15,107,65,7,112,148,66,13,32,75,194,254,67,82,65,7,112,148,66,0,128,59,194,151,255,46,65,7,112,148,66,13,224,43,194,78,81,22,65,7,112,148,66,0,64,28,194,81,131,19,65,7,112,148,66,13,160,12,194,225,250,27,65,7,112,148,66,0,0,250,193,140,74,38,65,7,112,148,66,26,192,218,193,41,203,44,65,7,112,148,66,0,128,187,193,93,220,56,65,7,112,148,66,26,64,156,193,54,171,88,65,7,112,148,66,0,0,122,193,58,35,122,65,7,112,148,66,52,128,59,193,169,19,131,65,7,112,148,66,0,0,250,192,109,231,141,
+65,7,112,148,66,0,0,122,192,10,215,143,65,7,112,148,66,0,0,0,0,208,85,153,65,7,112,148,66,0,0,122,64,148,118,165,65,7,112,148,66,0,0,122,195,155,114,174,64,0,160,140,66,16,24,118,195,45,207,154,64,0,160,140,66,33,48,114,195,163,117,102,64,0,160,140,66,240,71,110,195,174,240,80,64,0,160,140,66,0,96,106,195,102,247,129,64,0,160,140,66,16,120,102,195,206,25,170,64,0,160,140,66,33,144,98,195,19,15,213,64,0,160,140,66,240,167,94,195,121,146,214,64,0,160,140,66,0,192,90,195,178,215,221,64,0,160,140,66,
+16,216,86,195,45,38,219,64,0,160,140,66,33,240,82,195,28,235,222,64,0,160,140,66,240,7,79,195,83,174,247,64,0,160,140,66,0,32,75,195,246,255,10,65,0,160,140,66,16,56,71,195,250,254,16,65,0,160,140,66,33,80,67,195,233,72,33,65,0,160,140,66,240,103,63,195,100,59,67,65,0,160,140,66,0,128,59,195,12,2,97,65,0,160,140,66,16,152,55,195,70,182,123,65,0,160,140,66,33,176,51,195,119,45,147,65,0,160,140,66,240,199,47,195,15,11,156,65,0,160,140,66,0,224,43,195,64,36,167,65,0,160,140,66,16,248,39,195,12,19,187,
+65,0,160,140,66,33,16,36,195,23,183,204,65,0,160,140,66,240,39,32,195,161,103,216,65,0,160,140,66,0,64,28,195,184,47,229,65,0,160,140,66,16,88,24,195,85,48,251,65,0,160,140,66,33,112,20,195,29,26,2,66,0,160,140,66,240,135,16,195,66,32,4,66,0,160,140,66,0,160,12,195,237,94,4,66,0,160,140,66,16,184,8,195,186,9,7,66,0,160,140,66,33,208,4,195,177,191,8,66,0,160,140,66,240,231,0,195,56,248,5,66,0,160,140,66,0,0,250,194,16,186,8,66,0,160,140,66,33,48,242,194,87,219,5,66,0,160,140,66,66,96,234,194,219,74,
+1,66,0,160,140,66,223,143,226,194,119,126,0,66,0,160,140,66,0,192,218,194,45,178,2,66,0,160,140,66,33,240,210,194,240,5,3,66,0,160,140,66,66,32,203,194,90,245,1,66,0,160,140,66,7,80,195,194,35,91,246,65,0,160,140,66,0,128,187,194,19,242,240,65,0,160,140,66,7,176,179,194,64,147,229,65,0,160,140,66,0,224,171,194,23,217,212,65,0,160,140,66,7,16,164,194,65,113,198,65,0,160,140,66,0,64,156,194,19,225,186,65,0,160,140,66,7,112,148,194,88,74,164,65,0,160,140,66,0,160,140,194,82,73,146,65,0,160,140,66,7,
+208,132,194,14,45,141,65,0,160,140,66,0,0,122,194,65,2,139,65,0,160,140,66,13,96,106,194,204,127,130,65,0,160,140,66,0,192,90,194,137,65,96,65,0,160,140,66,13,32,75,194,113,27,58,65,0,160,140,66,0,128,59,194,92,3,27,65,0,160,140,66,13,224,43,194,211,48,10,65,0,160,140,66,0,64,28,194,204,98,8,65,0,160,140,66,13,160,12,194,172,173,37,65,0,160,140,66,0,0,250,193,96,229,49,65,0,160,140,66,26,192,218,193,36,40,77,65,0,160,140,66,0,128,187,193,169,19,100,65,0,160,140,66,26,64,156,193,111,129,118,65,0,160,
+140,66,0,0,122,193,0,0,135,65,0,160,140,66,52,128,59,193],"i8",I,v.k);
+K([248,194,141,65,0,160,140,66,0,0,250,192,112,95,149,65,0,160,140,66,0,0,122,192,143,194,157,65,0,160,140,66,0,0,0,0,3,120,170,65,0,160,140,66,0,0,122,64,129,149,183,65,0,160,140,66,0,0,122,195,109,255,144,64,7,208,132,66,16,24,118,195,98,21,111,64,7,208,132,66,33,48,114,195,115,162,115,64,7,208,132,66,240,71,110,195,86,154,141,64,7,208,132,66,0,96,106,195,176,3,161,64,7,208,132,66,16,120,102,195,156,80,212,64,7,208,132,66,33,144,98,195,223,253,244,64,7,208,132,66,240,167,94,195,75,217,8,65,7,208,
+132,66,0,192,90,195,162,127,11,65,7,208,132,66,16,216,86,195,11,12,246,64,7,208,132,66,33,240,82,195,106,118,9,65,7,208,132,66,240,7,79,195,76,207,27,65,7,208,132,66,0,32,75,195,36,40,34,65,7,208,132,66,16,56,71,195,82,184,33,65,7,208,132,66,33,80,67,195,251,58,50,65,7,208,132,66,240,103,63,195,143,83,89,65,7,208,132,66,0,128,59,195,238,235,119,65,7,208,132,66,16,152,55,195,142,117,140,65,7,208,132,66,33,176,51,195,204,110,159,65,7,208,132,66,240,199,47,195,31,116,168,65,7,208,132,66,0,224,43,195,
+157,0,180,65,7,208,132,66,16,248,39,195,94,203,204,65,7,208,132,66,33,16,36,195,222,19,216,65,7,208,132,66,240,39,32,195,50,85,223,65,7,208,132,66,0,64,28,195,242,48,239,65,7,208,132,66,16,88,24,195,201,182,0,66,7,208,132,66,33,112,20,195,129,68,8,66,7,208,132,66,240,135,16,195,54,13,10,66,7,208,132,66,0,160,12,195,207,183,8,66,7,208,132,66,16,184,8,195,12,83,5,66,7,208,132,66,33,208,4,195,66,224,3,66,7,208,132,66,240,231,0,195,114,202,3,66,7,208,132,66,0,0,250,194,12,19,6,66,7,208,132,66,33,48,242,
+194,209,226,3,66,7,208,132,66,66,96,234,194,142,245,1,66,7,208,132,66,223,143,226,194,220,87,4,66,7,208,132,66,0,192,218,194,180,153,2,66,7,208,132,66,33,240,210,194,84,99,3,66,7,208,132,66,66,32,203,194,199,58,3,66,7,208,132,66,7,80,195,194,95,135,252,65,7,208,132,66,0,128,187,194,121,216,235,65,7,208,132,66,7,176,179,194,100,93,229,65,7,208,132,66,0,224,171,194,150,67,211,65,7,208,132,66,7,16,164,194,242,48,195,65,7,208,132,66,0,64,156,194,85,65,179,65,7,208,132,66,7,112,148,194,237,158,161,65,
+7,208,132,66,0,160,140,194,16,105,148,65,7,208,132,66,7,208,132,194,59,112,136,65,7,208,132,66,0,0,122,194,151,127,136,65,7,208,132,66,13,96,106,194,186,218,127,65,7,208,132,66,0,192,90,194,76,55,86,65,7,208,132,66,13,32,75,194,232,217,61,65,7,208,132,66,0,128,59,194,160,108,16,65,7,208,132,66,13,224,43,194,237,216,15,65,7,208,132,66,0,64,28,194,106,222,32,65,7,208,132,66,13,160,12,194,38,83,59,65,7,208,132,66,0,0,250,193,250,237,71,65,7,208,132,66,26,192,218,193,133,235,96,65,7,208,132,66,0,128,
+187,193,105,111,115,65,7,208,132,66,26,64,156,193,212,171,133,65,7,208,132,66,0,0,122,193,62,104,142,65,7,208,132,66,52,128,59,193,157,17,152,65,7,208,132,66,0,0,250,192,38,228,167,65,7,208,132,66,0,0,122,192,237,141,181,65,7,208,132,66,0,0,0,0,122,182,191,65,7,208,132,66,0,0,122,64,130,115,204,65,7,208,132,66,0,0,122,195,91,177,149,64,0,0,122,66,16,24,118,195,238,90,141,64,0,0,122,66,33,48,114,195,32,239,123,64,0,0,122,66,240,71,110,195,22,53,144,64,0,0,122,66,0,96,106,195,49,177,176,64,0,0,122,
+66,16,120,102,195,143,83,227,64,0,0,122,66,33,144,98,195,32,164,1,65,0,0,122,66,240,167,94,195,76,224,5,65,0,0,122,66,0,192,90,195,212,84,9,65,0,0,122,66,16,216,86,195,230,22,9,65,0,0,122,66,33,240,82,195,89,64,31,65,0,0,122,66,240,7,79,195,174,216,39,65,0,0,122,66,0,32,75,195,244,253,44,65,0,0,122,66,16,56,71,195,216,129,57,65,0,0,122,66,33,80,67,195,246,151,80,65,0,0,122,66,240,103,63,195,140,74,106,65,0,0,122,66,0,128,59,195,102,230,133,65,0,0,122,66,16,152,55,195,159,77,147,65,0,0,122,66,33,176,
+51,195,144,160,167,65,0,0,122,66,240,199,47,195,198,237,184,65,0,0,122,66,0,224,43,195,174,54,200,65,0,0,122,66,16,248,39,195,78,226,213,65,0,0,122,66,33,16,36,195,30,150,221,65,0,0,122,66,240,39,32,195,136,227,232,65,0,0,122,66,0,64,28,195,37,134,249,65,0,0,122,66,16,88,24,195,10,232,3,66,0,0,122,66,33,112,20,195,150,225,5,66,0,0,122,66,240,135,16,195,35,219,6,66,0,0,122,66,0,160,12,195,147,152,6,66,0,0,122,66,16,184,8,195,49,25,4,66,0,0,122,66,33,208,4,195,84,244,2,66,0,0,122,66,240,231,0,195,119,
+109,2,66,0,0,122,66,0,0,250,194,177,161,2,66,0,0,122,66,33,48,242,194,150,195,252,65,0,0,122,66,66,96,234,194,7,223,254,65,0,0,122,66,223,143,226,194,13,224,2,66,0,0,122,66,0,192,218,194,86,142,3,66,0,0,122,66,33,240,210,194,67,237,2,66,0,0,122,66,66,32,203,194,13,177,1,66,0,0,122,66,7,80,195,194,196,177,249,65,0,0,122,66,0,128,187,194,142,117,245,65,0,0,122,66,7,176,179,194,8,172,228,65,0,0,122,66,0,224,171,194,71,242,208,65,0,0,122,66,7,16,164,194,182,132,190,65,0,0,122,66,0,64,156,194,51,68,176,
+65,0,0,122,66,7,112,148,194,139,108,161,65,0,0,122,66,0,160,140,194,203,161,149,65,0,0,122,66,7,208,132,194,198,109,134,65,0,0,122,66,0,0,122,194,16,122,123,65,0,0,122,66,13,96,106,194,186,218,94,65,0,0,122,66,0,192,90,194,107,43,81,65,0,0,122,66,13,32,75,194,192,91,62,65,0,0,122,66,0,128,59,194,147,157,30,65,0,0,122,66,13,224,43,194,106,77,34,65,0,0,122,66,0,64,28,194,47,221,52,65,0,0,122,66,13,160,12,194,119,45,72,65,0,0,122,66,0,0,250,193,193,202,97,65,0,0,122,66,26,192,218,193,236,81,117,65,0,
+0,122,66,0,128,187,193,161,248,132,65,0,0,122,66,26,64,156,193,116,198,142,65,0,0,122,66,0,0,122,193,189,99,154,65,0,0,122,66,52,128,59,193,73,157,167,65,0,0,122,66,0,0,250,192,99,110,187,65,0,0,122,66,0,0,122,192,210,128,199,65,0,0,122,66,0,0,0,0,125,63,209,65,0,0,122,66,0,0,122,64,15,139,217,65,0,0,122,66,0,0,122,195,0,169,135,64,13,96,106,66,16,24,118,195,63,53,154,64,13,96,106,66,33,48,114,195,115,46,148,64,13,96,106,66,240,71,110,195,144,73,169,64,13,96,106,66,0,96,106,195,248,107,207,64,13,
+96,106,66,16,120,102,195,83,121,219,64,13,96,106,66,33,144,98,195,200,152,7,65,13,96,106,66,240,167,94,195,0,58,12,65,13,96,106,66,0,192,90,195,115,232,19,65,13,96,106,66,16,216,86,195,28,211,26,65,13,96,106,66,33,240,82,195,155,230,44,65,13,96,106,66,240,7,79,195,224,45,69,65,13,96,106,66,0,32,75,195,186,218,75,65,13,96,106,66,16,56,71,195,163,35,76,65,13,96,106,66,33,80,67,195,69,216,101,65,13,96,106,66,240,103,63,195,113,44,129,65,13,96,106,66,0,128,59,195,38,100,136,65,13,96,106,66,16,152,55,
+195,61,172,153,65,13,96,106,66,33,176,51,195,233,72,174,65,13,96,106,66,240,199,47,195,97,67,198,65,13,96,106,66,0,224,43,195,179,234,209,65,13,96,106,66,16,248,39,195,110,52,218,65,13,96,106,66,33,16,36,195,208,85,226,65,13,96,106,66,240,39,32,195,137,193,244,65,13,96,106,66,0,64,28,195,251,11,1,66,13,96,106,66,16,88,24,195,158,158,3,66,13,96,106,66,33,112,20,195,104,51,3,66,13,96,106,66,240,135,16,195,129,230,1,66,13,96,106,66,0,160,12,195,158,158,1,66,13,96,106,66,16,184,8,195,157,64,6,66,13,96,
+106,66,33,208,4,195,253,135,5,66,13,96,106,66,240,231,0,195,244,108,4,66,13,96,106,66,0,0,250,194,187,56,1,66,13,96,106,66,33,48,242,194,208,4,2,66,13,96,106,66,66,96,234,194,100,76,1,66,13,96,106,66,223,143,226,194,216,193,1,66,13,96,106,66,0,192,218,194,70,54,2,66,13,96,106,66,33,240,210,194,96,182,3,66,13,96,106,66,66,32,203,194,202,212,254,65,13,96,106,66,7,80,195,194,4,103,247,65,13,96,106,66,0,128,187,194,96,118,243,65,13,96,106,66,7,176,179,194,209,162,226,65,13,96,106,66,0,224,171,194,125,
+80,204,65,13,96,106,66,7,16,164,194,132,141,184,65,13,96,106,66,0,64,156,194,61,10,172,65,13,96,106,66,7,112,148,194,49,153,168,65,13,96,106,66,0,160,140,194,229,242,152,65,13,96,106,66,7,208,132,194,79,64,134,65,13,96,106,66,0,0,122,194,133,124,115,65,13,96,106,66,13,96,106,194,203,16,98,65,13,96,106,66,0,192,90,194,248,194,83,65,13,96,106,66,13,32,75,194,4,86,62,65,13,96,106,66,0,128,59,194,37,117,49,65,13,96,106,66,13,224,43,194,219,249,75,65,13,96,106,66,0,64,28,194,162,69,91,65,13,96,106,66,
+13,160,12,194,7,206,105,65,13,96,106,66,0,0,250,193,106,188,120,65,13,96,106,66,26,192,218,193,45,67,134,65,13,96,106,66,0,128,187,193,249,15,150,65,13,96,106,66,26,64,156,193,93,92,158,65,13,96,106,66,0,0,122,193,13,224,174,65,13,96,106,66,52,128,59,193,177,208,181,65,13,96,106,66,0,0,250,192,47,221,199,65,13,96,106,66,0,0,122,192,164,112,211,65,13,96,106,66,0,0,0,0,163,146,219,65,13,96,106,66,0,0,122,64,199,203,226,65,13,96,106,66,0,0,122,195,162,40,104,64,0,192,90,66,16,24,118,195,160,84,117,64,
+0,192,90,66,33,48,114,195,72,22,142,64,0,192,90,66,240,71,110,195,242,205,168,64,0,192,90,66,0,96,106,195,18,20,238,64,0,192,90,66,16,120,102,195,179,239,242,64,0,192,90,66,33,144,98,195,58,163,4,65,0,192,90,66,240,167,94,195,14,243,25,65,0,192,90,66,0,192,90,195,175,148,42,65,0,192,90,66,16,216,86,195,96,118,49,65,0,192,90,66,33,240,82,195,99,127,67,65,0,192,90,66,240,7,79,195,14,45,83,65,0,192,90,66,0,32,75,195,161,248,95,65,0,192,90,66,16,56,71,195,101,25,101,65,0,192,90,66,33,80,67,195,203,16,
+110,65,0,192,90,66,240,103,63,195,199,169,132,65,0,192,90,66,0,128,59,195,23,217,145,65,0,192,90,66,16,152,55,195,46,127,160,65,0,192,90,66,33,176,51,195,30,39,183,65,0,192,90,66,240,199,47,195,61,172,200,65,0,192,90,66,0,224,43,195,37,134,212,65,0,192,90,66,16,248,39,195,103,213,218,65,0,192,90,66,33,16,36,195,48,204,233,65,0,192,90,66,240,39,32,195,174,71,247,65,0,192,90,66,0,64,28,195,180,89,5,66,0,192,90,66,16,88,24,195,240,133,3,66,0,192,90,66,33,112,20,195,46,80,2,66,0,192,90,66,240,135,16,
+195,136,116,2,66,0,192,90,66,0,160,12,195,206,153,3,66,0,192,90,66,16,184,8,195,192,236,8,66,0,192,90,66,33,208,4,195,129,85,7,66,0,192,90,66,240,231,0,195,2,107,3,66,0,192,90,66,0,0,250,194,87,172,6,66,0,192,90,66,33,48,242,194,48,251,3,66,0,192,90,66,66,96,234,194,213,9,2,66,0,192,90,66,223,143,226,194,9,185,1,66,0,192,90,66,0,192,218,194,58,146,254,65,0,192,90,66,33,240,210,194,217,206,254,65,0,192,90,66,66,32,203,194,61,27,253,65,0,192,90,66,7,80,195,194,185,124,243,65,0,192,90,66,0,128,187,194,
+222,113,231,65,0,192,90,66,7,176,179,194,150,195,212,65,0,192,90,66,0,224,171,194,134,201,197,65,0,192,90,66,7,16,164,194,219,121,184,65,0,192,90,66,0,64,156,194,174,216,170,65,0,192,90,66,7,112,148,194,200,7,163,65,0,192,90,66,0,160,140,194,145,143,154,65,0,192,90,66,7,208,132,194,119,173,135,65,0,192,90,66,0,0,122,194,169,164,106,65,0,192,90,66,13,96,106,194,161,214,103,65,0,192,90,66,0,192,90,194,191,125,85,65,0,192,90,66,13,32,75,194,242,65,69,65,0,192,90,66,0,128,59,194,149,101,74,65,0,192,90,
+66,13,224,43,194,217,61,100,65,0,192,90,66,0,64,28,194,234,4,123,65,0,192,90,66,13,160,12,194,98,161,129,65,0,192,90,66,0,0,250,193,158,222,137,65,0,192,90,66,26,192,218,193,55,26,150,65,0,192,90,66,0,128,187,193,68,250,161,65,0,192,90,66,26,64,156,193,124,114,173,65,0,192,90,66,0,0,122,193,8,172,192,65,0,192,90,66,52,128,59,193,254,67,201,65,0,192,90,66,0,0,250,192,154,153,213,65,0,192,90,66,0,0,122,192,57,86,220,65,0,192,90,66,0,0,0,0,95,152,226,65,0,192,90,66,0,0,122,64,70,165,233,65,0,192,90,
+66,0,0,122,195,206,199,111,64,13,32,75,66,16,24,118,195,241,17,121,64,13,32,75,66,33,48,114,195,53,239,131,64,13,32,75,66,240,71,110,195,173,105,165,64,13,32,75,66,0,96,106,195,224,185,201,64,13,32,75,66,16,120,102,195,49,8,231,64,13,32,75,66,33,144,98,195,194,204,9,65,13,32,75,66,240,167,94,195,111,18,34,65,13,32,75,66,0,192,90,195,52,128,68,65,13,32,75,66,16,216,86,195,94,75,69,65,13,32,75,66,33,240,82,195,79,64,86,65,13,32,75,66,240,7,79,195,222,113,98,65,13,32,75,66,0,32,75,195,206,136,96,65,
+13,32,75,66,16,56,71,195,37,6,109,65,13,32,75,66,33,80,67,195,31,133,133,65,13,32,75,66,240,103,63,195,172,28,141,65,13,32,75,66,0,128,59,195,135,22,154,65,13,32,75,66,16,152,55,195,231,251,165,65,13,32,75,66,33,176,51,195,165,172,186,65,13,32,75,66,240,199,47,195,158,222,203,65,13,32,75,66,0,224,43,195,202,195,214,65,13,32,75,66,16,248,39,195,251,58,222,65,13,32,75,66,33,16,36,195,163,35,240,65,13,32,75,66,240,39,32,195,27,141,248,65,13,32,75,66,0,64,28,195,245,91,2,66,13,32,75,66,16,88,24,195,208,
+68,2,66,13,32,75,66,33,112,20,195,146,220,1,66,13,32,75,66,240,135,16,195,217,206,6,66,13,32,75,66,0,160,12,195,134,9,11,66,13,32,75,66,16,184,8,195,104,162,7,66,13,32,75,66,33,208,4,195,88,185,6,66,13,32,75,66,240,231,0,195,48,140,6,66,13,32,75,66,0,0,250,194,254,37,8,66,13,32,75,66,33,48,242,194,13,49,8,66,13,32,75,66,66,96,234,194,80,13,10,66,13,32,75,66,223,143,226,194,44,212,6,66,13,32,75,66,0,192,218,194,238,26,1,66,13,32,75,66,33,240,210,194,66,62,0,66,13,32,75,66,66,32,203,194,153,170,248,
+65,13,32,75,66,7,80,195,194,155,85,239,65,13,32,75,66,0,128,187,194,77,21,230,65,13,32,75,66,7,176,179,194,129,166,215,65,13,32,75,66,0,224,171,194,143,83,198,65,13,32,75,66,7,16,164,194,10,87,190,65,13,32,75,66,0,64,156,194,45,161,173,65,13,32,75,66,7,112,148,194,20,63,156,65,13,32,75,66,0,160,140,194,144,177,154,65,13,32,75,66,7,208,132,194,29,201,142,65,13,32,75,66,0,0,122,194,80,252,99,65,13,32,75,66,13,96,106,194,198,220,107,65,13,32,75,66,0,192,90,194,203,161,96,65,13,32,75,66,13,32,75,194,
+175,148,79,65,13,32,75,66,0,128,59,194,82,39,95,65,13,32,75,66,13,224,43,194,118,79,125,65,13,32,75,66,0,64,28,194,184,64,133,65,13,32,75,66,13,160,12,194,105,0,137,65,13,32,75,66,0,0,250,193,49,153,149,65,13,32,75,66,26,192,218,193,25,4,167,65,13,32,75,66,0,128,187,193,255,50,176,65,13,32,75,66,26,64,156,193,197,126,183,65,13,32,75,66,0,0,122,193,238,124,205,65,13,32,75,66,52,128,59,193,10,104,209,65,13,32,75,66,0,0,250,192,249,15,227,65,13,32,75,66,0,0,122,192,223,96,230,65,13,32,75,66,0,0,0,0,
+32,210,237,65,13,32,75,66,0,0,122,64,222,113,243,65,13,32,75,66,0,0,122,195,240,80,108,64,0,128,59,66,16,24,118,195,112,177,120,64,0,128,59,66,33,48,114,195,255,4,127,64,0,128,59,66,240,71,110,195,42,145,160,64,0,128,59,66,0,96,106,195,245,156,231,64,0,128,59,66,16,120,102,195,88,255,248,64,0,128,59,66,33,144,98,195,2,217,8,65,0,128,59,66,240,167,94,195,94,75,36,65,0,128,59,66,0,192,90,195,52,17,51,65,0,128,59,66,16,216,86,195,117,147,70,65,0,128,59,66,33,240,82,195,219,138,91,65,0,128,59,66,240,
+7,79,195,142,117,103,65,0,128,59,66,0,32,75,195,117,147,120,65,0,128,59,66,16,56,71,195,240,167,121,65,0,128,59,66,33,80,67,195,202,195,134,65,0,128,59,66,240,103,63,195,140,185,147,65,0,128,59,66,0,128,59,195,236,81,155,65,0,128,59,66,16,152,55,195,159,205,166,65,0,128,59,66,33,176,51,195,170,130,191,65,0,128,59,66,240,199,47,195,100,93,210,65,0,128,59,66,0,224,43,195,229,97,221,65,0,128,59,66,16,248,39,195,99,255,225,65,0,128,59,66,33,16,36,195,208,51,237,65,0,128,59,66,240,39,32,195,167,121,255,
+65,0,128,59,66,0,64,28,195,75,170,5,66,0,128,59,66,16,88,24,195,70,182,5,66,0,128,59,66,33,112,20,195,71,67,5,66,0,128,59,66,240,135,16,195,32,129,6,66,0,128,59,66,0,160,12,195,85,193,12,66,0,128,59,66,16,184,8,195,164,95,11,66,0,128,59,66,33,208,4,195,211,124,8,66,0,128,59,66,240,231,0,195,91,211,9,66,0,128,59,66,0,0,250,194,64,228,11,66,0,128,59,66,33,48,242,194,63,134,11,66,0,128,59,66,66,96,234,194,113,189,12,66,0,128,59,66,223,143,226,194,80,141,8,66,0,128,59,66,0,192,218,194,175,212,2,66,0,
+128,59,66,33,240,210,194,58,227,0,66,0,128,59,66,66,32,203,194,225,250,249,65,0,128,59,66,7,80,195,194,168,181,239,65,0,128,59,66,0,128,187,194,161,248,224,65,0,128,59,66,7,176,179,194,17,182,216,65,0,128,59,66,0,224,171,194,106,188,200,65,0,128,59,66,7,16,164,194,184,47,187,65,0,128,59,66,0,64,156,194,51,51,178,65,0,128,59,66,7,112,148,194,223,224,158,65,0,128,59,66,0,160,140,194,160,9,151,65,0,128,59,66,7,208,132,194,114,249,137,65,0,128,59,66,0,0,122,194,219,249,119,65,0,128,59,66,13,96,106,194,
+58,146,104,65,0,128,59,66,0,192,90,194,116,36,107,65,0,128,59,66,13,32,75,194,246,151,85,65,0,128,59,66,0,128,59,194,153,42,122,65,0,128,59,66,13,224,43,194,217,189,133,65,0,128,59,66,0,64,28,194,33,159,139,65,0,128,59,66,13,160,12,194,196,66,146,65,0,128,59,66,0,0,250,193,104,162,162,65,0,128,59,66,26,192,218,193,213,120,181,65,0,128,59,66,0,128,187,193,211,77,188,65,0,128,59,66,26,64,156,193,210,111,194,65,0,128,59,66,0,0,122,193,241,227,208,65,0,128,59,66,52,128,59,193,161,231,219,65,0,128,59,
+66,0,0,250,192,140,219,234,65,0,128,59,66,0,0,122,192,186,73,238,65,0,128,59,66,0,0,0,0,220,232,242,65,0,128,59,66,0,0,122,64,129,4,247,65,0,128,59,66,0,0,122,195,41,150,130,64,13,224,43,66,16,24,118,195,4,33,131,64,13,224,43,66,33,48,114,195,119,21,120,64,13,224,43,66,240,71,110,195,146,232,163,64,13,224,43,66,0,96,106,195,191,183,214,64,13,224,43,66,16,120,102,195,7,66,248,64,13,224,43,66,33,144,98,195,43,48,2,65,13,224,43,66,240,167,94,195,201,159,13,65,13,224,43,66,0,192,90,195,59,1,47,65,13,
+224,43,66,16,216,86,195,3,120,70,65,13,224,43,66,33,240,82,195,232,106,87,65,13,224,43,66,240,7,79,195,97,195,107,65,13,224,43,66,0,32,75,195,20,174,121,65,13,224,43,66,16,56,71,195,197,254,123,65,13,224,43,66,33,80,67,195,213,120,137,65,13,224,43,66,240,103,63,195,118,241,154,65,13,224,43,66,0,128,59,195,93,92,169,65,13,224,43,66,16,152,55,195,97,195,181,65,13,224,43,66,33,176,51,195,157,128,198,65,13,224,43,66,240,199,47,195,101,42,214,65,13,224,43,66,0,224,43,195,77,4,222,65,13,224,43,66,16,248,
+39,195,130,243,230,65,13,224,43,66,33,16,36,195,201,246,248,65,13,224,43,66,240,39,32,195,240,39,5,66,13,224,43,66,0,64,28,195,66,32,9,66,13,224,43,66,16,88,24,195,54,235,7,66,13,224,43,66,33,112,20,195,196,2,9,66,13,224,43,66,240,135,16,195,32,193,8,66,13,224,43,66,0,160,12,195,213,120,11,66,13,224,43,66,16,184,8,195,170,160,14,66,13,224,43,66,33,208,4,195,230,255,13,66,13,224,43,66,240,231,0,195,204,191,13,66,13,224,43,66,0,0,250,194,244,125,17,66,13,224,43,66,33,48,242,194,187,184,13,66,13,224,
+43,66,66,96,234,194,206,106,9,66,13,224,43,66,223,143,226,194,170,66,12,66,13,224,43,66,0,192,218,194,57,5,6,66,13,224,43,66,33,240,210,194,78,226,1,66,13,224,43,66,66,32,203,194,17,54,250,65,13,224,43,66,7,80,195,194,61,27,238,65,13,224,43,66,0,128,187,194,29,73,223,65,13,224,43,66,7,176,179,194,233,55,212,65,13,224,43,66,0,224,171,194,136,244,201,65,13,224,43,66,7,16,164,194,217,223,188,65,13,224,43,66,0,64,156,194,72,191,175,65,13,224,43,66,7,112,148,194,93,254,155,65,13,224,43,66,0,160,140,194,
+181,149,142,65,13,224,43,66,7,208,132,194,254,67,139,65,13,224,43,66,0,0,122,194,26,192,136,65,13,224,43,66,13,96,106,194,87,91,117,65,13,224,43,66,0,192,90,194,14,190,108,65,13,224,43,66,13,32,75,194,179,234,111,65,13,224,43,66,0,128,59,194,19,114,137,65,13,224,43,66,13,224,43,194,170,241,144,65,13,224,43,66,0,64,28,194,175,165,152,65,13,224,43,66,13,160,12,194,169,147,157,65,13,224,43,66,0,0,250,193,76,55,173,65,13,224,43,66,26,192,218,193,114,121,187,65,13,224,43,66,0,128,187,193,0,145,196,65,
+13,224,43,66,26,64,156,193,55,154,201,65,13,224,43,66,0,0,122,193,122,182,214,65,13,224,43,66,52,128,59,193,114,121,231,65,13,224,43,66,0,0,250,192,97,67,239,65,13,224,43,66,0,0,122,192,221,36,250,65,13,224,43,66,0,0,0,0,255,33,251,65,13,224,43,66,0,0,122,64,240,39,255,65,13,224,43,66,0,0,122,195,203,243,136,64,0,64,28,66,16,24,118,195,86,130,134,64,0,64,28,66,33,48,114,195,6,100,115,64,0,64,28,66,240,71,110,195,150,91,153,64,0,64,28,66,0,96,106,195,57,151,176,64,0,64,28,66,16,120,102,195,160,79,
+221,64,0,64,28,66,33,144,98,195,189,29,4,65,0,64,28,66,240,167,94,195,30,155,13,65,0,64,28,66,0,192,90,195,75,48,25,65,0,64,28,66,16,216,86,195,8,61,54,65,0,64,28,66,33,240,82,195,35,74,73,65,0,64,28,66,240,7,79,195,176,3,100,65,0,64,28,66,0,32,75,195,89,134,108,65,0,64,28,66,16,56,71,195,125,174,127,65,0,64,28,66,33,80,67,195,72,97,139,65,0,64,28,66,240,103,63,195,125,208,156,65,0,64,28,66,0,128,59,195,66,224,176,65,0,64,28,66,16,152,55,195,153,170,190,65,0,64,28,66,33,176,51,195,108,137,200,65,
+0,64,28,66,240,199,47,195,134,218,216,65,0,64,28,66,0,224,43,195,0,0,228,65,0,64,28,66,16,248,39,195,51,179,239,65,0,64,28,66,33,16,36,195,217,142,1,66,0,64,28,66,240,39,32,195,35,74,7,66,0,64,28,66,0,64,28,195,240,86,9,66,0,64,28,66,16,88,24,195,73,221,9,66,0,64,28,66,33,112,20,195,247,228,10,66,0,64,28,66,240,135,16,195,156,115,8,66,0,64,28,66,0,160,12,195,251,156,11,66,0,64,28,66,16,184,8,195,217,125,14,66,0,64,28,66,33,208,4,195,113,219,14,66,0,64,28,66,240,231,0,195,67,220,18,66,0,64,28,66,0,
+0,250,194,97,212,19,66,0,64,28,66,33,48,242,194,166,74,16,66,0,64,28,66,66,96,234,194,79,222,12,66,0,64,28,66,223,143,226,194,185,188,11,66,0,64,28,66,0,192,218,194,102,72,10,66,0,64,28,66,33,240,210,194,182,4,6,66,0,64,28,66,66,32,203,194,242,210,250,65,0,64,28,66,7,80,195,194,245,57,240,65,0,64,28,66,0,128,187,194,129,4,229,65,0,64,28,66,7,176,179,194,222,130,211,65,0,64,28,66,0,224,171,194,247,134,198,65,0,64,28,66,7,16,164,194,106,60,184,65,0,64,28,66,0,64,156,194,152,221,168,65,0,64,28,66,7,
+112,148,194,191,253,152,65,0,64,28,66,0,160,140,194,48,187,144,65,0,64,28,66,7,208,132,194,228,148,138,65,0,64,28,66,0,0,122,194,78,209,136,65,0,64,28,66,13,96,106,194,59,112,131,65,0,64,28,66,0,192,90,194,245,185,122,65,0,64,28,66,13,32,75,194,253,135,132,65,0,64,28,66,0,128,59,194,242,210,147,65,0,64,28,66,13,224,43,194,177,80,155,65,0,64,28,66,0,64,28,194,22,123,159,65,0,64,28,66,13,160,12,194,242,193,162,65,0,64,28,66,0,0,250,193,120,122,179,65,0,64,28,66,26,192,218,193,6,146,196,65,0,64,28,66,
+0,128,187,193,59,95,204,65,0,64,28,66,26,64,156,193,72,225,211,65,0,64,28,66,0,0,122,193,4,86,226,65,0,64,28,66,52,128,59,193,71,3,240,65,0,64,28,66,0,0,250,192,71,3,1,66,0,64,28,66,0,0,122,192,227,135,6,66,0,64,28,66,0,0,0,0,10,87,7,66,0,64,28,66,0,0,122,64,28,171,11,66,0,64,28,66,0,0,122,195,24,207,122,64,13,160,12,66,16,24,118,195,186,102,88,64,13,160,12,66,33,48,114,195,8,61,81,64,13,160,12,66,240,71,110,195,65,43,130,64,13,160,12,66,0,96,106,195,182,248,155,64,13,160,12,66,16,120,102,195,173,
+163,207,64,13,160,12,66,33,144,98,195,89,139,229,64,13,160,12,66,240,167,94,195,201,101,3,65,13,160,12,66,0,192,90,195,176,131,3,65,13,160,12,66,16,216,86,195,8,172,38,65,13,160,12,66,33,240,82,195,249,49,63,65,13,160,12,66,240,7,79,195,203,161,86,65,13,160,12,66,0,32,75,195,207,102,97,65,13,160,12,66,16,56,71,195,138,31,120,65,13,160,12,66,33,80,67,195,116,53,135,65,13,160,12,66,240,103,63,195,25,132,163,65,13,160,12,66,0,128,59,195,12,2,184,65,13,160,12,66,16,152,55,195,193,40,192,65,13,160,12,
+66,33,176,51,195,101,170,205,65,13,160,12,66,240,199,47,195,22,106,218,65,13,160,12,66,0,224,43,195,206,170,231,65,13,160,12,66,16,248,39,195,178,46,249,65,13,160,12,66,33,16,36,195,57,116,3,66,13,160,12,66,240,39,32,195,241,52,6,66,13,160,12,66,0,64,28,195,237,77,10,66,13,160,12,66,16,88,24,195,237,77,10,66,13,160,12,66,33,112,20,195,1,205,8,66,13,160,12,66,240,135,16,195,237,222,10,66,13,160,12,66,0,160,12,195,222,66,14,66,13,160,12,66,16,184,8,195,124,50,15,66,13,160,12,66,33,208,4,195,104,115,
+20,66,13,160,12,66,240,231,0,195,165,253,20,66,13,160,12,66,0,0,250,194,93,126,19,66,13,160,12,66,33,48,242,194,95,169,13,66,13,160,12,66,66,96,234,194,2,107,11,66,13,160,12,66,223,143,226,194,16,186,13,66,13,160,12,66,0,192,218,194,152,174,11,66,13,160,12,66,33,240,210,194,199,11,6,66,13,160,12,66,66,32,203,194,124,242,0,66,13,160,12,66,7,80,195,194,124,225,242,65,13,160,12,66,0,128,187,194,149,84,234,65,13,160,12,66,7,176,179,194,50,213,219,65,13,160,12,66,0,224,171,194,238,124,198,65,13,160,12,
+66,7,16,164,194,185,252,187,65,13,160,12,66,0,64,156,194,227,165,171,65,13,160,12,66,7,112,148,194,144,49,159,65,13,160,12,66,0,160,140,194,25,226,141,65,13,160,12,66,7,208,132,194,235,115,138,65,13,160,12,66,0,0,122,194,96,101,137,65,13,160,12,66,13,96,106,194,94,58,132,65,13,160,12,66,0,192,90,194,196,66,138,65,13,160,12,66,13,32,75,194,126,140,149,65,13,160,12,66,0,128,59,194,229,97,155,65,13,160,12,66,13,224,43,194,27,158,161,65,13,160,12,66,0,64,28,194,167,104,171,65,13,160,12,66,13,160,12,194,
+138,159,172,65,13,160,12,66,0,0,250,193,222,19,192,65,13,160,12,66,26,192,218,193,181,149,203,65,13,160,12,66,0,128,187,193,95,7,208,65,13,160,12,66,26,64,156,193,16,122,219,65,13,160,12,66,0,0,122,193,154,247,241,65,13,160,12,66,52,128,59,193,113,61,3,66,13,160,12,66,0,0,250,192,107,43,11,66,13,160,12,66,0,0,122,192,20,144,15,66,13,160,12,66,0,0,0,0,233,230,19,66,13,160,12,66,0,0,122,64,186,43,26,66,13,160,12,66,0,0,122,195,87,67,18,64,0,0,250,65,16,24,118,195,191,183,209,63,0,0,250,65,33,48,114,
+195,84,198,25,64,0,0,250,65,240,71,110,195,212,125,76,64,0,0,250,65,0,96,106,195,183,156,127,64,0,0,250,65,16,120,102,195,75,229,159,64,0,0,250,65,33,144,98,195,54,60,180,64,0,0,250,65,240,167,94,195,60,160,219,64,0,0,250,65,0,192,90,195,59,1,236,64,0,0,250,65,16,216,86,195,212,142,21,65,0,0,250,65,33,240,82,195,32,65,59,65,0,0,250,65,240,7,79,195,247,228,86,65,0,0,250,65,0,32,75,195,141,40,103,65,0,0,250,65,16,56,71,195,113,27,126,65,0,0,250,65,33,80,67,195,195,245,142,65,0,0,250,65,240,103,63,195,
+77,243,167,65,0,0,250,65,0,128,59,195,51,68,188,65,0,0,250,65,16,152,55,195,29,73,195,65,0,0,250,65,33,176,51,195,24,166,208,65,0,0,250,65,240,199,47,195,109,214,223,65,0,0,250,65,0,224,43,195,180,217,235,65,0,0,250,65,16,248,39,195,36,168,253,65,0,0,250,65,33,16,36,195,155,85,4,66,0,0,250,65,240,39,32,195,50,102,6,66,0,0,250,65,0,64,28,195,33,31,6,66,0,0,250,65,16,88,24,195,187,248,7,66,0,0,250,65,33,112,20,195,3,184,13,66,0,0,250,65,240,135,16,195,249,207,17,66,0,0,250,65,0,160,12,195,198,173,15,
+66,0,0,250,65,16,184,8,195,86,189,18,66,0,0,250,65,33,208,4,195,176,67,23,66,0,0,250,65,240,231,0,195,102,119,22,66,0,0,250,65,0,0,250,194,57,197,19,66,0,0,250,65,33,48,242,194,34,142,14,66,0,0,250,65,66,96,234,194,170,2,12,66,0,0,250,65,223,143,226,194,68,139,13,66,0,0,250,65,0,192,218,194,202,131,10,66,0,0,250,65,33,240,210,194,181,149,7,66,0,0,250,65,66,32,203,194,211,188,0,66,0,0,250,65,7,80,195,194,94,75,246,65,0,0,250,65,0,128,187,194,209,34,234,65,0,0,250,65,7,176,179,194,104,17,218,65,0,0,
+250,65,0,224,171,194,136,99,203,65,0,0,250,65,7,16,164,194,140,57,184,65,0,0,250,65,0,64,156,194,165,172,171,65,0,0,250,65,7,112,148,194,18,165,155,65,0,0,250,65,0,160,140,194,29,201,144,65,0,0,250,65,7,208,132,194,161,248,136,65,0,0,250,65,0,0,122,194,155,102,137,65,0,0,250,65,13,96,106,194,169,36,137,65,0,0,250,65,0,192,90,194,21,140,147,65,0,0,250,65,13,32,75,194,160,137,159,65,0,0,250,65,0,128,59,194,255,178,169,65,0,0,250,65,13,224,43,194,79,175,169,65,0,0,250,65,0,64,28,194,169,19,177,65,0,
+0,250,65,13,160,12,194,50,119,186,65,0,0,250,65,0,0,250,193,156,162,197,65,0,0,250,65,26,192,218,193,129,38,210,65,0,0,250,65,0,128,187,193,185,141,220,65,0,0,250,65,26,64,156,193,122,71,243,65,0,0,250,65,0,0,122,193,99,46,4,66,0,0,250,65,52,128,59,193,91,241,11,66,0,0,250,65,0,0,250,192,114,74,20,66,0,0,250,65,0,0,122,192,58,227,28,66,0,0,250,65,0,0,0,0,148,118,33,66,0,0,250,65,0,0,122,64,157,192,37,66,0,0,250,65,0,0,122,195,170,96,244,62,26,192,218,65,16,24,118,195,186,192,33,63,26,192,218,65,33,
+48,114,195,105,116,155,63,26,192,218,65,240,71,110,195,233,125,195,63,26,192,218,65,0,96,106,195,62,208,46,64,26,192,218,65,16,120,102,195,10,215,105,64,26,192,218,65,33,144,98,195,4,28,161,64,26,192,218,65,240,167,94,195,42,169,200,64,26,192,218,65,0,192,90,195,126,58,242,64,26,192,218,65,16,216,86,195,238,49,26,65,26,192,218,65,33,240,82,195,105,111,54,65,26,192,218,65,240,7,79,195,4,86,75,65,26,192,218,65,0,32,75,195,194,23,102,65,26,192,218,65,16,56,71,195,246,151,126,65,26,192,218,65,33,80,67,
+195,147,41,143,65,26,192,218,65,240,103,63,195,202,195,166,65,26,192,218,65,0,128,59,195,252,41,182,65,26,192,218,65,16,152,55,195,156,162,196,65,230,191,218,65,33,176,51,195,164,112,216,65,26,192,218,65,240,199,47,195,161,214,234,65,230,191,218,65,0,224,43,195,144,160,243,65,26,192,218,65,16,248,39,195,20,191,1,66,230,191,218,65,33,16,36,195,159,252,9,66,26,192,218,65,240,39,32,195,121,216,11,66,230,191,218,65,0,64,28,195,18,195,11,66,26,192,218,65,16,88,24,195,178,221,14,66,230,191,218,65,33,112,
+20,195,161,39,20,66,26,192,218,65,240,135,16,195,164,95,24,66,230,191,218,65,0,160,12,195,126,140,21,66,26,192,218,65,16,184,8,195,2,188,17,66,230,191,218,65,33,208,4,195,96,37,20,66,26,192,218,65,240,231,0,195,82,9,21,66,230,191,218,65,0,0,250,194,104,51,18,66,26,192,218,65,33,48,242,194,244,236,13,66,230,191,218,65,66,96,234,194,138,78,13,66,26,192,218,65,223,143,226,194,184,128,9,66,230,191,218,65,0,192,218,194,100,251,8,66,26,192,218,65,33,240,210,194,139,189,6,66,230,191,218,65,66,32,203,194,
+42,105,1,66,26,192,218,65,7,80,195,194,84,227,240,65,230,191,218,65,0,128,187,194,250,237,227,65,26,192,218,65,7,176,179,194,131,81,216,65,230,191,218,65,0,224,171,194,91,194,199,65,26,192,218,65,7,16,164,194,45,195,183,65,230,191,218,65,0,64,156,194,105,0,174,65,26,192,218,65,7,112,148,194,97,212,150,65,26,192,218,65,0,160,140,194,229,225,145,65,26,192,218,65,7,208,132,194,102,247,146,65,26,192,218,65,0,0,122,194,241,99,149,65,26,192,218,65,13,96,106,194,124,114,148,65,26,192,218,65,0,192,90,194,
+75,72,153,65,26,192,218,65,13,32,75,194,224,173,166,65,26,192,218,65,0,128,59,194,164,223,172,65,26,192,218,65,13,224,43,194,31,116,175,65,230,191,218,65,0,64,28,194,136,99,184,65,26,192,218,65,13,160,12,194,164,240,198,65,230,191,218,65,0,0,250,193,89,134,205,65,26,192,218,65,26,192,218,193,137,193,223,65,230,191,218,65,0,128,187,193,231,123,242,65,26,192,218,65,26,64,156,193,116,245,7,66,230,191,218,65,0,0,122,193,146,203,14,66,26,192,218,65,52,128,59,193,105,175,23,66,230,191,218,65,0,0,250,192,
+193,138,32,66,26,192,218,65,0,0,122,192,192,108,38,66,230,191,218,65,0,0,0,0,141,23,41,66,26,192,218,65,0,0,122,64,0,239,42,66,230,191,218,65,0,0,122,195,97,107,54,62,0,128,187,65,16,24,118,195,195,42,138,63,0,128,187,65,33,48,114,195,90,42,195,63,0,128,187,65,240,71,110,195,139,137,37,64,0,128,187,65,0,96,106,195,187,237,96,64,0,128,187,65,16,120,102,195,153,100,135,64,0,128,187,65,33,144,98,195,13,195,185,64,0,128,187,65,240,167,94,195,247,88,232,64,0,128,187,65,0,192,90,195,213,161,13,65,0,128,
+187,65,16,216,86,195,71,114,46,65,0,128,187,65,33,240,82,195,186,107,75,65,0,128,187,65,240,7,79,195,100,204,110,65,0,128,187,65,0,32,75,195,220,104,122,65,0,128,187,65,16,56,71,195,100,59,132,65,0,128,187,65,33,80,67,195,94,58,137,65,0,128,187,65,240,103,63,195,111,129,164,65,0,128,187,65,0,128,59,195,165,206,184,65,0,128,187,65,16,152,55,195,134,73,198,65,0,128,187,65,33,176,51,195,115,232,214,65,0,128,187,65,240,199,47,195,18,148,228,65,0,128,187,65,0,224,43,195,155,85,242,65,0,128,187,65,16,248,
+39,195,113,27,3,66,0,128,187,65,33,16,36,195,199,122,10,66,0,128,187,65,240,39,32,195,196,194,14,66,0,128,187,65,0,64,28,195,102,119,20,66,0,128,187,65,16,88,24,195,143,83,20,66,0,128,187,65,33,112,20,195,125,255,23,66,0,128,187,65,240,135,16,195,125,191,26,66,0,128,187,65,0,160,12,195,84,180,23,66,0,128,187,65,16,184,8,195,139,253,18,66,0,128,187,65,33,208,4,195,80,188,20,66,0,128,187,65,240,231,0,195,9,121,19,66,0,128,187,65,0,0,250,194,162,5,17,66,0,128,187,65,33,48,242,194,104,98,11,66,0,128,
+187,65,66,96,234,194,132,77,10,66,0,128,187,65,223,143,226,194,4,150,7,66,0,128,187,65,0,192,218,194,171,254,5,66,0,128,187,65,33,240,210,194,123,20,4,66,0,128,187,65,66,32,203,194,104,162,251,65,0,128,187,65,7,80,195,194,29,184,236,65,0,128,187,65,0,128,187,194,225,11,223,65,0,128,187,65,7,176,179,194,167,232,211,65,0,128,187,65,0,224,171,194,149,84,196,65,0,128,187,65,7,16,164,194,170,224,180,65,0,128,187,65,0,64,156,194,61,10,171,65,0,128,187,65,7,112,148,194,40,15,154,65,0,128,187,65,0,160,140,
+194,86,125,157,65,0,128,187,65,7,208,132,194,92,160,154,65,0,128,187,65,0,0,122,194,235,226,162,65,0,128,187,65,13,96,106,194,167,249,167,65,0,128,187,65,0,192,90,194,25,132,164,65,0,128,187,65,13,32,75,194,6,18,173,65,0,128,187,65,0,128,59,194,98,144,176,65,0,128,187,65,13,224,43,194,214,86,186,65,0,128,187,65,0,64,28,194,207,230,198,65,0,128,187,65,13,160,12,194,0,111,207,65,0,128,187,65,0,0,250,193,215,180,217,65,0,128,187,65,26,192,218,193,57,214,237,65,0,128,187,65,0,128,187,193,117,66,3,66,
+0,128,187,65,26,64,156,193,223,32,14,66,0,128,187,65,0,0,122,193,140,219,24,66,0,128,187,65,52,128,59,193,233,247,32,66,0,128,187,65,0,0,250,192,217,253,38,66,0,128,187,65,0,0,122,192,238,124,45,66,0,128,187,65,0,0,0,0,170,2,47,66,0,128,187,65,0,0,122,64,148,182,50,66,0,128,187,65,0,0,122,195,206,137,13,62,26,64,156,65,16,24,118,195,79,64,179,63,26,64,156,65,33,48,114,195,56,248,80,64,26,64,156,65,240,71,110,195,210,198,105,64,26,64,156,65,0,96,106,195,30,254,156,64,26,64,156,65,16,120,102,195,90,
+18,193,64,26,64,156,65,33,144,98,195,103,237,255,64,26,64,156,65,240,167,94,195,46,173,22,65,26,64,156,65,0,192,90,195,45,178,32,65,26,64,156,65,16,216,86,195,175,148,66,65,26,64,156,65,33,240,82,195,202,50,91,65,26,64,156,65,240,7,79,195,48,42,124,65,26,64,156,65,0,32,75,195,60,61,129,65,26,64,156,65,16,56,71,195,26,209,136,65,26,64,156,65,33,80,67,195,93,126,145,65,26,64,156,65,240,103,63,195,3,120,165,65,26,64,156,65,0,128,59,195,39,177,184,65,230,63,156,65,16,152,55,195,121,105,194,65,26,64,156,
+65,33,176,51,195,100,76,213,65,230,63,156,65,240,199,47,195,35,219,225,65,26,64,156,65,0,224,43,195,199,41,245,65,230,63,156,65,16,248,39,195,56,120,3,66,26,64,156,65,33,16,36,195,55,90,12,66,230,63,156,65,240,39,32,195,4,22,21,66,26,64,156,65,0,64,28,195,246,104,26,66,230,63,156,65,16,88,24,195,198,28,25,66,26,64,156,65,33,112,20,195,218,236,25,66,230,63,156,65,240,135,16,195,249,79,25,66,26,64,156,65,0,160,12,195,143,147,24,66,230,63,156,65,16,184,8,195,41,109,22,66,230,63,156,65,33,208,4,195,188,
+214,20,66,230,63,156,65,240,231,0,195,17,71,18,66,230,63,156,65,0,0,250,194,102,247,16,66,230,63,156,65,33,48,242,194,59,31,10,66,230,63,156,65,66,96,234,194,62,121,5,66,230,63,156,65,223,143,226,194,59,31,3,66,230,63,156,65,0,192,218,194,180,217,254,65,230,63,156,65,33,240,210,194,233,183,250,65,230,63,156,65,66,32,203,194,220,232,237,65,230,63,156,65,7,80,195,194,97,178,229,65,230,63,156,65,0,128,187,194,138,31,223,65,230,63,156,65,7,176,179,194,110,52,208,65,230,63,156,65,0,224,171,194,13,96,196,
+65,230,63,156,65,7,16,164,194,38,211,186,65,230,63,156,65,0,64,156,194,97,178,171,65,26,64,156,65,7,112,148,194,60,206,162,65,26,64,156,65,0,160,140,194,210,128,161,65,26,64,156,65,7,208,132,194,211,222,167,65,26,64,156,65,0,0,122,194,254,212,177,65,230,63,156,65,13,96,106,194,10,215,178,65,230,63,156,65,0,192,90,194,144,32,182,65,230,63,156,65,13,32,75,194,10,104,183,65,230,63,156,65,0,128,59,194,152,110,188,65,230,63,156,65,13,224,43,194,188,22,195,65,230,63,156,65,0,64,28,194,240,22,204,65,230,
+63,156,65,13,160,12,194,235,243,214,65,230,63,156,65,0,0,250,193,119,190,231,65],"i8",I,v.k+10240);
+K([230,63,156,65,26,192,218,193,101,25,248,65,230,63,156,65,0,128,187,193,194,87,11,66,230,63,156,65,26,64,156,193,222,241,20,66,230,63,156,65,0,0,122,193,158,94,30,66,230,63,156,65,52,128,59,193,194,70,38,66,230,63,156,65,0,0,250,192,245,249,44,66,230,63,156,65,0,0,122,192,154,119,52,66,230,63,156,65,0,0,0,0,162,5,55,66,230,63,156,65,0,0,122,64,59,159,59,66,230,63,156,65,0,0,122,195,243,5,237,62,0,0,122,65,16,24,118,195,184,233,9,64,0,0,122,65,33,48,114,195,249,78,108,64,0,0,122,65,240,71,110,195,
+116,152,156,64,0,0,122,65,0,96,106,195,60,160,222,64,0,0,122,65,16,120,102,195,10,17,6,65,0,0,122,65,33,144,98,195,65,113,19,65,0,0,122,65,240,167,94,195,151,255,32,65,0,0,122,65,0,192,90,195,251,92,58,65,0,0,122,65,16,216,86,195,172,28,84,65,0,0,122,65,33,240,82,195,28,235,109,65,0,0,122,65,240,7,79,195,97,195,127,65,0,0,122,65,0,32,75,195,51,51,136,65,0,0,122,65,16,56,71,195,14,207,142,65,0,0,122,65,33,80,67,195,100,221,162,65,0,0,122,65,240,103,63,195,199,169,176,65,0,0,122,65,0,128,59,195,112,
+95,195,65,0,0,122,65,16,152,55,195,0,128,204,65,0,0,122,65,33,176,51,195,208,196,216,65,0,0,122,65,240,199,47,195,51,196,240,65,0,0,122,65,0,224,43,195,177,97,254,65,0,0,122,65,16,248,39,195,52,209,10,66,0,0,122,65,33,16,36,195,121,169,20,66,0,0,122,65,240,39,32,195,173,186,22,66,0,0,122,65,0,64,28,195,74,123,22,66,0,0,122,65,16,88,24,195,253,54,23,66,0,0,122,65,33,112,20,195,8,108,23,66,0,0,122,65,240,135,16,195,238,218,23,66,0,0,122,65,0,160,12,195,172,237,21,66,0,0,122,65,16,184,8,195,175,20,20,
+66,0,0,122,65,33,208,4,195,115,215,17,66,0,0,122,65,240,231,0,195,72,161,16,66,0,0,122,65,0,0,250,194,236,175,13,66,0,0,122,65,33,48,242,194,175,20,6,66,0,0,122,65,66,96,234,194,201,118,0,66,0,0,122,65,223,143,226,194,74,123,247,65,0,0,122,65,0,192,218,194,58,163,238,65,0,0,122,65,33,240,210,194,26,81,239,65,0,0,122,65,66,32,203,194,199,203,229,65,0,0,122,65,7,80,195,194,150,195,221,65,0,0,122,65,0,128,187,194,164,95,219,65,0,0,122,65,7,176,179,194,121,216,206,65,0,0,122,65,0,224,171,194,185,124,
+192,65,0,0,122,65,7,16,164,194,146,75,182,65,0,0,122,65,0,64,156,194,59,240,163,65,0,0,122,65,7,112,148,194,31,5,168,65,0,0,122,65,0,160,140,194,84,99,170,65,0,0,122,65,7,208,132,194,215,146,180,65,0,0,122,65,0,0,122,194,136,116,184,65,0,0,122,65,13,96,106,194,202,178,185,65,0,0,122,65,0,192,90,194,34,125,193,65,0,0,122,65,13,32,75,194,52,128,196,65,0,0,122,65,0,128,59,194,216,1,201,65,0,0,122,65,13,224,43,194,250,254,207,65,0,0,122,65,0,64,28,194,19,242,214,65,0,0,122,65,13,160,12,194,217,223,222,
+65,0,0,122,65,0,0,250,193,163,35,239,65,0,0,122,65,26,192,218,193,191,142,3,66,0,0,122,65,0,128,187,193,16,41,17,66,0,0,122,65,26,64,156,193,113,253,24,66,0,0,122,65,0,0,122,193,59,95,34,66,0,0,122,65,52,128,59,193,111,48,41,66,0,0,122,65,0,0,250,192,189,82,53,66,0,0,122,65,0,0,122,192,72,97,61,66,0,0,122,65,0,0,0,0,87,236,67,66,0,0,122,65,0,0,122,64,2,235,68,66,0,0,122,65,0,0,122,195,144,78,149,63,52,128,59,65,16,24,118,195,100,146,63,64,52,128,59,65,33,48,114,195,244,26,140,64,52,128,59,65,240,
+71,110,195,230,232,166,64,52,128,59,65,0,96,106,195,235,255,218,64,52,128,59,65,16,120,102,195,223,137,5,65,52,128,59,65,33,144,98,195,136,133,20,65,52,128,59,65,240,167,94,195,169,106,30,65,52,128,59,65,0,192,90,195,211,188,46,65,204,127,59,65,16,216,86,195,117,2,91,65,204,127,59,65,33,240,82,195,90,100,124,65,204,127,59,65,240,7,79,195,41,220,129,65,204,127,59,65,0,32,75,195,31,5,138,65,204,127,59,65,16,56,71,195,235,226,152,65,204,127,59,65,33,80,67,195,94,203,171,65,204,127,59,65,240,103,63,195,
+2,43,192,65,204,127,59,65,0,128,59,195,216,240,206,65,204,127,59,65,16,152,55,195,2,43,216,65,204,127,59,65,33,176,51,195,49,8,226,65,204,127,59,65,240,199,47,195,44,212,252,65,204,127,59,65,0,224,43,195,25,132,2,66,204,127,59,65,16,248,39,195,118,207,11,66,204,127,59,65,33,16,36,195,94,75,19,66,204,127,59,65,240,39,32,195,166,155,20,66,204,127,59,65,0,64,28,195,226,169,22,66,204,127,59,65,16,88,24,195,11,164,21,66,204,127,59,65,33,112,20,195,137,82,20,66,204,127,59,65,240,135,16,195,5,133,22,66,
+204,127,59,65,0,160,12,195,88,232,18,66,204,127,59,65,16,184,8,195,184,239,17,66,204,127,59,65,33,208,4,195,214,5,13,66,204,127,59,65,240,231,0,195,143,211,10,66,204,127,59,65,0,0,250,194,249,96,8,66,204,127,59,65,33,48,242,194,236,239,2,66,204,127,59,65,66,96,234,194,231,123,252,65,204,127,59,65,223,143,226,194,93,254,245,65,204,127,59,65,0,192,218,194,82,73,241,65,204,127,59,65,33,240,210,194,177,80,239,65,204,127,59,65,66,32,203,194,244,108,228,65,204,127,59,65,7,80,195,194,11,164,209,65,204,127,
+59,65,0,128,187,194,121,88,208,65,204,127,59,65,7,176,179,194,253,118,201,65,204,127,59,65,0,224,171,194,23,89,190,65,204,127,59,65,7,16,164,194,197,143,181,65,204,127,59,65,0,64,156,194,127,217,175,65,204,127,59,65,7,112,148,194,8,189,178,65,204,127,59,65,0,160,140,194,154,247,179,65,204,127,59,65,7,208,132,194,231,140,183,65,204,127,59,65,0,0,122,194,214,69,189,65,204,127,59,65,13,96,106,194,165,78,193,65,204,127,59,65,0,192,90,194,89,6,199,65,204,127,59,65,13,32,75,194,220,198,202,65,204,127,59,
+65,0,128,59,194,70,20,206,65,204,127,59,65,13,224,43,194,72,225,212,65,204,127,59,65,0,64,28,194,194,6,220,65,204,127,59,65,13,160,12,194,104,51,234,65,204,127,59,65,0,0,250,193,78,81,255,65,204,127,59,65,26,192,218,193,29,201,8,66,204,127,59,65,0,128,187,193,246,23,19,66,204,127,59,65,26,64,156,193,245,249,28,66,204,127,59,65,0,0,122,193,191,78,37,66,204,127,59,65,52,128,59,193,163,18,49,66,204,127,59,65,0,0,250,192,179,251,60,66,204,127,59,65,0,0,122,192,45,225,68,66,204,127,59,65,0,0,0,0,182,4,
+73,66,204,127,59,65,0,0,122,64,66,126,76,66,204,127,59,65,0,0,122,195,21,116,195,63,0,0,250,64,16,24,118,195,172,57,62,64,0,0,250,64,33,48,114,195,242,123,113,64,0,0,250,64,240,71,110,195,77,243,153,64,0,0,250,64,0,96,106,195,0,58,190,64,0,0,250,64,16,120,102,195,60,131,238,64,0,0,250,64,33,144,98,195,40,126,15,65,0,0,250,64,240,167,94,195,198,249,21,65,0,0,250,64,0,192,90,195,218,27,38,65,0,0,250,64,16,216,86,195,222,2,81,65,0,0,250,64,33,240,82,195,109,86,121,65,0,0,250,64,240,7,79,195,193,57,137,
+65,0,0,250,64,0,32,75,195,182,115,154,65,0,0,250,64,16,56,71,195,207,247,173,65,0,0,250,64,33,80,67,195,83,5,184,65,0,0,250,64,240,103,63,195,52,128,201,65,0,0,250,64,0,128,59,195,198,237,219,65,0,0,250,64,16,152,55,195,63,53,229,65,0,0,250,64,33,176,51,195,125,191,231,65,0,0,250,64,240,199,47,195,31,5,249,65,0,0,250,64,0,224,43,195,248,211,1,66,0,0,250,64,16,248,39,195,2,188,9,66,0,0,250,64,33,16,36,195,76,166,15,66,0,0,250,64,240,39,32,195,253,7,18,66,0,0,250,64,0,64,28,195,230,255,19,66,0,0,250,
+64,16,88,24,195,138,206,19,66,0,0,250,64,33,112,20,195,156,226,23,66,0,0,250,64,240,135,16,195,76,183,23,66,0,0,250,64,0,160,12,195,52,34,22,66,0,0,250,64,16,184,8,195,132,30,17,66,0,0,250,64,33,208,4,195,248,194,12,66,0,0,250,64,240,231,0,195,65,241,6,66,0,0,250,64,0,0,250,194,32,99,8,66,0,0,250,64,33,48,242,194,208,85,6,66,0,0,250,64,66,96,234,194,151,191,3,66,0,0,250,64,223,143,226,194,38,36,0,66,0,0,250,64,0,192,218,194,202,178,251,65,0,0,250,64,33,240,210,194,175,37,244,65,0,0,250,64,66,32,203,
+194,179,234,229,65,0,0,250,64,7,80,195,194,8,44,218,65,0,0,250,64,0,128,187,194,93,254,208,65,0,0,250,64,7,176,179,194,132,141,196,65,0,0,250,64,0,224,171,194,176,114,191,65,0,0,250,64,7,16,164,194,73,29,190,65,0,0,250,64,0,64,156,194,159,171,179,65,0,0,250,64,7,112,148,194,229,80,180,65,0,0,250,64,0,160,140,194,37,117,183,65,0,0,250,64,7,208,132,194,34,125,187,65,0,0,250,64,0,0,122,194,184,47,194,65,0,0,250,64,13,96,106,194,151,127,193,65,0,0,250,64,0,192,90,194,255,33,194,65,0,0,250,64,13,32,75,
+194,129,4,202,65,0,0,250,64,0,128,59,194,146,203,210,65,0,0,250,64,13,224,43,194,39,177,214,65,0,0,250,64,0,64,28,194,121,105,220,65,0,0,250,64,13,160,12,194,132,141,243,65,0,0,250,64,0,0,250,193,3,56,6,66,0,0,250,64,26,192,218,193,72,144,16,66,0,0,250,64,0,128,187,193,242,112,24,66,0,0,250,64,26,64,156,193,182,68,31,66,0,0,250,64,0,0,122,193,90,117,40,66,0,0,250,64,52,128,59,193,242,112,53,66,0,0,250,64,0,0,250,192,11,164,62,66,0,0,250,64,0,0,122,192,29,218,71,66,0,0,250,64,0,0,0,0,99,63,79,66,0,
+0,250,64,0,0,122,64,196,2,81,66,0,0,250,64,0,0,122,195,100,59,15,62,0,0,122,64,16,24,118,195,0,111,221,63,0,0,122,64,33,48,114,195,99,122,38,64,0,0,122,64,240,71,110,195,68,110,128,64,0,0,122,64,0,96,106,195,137,94,164,64,0,0,122,64,16,120,102,195,245,74,214,64,0,0,122,64,33,144,98,195,152,233,6,65,0,0,122,64,240,167,94,195,201,89,29,65,0,0,122,64,0,192,90,195,254,212,53,65,0,0,122,64,16,216,86,195,80,141,99,65,0,0,122,64,33,240,82,195,10,104,129,65,0,0,122,64,240,7,79,195,54,77,151,65,0,0,122,64,
+0,32,75,195,127,251,169,65,0,0,122,64,16,56,71,195,161,120,184,65,0,0,122,64,33,80,67,195,236,209,196,65,0,0,122,64,240,103,63,195,176,131,206,65,0,0,122,64,0,128,59,195,138,142,220,65,0,0,122,64,16,152,55,195,165,189,233,65,0,0,122,64,33,176,51,195,207,119,237,65,0,0,122,64,240,199,47,195,204,238,245,65,0,0,122,64,0,224,43,195,37,134,251,65,0,0,122,64,16,248,39,195,24,85,4,66,0,0,122,64,33,16,36,195,113,125,10,66,0,0,122,64,240,39,32,195,46,255,13,66,0,0,122,64,0,64,28,195,129,166,21,66,0,0,122,
+64,16,88,24,195,223,207,25,66,0,0,122,64,33,112,20,195,86,253,27,66,0,0,122,64,240,135,16,195,254,37,27,66,0,0,122,64,0,160,12,195,141,104,22,66,0,0,122,64,16,184,8,195,3,184,16,66,0,0,122,64,33,208,4,195,96,246,11,66,0,0,122,64,240,231,0,195,136,133,8,66,0,0,122,64,0,0,250,194,36,104,9,66,0,0,122,64,33,48,242,194,18,165,6,66,0,0,122,64,66,96,234,194,157,209,2,66,0,0,122,64,223,143,226,194,77,149,1,66,0,0,122,64,0,192,218,194,135,167,248,65,0,0,122,64,33,240,210,194,249,160,247,65,0,0,122,64,66,32,
+203,194,98,144,238,65,0,0,122,64,7,80,195,194,57,214,227,65,0,0,122,64,0,128,187,194,249,49,221,65,0,0,122,64,7,176,179,194,169,147,204,65,0,0,122,64,0,224,171,194,229,208,193,65,0,0,122,64,7,16,164,194,188,22,186,65,0,0,122,64,0,64,156,194,212,171,179,65,0,0,122,64,7,112,148,194,14,207,185,65,0,0,122,64,0,160,140,194,31,5,188,65,0,0,122,64,7,208,132,194,200,135,189,65,0,0,122,64,0,0,122,194,145,109,197,65,0,0,122,64,13,96,106,194,241,244,203,65,0,0,122,64,0,192,90,194,17,199,207,65,0,0,122,64,13,
+32,75,194,228,148,209,65,0,0,122,64,0,128,59,194,202,212,214,65,0,0,122,64,13,224,43,194,125,208,221,65,0,0,122,64,0,64,28,194,5,163,233,65,0,0,122,64,13,160,12,194,236,81,254,65,0,0,122,64,0,0,250,193,46,16,9,66,0,0,122,64,26,192,218,193,50,247,15,66,0,0,122,64,0,128,187,193,170,130,25,66,0,0,122,64,26,64,156,193,114,138,31,66,0,0,122,64,0,0,122,193,254,148,44,66,0,0,122,64,52,128,59,193,11,6,54,66,0,0,122,64,0,0,250,192,235,179,61,66,0,0,122,64,0,0,122,192,224,156,71,66,0,0,122,64,0,0,0,0,249,32,
+80,66,0,0,122,64,0,0,122,64,114,121,82,66,0,0,122,64,0,0,1,0,2,0,3,0,2,0,1,0,2,0,3,0,4,0,5,0,4,0,3,0,4,0,5,0,6,0,7,0,6,0,5,0,6,0,7,0,8,0,9,0,8,0,7,0,8,0,9,0,10,0,11,0,10,0,9,0,10,0,11,0,12,0,13,0,12,0,11,0,12,0,13,0,14,0,15,0,14,0,13,0,14,0,15,0,16,0,17,0,16,0,15,0,16,0,17,0,18,0,19,0,18,0,17,0,18,0,19,0,20,0,21,0,20,0,19,0,20,0,21,0,22,0,23,0,22,0,21,0,22,0,23,0,24,0,25,0,24,0,23,0,24,0,25,0,26,0,27,0,26,0,25,0,26,0,27,0,28,0,29,0,28,0,27,0,28,0,29,0,30,0,31,0,30,0,29,0,30,0,31,0,32,0,33,0,32,0,
+31,0,32,0,33,0,34,0,35,0,34,0,33,0,34,0,35,0,36,0,37,0,36,0,35,0,36,0,37,0,38,0,39,0,38,0,37,0,38,0,39,0,40,0,41,0,40,0,39,0,40,0,41,0,42,0,43,0,42,0,41,0,42,0,43,0,44,0,45,0,44,0,43,0,44,0,45,0,46,0,47,0,46,0,45,0,46,0,47,0,48,0,49,0,48,0,47,0,48,0,49,0,50,0,51,0,50,0,49,0,50,0,51,0,52,0,53,0,52,0,51,0,52,0,53,0,54,0,55,0,54,0,53,0,54,0,55,0,56,0,57,0,56,0,55,0,56,0,57,0,58,0,59,0,58,0,57,0,58,0,59,0,60,0,61,0,60,0,59,0,60,0,61,0,62,0,63,0,62,0,61,0,62,0,63,0,64,0,65,0,64,0,63,0,64,0,65,0,66,0,67,
+0,66,0,65,0,66,0,67,0,68,0,69,0,68,0,67,0,68,0,69,0,70,0,71,0,70,0,69,0,70,0,71,0,72,0,73,0,72,0,71,0,72,0,73,0,74,0,75,0,74,0,73,0,74,0,75,0,76,0,77,0,76,0,75,0,76,0,77,0,78,0,79,0,78,0,77,0,78,0,79,0,80,0,81,0,80,0,79,0,80,0,81,0,82,0,83,0,82,0,81,0,82,0,83,0,84,0,85,0,84,0,83,0,84,0,85,0,86,0,87,0,86,0,85,0,86,0,87,0,88,0,89,0,88,0,87,0,88,0,89,0,90,0,91,0,90,0,89,0,90,0,91,0,92,0,93,0,92,0,91,0,92,0,93,0,94,0,95,0,94,0,93,0,94,0,95,0,96,0,97,0,96,0,95,0,96,0,97,0,98,0,99,0,98,0,97,0,98,0,99,0,
+100,0,101,0,100,0,99,0,100,0,101,0,102,0,103,0,102,0,101,0,102,0,103,0,104,0,105,0,104,0,103,0,104,0,105,0,106,0,107,0,106,0,105,0,106,0,107,0,108,0,109,0,108,0,107,0,108,0,109,0,110,0,111,0,110,0,109,0,110,0,111,0,112,0,113,0,112,0,111,0,112,0,113,0,114,0,115,0,114,0,113,0,114,0,115,0,116,0,117,0,116,0,115,0,116,0,117,0,118,0,119,0,118,0,117,0,118,0,119,0,120,0,121,0,120,0,119,0,120,0,121,0,122,0,123,0,122,0,121,0,122,0,123,0,124,0,125,0,124,0,123,0,124,0,125,0,126,0,127,0,126,0,125,0,126,0,127,
+0,128,0,129,0,128,0,127,0,128,0,129,0,130,0,131,0,130,0,129,0,132,0,0,0,133,0,2,0,133,0,0,0,133,0,2,0,134,0,4,0,134,0,2,0,134,0,4,0,135,0,6,0,135,0,4,0,135,0,6,0,136,0,8,0,136,0,6,0,136,0,8,0,137,0,10,0,137,0,8,0,137,0,10,0,138,0,12,0,138,0,10,0,138,0,12,0,139,0,14,0,139,0,12,0,139,0,14,0,140,0,16,0,140,0,14,0,140,0,16,0,141,0,18,0,141,0,16,0,141,0,18,0,142,0,20,0,142,0,18,0,142,0,20,0,143,0,22,0,143,0,20,0,143,0,22,0,144,0,24,0,144,0,22,0,144,0,24,0,145,0,26,0,145,0,24,0,145,0,26,0,146,0,28,0,146,
+0,26,0,146,0,28,0,147,0,30,0,147,0,28,0,147,0,30,0,148,0,32,0,148,0,30,0,148,0,32,0,149,0,34,0,149,0,32,0,149,0,34,0,150,0,36,0,150,0,34,0,150,0,36,0,151,0,38,0,151,0,36,0,151,0,38,0,152,0,40,0,152,0,38,0,152,0,40,0,153,0,42,0,153,0,40,0,153,0,42,0,154,0,44,0,154,0,42,0,154,0,44,0,155,0,46,0,155,0,44,0,155,0,46,0,156,0,48,0,156,0,46,0,156,0,48,0,157,0,50,0,157,0,48,0,157,0,50,0,158,0,52,0,158,0,50,0,158,0,52,0,159,0,54,0,159,0,52,0,159,0,54,0,160,0,56,0,160,0,54,0,160,0,56,0,161,0,58,0,161,0,56,0,
+161,0,58,0,162,0,60,0,162,0,58,0,162,0,60,0,163,0,62,0,163,0,60,0,163,0,62,0,164,0,64,0,164,0,62,0,164,0,64,0,165,0,66,0,165,0,64,0,165,0,66,0,166,0,68,0,166,0,66,0,166,0,68,0,167,0,70,0,167,0,68,0,167,0,70,0,168,0,72,0,168,0,70,0,168,0,72,0,169,0,74,0,169,0,72,0,169,0,74,0,170,0,76,0,170,0,74,0,170,0,76,0,171,0,78,0,171,0,76,0,171,0,78,0,172,0,80,0,172,0,78,0,172,0,80,0,173,0,82,0,173,0,80,0,173,0,82,0,174,0,84,0,174,0,82,0,174,0,84,0,175,0,86,0,175,0,84,0,175,0,86,0,176,0,88,0,176,0,86,0,176,0,
+88,0,177,0,90,0,177,0,88,0,177,0,90,0,178,0,92,0,178,0,90,0,178,0,92,0,179,0,94,0,179,0,92,0,179,0,94,0,180,0,96,0,180,0,94,0,180,0,96,0,181,0,98,0,181,0,96,0,181,0,98,0,182,0,100,0,182,0,98,0,182,0,100,0,183,0,102,0,183,0,100,0,183,0,102,0,184,0,104,0,184,0,102,0,184,0,104,0,185,0,106,0,185,0,104,0,185,0,106,0,186,0,108,0,186,0,106,0,186,0,108,0,187,0,110,0,187,0,108,0,187,0,110,0,188,0,112,0,188,0,110,0,188,0,112,0,189,0,114,0,189,0,112,0,189,0,114,0,190,0,116,0,190,0,114,0,190,0,116,0,191,0,118,
+0,191,0,116,0,191,0,118,0,192,0,120,0,192,0,118,0,192,0,120,0,193,0,122,0,193,0,120,0,193,0,122,0,194,0,124,0,194,0,122,0,194,0,124,0,195,0,126,0,195,0,124,0,195,0,126,0,196,0,128,0,196,0,126,0,196,0,128,0,197,0,130,0,197,0,128,0,198,0,132,0,199,0,133,0,199,0,132,0,199,0,133,0,200,0,134,0,200,0,133,0,200,0,134,0,201,0,135,0,201,0,134,0,201,0,135,0,202,0,136,0,202,0,135,0,202,0,136,0,203,0,137,0,203,0,136,0,203,0,137,0,204,0,138,0,204,0,137,0,204,0,138,0,205,0,139,0,205,0,138,0,205,0,139,0,206,0,140,
+0,206,0,139,0,206,0,140,0,207,0,141,0,207,0,140,0,207,0,141,0,208,0,142,0,208,0,141,0,208,0,142,0,209,0,143,0,209,0,142,0,209,0,143,0,210,0,144,0,210,0,143,0,210,0,144,0,211,0,145,0,211,0,144,0,211,0,145,0,212,0,146,0,212,0,145,0,212,0,146,0,213,0,147,0,213,0,146,0,213,0,147,0,214,0,148,0,214,0,147,0,214,0,148,0,215,0,149,0,215,0,148,0,215,0,149,0,216,0,150,0,216,0,149,0,216,0,150,0,217,0,151,0,217,0,150,0,217,0,151,0,218,0,152,0,218,0,151,0,218,0,152,0,219,0,153,0,219,0,152,0,219,0,153,0,220,0,154,
+0,220,0,153,0,220,0,154,0,221,0,155,0,221,0,154,0,221,0,155,0,222,0,156,0,222,0,155,0,222,0,156,0,223,0,157,0,223,0,156,0,223,0,157,0,224,0,158,0,224,0,157,0,224,0,158,0,225,0,159,0,225,0,158,0,225,0,159,0,226,0,160,0,226,0,159,0,226,0,160,0,227,0,161,0,227,0,160,0,227,0,161,0,228,0,162,0,228,0,161,0,228,0,162,0,229,0,163,0,229,0,162,0,229,0,163,0,230,0,164,0,230,0,163,0,230,0,164,0,231,0,165,0,231,0,164,0,231,0,165,0,232,0,166,0,232,0,165,0,232,0,166,0,233,0,167,0,233,0,166,0,233,0,167,0,234,0,168,
+0,234,0,167,0,234,0,168,0,235,0,169,0,235,0,168,0,235,0,169,0,236,0,170,0,236,0,169,0,236,0,170,0,237,0,171,0,237,0,170,0,237,0,171,0,238,0,172,0,238,0,171,0,238,0,172,0,239,0,173,0,239,0,172,0,239,0,173,0,240,0,174,0,240,0,173,0,240,0,174,0,241,0,175,0,241,0,174,0,241,0,175,0,242,0,176,0,242,0,175,0,242,0,176,0,243,0,177,0,243,0,176,0,243,0,177,0,244,0,178,0,244,0,177,0,244,0,178,0,245,0,179,0,245,0,178,0,245,0,179,0,246,0,180,0,246,0,179,0,246,0,180,0,247,0,181,0,247,0,180,0,247,0,181,0,248,0,182,
+0,248,0,181,0,248,0,182,0,249,0,183,0,249,0,182,0,249,0,183,0,250,0,184,0,250,0,183,0,250,0,184,0,251,0,185,0,251,0,184,0,251,0,185,0,252,0,186,0,252,0,185,0,252,0,186,0,253,0,187,0,253,0,186,0,253,0,187,0,254,0,188,0,254,0,187,0,254,0,188,0,255,0,189,0,255,0,188,0,255,0,189,0,0,1,190,0,0,1,189,0,0,1,190,0,1,1,191,0,1,1,190,0,1,1,191,0,2,1,192,0,2,1,191,0,2,1,192,0,3,1,193,0,3,1,192,0,3,1,193,0,4,1,194,0,4,1,193,0,4,1,194,0,5,1,195,0,5,1,194,0,5,1,195,0,6,1,196,0,6,1,195,0,6,1,196,0,7,1,197,0,7,1,
+196,0,8,1,198,0,9,1,199,0,9,1,198,0,9,1,199,0,10,1,200,0,10,1,199,0,10,1,200,0,11,1,201,0,11,1,200,0,11,1,201,0,12,1,202,0,12,1,201,0,12,1,202,0,13,1,203,0,13,1,202,0,13,1,203,0,14,1,204,0,14,1,203,0,14,1,204,0,15,1,205,0,15,1,204,0,15,1,205,0,16,1,206,0,16,1,205,0,16,1,206,0,17,1,207,0,17,1,206,0,17,1,207,0,18,1,208,0,18,1,207,0,18,1,208,0,19,1,209,0,19,1,208,0,19,1,209,0,20,1,210,0,20,1,209,0,20,1,210,0,21,1,211,0,21,1,210,0,21,1,211,0,22,1,212,0,22,1,211,0,22,1,212,0,23,1,213,0,23,1,212,0,23,1,
+213,0,24,1,214,0,24,1,213,0,24,1,214,0,25,1,215,0,25,1,214,0,25,1,215,0,26,1,216,0,26,1,215,0,26,1,216,0,27,1,217,0,27,1,216,0,27,1,217,0,28,1,218,0,28,1,217,0,28,1,218,0,29,1,219,0,29,1,218,0,29,1,219,0,30,1,220,0,30,1,219,0,30,1,220,0,31,1,221,0,31,1,220,0,31,1,221,0,32,1,222,0,32,1,221,0,32,1,222,0,33,1,223,0,33,1,222,0,33,1,223,0,34,1,224,0,34,1,223,0,34,1,224,0,35,1,225,0,35,1,224,0,35,1,225,0,36,1,226,0,36,1,225,0,36,1,226,0,37,1,227,0,37,1,226,0,37,1,227,0,38,1,228,0,38,1,227,0,38,1,228,0,
+39,1,229,0,39,1,228,0,39,1,229,0,40,1,230,0,40,1,229,0,40,1,230,0,41,1,231,0,41,1,230,0,41,1,231,0,42,1,232,0,42,1,231,0,42,1,232,0,43,1,233,0,43,1,232,0,43,1,233,0,44,1,234,0,44,1,233,0,44,1,234,0,45,1,235,0,45,1,234,0,45,1,235,0,46,1,236,0,46,1,235,0,46,1,236,0,47,1,237,0,47,1,236,0,47,1,237,0,48,1,238,0,48,1,237,0,48,1,238,0,49,1,239,0,49,1,238,0,49,1,239,0,50,1,240,0,50,1,239,0,50,1,240,0,51,1,241,0,51,1,240,0,51,1,241,0,52,1,242,0,52,1,241,0,52,1,242,0,53,1,243,0,53,1,242,0,53,1,243,0,54,1,244,
+0,54,1,243,0,54,1,244,0,55,1,245,0,55,1,244,0,55,1,245,0,56,1,246,0,56,1,245,0,56,1,246,0,57,1,247,0,57,1,246,0,57,1,247,0,58,1,248,0,58,1,247,0,58,1,248,0,59,1,249,0,59,1,248,0,59,1,249,0,60,1,250,0,60,1,249,0,60,1,250,0,61,1,251,0,61,1,250,0,61,1,251,0,62,1,252,0,62,1,251,0,62,1,252,0,63,1,253,0,63,1,252,0,63,1,253,0,64,1,254,0,64,1,253,0,64,1,254,0,65,1,255,0,65,1,254,0,65,1,255,0,66,1,0,1,66,1,255,0,66,1,0,1,67,1,1,1,67,1,0,1,67,1,1,1,68,1,2,1,68,1,1,1,68,1,2,1,69,1,3,1,69,1,2,1,69,1,3,1,70,1,
+4,1,70,1,3,1,70,1,4,1,71,1,5,1,71,1,4,1,71,1,5,1,72,1,6,1,72,1,5,1,72,1,6,1,73,1,7,1,73,1,6,1,74,1,8,1,75,1,9,1,75,1,8,1,75,1,9,1,76,1,10,1,76,1,9,1,76,1,10,1,77,1,11,1,77,1,10,1,77,1,11,1,78,1,12,1,78,1,11,1,78,1,12,1,79,1,13,1,79,1,12,1,79,1,13,1,80,1,14,1,80,1,13,1,80,1,14,1,81,1,15,1,81,1,14,1,81,1,15,1,82,1,16,1,82,1,15,1,82,1,16,1,83,1,17,1,83,1,16,1,83,1,17,1,84,1,18,1,84,1,17,1,84,1,18,1,85,1,19,1,85,1,18,1,85,1,19,1,86,1,20,1,86,1,19,1,86,1,20,1,87,1,21,1,87,1,20,1,87,1,21,1,88,1,22,1,88,
+1,21,1,88,1,22,1,89,1,23,1,89,1,22,1,89,1,23,1,90,1,24,1,90,1,23,1,90,1,24,1,91,1,25,1,91,1,24,1,91,1,25,1,92,1,26,1,92,1,25,1,92,1,26,1,93,1,27,1,93,1,26,1,93,1,27,1,94,1,28,1,94,1,27,1,94,1,28,1,95,1,29,1,95,1,28,1,95,1,29,1,96,1,30,1,96,1,29,1,96,1,30,1,97,1,31,1,97,1,30,1,97,1,31,1,98,1,32,1,98,1,31,1,98,1,32,1,99,1,33,1,99,1,32,1,99,1,33,1,100,1,34,1,100,1,33,1,100,1,34,1,101,1,35,1,101,1,34,1,101,1,35,1,102,1,36,1,102,1,35,1,102,1,36,1,103,1,37,1,103,1,36,1,103,1,37,1,104,1,38,1,104,1,37,1,
+104,1,38,1,105,1,39,1,105,1,38,1,105,1,39,1,106,1,40,1,106,1,39,1,106,1,40,1,107,1,41,1,107,1,40,1,107,1,41,1,108,1,42,1,108,1,41,1,108,1,42,1,109,1,43,1,109,1,42,1,109,1,43,1,110,1,44,1,110,1,43,1,110,1,44,1,111,1,45,1,111,1,44,1,111,1,45,1,112,1,46,1,112,1,45,1,112,1,46,1,113,1,47,1,113,1,46,1,113,1,47,1,114,1,48,1,114,1,47,1,114,1,48,1,115,1,49,1,115,1,48,1,115,1,49,1,116,1,50,1,116,1,49,1,116,1,50,1,117,1,51,1,117,1,50,1,117,1,51,1,118,1,52,1,118,1,51,1,118,1,52,1,119,1,53,1,119,1,52,1,119,1,
+53,1,120,1,54,1,120,1,53,1,120,1,54,1,121,1,55,1,121,1,54,1,121,1,55,1,122,1,56,1,122,1,55,1,122,1,56,1,123,1,57,1,123,1,56,1,123,1,57,1,124,1,58,1,124,1,57,1,124,1,58,1,125,1,59,1,125,1,58,1,125,1,59,1,126,1,60,1,126,1,59,1,126,1,60,1,127,1,61,1,127,1,60,1,127,1,61,1,128,1,62,1,128,1,61,1,128,1,62,1,129,1,63,1,129,1,62,1,129,1,63,1,130,1,64,1,130,1,63,1,130,1,64,1,131,1,65,1,131,1,64,1,131,1,65,1,132,1,66,1,132,1,65,1,132,1,66,1,133,1,67,1,133,1,66,1,133,1,67,1,134,1,68,1,134,1,67,1,134,1,68,1,135,
+1,69,1,135,1,68,1,135,1,69,1,136,1,70,1,136,1,69,1,136,1,70,1,137,1,71,1,137,1,70,1,137,1,71,1,138,1,72,1,138,1,71,1,138,1,72,1,139,1,73,1,139,1,72,1,140,1,74,1,141,1,75,1,141,1,74,1,141,1,75,1,142,1,76,1,142,1,75,1,142,1,76,1,143,1,77,1,143,1,76,1,143,1,77,1,144,1,78,1,144,1,77,1,144,1,78,1,145,1,79,1,145,1,78,1,145,1,79,1,146,1,80,1,146,1,79,1,146,1,80,1,147,1,81,1,147,1,80,1,147,1,81,1,148,1,82,1,148,1,81,1,148,1,82,1,149,1,83,1,149,1,82,1,149,1,83,1,150,1,84,1,150,1,83,1,150,1,84,1,151,1,85,1,
+151,1,84,1,151,1,85,1,152,1,86,1,152,1,85,1,152,1,86,1,153,1,87,1,153,1,86,1,153,1,87,1,154,1,88,1,154,1,87,1,154,1,88,1,155,1,89,1,155,1,88,1,155,1,89,1,156,1,90,1,156,1,89,1,156,1,90,1,157,1,91,1,157,1,90,1,157,1,91,1,158,1,92,1,158,1,91,1,158,1,92,1,159,1,93,1,159,1,92,1,159,1,93,1,160,1,94,1,160,1,93,1,160,1,94,1,161,1,95,1,161,1,94,1,161,1,95,1,162,1,96,1,162,1,95,1,162,1,96,1,163,1,97,1,163,1,96,1,163,1,97,1,164,1,98,1,164,1,97,1,164,1,98,1,165,1,99,1,165,1,98,1,165,1,99,1,166,1,100,1,166,1,
+99,1,166,1,100,1,167,1,101,1,167,1,100,1,167,1,101,1,168,1,102,1,168,1,101,1,168,1,102,1,169,1,103,1,169,1,102,1,169,1,103,1,170,1,104,1,170,1,103,1,170,1,104,1,171,1,105,1,171,1,104,1,171,1,105,1,172,1,106,1,172,1,105,1,172,1,106,1,173,1,107,1,173,1,106,1,173,1,107,1,174,1,108,1,174,1,107,1,174,1,108,1,175,1,109,1,175,1,108,1,175,1,109,1,176,1,110,1,176,1,109,1,176,1,110,1,177,1,111,1,177,1,110,1,177,1,111,1,178,1,112,1,178,1,111,1,178,1,112,1,179,1,113,1,179,1,112,1,179,1,113,1,180,1,114,1,180,