Browse Source

lot changes

Nikolay Suslov 7 years ago
parent
commit
3385444271
100 changed files with 83957 additions and 16849 deletions
  1. 1 1
      lib/nodejs/reflector.js
  2. 1 1
      package.json
  3. 8 0
      public/aframe2/assets.json
  4. 4126 0
      public/assets/avatars/female/avatar1.gltf
  5. BIN
      public/assets/avatars/female/best_avatar2-all.bin
  6. BIN
      public/assets/avatars/female/brown_eye.png
  7. BIN
      public/assets/avatars/female/eyebrow001.png
  8. BIN
      public/assets/avatars/female/eyelashes01.png
  9. BIN
      public/assets/avatars/female/long01_diffuse.png
  10. BIN
      public/assets/avatars/female/young_lightskinned_female_diffuse.png
  11. BIN
      public/assets/avatars/ico/female.jpg
  12. BIN
      public/assets/avatars/ico/male.jpg
  13. BIN
      public/assets/avatars/ico/simple.jpg
  14. BIN
      public/assets/avatars/male/avatar1.bin
  15. 1678 0
      public/assets/avatars/male/avatar1.gltf
  16. BIN
      public/assets/avatars/male/brown_eye.png
  17. BIN
      public/assets/avatars/male/eyebrow001.png
  18. BIN
      public/assets/avatars/male/male_casualsuit01_diffuse.png
  19. BIN
      public/assets/avatars/male/male_casualsuit01_normal.png
  20. BIN
      public/assets/avatars/male/middleage_lightskinned_male_diffuse.png
  21. BIN
      public/assets/avatars/male/short02_diffuse.png
  22. 64 24
      public/index.html
  23. 8 0
      public/vr/assets.json
  24. BIN
      public/vr/assets/MarineCv2_color.jpg
  25. BIN
      public/vr/assets/images/planeDiffuse.png
  26. 0 10
      public/vr/assets/marine_anims_core.json
  27. 0 867
      public/vr/assets/pirouette.bvh
  28. 0 225
      public/vr/assets/plane.dae
  29. BIN
      public/vr/assets/sky1.jpg
  30. BIN
      public/vr/assets/sky3.jpg
  31. 9 14
      public/vr/index.vwf.yaml
  32. BIN
      public/vr/webimg.jpg
  33. 25 10
      public/web/lib/app.css
  34. 188 58
      public/web/lib/app.js
  35. 578 0
      public/web/lib/cell.js
  36. 30 0
      public/web/lib/he.js
  37. 14484 0
      public/web/lib/mdc/dist/material-components-web.css
  38. 12483 0
      public/web/lib/mdc/dist/material-components-web.js
  39. 5 0
      public/web/lib/mdc/dist/material-components-web.min.css
  40. 5 0
      public/web/lib/mdc/dist/material-components-web.min.js
  41. 1 1
      public/webapps.json
  42. 53 32
      support/client/lib/index.html
  43. 6 5
      support/client/lib/vwf.js
  44. 472 200
      support/client/lib/vwf/model/aframe/addon/monument-app.js
  45. 166 149
      support/client/lib/vwf/model/aframe/aframe-master.js
  46. 0 0
      support/client/lib/vwf/model/aframe/aframe-master.js.map
  47. 0 0
      support/client/lib/vwf/model/aframe/aframe-master.min.js
  48. 0 0
      support/client/lib/vwf/model/aframe/aframe-master.min.js.map
  49. 17987 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.controls.js
  50. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.controls.min.js
  51. 5807 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.js
  52. 6411 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.loaders.js
  53. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.loaders.min.js
  54. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.min.js
  55. 16845 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.misc.js
  56. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.misc.min.js
  57. 1215 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.pathfinding.js
  58. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.pathfinding.min.js
  59. 75 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.primitives.js
  60. 0 0
      support/client/lib/vwf/model/aframe/extras/aframe-extras.primitives.min.js
  61. 75 0
      support/client/lib/vwf/model/aframe/extras/components/grab.js
  62. 0 0
      support/client/lib/vwf/model/aframe/extras/components/grab.min.js
  63. 151 0
      support/client/lib/vwf/model/aframe/extras/components/sphere-collider.js
  64. 0 0
      support/client/lib/vwf/model/aframe/extras/components/sphere-collider.min.js
  65. 150 0
      support/client/lib/vwf/model/aframe/extras/components/three-model.js
  66. 0 0
      support/client/lib/vwf/model/aframe/extras/components/three-model.min.js
  67. 89 0
      support/client/lib/vwf/model/aframeComponent.js
  68. 9 3
      support/client/lib/vwf/view/aframe.js
  69. 158 2
      support/client/lib/vwf/view/editor-new.js
  70. 16 1
      support/client/lib/vwf/view/lib/editorLive.css
  71. 0 21
      support/client/lib/vwf/view/lib/mdc/dist/material-components-web.css
  72. 0 81
      support/client/lib/vwf/view/lib/mdc/dist/material-components-web.css-entry
  73. 568 394
      support/client/lib/vwf/view/lib/mdc/dist/material-components-web.js
  74. 5 0
      support/client/lib/vwf/view/lib/mdc/dist/material-components-web.min.css
  75. 5 0
      support/client/lib/vwf/view/lib/mdc/dist/material-components-web.min.js
  76. 0 20
      support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.css
  77. 0 82
      support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.css-entry
  78. 0 243
      support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.js
  79. 0 178
      support/client/lib/vwf/view/lib/mdc/dist/mdc.autoInit.js
  80. 0 438
      support/client/lib/vwf/view/lib/mdc/dist/mdc.base.js
  81. 0 1059
      support/client/lib/vwf/view/lib/mdc/dist/mdc.button.css
  82. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.button.css-entry
  83. 0 457
      support/client/lib/vwf/view/lib/mdc/dist/mdc.card.css
  84. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.card.css-entry
  85. 0 1015
      support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.css
  86. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.css-entry
  87. 0 2585
      support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.js
  88. 0 449
      support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.css
  89. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.css-entry
  90. 0 2486
      support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.js
  91. 0 1888
      support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.css
  92. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.css-entry
  93. 0 1609
      support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.js
  94. 0 143
      support/client/lib/vwf/view/lib/mdc/dist/mdc.elevation.css
  95. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.elevation.css-entry
  96. 0 489
      support/client/lib/vwf/view/lib/mdc/dist/mdc.fab.css
  97. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.fab.css-entry
  98. 0 279
      support/client/lib/vwf/view/lib/mdc/dist/mdc.form-field.css
  99. 0 83
      support/client/lib/vwf/view/lib/mdc/dist/mdc.form-field.css-entry
  100. 0 666
      support/client/lib/vwf/view/lib/mdc/dist/mdc.formField.js

+ 1 - 1
lib/nodejs/reflector.js

@@ -70,7 +70,7 @@ function OnConnection( socket ) {
             }
             var json = JSON.stringify(obj);
             socket.emit('getWebAppUpdate', json);
-}, 5000);
+}, 3000);
 
 //          socket.on('getWebAppUpdate', function(msg){
           

+ 1 - 1
package.json

@@ -4,7 +4,7 @@
   "version": "0.0.1",
   "author": "Nikolai Suslov",
   "scripts": {
-    "start": "node ./node-server.js --applicationPath=./public -p 4007",
+    "start": "node ./node-server.js --applicationPath=./public -p 3001",
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "directories": {

+ 8 - 0
public/aframe2/assets.json

@@ -14,5 +14,13 @@
      "bg2":{
         "tag": "img",
         "src": "/../assets/checker.jpg"
+    },
+    "maleAvatar":{
+        "tag": "a-asset-item",
+        "src": "/../assets/avatars/male/avatar1.gltf"
+    },
+    "femaleAvatar":{
+        "tag": "a-asset-item",
+        "src": "/../assets/avatars/female/avatar1.gltf"
     }
 }

+ 4126 - 0
public/assets/avatars/female/avatar1.gltf

@@ -0,0 +1,4126 @@
+{
+    "accessors" : [
+        {
+            "bufferView" : 0, 
+            "componentType" : 5123, 
+            "count" : 12324, 
+            "max" : [
+                3311
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 1, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                0.1215900182723999, 
+                1.542199969291687, 
+                0.1253499984741211
+            ], 
+            "min" : [
+                -0.1215900182723999, 
+                0.8676689863204956, 
+                -0.0951400026679039
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 2, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                0.9957884550094604, 
+                0.999969482421875, 
+                0.9978942275047302
+            ], 
+            "min" : [
+                -0.9980773329734802, 
+                -0.8800622820854187, 
+                -0.999969482421875
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 3, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                0.9976367950439453, 
+                0.9970922470092773, 
+                0.9759458899497986, 
+                1.0
+            ], 
+            "min" : [
+                -0.999966025352478, 
+                -0.9978456497192383, 
+                -0.9815999269485474, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 4, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                0.9761999845504761, 
+                0.9894000003114343
+            ], 
+            "min" : [
+                0.010599999688565731, 
+                0.011900007724761963
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 5, 
+            "componentType" : 5123, 
+            "count" : 3312, 
+            "max" : [
+                49, 
+                45, 
+                44, 
+                43
+            ], 
+            "min" : [
+                1, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 6, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                1.0, 
+                0.9990699887275696, 
+                0.9956300258636475, 
+                0.9629200100898743
+            ], 
+            "min" : [
+                0.0001961899979505688, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 7, 
+            "componentType" : 5123, 
+            "count" : 3312, 
+            "max" : [
+                24, 
+                5, 
+                4, 
+                0
+            ], 
+            "min" : [
+                0, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 8, 
+            "componentType" : 5126, 
+            "count" : 3312, 
+            "max" : [
+                0.937250018119812, 
+                0.9321900010108948, 
+                0.8674299716949463, 
+                0.0
+            ], 
+            "min" : [
+                0.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 9, 
+            "componentType" : 5121, 
+            "count" : 576, 
+            "max" : [
+                123
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 10, 
+            "componentType" : 5126, 
+            "count" : 124, 
+            "max" : [
+                0.05520699918270111, 
+                1.4460698366165161, 
+                0.13106998801231384
+            ], 
+            "min" : [
+                -0.05522000044584274, 
+                1.4344898462295532, 
+                0.10054999589920044
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 11, 
+            "componentType" : 5126, 
+            "count" : 124, 
+            "max" : [
+                0.9367656707763672, 
+                0.8156377077102661, 
+                0.9744865298271179
+            ], 
+            "min" : [
+                -0.9374065399169922, 
+                -0.8702048063278198, 
+                -0.12506484985351562
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 12, 
+            "componentType" : 5126, 
+            "count" : 124, 
+            "max" : [
+                0.9972963333129883, 
+                0.5083905458450317, 
+                0.9937196373939514, 
+                1.0
+            ], 
+            "min" : [
+                -0.01899896189570427, 
+                -0.5079329013824463, 
+                -0.9938132166862488, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 13, 
+            "componentType" : 5126, 
+            "count" : 124, 
+            "max" : [
+                0.9628000259399414, 
+                0.7597000002861023
+            ], 
+            "min" : [
+                0.02710000053048134, 
+                0.3176000118255615
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 14, 
+            "componentType" : 5123, 
+            "count" : 124, 
+            "max" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "min" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 15, 
+            "componentType" : 5126, 
+            "count" : 124, 
+            "max" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "min" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 16, 
+            "componentType" : 5121, 
+            "count" : 1104, 
+            "max" : [
+                249
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 17, 
+            "componentType" : 5126, 
+            "count" : 250, 
+            "max" : [
+                0.04615199938416481, 
+                1.438139796257019, 
+                0.12537997961044312
+            ], 
+            "min" : [
+                -0.04615199938416481, 
+                1.42277991771698, 
+                0.1136699914932251
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 18, 
+            "componentType" : 5126, 
+            "count" : 250, 
+            "max" : [
+                0.8809472918510437, 
+                0.9921872615814209, 
+                0.9940488934516907
+            ], 
+            "min" : [
+                -0.8809472918510437, 
+                -0.9970396757125854, 
+                -0.0798364207148552
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 19, 
+            "componentType" : 5126, 
+            "count" : 250, 
+            "max" : [
+                0.9999721050262451, 
+                0.5831143856048584, 
+                0.25745096802711487, 
+                1.0
+            ], 
+            "min" : [
+                -0.9999721050262451, 
+                -0.8864092826843262, 
+                -0.3186206817626953, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 20, 
+            "componentType" : 5126, 
+            "count" : 250, 
+            "max" : [
+                0.9770100116729736, 
+                0.9707060009241104
+            ], 
+            "min" : [
+                0.06547699868679047, 
+                0.03728002309799194
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 21, 
+            "componentType" : 5123, 
+            "count" : 250, 
+            "max" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "min" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 22, 
+            "componentType" : 5126, 
+            "count" : 250, 
+            "max" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "min" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 23, 
+            "componentType" : 5121, 
+            "count" : 516, 
+            "max" : [
+                95
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 24, 
+            "componentType" : 5126, 
+            "count" : 96, 
+            "max" : [
+                0.04213299974799156, 
+                1.4449799060821533, 
+                0.12032999098300934
+            ], 
+            "min" : [
+                -0.04213299974799156, 
+                1.4173599481582642, 
+                0.09959699213504791
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 25, 
+            "componentType" : 5126, 
+            "count" : 96, 
+            "max" : [
+                0.921872615814209, 
+                0.9279763102531433, 
+                0.9887996912002563
+            ], 
+            "min" : [
+                -0.921872615814209, 
+                -0.9270913004875183, 
+                -0.21991637349128723
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 26, 
+            "componentType" : 5126, 
+            "count" : 96, 
+            "max" : [
+                0.9987075328826904, 
+                0.42667314410209656, 
+                0.9906246066093445, 
+                1.0
+            ], 
+            "min" : [
+                -0.9987000823020935, 
+                -0.4160304367542267, 
+                -0.9905717968940735, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 27, 
+            "componentType" : 5126, 
+            "count" : 96, 
+            "max" : [
+                0.964900016784668, 
+                0.9673000015318394
+            ], 
+            "min" : [
+                0.02759999968111515, 
+                0.028400003910064697
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 28, 
+            "componentType" : 5123, 
+            "count" : 96, 
+            "max" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "min" : [
+                44, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 29, 
+            "componentType" : 5126, 
+            "count" : 96, 
+            "max" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "min" : [
+                1.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 30, 
+            "componentType" : 5123, 
+            "count" : 65238, 
+            "max" : [
+                11980
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 31, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                0.46851998567581177, 
+                1.533039927482605, 
+                0.2810300588607788
+            ], 
+            "min" : [
+                -0.46852004528045654, 
+                -0.0009499788284301758, 
+                -0.04755799099802971
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 32, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                0.99993896484375, 
+                0.999664306640625, 
+                0.999969482421875
+            ], 
+            "min" : [
+                -0.99993896484375, 
+                -0.999969482421875, 
+                -0.999725341796875
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 33, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                1.0, 
+                0.9999310374259949, 
+                0.9999498724937439, 
+                1.0
+            ], 
+            "min" : [
+                -0.9991563558578491, 
+                -0.9999814033508301, 
+                -0.9999862909317017, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 34, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                0.9935200214385986, 
+                0.9903929997235537
+            ], 
+            "min" : [
+                0.009208000265061855, 
+                0.02613997459411621
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 35, 
+            "componentType" : 5123, 
+            "count" : 11981, 
+            "max" : [
+                52, 
+                52, 
+                50, 
+                40
+            ], 
+            "min" : [
+                1, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 36, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                1.0, 
+                0.9998999834060669, 
+                0.9911999702453613, 
+                0.9452000260353088
+            ], 
+            "min" : [
+                0.00010001000191550702, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 37, 
+            "componentType" : 5123, 
+            "count" : 11981, 
+            "max" : [
+                27, 
+                0, 
+                0, 
+                0
+            ], 
+            "min" : [
+                0, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 38, 
+            "componentType" : 5126, 
+            "count" : 11981, 
+            "max" : [
+                0.48179998993873596, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "min" : [
+                0.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 39, 
+            "componentType" : 5123, 
+            "count" : 12576, 
+            "max" : [
+                2423
+            ], 
+            "min" : [
+                0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 40, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                0.4253399968147278, 
+                1.3130898475646973, 
+                0.18449994921684265
+            ], 
+            "min" : [
+                -0.4269900321960449, 
+                0.5056599974632263, 
+                -0.0920870378613472
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 41, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                0.9968260526657104, 
+                0.982818067073822, 
+                0.999969482421875
+            ], 
+            "min" : [
+                -0.9945066571235657, 
+                -0.9933469891548157, 
+                -0.999755859375
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 42, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                1.0, 
+                0.9706400036811829, 
+                0.999703049659729, 
+                1.0
+            ], 
+            "min" : [
+                -0.9999986290931702, 
+                -0.9543471336364746, 
+                -0.9995613098144531, 
+                1.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 43, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                0.984499990940094, 
+                0.9832000005990267
+            ], 
+            "min" : [
+                0.008500000461935997, 
+                0.06430000066757202
+            ], 
+            "type" : "VEC2"
+        }, 
+        {
+            "bufferView" : 44, 
+            "componentType" : 5123, 
+            "count" : 2424, 
+            "max" : [
+                50, 
+                49, 
+                45, 
+                24
+            ], 
+            "min" : [
+                1, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 45, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                1.0, 
+                0.9998999834060669, 
+                0.9853299856185913, 
+                0.9654099941253662
+            ], 
+            "min" : [
+                0.0001036100002238527, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 46, 
+            "componentType" : 5123, 
+            "count" : 2424, 
+            "max" : [
+                4, 
+                3, 
+                0, 
+                0
+            ], 
+            "min" : [
+                0, 
+                0, 
+                0, 
+                0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 47, 
+            "componentType" : 5126, 
+            "count" : 2424, 
+            "max" : [
+                0.9851300120353699, 
+                0.6431900262832642, 
+                0.0, 
+                0.0
+            ], 
+            "min" : [
+                0.0, 
+                0.0, 
+                0.0, 
+                0.0
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 48, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 49, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 50, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 51, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 52, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 53, 
+            "componentType" : 5126, 
+            "count" : 53, 
+            "max" : [
+                1.0, 
+                0.9910596013069153, 
+                1.0, 
+                0.0, 
+                1.0, 
+                0.9998289942741394, 
+                0.5796707272529602, 
+                0.0, 
+                0.934275209903717, 
+                1.0000001192092896, 
+                0.9999011754989624, 
+                0.0, 
+                1.2161815166473389, 
+                0.7877880334854126, 
+                0.9474417567253113, 
+                1.0
+            ], 
+            "min" : [
+                -0.7420006394386292, 
+                -0.9910596013069153, 
+                -0.9548930525779724, 
+                0.0, 
+                -0.9907370209693909, 
+                -0.9958484172821045, 
+                -0.9965822696685791, 
+                0.0, 
+                -0.9342756271362305, 
+                -0.579670786857605, 
+                -0.9978558421134949, 
+                0.0, 
+                -1.2161815166473389, 
+                -1.3914018869400024, 
+                -0.48654863238334656, 
+                1.0
+            ], 
+            "type" : "MAT4"
+        }, 
+        {
+            "bufferView" : 54, 
+            "componentType" : 5126, 
+            "count" : 4, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.125
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 55, 
+            "componentType" : 5126, 
+            "count" : 4, 
+            "max" : [
+                0.7884735465049744, 
+                0.08176314830780029, 
+                -0.0011969658080488443
+            ], 
+            "min" : [
+                0.7417046427726746, 
+                0.08176306635141373, 
+                -0.002107842592522502
+            ], 
+            "type" : "VEC3"
+        }, 
+        {
+            "bufferView" : 56, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 57, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                -0.5999687910079956, 
+                -0.33633434772491455, 
+                -0.5962396860122681, 
+                0.37215855717658997
+            ], 
+            "min" : [
+                -0.6201735138893127, 
+                -0.37924835085868835, 
+                -0.6213138103485107, 
+                0.33611929416656494
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 58, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 59, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.4421042501926422, 
+                0.011904798448085785, 
+                0.013294422999024391, 
+                0.9137520790100098
+            ], 
+            "min" : [
+                0.4062466323375702, 
+                -0.009216354228556156, 
+                -0.017155887559056282, 
+                0.8967205882072449
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 60, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 61, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                -0.021287968382239342, 
+                0.06332888454198837, 
+                0.010340827517211437, 
+                0.9995008707046509
+            ], 
+            "min" : [
+                -0.06070946902036667, 
+                -0.05889498442411423, 
+                -0.009969276376068592, 
+                0.9961523413658142
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 62, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 63, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.020853929221630096, 
+                0.05295494198799133, 
+                -0.7399250268936157, 
+                0.6632608771324158
+            ], 
+            "min" : [
+                -0.03674810379743576, 
+                -0.15632538497447968, 
+                -0.8035672903060913, 
+                0.5935777425765991
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 64, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 65, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.16836342215538025, 
+                0.06388574838638306, 
+                -0.48674866557121277, 
+                0.8505122661590576
+            ], 
+            "min" : [
+                -0.20278681814670563, 
+                -0.04155644401907921, 
+                -0.5643190741539001, 
+                0.8241376280784607
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 66, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 67, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.26978516578674316, 
+                0.2952622175216675, 
+                0.08288329839706421, 
+                0.9685210585594177
+            ], 
+            "min" : [
+                0.07734785974025726, 
+                0.22486037015914917, 
+                0.028915870934724808, 
+                0.921671986579895
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 68, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 69, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.25632283091545105, 
+                0.41171011328697205, 
+                -0.03634712100028992, 
+                0.9045922756195068
+            ], 
+            "min" : [
+                0.10462836176156998, 
+                0.38396769762039185, 
+                -0.07728578895330429, 
+                0.8848907947540283
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 70, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 71, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.0277496799826622, 
+                0.15632547438144684, 
+                0.8005712628364563, 
+                0.6609198451042175
+            ], 
+            "min" : [
+                -0.03861542418599129, 
+                -0.04017593711614609, 
+                0.739924967288971, 
+                0.5990529656410217
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 72, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 73, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.16281022131443024, 
+                0.043410323560237885, 
+                0.5643341541290283, 
+                0.8538129925727844
+            ], 
+            "min" : [
+                -0.20844075083732605, 
+                -0.07353734970092773, 
+                0.494909405708313, 
+                0.8242528438568115
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 74, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 75, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.21759033203125, 
+                -0.22542743384838104, 
+                -0.027034390717744827, 
+                0.9700818061828613
+            ], 
+            "min" : [
+                0.0774213969707489, 
+                -0.2956772446632385, 
+                -0.07212277501821518, 
+                0.9309691786766052
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 76, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 77, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.2768916189670563, 
+                -0.38008803129196167, 
+                0.08014089614152908, 
+                0.9028395414352417
+            ], 
+            "min" : [
+                0.12196023017168045, 
+                -0.40915584564208984, 
+                0.04112650454044342, 
+                0.8811683654785156
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 78, 
+            "componentType" : 5126, 
+            "count" : 1, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.49999999999999994
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 79, 
+            "componentType" : 5126, 
+            "count" : 1, 
+            "max" : [
+                0.1876019984483719, 
+                -1.5341179437911023e-09, 
+                5.65351321313301e-10, 
+                0.982245147228241
+            ], 
+            "min" : [
+                0.1876019984483719, 
+                -1.5341179437911023e-09, 
+                5.65351321313301e-10, 
+                0.982245147228241
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 80, 
+            "componentType" : 5126, 
+            "count" : 10, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 81, 
+            "componentType" : 5126, 
+            "count" : 10, 
+            "max" : [
+                -0.20165589451789856, 
+                0.00403197854757309, 
+                0.007088812533766031, 
+                0.979455828666687
+            ], 
+            "min" : [
+                -0.2060573846101761, 
+                -0.0030703546945005655, 
+                -0.003367356490343809, 
+                0.9785388112068176
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 82, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 83, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.9648845791816711, 
+                0.020070869475603104, 
+                0.2824074923992157, 
+                0.5221412777900696
+            ], 
+            "min" : [
+                -0.9627798199653625, 
+                -0.08544495701789856, 
+                -0.28509530425071716, 
+                0.004344812594354153
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 84, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 85, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.5451491475105286, 
+                0.22168633341789246, 
+                -0.008407898247241974, 
+                0.9781911969184875
+            ], 
+            "min" : [
+                0.012396088801324368, 
+                0.15246057510375977, 
+                -0.12447629868984222, 
+                0.8149073123931885
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 86, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 87, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                -0.3464522659778595, 
+                0.04076668247580528, 
+                0.0024947926867753267, 
+                0.9367862939834595
+            ], 
+            "min" : [
+                -0.6271836161613464, 
+                -0.07900172472000122, 
+                -0.061596453189849854, 
+                0.777490496635437
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 88, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 89, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.9645976424217224, 
+                0.0884048268198967, 
+                0.26158249378204346, 
+                0.528266966342926
+            ], 
+            "min" : [
+                -0.9649780988693237, 
+                -0.030773621052503586, 
+                -0.28299301862716675, 
+                0.011972772888839245
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 90, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 91, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.54500412940979, 
+                -0.15260206162929535, 
+                0.12514834105968475, 
+                0.9765299558639526
+            ], 
+            "min" : [
+                0.01958947815001011, 
+                -0.2216501384973526, 
+                0.01094491221010685, 
+                0.8148748278617859
+            ], 
+            "type" : "VEC4"
+        }, 
+        {
+            "bufferView" : 92, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                0.49999999999999994
+            ], 
+            "min" : [
+                0.0
+            ], 
+            "type" : "SCALAR"
+        }, 
+        {
+            "bufferView" : 93, 
+            "componentType" : 5126, 
+            "count" : 13, 
+            "max" : [
+                -0.3453717529773712, 
+                0.07882095128297806, 
+                0.06106660142540932, 
+                0.937202513217926
+            ], 
+            "min" : [
+                -0.6272411942481995, 
+                -0.0432673916220665, 
+                -0.003130991943180561, 
+                0.7772074341773987
+            ], 
+            "type" : "VEC4"
+        }
+    ], 
+    "animations" : [
+        {
+            "channels" : [
+                {
+                    "sampler" : 0, 
+                    "target" : {
+                        "node" : 8, 
+                        "path" : "translation"
+                    }
+                }, 
+                {
+                    "sampler" : 1, 
+                    "target" : {
+                        "node" : 8, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 2, 
+                    "target" : {
+                        "node" : 9, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 3, 
+                    "target" : {
+                        "node" : 11, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 4, 
+                    "target" : {
+                        "node" : 12, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 5, 
+                    "target" : {
+                        "node" : 13, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 6, 
+                    "target" : {
+                        "node" : 14, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 7, 
+                    "target" : {
+                        "node" : 15, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 8, 
+                    "target" : {
+                        "node" : 31, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 9, 
+                    "target" : {
+                        "node" : 32, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 10, 
+                    "target" : {
+                        "node" : 33, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 11, 
+                    "target" : {
+                        "node" : 34, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 12, 
+                    "target" : {
+                        "node" : 50, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 13, 
+                    "target" : {
+                        "node" : 51, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 14, 
+                    "target" : {
+                        "node" : 52, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 15, 
+                    "target" : {
+                        "node" : 53, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 16, 
+                    "target" : {
+                        "node" : 54, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 17, 
+                    "target" : {
+                        "node" : 56, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 18, 
+                    "target" : {
+                        "node" : 57, 
+                        "path" : "rotation"
+                    }
+                }, 
+                {
+                    "sampler" : 19, 
+                    "target" : {
+                        "node" : 58, 
+                        "path" : "rotation"
+                    }
+                }
+            ], 
+            "samplers" : [
+                {
+                    "input" : 54, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 55
+                }, 
+                {
+                    "input" : 56, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 57
+                }, 
+                {
+                    "input" : 58, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 59
+                }, 
+                {
+                    "input" : 60, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 61
+                }, 
+                {
+                    "input" : 62, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 63
+                }, 
+                {
+                    "input" : 64, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 65
+                }, 
+                {
+                    "input" : 66, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 67
+                }, 
+                {
+                    "input" : 68, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 69
+                }, 
+                {
+                    "input" : 70, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 71
+                }, 
+                {
+                    "input" : 72, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 73
+                }, 
+                {
+                    "input" : 74, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 75
+                }, 
+                {
+                    "input" : 76, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 77
+                }, 
+                {
+                    "input" : 78, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 79
+                }, 
+                {
+                    "input" : 80, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 81
+                }, 
+                {
+                    "input" : 82, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 83
+                }, 
+                {
+                    "input" : 84, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 85
+                }, 
+                {
+                    "input" : 86, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 87
+                }, 
+                {
+                    "input" : 88, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 89
+                }, 
+                {
+                    "input" : 90, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 91
+                }, 
+                {
+                    "input" : 92, 
+                    "interpolation" : "LINEAR", 
+                    "output" : 93
+                }
+            ]
+        }
+    ], 
+    "asset" : {
+        "generator" : "Khronos Blender glTF 2.0 exporter", 
+        "version" : "2.0"
+    }, 
+    "bufferViews" : [
+        {
+            "buffer" : 0, 
+            "byteLength" : 24648, 
+            "byteOffset" : 0, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 39744, 
+            "byteOffset" : 24648, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 39744, 
+            "byteOffset" : 64392, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52992, 
+            "byteOffset" : 104136, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 26496, 
+            "byteOffset" : 157128, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 26496, 
+            "byteOffset" : 183624, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52992, 
+            "byteOffset" : 210120, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 26496, 
+            "byteOffset" : 263112, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52992, 
+            "byteOffset" : 289608, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 576, 
+            "byteOffset" : 342600, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1488, 
+            "byteOffset" : 343176, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1488, 
+            "byteOffset" : 344664, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1984, 
+            "byteOffset" : 346152, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 992, 
+            "byteOffset" : 348136, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 992, 
+            "byteOffset" : 349128, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1984, 
+            "byteOffset" : 350120, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1104, 
+            "byteOffset" : 352104, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3000, 
+            "byteOffset" : 353208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3000, 
+            "byteOffset" : 356208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 4000, 
+            "byteOffset" : 359208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 2000, 
+            "byteOffset" : 363208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 2000, 
+            "byteOffset" : 365208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 4000, 
+            "byteOffset" : 367208, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 516, 
+            "byteOffset" : 371208, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1152, 
+            "byteOffset" : 371724, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1152, 
+            "byteOffset" : 372876, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1536, 
+            "byteOffset" : 374028, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 768, 
+            "byteOffset" : 375564, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 768, 
+            "byteOffset" : 376332, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 1536, 
+            "byteOffset" : 377100, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 130476, 
+            "byteOffset" : 378636, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 143772, 
+            "byteOffset" : 509112, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 143772, 
+            "byteOffset" : 652884, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 191696, 
+            "byteOffset" : 796656, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 95848, 
+            "byteOffset" : 988352, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 95848, 
+            "byteOffset" : 1084200, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 191696, 
+            "byteOffset" : 1180048, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 95848, 
+            "byteOffset" : 1371744, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 191696, 
+            "byteOffset" : 1467592, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 25152, 
+            "byteOffset" : 1659288, 
+            "target" : 34963
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 29088, 
+            "byteOffset" : 1684440, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 29088, 
+            "byteOffset" : 1713528, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 38784, 
+            "byteOffset" : 1742616, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 19392, 
+            "byteOffset" : 1781400, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 19392, 
+            "byteOffset" : 1800792, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 38784, 
+            "byteOffset" : 1820184, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 19392, 
+            "byteOffset" : 1858968, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 38784, 
+            "byteOffset" : 1878360, 
+            "target" : 34962
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1917144
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1920536
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1923928
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1927320
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1930712
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 3392, 
+            "byteOffset" : 1934104
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 16, 
+            "byteOffset" : 1937496
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 48, 
+            "byteOffset" : 1937512
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1937560
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1937612
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1937820
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1937872
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1938080
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1938132
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1938340
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1938392
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1938600
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1938652
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1938860
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1938912
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1939120
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1939172
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1939380
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1939432
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1939640
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1939692
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1939900
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1939952
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1940160
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1940212
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 4, 
+            "byteOffset" : 1940420
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 16, 
+            "byteOffset" : 1940424
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 40, 
+            "byteOffset" : 1940440
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 160, 
+            "byteOffset" : 1940480
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1940640
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1940692
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1940900
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1940952
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1941160
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1941212
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1941420
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1941472
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1941680
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1941732
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 52, 
+            "byteOffset" : 1941940
+        }, 
+        {
+            "buffer" : 0, 
+            "byteLength" : 208, 
+            "byteOffset" : 1941992
+        }
+    ], 
+    "buffers" : [
+        {
+            "byteLength" : 1942200, 
+            "uri" : "best_avatar2-all.bin"
+        }
+    ], 
+    "images" : [
+        {
+            "uri" : "young_lightskinned_female_diffuse.png"
+        }, 
+        {
+            "uri" : "eyebrow001.png"
+        }, 
+        {
+            "uri" : "eyelashes01.png"
+        }, 
+        {
+            "uri" : "long01_diffuse.png"
+        }, 
+        {
+            "uri" : "brown_eye.png"
+        }
+    ], 
+    "materials" : [
+        {
+            "alphaMode" : "BLEND", 
+            "name" : "Best_avatar_female:Body:Young_caucasian_female", 
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 0
+                }, 
+                "metallicFactor" : 0.0
+            }
+        }, 
+        {
+            "alphaMode" : "BLEND", 
+            "name" : "Best_avatar_female:Eyebrow001:Eyebrow001", 
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 1
+                }, 
+                "metallicFactor" : 0.0
+            }
+        }, 
+        {
+            "alphaMode" : "BLEND", 
+            "name" : "Best_avatar_female:Eyelashes01:Bodymaterial", 
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 2
+                }, 
+                "metallicFactor" : 0.0
+            }
+        }, 
+        {
+            "name" : "Best_avatar_female:Female_elegantsuit01:Female_elegantsuit01", 
+            "pbrMetallicRoughness" : {
+                "baseColorFactor" : [
+                    0.9737517237663269, 
+                    1.0, 
+                    1.0, 
+                    1.0
+                ], 
+                "metallicFactor" : 0.0
+            }
+        }, 
+        {
+            "alphaMode" : "BLEND", 
+            "name" : "Best_avatar_female:Long01:Long01", 
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 3
+                }, 
+                "metallicFactor" : 0.0
+            }
+        }, 
+        {
+            "alphaMode" : "BLEND", 
+            "name" : "Best_avatar_female:Low-poly:Eye_brown", 
+            "pbrMetallicRoughness" : {
+                "baseColorTexture" : {
+                    "index" : 4
+                }, 
+                "metallicFactor" : 0.0
+            }
+        }
+    ], 
+    "meshes" : [
+        {
+            "name" : "Best_avatar_female:Long01", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 5, 
+                        "JOINTS_1" : 7, 
+                        "NORMAL" : 2, 
+                        "POSITION" : 1, 
+                        "TANGENT" : 3, 
+                        "TEXCOORD_0" : 4, 
+                        "WEIGHTS_0" : 6, 
+                        "WEIGHTS_1" : 8
+                    }, 
+                    "indices" : 0, 
+                    "material" : 4
+                }
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female:Eyebrow001", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 14, 
+                        "NORMAL" : 11, 
+                        "POSITION" : 10, 
+                        "TANGENT" : 12, 
+                        "TEXCOORD_0" : 13, 
+                        "WEIGHTS_0" : 15
+                    }, 
+                    "indices" : 9, 
+                    "material" : 1
+                }
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female:Eyelashes01", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 21, 
+                        "NORMAL" : 18, 
+                        "POSITION" : 17, 
+                        "TANGENT" : 19, 
+                        "TEXCOORD_0" : 20, 
+                        "WEIGHTS_0" : 22
+                    }, 
+                    "indices" : 16, 
+                    "material" : 2
+                }
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female:Low-poly", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 28, 
+                        "NORMAL" : 25, 
+                        "POSITION" : 24, 
+                        "TANGENT" : 26, 
+                        "TEXCOORD_0" : 27, 
+                        "WEIGHTS_0" : 29
+                    }, 
+                    "indices" : 23, 
+                    "material" : 5
+                }
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female:Body", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 35, 
+                        "JOINTS_1" : 37, 
+                        "NORMAL" : 32, 
+                        "POSITION" : 31, 
+                        "TANGENT" : 33, 
+                        "TEXCOORD_0" : 34, 
+                        "WEIGHTS_0" : 36, 
+                        "WEIGHTS_1" : 38
+                    }, 
+                    "indices" : 30, 
+                    "material" : 0
+                }
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female:Female_elegantsuit01", 
+            "primitives" : [
+                {
+                    "attributes" : {
+                        "JOINTS_0" : 44, 
+                        "JOINTS_1" : 46, 
+                        "NORMAL" : 41, 
+                        "POSITION" : 40, 
+                        "TANGENT" : 42, 
+                        "TEXCOORD_0" : 43, 
+                        "WEIGHTS_0" : 45, 
+                        "WEIGHTS_1" : 47
+                    }, 
+                    "indices" : 39, 
+                    "material" : 3
+                }
+            ]
+        }
+    ], 
+    "nodes" : [
+        {
+            "children" : [
+                1, 
+                2, 
+                3, 
+                4, 
+                5, 
+                6, 
+                7
+            ], 
+            "name" : "Best_avatar_female"
+        }, 
+        {
+            "mesh" : 4, 
+            "name" : "Best_avatar_female:Body", 
+            "skin" : 0
+        }, 
+        {
+            "mesh" : 1, 
+            "name" : "Best_avatar_female:Eyebrow001", 
+            "skin" : 1
+        }, 
+        {
+            "mesh" : 2, 
+            "name" : "Best_avatar_female:Eyelashes01", 
+            "skin" : 2
+        }, 
+        {
+            "mesh" : 5, 
+            "name" : "Best_avatar_female:Female_elegantsuit01", 
+            "skin" : 3
+        }, 
+        {
+            "mesh" : 0, 
+            "name" : "Best_avatar_female:Long01", 
+            "skin" : 4
+        }, 
+        {
+            "mesh" : 3, 
+            "name" : "Best_avatar_female:Low-poly", 
+            "skin" : 5
+        }, 
+        {
+            "children" : [
+                8
+            ], 
+            "name" : "Best_avatar_female_Root", 
+            "rotation" : [
+                0.5, 
+                0.5, 
+                0.5, 
+                0.5
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                0.0, 
+                0.0, 
+                -0.02672399953007698
+            ]
+        }, 
+        {
+            "children" : [
+                9, 
+                52, 
+                56
+            ], 
+            "name" : "Best_avatar_female_pelvis", 
+            "rotation" : [
+                -0.6284248232841492, 
+                -0.3241640329360962, 
+                -0.6284247636795044, 
+                0.3241640329360962
+            ], 
+            "translation" : [
+                0.7417046427726746, 
+                0.08176306635141373, 
+                -0.0007921319920569658
+            ]
+        }, 
+        {
+            "children" : [
+                10
+            ], 
+            "name" : "Best_avatar_female_spine_01", 
+            "rotation" : [
+                0.449134886264801, 
+                -6.201337665601159e-09, 
+                2.3050027664339723e-08, 
+                0.8934639692306519
+            ], 
+            "scale" : [
+                1.0, 
+                1.0000001192092896, 
+                1.0000001192092896
+            ], 
+            "translation" : [
+                -9.46465128492946e-15, 
+                0.07186498492956161, 
+                -5.029141902923584e-08
+            ]
+        }, 
+        {
+            "children" : [
+                11
+            ], 
+            "name" : "Best_avatar_female_spine_02", 
+            "rotation" : [
+                -0.07708343118429184, 
+                2.211193273092744e-15, 
+                2.0539150043064834e-16, 
+                0.997024655342102
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                -2.1347506671854114e-16, 
+                0.06053812429308891, 
+                -5.96512109041214e-07
+            ]
+        }, 
+        {
+            "children" : [
+                12, 
+                31, 
+                50
+            ], 
+            "name" : "Best_avatar_female_spine_03", 
+            "rotation" : [
+                -0.08860477060079575, 
+                4.507579531833549e-16, 
+                -1.4226382099674596e-15, 
+                0.9960668683052063
+            ], 
+            "translation" : [
+                2.444318710094197e-22, 
+                0.07965409755706787, 
+                -1.5832483768463135e-08
+            ]
+        }, 
+        {
+            "children" : [
+                13
+            ], 
+            "name" : "Best_avatar_female_clavicle_l", 
+            "rotation" : [
+                -0.00528639554977417, 
+                -0.00012986479850951582, 
+                -0.7527257800102234, 
+                0.6583130359649658
+            ], 
+            "translation" : [
+                0.023037999868392944, 
+                0.21726809442043304, 
+                0.01508809719234705
+            ]
+        }, 
+        {
+            "children" : [
+                14
+            ], 
+            "name" : "Best_avatar_female_upperarm_l", 
+            "rotation" : [
+                0.003640782553702593, 
+                0.003911211621016264, 
+                0.0667601227760315, 
+                0.9977547526359558
+            ], 
+            "scale" : [
+                1.0000001192092896, 
+                1.0, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                -2.884829882532358e-06, 
+                0.12675486505031586, 
+                5.878973752260208e-08
+            ]
+        }, 
+        {
+            "children" : [
+                15
+            ], 
+            "name" : "Best_avatar_female_lowerarm_l", 
+            "rotation" : [
+                -2.1424000351544237e-07, 
+                -0.00015750591410323977, 
+                6.216578185558319e-08, 
+                1.0
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999998807907104, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                2.0348525140434504e-06, 
+                0.2242341786623001, 
+                3.527384251356125e-08
+            ]
+        }, 
+        {
+            "children" : [
+                16, 
+                19, 
+                22, 
+                25, 
+                28
+            ], 
+            "name" : "Best_avatar_female_hand_l", 
+            "rotation" : [
+                0.1145215705037117, 
+                0.4131719470024109, 
+                -0.0038256733678281307, 
+                0.9034152626991272
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999999403953552, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                4.412373527884483e-06, 
+                0.20876353979110718, 
+                1.8104910850524902e-06
+            ]
+        }, 
+        {
+            "children" : [
+                17
+            ], 
+            "name" : "Best_avatar_female_index_01_l", 
+            "rotation" : [
+                0.11410598456859589, 
+                0.4707288444042206, 
+                -0.0035129678435623646, 
+                0.8748611211776733
+            ], 
+            "scale" : [
+                0.9999998211860657, 
+                0.9999996423721313, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -0.010785464197397232, 
+                0.08806535601615906, 
+                0.007907651364803314
+            ]
+        }, 
+        {
+            "children" : [
+                18
+            ], 
+            "name" : "Best_avatar_female_index_02_l", 
+            "rotation" : [
+                0.11393319070339203, 
+                0.0032272126991301775, 
+                0.005158658139407635, 
+                0.9934698939323425
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999998807907104, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -3.4868717193603516e-06, 
+                0.021534793078899384, 
+                -3.390014171600342e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_index_03_l", 
+            "rotation" : [
+                0.06540317088365555, 
+                0.0001257616822840646, 
+                0.021194785833358765, 
+                0.9976338148117065
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                1.0, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -3.0994415283203125e-06, 
+                0.0192314051091671, 
+                4.4852495193481445e-06
+            ]
+        }, 
+        {
+            "children" : [
+                20
+            ], 
+            "name" : "Best_avatar_female_middle_01_l", 
+            "rotation" : [
+                0.10672897845506668, 
+                0.40408656001091003, 
+                -0.1532706469297409, 
+                0.8954503536224365
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999999403953552, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                0.002478118985891342, 
+                0.0846920758485794, 
+                -0.009664811193943024
+            ]
+        }, 
+        {
+            "children" : [
+                21
+            ], 
+            "name" : "Best_avatar_female_middle_02_l", 
+            "rotation" : [
+                0.04563915356993675, 
+                0.0013548185816034675, 
+                0.036006636917591095, 
+                0.9983079433441162
+            ], 
+            "translation" : [
+                8.016824722290039e-06, 
+                0.028464406728744507, 
+                -1.6093254089355469e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_middle_03_l", 
+            "rotation" : [
+                0.07225939631462097, 
+                6.073324129829416e-06, 
+                -0.006432712078094482, 
+                0.9973651766777039
+            ], 
+            "scale" : [
+                1.0, 
+                1.0000001192092896, 
+                1.0
+            ], 
+            "translation" : [
+                -7.972121238708496e-06, 
+                0.023355375975370407, 
+                1.1175870895385742e-07
+            ]
+        }, 
+        {
+            "children" : [
+                23
+            ], 
+            "name" : "Best_avatar_female_pinky_01_l", 
+            "rotation" : [
+                0.052524276077747345, 
+                0.2900109589099884, 
+                -0.30873745679855347, 
+                0.9043318033218384
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999998211860657, 
+                0.9999998211860657
+            ], 
+            "translation" : [
+                0.027982842177152634, 
+                0.0695890337228775, 
+                -0.026302970945835114
+            ]
+        }, 
+        {
+            "children" : [
+                24
+            ], 
+            "name" : "Best_avatar_female_pinky_02_l", 
+            "rotation" : [
+                0.08278276026248932, 
+                0.001266013365238905, 
+                0.029449669644236565, 
+                0.9961315989494324
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999999403953552, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                2.682209014892578e-07, 
+                0.017829496413469315, 
+                -4.936009645462036e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_pinky_03_l", 
+            "rotation" : [
+                -0.011176256462931633, 
+                1.599310962774325e-05, 
+                -0.012756619602441788, 
+                0.999856173992157
+            ], 
+            "translation" : [
+                -5.513429641723633e-07, 
+                0.013116702437400818, 
+                -2.436339855194092e-06
+            ]
+        }, 
+        {
+            "children" : [
+                26
+            ], 
+            "name" : "Best_avatar_female_ring_01_l", 
+            "rotation" : [
+                0.05970457196235657, 
+                0.3832201063632965, 
+                -0.2316708117723465, 
+                0.8921358585357666
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999997615814209, 
+                0.9999998211860657
+            ], 
+            "translation" : [
+                0.014189835637807846, 
+                0.07856208086013794, 
+                -0.019964367151260376
+            ]
+        }, 
+        {
+            "children" : [
+                27
+            ], 
+            "name" : "Best_avatar_female_ring_02_l", 
+            "rotation" : [
+                0.06158512085676193, 
+                0.0011121106799691916, 
+                0.0420130118727684, 
+                0.9972166419029236
+            ], 
+            "translation" : [
+                1.1920928955078125e-07, 
+                0.024951666593551636, 
+                -8.568167686462402e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_ring_03_l", 
+            "rotation" : [
+                0.05811428278684616, 
+                -5.113460429129191e-05, 
+                -0.02301696129143238, 
+                0.9980446100234985
+            ], 
+            "scale" : [
+                1.0000001192092896, 
+                1.0, 
+                1.0
+            ], 
+            "translation" : [
+                2.3990869522094727e-06, 
+                0.02076645940542221, 
+                3.3080577850341797e-06
+            ]
+        }, 
+        {
+            "children" : [
+                29
+            ], 
+            "name" : "Best_avatar_female_thumb_01_l", 
+            "rotation" : [
+                0.27364686131477356, 
+                0.7288111448287964, 
+                0.4466920793056488, 
+                0.44092848896980286
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999997615814209, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -0.012022789567708969, 
+                0.03276778757572174, 
+                0.012339107692241669
+            ]
+        }, 
+        {
+            "children" : [
+                30
+            ], 
+            "name" : "Best_avatar_female_thumb_02_l", 
+            "rotation" : [
+                0.07393285632133484, 
+                -0.01921752095222473, 
+                -0.18499884009361267, 
+                0.9797654151916504
+            ], 
+            "scale" : [
+                1.0, 
+                1.0, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                -8.959323167800903e-07, 
+                0.02588532865047455, 
+                2.4437904357910156e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_thumb_03_l", 
+            "rotation" : [
+                0.14480456709861755, 
+                -0.004902568180114031, 
+                -0.033484406769275665, 
+                0.9888814687728882
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                1.0, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                2.115964889526367e-06, 
+                0.030100449919700623, 
+                -4.470348358154297e-08
+            ]
+        }, 
+        {
+            "children" : [
+                32
+            ], 
+            "name" : "Best_avatar_female_clavicle_r", 
+            "rotation" : [
+                -0.0052863433957099915, 
+                0.0001299259893130511, 
+                0.7527257800102234, 
+                0.6583130359649658
+            ], 
+            "translation" : [
+                -0.023037999868392944, 
+                0.21726810932159424, 
+                0.015088099054992199
+            ]
+        }, 
+        {
+            "children" : [
+                33
+            ], 
+            "name" : "Best_avatar_female_upperarm_r", 
+            "rotation" : [
+                0.003640736686065793, 
+                -0.003911185078322887, 
+                -0.0667601227760315, 
+                0.9977547526359558
+            ], 
+            "scale" : [
+                1.0000001192092896, 
+                1.0, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                2.8866343200206757e-06, 
+                0.12675485014915466, 
+                4.819594323635101e-08
+            ]
+        }, 
+        {
+            "children" : [
+                34
+            ], 
+            "name" : "Best_avatar_female_lowerarm_r", 
+            "rotation" : [
+                -1.0248761128650585e-07, 
+                0.00015750768943689764, 
+                -8.195638656616211e-08, 
+                1.0
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                -2.0348234102129936e-06, 
+                0.2242341786623001, 
+                3.3760443329811096e-08
+            ]
+        }, 
+        {
+            "children" : [
+                35, 
+                38, 
+                41, 
+                44, 
+                47
+            ], 
+            "name" : "Best_avatar_female_hand_r", 
+            "rotation" : [
+                0.11452152580022812, 
+                -0.4131711721420288, 
+                0.003825774881988764, 
+                0.9034156203269958
+            ], 
+            "scale" : [
+                0.9999998211860657, 
+                0.9999997615814209, 
+                0.9999998211860657
+            ], 
+            "translation" : [
+                -4.4764019548892975e-06, 
+                0.2087634801864624, 
+                1.8477439880371094e-06
+            ]
+        }, 
+        {
+            "children" : [
+                36
+            ], 
+            "name" : "Best_avatar_female_index_01_r", 
+            "rotation" : [
+                0.11410591006278992, 
+                -0.47072967886924744, 
+                0.003512956900522113, 
+                0.8748606443405151
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999998807907104, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                0.01078549399971962, 
+                0.08806537091732025, 
+                0.007907666265964508
+            ]
+        }, 
+        {
+            "children" : [
+                37
+            ], 
+            "name" : "Best_avatar_female_index_02_r", 
+            "rotation" : [
+                0.11393216997385025, 
+                -0.0032286893110722303, 
+                -0.005157760344445705, 
+                0.9934700131416321
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                3.5315752029418945e-06, 
+                0.021534860134124756, 
+                -3.3080577850341797e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_index_03_r", 
+            "rotation" : [
+                0.06540428847074509, 
+                -0.00012191941641503945, 
+                -0.021195854991674423, 
+                0.9976338148117065
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                1.0, 
+                0.9999998211860657
+            ], 
+            "translation" : [
+                3.159046173095703e-06, 
+                0.01923130825161934, 
+                4.410743713378906e-06
+            ]
+        }, 
+        {
+            "children" : [
+                39
+            ], 
+            "name" : "Best_avatar_female_middle_01_r", 
+            "rotation" : [
+                0.10672884434461594, 
+                -0.4040873646736145, 
+                0.15327061712741852, 
+                0.8954498767852783
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                1.0, 
+                1.0
+            ], 
+            "translation" : [
+                -0.0024780556559562683, 
+                0.0846920758485794, 
+                -0.009664826095104218
+            ]
+        }, 
+        {
+            "children" : [
+                40
+            ], 
+            "name" : "Best_avatar_female_middle_02_r", 
+            "rotation" : [
+                0.04563967138528824, 
+                -0.001352229155600071, 
+                -0.03600689768791199, 
+                0.9983079433441162
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999999403953552, 
+                0.9999998807907104
+            ], 
+            "translation" : [
+                -8.031725883483887e-06, 
+                0.028464384377002716, 
+                -1.6540288925170898e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_middle_03_r", 
+            "rotation" : [
+                0.07225999981164932, 
+                -8.919495485315565e-06, 
+                0.006432514172047377, 
+                0.9973651170730591
+            ], 
+            "scale" : [
+                1.0000001192092896, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                8.061528205871582e-06, 
+                0.02335534244775772, 
+                -1.4901161193847656e-08
+            ]
+        }, 
+        {
+            "children" : [
+                42
+            ], 
+            "name" : "Best_avatar_female_pinky_01_r", 
+            "rotation" : [
+                0.052524350583553314, 
+                -0.29001283645629883, 
+                0.308737188577652, 
+                0.9043313264846802
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999999403953552, 
+                1.0
+            ], 
+            "translation" : [
+                -0.02798275277018547, 
+                0.0695890337228775, 
+                -0.02630303055047989
+            ]
+        }, 
+        {
+            "children" : [
+                43
+            ], 
+            "name" : "Best_avatar_female_pinky_02_r", 
+            "rotation" : [
+                0.08278274536132812, 
+                -0.0012648842530325055, 
+                -0.029449690133333206, 
+                0.9961316585540771
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999998807907104, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -3.129243850708008e-07, 
+                0.01782962679862976, 
+                -4.9658119678497314e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_pinky_03_r", 
+            "rotation" : [
+                -0.011176228523254395, 
+                -1.5994040950317867e-05, 
+                0.012756580486893654, 
+                0.999856173992157
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999998807907104, 
+                1.0
+            ], 
+            "translation" : [
+                6.407499313354492e-07, 
+                0.013116702437400818, 
+                -2.4959444999694824e-06
+            ]
+        }, 
+        {
+            "children" : [
+                45
+            ], 
+            "name" : "Best_avatar_female_ring_01_r", 
+            "rotation" : [
+                0.059704337269067764, 
+                -0.3832198977470398, 
+                0.23166640102863312, 
+                0.8921371102333069
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                1.0, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                -0.014189817011356354, 
+                0.07856211066246033, 
+                -0.019964396953582764
+            ]
+        }, 
+        {
+            "children" : [
+                46
+            ], 
+            "name" : "Best_avatar_female_ring_02_r", 
+            "rotation" : [
+                0.061582330614328384, 
+                -0.0011147940531373024, 
+                -0.0420062392950058, 
+                0.9972171187400818
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                1.0, 
+                1.0
+            ], 
+            "translation" : [
+                -3.725290298461914e-07, 
+                0.024951748549938202, 
+                -8.560717105865479e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_ring_03_r", 
+            "rotation" : [
+                0.05812036246061325, 
+                5.443603731691837e-05, 
+                0.023013366386294365, 
+                0.9980443120002747
+            ], 
+            "scale" : [
+                1.0, 
+                1.0, 
+                1.0000001192092896
+            ], 
+            "translation" : [
+                -2.294778823852539e-06, 
+                0.020766526460647583, 
+                3.516674041748047e-06
+            ]
+        }, 
+        {
+            "children" : [
+                48
+            ], 
+            "name" : "Best_avatar_female_thumb_01_r", 
+            "rotation" : [
+                0.2736473083496094, 
+                -0.7288115620613098, 
+                -0.44669196009635925, 
+                0.4409278333187103
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                0.9999997615814209, 
+                1.0
+            ], 
+            "translation" : [
+                0.012022789567708969, 
+                0.03276774287223816, 
+                0.012339092791080475
+            ]
+        }, 
+        {
+            "children" : [
+                49
+            ], 
+            "name" : "Best_avatar_female_thumb_02_r", 
+            "rotation" : [
+                0.073932945728302, 
+                0.019217513501644135, 
+                0.18499886989593506, 
+                0.9797652959823608
+            ], 
+            "translation" : [
+                9.927898645401e-07, 
+                0.02588532865047455, 
+                2.343207597732544e-06
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_thumb_03_r", 
+            "rotation" : [
+                0.14480449259281158, 
+                0.004903318826109171, 
+                0.03348451480269432, 
+                0.9888814091682434
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                1.0000001192092896, 
+                1.0
+            ], 
+            "translation" : [
+                -2.0265579223632812e-06, 
+                0.030100449919700623, 
+                -8.940696716308594e-08
+            ]
+        }, 
+        {
+            "children" : [
+                51
+            ], 
+            "name" : "Best_avatar_female_neck_01", 
+            "rotation" : [
+                0.1876019984483719, 
+                -3.6561085289823304e-17, 
+                3.71357005298398e-16, 
+                0.982245147228241
+            ], 
+            "translation" : [
+                -2.220446049250313e-16, 
+                0.2840788960456848, 
+                -0.0038089121226221323
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_head", 
+            "rotation" : [
+                -0.20514167845249176, 
+                7.736209722926846e-16, 
+                2.1773553656411187e-16, 
+                0.9787322878837585
+            ], 
+            "translation" : [
+                1.7124502152331632e-16, 
+                0.11120805889368057, 
+                1.1511147022247314e-06
+            ]
+        }, 
+        {
+            "children" : [
+                53
+            ], 
+            "name" : "Best_avatar_female_thigh_l", 
+            "rotation" : [
+                -0.9246225953102112, 
+                -0.07318371534347534, 
+                0.22912555932998657, 
+                0.29532814025878906
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                1.0000001192092896, 
+                1.000000238418579
+            ], 
+            "translation" : [
+                0.08740200102329254, 
+                -0.012915498577058315, 
+                -0.010146367363631725
+            ]
+        }, 
+        {
+            "children" : [
+                54
+            ], 
+            "name" : "Best_avatar_female_calf_l", 
+            "rotation" : [
+                -2.105983387679089e-09, 
+                0.22840911149978638, 
+                1.1628795704154982e-08, 
+                0.9735652208328247
+            ], 
+            "scale" : [
+                0.9999998807907104, 
+                1.0, 
+                1.0
+            ], 
+            "translation" : [
+                -2.868473529815674e-07, 
+                0.35240113735198975, 
+                8.940696716308594e-08
+            ]
+        }, 
+        {
+            "children" : [
+                55
+            ], 
+            "name" : "Best_avatar_female_foot_l", 
+            "rotation" : [
+                -0.5385465025901794, 
+                -1.4543513771059224e-07, 
+                -4.557133763682941e-07, 
+                0.8425958156585693
+            ], 
+            "scale" : [
+                1.0, 
+                1.0000001192092896, 
+                1.0
+            ], 
+            "translation" : [
+                -2.928660251200199e-06, 
+                0.3864944875240326, 
+                9.413342922925949e-07
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_ball_l", 
+            "rotation" : [
+                -0.2518274486064911, 
+                0.018458455801010132, 
+                0.04582745209336281, 
+                0.9665102362632751
+            ], 
+            "scale" : [
+                1.0, 
+                0.9999998807907104, 
+                1.0
+            ], 
+            "translation" : [
+                7.0087844505906105e-06, 
+                0.11254359781742096, 
+                4.912726581096649e-06
+            ]
+        }, 
+        {
+            "children" : [
+                57
+            ], 
+            "name" : "Best_avatar_female_thigh_r", 
+            "rotation" : [
+                -0.9246225953102112, 
+                0.0731835588812828, 
+                -0.22912558913230896, 
+                0.2953281104564667
+            ], 
+            "scale" : [
+                1.0, 
+                1.0, 
+                1.0000001192092896
+            ], 
+            "translation" : [
+                -0.08740200102329254, 
+                -0.012915506027638912, 
+                -0.010146367363631725
+            ]
+        }, 
+        {
+            "children" : [
+                58
+            ], 
+            "name" : "Best_avatar_female_calf_r", 
+            "rotation" : [
+                -6.1071907531129455e-09, 
+                -0.2284090667963028, 
+                1.8579168425958414e-08, 
+                0.9735652804374695
+            ], 
+            "scale" : [
+                0.9999999403953552, 
+                0.9999998807907104, 
+                0.9999999403953552
+            ], 
+            "translation" : [
+                2.9243528842926025e-07, 
+                0.3524011969566345, 
+                8.940696716308594e-08
+            ]
+        }, 
+        {
+            "children" : [
+                59
+            ], 
+            "name" : "Best_avatar_female_foot_r", 
+            "rotation" : [
+                -0.538546621799469, 
+                1.9094061087798764e-07, 
+                4.847859713663638e-07, 
+                0.8425957560539246
+            ], 
+            "scale" : [
+                1.0, 
+                1.0000001192092896, 
+                1.0
+            ], 
+            "translation" : [
+                2.955348463729024e-06, 
+                0.3864944875240326, 
+                9.431969374418259e-07
+            ]
+        }, 
+        {
+            "name" : "Best_avatar_female_ball_r", 
+            "rotation" : [
+                -0.2518274486064911, 
+                -0.018458442762494087, 
+                -0.045827463269233704, 
+                0.9665103554725647
+            ], 
+            "scale" : [
+                1.0000001192092896, 
+                1.0, 
+                1.0
+            ], 
+            "translation" : [
+                -7.009890396147966e-06, 
+                0.11254362016916275, 
+                4.909001290798187e-06
+            ]
+        }
+    ], 
+    "samplers" : [
+        {}
+    ], 
+    "scene" : 0, 
+    "scenes" : [
+        {
+            "name" : "Scene", 
+            "nodes" : [
+                0
+            ]
+        }
+    ], 
+    "skins" : [
+        {
+            "inverseBindMatrices" : 48, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }, 
+        {
+            "inverseBindMatrices" : 49, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }, 
+        {
+            "inverseBindMatrices" : 50, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }, 
+        {
+            "inverseBindMatrices" : 51, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }, 
+        {
+            "inverseBindMatrices" : 52, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }, 
+        {
+            "inverseBindMatrices" : 53, 
+            "joints" : [
+                7, 
+                8, 
+                9, 
+                10, 
+                11, 
+                12, 
+                13, 
+                14, 
+                15, 
+                16, 
+                17, 
+                18, 
+                19, 
+                20, 
+                21, 
+                22, 
+                23, 
+                24, 
+                25, 
+                26, 
+                27, 
+                28, 
+                29, 
+                30, 
+                31, 
+                32, 
+                33, 
+                34, 
+                35, 
+                36, 
+                37, 
+                38, 
+                39, 
+                40, 
+                41, 
+                42, 
+                43, 
+                44, 
+                45, 
+                46, 
+                47, 
+                48, 
+                49, 
+                50, 
+                51, 
+                52, 
+                53, 
+                54, 
+                55, 
+                56, 
+                57, 
+                58, 
+                59
+            ], 
+            "skeleton" : 0
+        }
+    ], 
+    "textures" : [
+        {
+            "sampler" : 0, 
+            "source" : 0
+        }, 
+        {
+            "sampler" : 0, 
+            "source" : 1
+        }, 
+        {
+            "sampler" : 0, 
+            "source" : 2
+        }, 
+        {
+            "sampler" : 0, 
+            "source" : 3
+        }, 
+        {
+            "sampler" : 0, 
+            "source" : 4
+        }
+    ]
+}

BIN
public/assets/avatars/female/best_avatar2-all.bin


BIN
public/assets/avatars/female/brown_eye.png


BIN
public/assets/avatars/female/eyebrow001.png


BIN
public/assets/avatars/female/eyelashes01.png


BIN
public/assets/avatars/female/long01_diffuse.png


BIN
public/assets/avatars/female/young_lightskinned_female_diffuse.png


BIN
public/assets/avatars/ico/female.jpg


BIN
public/assets/avatars/ico/male.jpg


BIN
public/assets/avatars/ico/simple.jpg


BIN
public/assets/avatars/male/avatar1.bin


+ 1678 - 0
public/assets/avatars/male/avatar1.gltf

@@ -0,0 +1,1678 @@
+{
+    "accessors" : [{
+        "bufferView" : 0, 
+        "componentType" : 5123, 
+        "count" : 50016, 
+        "max" : [8863], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 1, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [0.51679, 1.52901, 0.23974], 
+        "min" : [-0.52031, 0.07182, -0.12425], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 2, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [0.999512, 0.999786, 0.999969], 
+        "min" : [-0.999969, -0.998962, -0.999939], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 3, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [0.999743, 0.999463, 0.999918, 1], 
+        "min" : [-0.999925, -0.982719, -0.999811, 1], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 4, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [0.9212, 0.9886], 
+        "min" : [0.0114, 0.0114], 
+        "type" : "VEC2"
+    }, {
+        "bufferView" : 5, 
+        "componentType" : 5123, 
+        "count" : 8864, 
+        "max" : [50, 51, 46, 44], 
+        "min" : [1, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 6, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [1, 0.9999, 0.98648, 0.754], 
+        "min" : [0.00010004, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 7, 
+        "componentType" : 5123, 
+        "count" : 8864, 
+        "max" : [44, 24, 0, 0], 
+        "min" : [0, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 8, 
+        "componentType" : 5126, 
+        "count" : 8864, 
+        "max" : [0.66502, 0.66839, 0, 0], 
+        "min" : [0, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 9, 
+        "componentType" : 5123, 
+        "count" : 60084, 
+        "max" : [11071], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 10, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [0.56658, 1.7321, 0.37732], 
+        "min" : [-0.56658, -0.000239978, -0.05519], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 11, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [0.999908, 0.998291, 0.999969], 
+        "min" : [-0.999908, -0.999969, -0.999969], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 12, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [1, 0.999947, 0.999273, 1], 
+        "min" : [-0.999169, -0.999999, -0.999273, 1], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 13, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [0.99352, 0.990393], 
+        "min" : [0.009208, 0.02614], 
+        "type" : "VEC2"
+    }, {
+        "bufferView" : 14, 
+        "componentType" : 5123, 
+        "count" : 11072, 
+        "max" : [52, 52, 50, 40], 
+        "min" : [4, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 15, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [1, 0.9999, 0.9912, 0.9452], 
+        "min" : [0.00010001, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 16, 
+        "componentType" : 5123, 
+        "count" : 11072, 
+        "max" : [27, 0, 0, 0], 
+        "min" : [0, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 17, 
+        "componentType" : 5126, 
+        "count" : 11072, 
+        "max" : [0.4818, 0, 0, 0], 
+        "min" : [0, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 18, 
+        "componentType" : 5123, 
+        "count" : 10032, 
+        "max" : [1793], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 19, 
+        "componentType" : 5126, 
+        "count" : 1794, 
+        "max" : [0.082759, 1.74705, 0.16553], 
+        "min" : [-0.088876, 1.54192, -0.052775], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 20, 
+        "componentType" : 5126, 
+        "count" : 1794, 
+        "max" : [0.999786, 0.998596, 0.998779], 
+        "min" : [-0.999664, -0.863247, -0.999695], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 21, 
+        "componentType" : 5126, 
+        "count" : 1794, 
+        "max" : [0.998589, 0.973951, 0.949316, 1], 
+        "min" : [-0.999578, -0.688422, -0.999958, 1], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 22, 
+        "componentType" : 5126, 
+        "count" : 1794, 
+        "max" : [0.9246, 0.9878], 
+        "min" : [0.0647, 0.031], 
+        "type" : "VEC2"
+    }, {
+        "bufferView" : 23, 
+        "componentType" : 5123, 
+        "count" : 1794, 
+        "max" : [44, 44, 44, 44], 
+        "min" : [4, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 24, 
+        "componentType" : 5126, 
+        "count" : 1794, 
+        "max" : [1, 0.99952, 0.75577, 0.66432], 
+        "min" : [0.0001082, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 25, 
+        "componentType" : 5121, 
+        "count" : 576, 
+        "max" : [123], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 26, 
+        "componentType" : 5126, 
+        "count" : 124, 
+        "max" : [0.059266, 1.63714, 0.15183], 
+        "min" : [-0.059266, 1.62763, 0.12181], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 27, 
+        "componentType" : 5126, 
+        "count" : 124, 
+        "max" : [0.96765, 0.805078, 0.959716], 
+        "min" : [-0.96765, -0.931455, 0.0260018], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 28, 
+        "componentType" : 5126, 
+        "count" : 124, 
+        "max" : [0.99994, 0.345554, 0.999586, 1], 
+        "min" : [0.00551062, -0.344533, -0.999642, 1], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 29, 
+        "componentType" : 5126, 
+        "count" : 124, 
+        "max" : [0.9628, 0.7597], 
+        "min" : [0.0271, 0.3176], 
+        "type" : "VEC2"
+    }, {
+        "bufferView" : 30, 
+        "componentType" : 5123, 
+        "count" : 124, 
+        "max" : [44, 0, 0, 0], 
+        "min" : [44, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 31, 
+        "componentType" : 5126, 
+        "count" : 124, 
+        "max" : [1, 0, 0, 0], 
+        "min" : [1, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 32, 
+        "componentType" : 5121, 
+        "count" : 516, 
+        "max" : [95], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 33, 
+        "componentType" : 5126, 
+        "count" : 96, 
+        "max" : [0.044132, 1.6382, 0.14281], 
+        "min" : [-0.044132, 1.61024, 0.11893], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 34, 
+        "componentType" : 5126, 
+        "count" : 96, 
+        "max" : [0.923093, 0.927244, 0.998108], 
+        "min" : [-0.923093, -0.92468, -0.328776], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 35, 
+        "componentType" : 5126, 
+        "count" : 96, 
+        "max" : [0.999222, 0.450083, 0.986935, 1], 
+        "min" : [-0.999221, -0.445885, -0.997483, 1], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 36, 
+        "componentType" : 5126, 
+        "count" : 96, 
+        "max" : [0.9649, 0.9673], 
+        "min" : [0.0276, 0.0284], 
+        "type" : "VEC2"
+    }, {
+        "bufferView" : 37, 
+        "componentType" : 5123, 
+        "count" : 96, 
+        "max" : [44, 0, 0, 0], 
+        "min" : [44, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 38, 
+        "componentType" : 5126, 
+        "count" : 96, 
+        "max" : [1, 0, 0, 0], 
+        "min" : [1, 0, 0, 0], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 39, 
+        "componentType" : 5126, 
+        "count" : 53, 
+        "max" : [1, 0.9832, 1, 0, 1, 0.999326, 0.562305, 0, 0.909774, 1, 0.999326, 0, 1.38568, 0.918457, 1.13381, 1], 
+        "min" : [-0.751268, -0.9832, -0.954157, 0, -0.979992, -0.994043, -0.987997, 0, -0.909774, -0.34277, -0.999399, 0, -1.38568, -1.58033, -0.522513, 1], 
+        "type" : "MAT4"
+    }, {
+        "bufferView" : 40, 
+        "componentType" : 5126, 
+        "count" : 53, 
+        "max" : [1, 0.9832, 1, 0, 1, 0.999326, 0.562305, 0, 0.909774, 1, 0.999326, 0, 1.38568, 0.918457, 1.13381, 1], 
+        "min" : [-0.751268, -0.9832, -0.954157, 0, -0.979992, -0.994043, -0.987997, 0, -0.909774, -0.34277, -0.999399, 0, -1.38568, -1.58033, -0.522513, 1], 
+        "type" : "MAT4"
+    }, {
+        "bufferView" : 41, 
+        "componentType" : 5126, 
+        "count" : 53, 
+        "max" : [1, 0.9832, 1, 0, 1, 0.999326, 0.562305, 0, 0.909774, 1, 0.999326, 0, 1.38568, 0.918457, 1.13381, 1], 
+        "min" : [-0.751268, -0.9832, -0.954157, 0, -0.979992, -0.994043, -0.987997, 0, -0.909774, -0.34277, -0.999399, 0, -1.38568, -1.58033, -0.522513, 1], 
+        "type" : "MAT4"
+    }, {
+        "bufferView" : 42, 
+        "componentType" : 5126, 
+        "count" : 53, 
+        "max" : [1, 0.9832, 1, 0, 1, 0.999326, 0.562305, 0, 0.909774, 1, 0.999326, 0, 1.38568, 0.918457, 1.13381, 1], 
+        "min" : [-0.751268, -0.9832, -0.954157, 0, -0.979992, -0.994043, -0.987997, 0, -0.909774, -0.34277, -0.999399, 0, -1.38568, -1.58033, -0.522513, 1], 
+        "type" : "MAT4"
+    }, {
+        "bufferView" : 43, 
+        "componentType" : 5126, 
+        "count" : 53, 
+        "max" : [1, 0.9832, 1, 0, 1, 0.999326, 0.562305, 0, 0.909774, 1, 0.999326, 0, 1.38568, 0.918457, 1.13381, 1], 
+        "min" : [-0.751268, -0.9832, -0.954157, 0, -0.979992, -0.994043, -0.987997, 0, -0.909774, -0.34277, -0.999399, 0, -1.38568, -1.58033, -0.522513, 1], 
+        "type" : "MAT4"
+    }, {
+        "bufferView" : 44, 
+        "componentType" : 5126, 
+        "count" : 5, 
+        "max" : [0.5], 
+        "min" : [0.0416667], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 45, 
+        "componentType" : 5126, 
+        "count" : 5, 
+        "max" : [0.937985, 0.0967121, -0.00118314], 
+        "min" : [0.882348, 0.0920558, -0.00250754], 
+        "type" : "VEC3"
+    }, {
+        "bufferView" : 46, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 47, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [-0.544767, -0.416458, -0.540203, 0.449103], 
+        "min" : [-0.569613, -0.45589, -0.570714, 0.416092], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 48, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 49, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.229278, 0.0111775, 0.0136679, 0.981674], 
+        "min" : [0.19051, -0.00865281, -0.0176384, 0.973137], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 50, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 51, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.0594583, 0.0636135, 0.00666755, 0.999126], 
+        "min" : [0.0199363, -0.0597305, -0.00655045, 0.997463], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 52, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 53, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.0352165, 0.093868, -0.75428, 0.649563], 
+        "min" : [-0.0276562, -0.113526, -0.818446, 0.57455], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 54, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 55, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.142227, 0.057538, -0.451029, 0.864478], 
+        "min" : [-0.228193, -0.0431017, -0.545828, 0.836699], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 56, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 57, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.275759, 0.296073, 0.0614516, 0.968326], 
+        "min" : [0.0779107, 0.22574, 0.0220333, 0.921472], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 58, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 59, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.23947, 0.414003, -0.048744, 0.904628], 
+        "min" : [0.0897081, 0.387734, -0.0974571, 0.885911], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 60, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 61, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.0397768, 0.113526, 0.813319, 0.646402], 
+        "min" : [-0.0284757, -0.0819572, 0.758823, 0.578686], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 62, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 63, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.136415, 0.044984, 0.545777, 0.863164], 
+        "min" : [-0.233551, -0.0678807, 0.460321, 0.836614], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 64, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 65, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.222878, -0.226164, -0.0206755, 0.969911], 
+        "min" : [0.0782013, -0.296379, -0.053774, 0.930713], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 66, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 67, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.261206, -0.383868, 0.100126, 0.9028], 
+        "min" : [0.105031, -0.411779, 0.0660845, 0.88259], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 68, 
+        "componentType" : 5126, 
+        "count" : 1, 
+        "max" : [0.5], 
+        "min" : [0.5], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 69, 
+        "componentType" : 5126, 
+        "count" : 1, 
+        "max" : [0.252503, 5.68716e-09, -2.11866e-09, 0.967596], 
+        "min" : [0.252503, 5.68716e-09, -2.11866e-09, 0.967596], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 70, 
+        "componentType" : 5126, 
+        "count" : 10, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 71, 
+        "componentType" : 5126, 
+        "count" : 10, 
+        "max" : [-0.189772, 0.00407043, 0.0070668, 0.981828], 
+        "min" : [-0.194184, -0.00307492, -0.0033743, 0.980964], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 72, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 73, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.966892, 0.00977655, 0.262846, 0.408629], 
+        "min" : [-0.96157, -0.0745894, -0.260388, 0.031195], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 74, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 75, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.543493, 0.225768, -0.00814557, 0.977298], 
+        "min" : [0.0127024, 0.156837, -0.103415, 0.818122], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 76, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 77, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [-0.341809, 0.043492, 0.00994791, 0.938932], 
+        "min" : [-0.622939, -0.080451, -0.0646035, 0.780607], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 78, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 79, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.967056, 0.0742888, 0.260752, 0.415313], 
+        "min" : [-0.962303, -0.0155643, -0.264402, 0.0325247], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 80, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 81, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.543448, -0.156961, 0.104102, 0.975712], 
+        "min" : [0.0200493, -0.225732, 0.00996623, 0.818041], 
+        "type" : "VEC4"
+    }, {
+        "bufferView" : 82, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [0.5], 
+        "min" : [0], 
+        "type" : "SCALAR"
+    }, {
+        "bufferView" : 83, 
+        "componentType" : 5126, 
+        "count" : 13, 
+        "max" : [-0.340738, 0.0802535, 0.0640925, 0.939352], 
+        "min" : [-0.622829, -0.0459844, -0.0104869, 0.780431], 
+        "type" : "VEC4"
+    }], 
+    "animations" : [{
+        "channels" : [{
+            "sampler" : 0, 
+            "target" : {
+                "node" : 7, 
+                "path" : "translation"
+            }
+        }, {
+            "sampler" : 1, 
+            "target" : {
+                "node" : 7, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 2, 
+            "target" : {
+                "node" : 8, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 3, 
+            "target" : {
+                "node" : 10, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 4, 
+            "target" : {
+                "node" : 11, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 5, 
+            "target" : {
+                "node" : 12, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 6, 
+            "target" : {
+                "node" : 13, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 7, 
+            "target" : {
+                "node" : 14, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 8, 
+            "target" : {
+                "node" : 30, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 9, 
+            "target" : {
+                "node" : 31, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 10, 
+            "target" : {
+                "node" : 32, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 11, 
+            "target" : {
+                "node" : 33, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 12, 
+            "target" : {
+                "node" : 49, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 13, 
+            "target" : {
+                "node" : 50, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 14, 
+            "target" : {
+                "node" : 51, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 15, 
+            "target" : {
+                "node" : 52, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 16, 
+            "target" : {
+                "node" : 53, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 17, 
+            "target" : {
+                "node" : 55, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 18, 
+            "target" : {
+                "node" : 56, 
+                "path" : "rotation"
+            }
+        }, {
+            "sampler" : 19, 
+            "target" : {
+                "node" : 57, 
+                "path" : "rotation"
+            }
+        }], 
+        "samplers" : [{
+            "input" : 44, 
+            "interpolation" : "LINEAR", 
+            "output" : 45
+        }, {
+            "input" : 46, 
+            "interpolation" : "LINEAR", 
+            "output" : 47
+        }, {
+            "input" : 48, 
+            "interpolation" : "LINEAR", 
+            "output" : 49
+        }, {
+            "input" : 50, 
+            "interpolation" : "LINEAR", 
+            "output" : 51
+        }, {
+            "input" : 52, 
+            "interpolation" : "LINEAR", 
+            "output" : 53
+        }, {
+            "input" : 54, 
+            "interpolation" : "LINEAR", 
+            "output" : 55
+        }, {
+            "input" : 56, 
+            "interpolation" : "LINEAR", 
+            "output" : 57
+        }, {
+            "input" : 58, 
+            "interpolation" : "LINEAR", 
+            "output" : 59
+        }, {
+            "input" : 60, 
+            "interpolation" : "LINEAR", 
+            "output" : 61
+        }, {
+            "input" : 62, 
+            "interpolation" : "LINEAR", 
+            "output" : 63
+        }, {
+            "input" : 64, 
+            "interpolation" : "LINEAR", 
+            "output" : 65
+        }, {
+            "input" : 66, 
+            "interpolation" : "LINEAR", 
+            "output" : 67
+        }, {
+            "input" : 68, 
+            "interpolation" : "LINEAR", 
+            "output" : 69
+        }, {
+            "input" : 70, 
+            "interpolation" : "LINEAR", 
+            "output" : 71
+        }, {
+            "input" : 72, 
+            "interpolation" : "LINEAR", 
+            "output" : 73
+        }, {
+            "input" : 74, 
+            "interpolation" : "LINEAR", 
+            "output" : 75
+        }, {
+            "input" : 76, 
+            "interpolation" : "LINEAR", 
+            "output" : 77
+        }, {
+            "input" : 78, 
+            "interpolation" : "LINEAR", 
+            "output" : 79
+        }, {
+            "input" : 80, 
+            "interpolation" : "LINEAR", 
+            "output" : 81
+        }, {
+            "input" : 82, 
+            "interpolation" : "LINEAR", 
+            "output" : 83
+        }]
+    }], 
+    "asset" : {
+        "generator" : "Khronos Blender glTF 2.0 exporter", 
+        "version" : "2.0"
+    }, 
+    "bufferViews" : [{
+        "buffer" : 0, 
+        "byteLength" : 100032, 
+        "byteOffset" : 0, 
+        "target" : 34963
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 106368, 
+        "byteOffset" : 100032, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 106368, 
+        "byteOffset" : 206400, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 141824, 
+        "byteOffset" : 312768, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 70912, 
+        "byteOffset" : 454592, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 70912, 
+        "byteOffset" : 525504, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 141824, 
+        "byteOffset" : 596416, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 70912, 
+        "byteOffset" : 738240, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 141824, 
+        "byteOffset" : 809152, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 120168, 
+        "byteOffset" : 950976, 
+        "target" : 34963
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 132864, 
+        "byteOffset" : 1071144, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 132864, 
+        "byteOffset" : 1204008, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 177152, 
+        "byteOffset" : 1336872, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 88576, 
+        "byteOffset" : 1514024, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 88576, 
+        "byteOffset" : 1602600, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 177152, 
+        "byteOffset" : 1691176, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 88576, 
+        "byteOffset" : 1868328, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 177152, 
+        "byteOffset" : 1956904, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 20064, 
+        "byteOffset" : 2134056, 
+        "target" : 34963
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 21528, 
+        "byteOffset" : 2154120, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 21528, 
+        "byteOffset" : 2175648, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 28704, 
+        "byteOffset" : 2197176, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 14352, 
+        "byteOffset" : 2225880, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 14352, 
+        "byteOffset" : 2240232, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 28704, 
+        "byteOffset" : 2254584, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 576, 
+        "byteOffset" : 2283288, 
+        "target" : 34963
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1488, 
+        "byteOffset" : 2283864, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1488, 
+        "byteOffset" : 2285352, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1984, 
+        "byteOffset" : 2286840, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 992, 
+        "byteOffset" : 2288824, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 992, 
+        "byteOffset" : 2289816, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1984, 
+        "byteOffset" : 2290808, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 516, 
+        "byteOffset" : 2292792, 
+        "target" : 34963
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1152, 
+        "byteOffset" : 2293308, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1152, 
+        "byteOffset" : 2294460, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1536, 
+        "byteOffset" : 2295612, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 768, 
+        "byteOffset" : 2297148, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 768, 
+        "byteOffset" : 2297916, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 1536, 
+        "byteOffset" : 2298684, 
+        "target" : 34962
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 3392, 
+        "byteOffset" : 2300220
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 3392, 
+        "byteOffset" : 2303612
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 3392, 
+        "byteOffset" : 2307004
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 3392, 
+        "byteOffset" : 2310396
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 3392, 
+        "byteOffset" : 2313788
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 20, 
+        "byteOffset" : 2317180
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 60, 
+        "byteOffset" : 2317200
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2317260
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2317312
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2317520
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2317572
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2317780
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2317832
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2318040
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2318092
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2318300
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2318352
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2318560
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2318612
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2318820
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2318872
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2319080
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2319132
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2319340
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2319392
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2319600
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2319652
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2319860
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2319912
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 4, 
+        "byteOffset" : 2320120
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 16, 
+        "byteOffset" : 2320124
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 40, 
+        "byteOffset" : 2320140
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 160, 
+        "byteOffset" : 2320180
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2320340
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2320392
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2320600
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2320652
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2320860
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2320912
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2321120
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2321172
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2321380
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2321432
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 52, 
+        "byteOffset" : 2321640
+    }, {
+        "buffer" : 0, 
+        "byteLength" : 208, 
+        "byteOffset" : 2321692
+    }], 
+    "buffers" : [{
+        "byteLength" : 2321900, 
+        "uri" : "avatar1.bin"
+    }], 
+    "images" : [{
+        "uri" : "middleage_lightskinned_male_diffuse.png"
+    }, {
+        "uri" : "eyebrow001.png"
+    }, {
+        "uri" : "brown_eye.png"
+    }, {
+        "uri" : "male_casualsuit01_normal.png"
+    }, {
+        "uri" : "male_casualsuit01_diffuse.png"
+    }, {
+        "uri" : "short02_diffuse.png"
+    }], 
+    "materials" : [{
+        "alphaMode" : "BLEND", 
+        "name" : "Untitled:Body:Middleage_cauasian_male", 
+        "pbrMetallicRoughness" : {
+            "baseColorTexture" : {
+                "index" : 0
+            }, 
+            "metallicFactor" : 0
+        }
+    }, {
+        "name" : "Untitled:Eyebrow001:Eyebrow001", 
+        "pbrMetallicRoughness" : {
+            "baseColorTexture" : {
+                "index" : 1
+            }, 
+            "metallicFactor" : 0
+        }
+    }, {
+        "name" : "Untitled:Low-poly:Eye_brown", 
+        "pbrMetallicRoughness" : {
+            "baseColorTexture" : {
+                "index" : 2
+            }, 
+            "metallicFactor" : 0
+        }
+    }, {
+        "alphaMode" : "BLEND", 
+        "name" : "Untitled:Male_casualsuit01:Male_casualsuit01", 
+        "normalTexture" : {
+            "index" : 3
+        }, 
+        "pbrMetallicRoughness" : {
+            "baseColorTexture" : {
+                "index" : 4
+            }, 
+            "metallicFactor" : 0
+        }
+    }, {
+        "name" : "Untitled:Short02:Short02", 
+        "pbrMetallicRoughness" : {
+            "baseColorTexture" : {
+                "index" : 5
+            }, 
+            "metallicFactor" : 0
+        }
+    }], 
+    "meshes" : [{
+        "name" : "Untitled:Male_casualsuit01", 
+        "primitives" : [{
+            "attributes" : {
+                "JOINTS_0" : 5, 
+                "JOINTS_1" : 7, 
+                "NORMAL" : 2, 
+                "POSITION" : 1, 
+                "TANGENT" : 3, 
+                "TEXCOORD_0" : 4, 
+                "WEIGHTS_0" : 6, 
+                "WEIGHTS_1" : 8
+            }, 
+            "indices" : 0, 
+            "material" : 3
+        }]
+    }, {
+        "name" : "Untitled:Body", 
+        "primitives" : [{
+            "attributes" : {
+                "JOINTS_0" : 14, 
+                "JOINTS_1" : 16, 
+                "NORMAL" : 11, 
+                "POSITION" : 10, 
+                "TANGENT" : 12, 
+                "TEXCOORD_0" : 13, 
+                "WEIGHTS_0" : 15, 
+                "WEIGHTS_1" : 17
+            }, 
+            "indices" : 9, 
+            "material" : 0
+        }]
+    }, {
+        "name" : "Untitled:Short02", 
+        "primitives" : [{
+            "attributes" : {
+                "JOINTS_0" : 23, 
+                "NORMAL" : 20, 
+                "POSITION" : 19, 
+                "TANGENT" : 21, 
+                "TEXCOORD_0" : 22, 
+                "WEIGHTS_0" : 24
+            }, 
+            "indices" : 18, 
+            "material" : 4
+        }]
+    }, {
+        "name" : "Untitled:Eyebrow001", 
+        "primitives" : [{
+            "attributes" : {
+                "JOINTS_0" : 30, 
+                "NORMAL" : 27, 
+                "POSITION" : 26, 
+                "TANGENT" : 28, 
+                "TEXCOORD_0" : 29, 
+                "WEIGHTS_0" : 31
+            }, 
+            "indices" : 25, 
+            "material" : 1
+        }]
+    }, {
+        "name" : "Untitled:Low-poly", 
+        "primitives" : [{
+            "attributes" : {
+                "JOINTS_0" : 37, 
+                "NORMAL" : 34, 
+                "POSITION" : 33, 
+                "TANGENT" : 35, 
+                "TEXCOORD_0" : 36, 
+                "WEIGHTS_0" : 38
+            }, 
+            "indices" : 32, 
+            "material" : 2
+        }]
+    }], 
+    "nodes" : [{
+        "children" : [1, 2, 3, 4, 5, 6], 
+        "name" : "Untitled"
+    }, {
+        "mesh" : 1, 
+        "name" : "Untitled:Body", 
+        "skin" : 0
+    }, {
+        "mesh" : 3, 
+        "name" : "Untitled:Eyebrow001", 
+        "skin" : 1
+    }, {
+        "mesh" : 4, 
+        "name" : "Untitled:Low-poly", 
+        "skin" : 2
+    }, {
+        "mesh" : 0, 
+        "name" : "Untitled:Male_casualsuit01", 
+        "skin" : 3
+    }, {
+        "mesh" : 2, 
+        "name" : "Untitled:Short02", 
+        "skin" : 4
+    }, {
+        "children" : [7], 
+        "name" : "Untitled_Root", 
+        "rotation" : [0.5, 0.5, 0.5, 0.5], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0, 0, -0.02658]
+    }, {
+        "children" : [8, 51, 55], 
+        "name" : "Untitled_pelvis", 
+        "rotation" : [-0.57939, -0.405349, -0.57939, 0.405349], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.882348, 0.0920558, -0.000942337]
+    }, {
+        "children" : [9], 
+        "name" : "Untitled_spine_01", 
+        "rotation" : [0.23686, -1.41073e-08, 9.23477e-09, 0.971544], 
+        "translation" : [2.04281e-14, 0.093111, -5.90459e-07]
+    }, {
+        "children" : [10], 
+        "name" : "Untitled_spine_02", 
+        "rotation" : [-0.135018, 9.99966e-16, 1.90403e-17, 0.990843], 
+        "translation" : [-4.19611e-17, 0.0705204, -1.30385e-07]
+    }, {
+        "children" : [11, 30, 49], 
+        "name" : "Untitled_spine_03", 
+        "rotation" : [-0.00790434, -1.66721e-16, -2.02202e-15, 0.999969], 
+        "translation" : [-2.32819e-17, 0.060715, 3.11062e-07]
+    }, {
+        "children" : [12], 
+        "name" : "Untitled_clavicle_l", 
+        "rotation" : [0.00703044, 0.042334, -0.766055, 0.64134], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.022819, 0.257339, 0.0926178]
+    }, {
+        "children" : [13], 
+        "name" : "Untitled_upperarm_l", 
+        "rotation" : [0.0225234, -0.00746443, 0.0888415, 0.995763], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-4.70283e-06, 0.166701, 2.06754e-07]
+    }, {
+        "children" : [14], 
+        "name" : "Untitled_lowerarm_l", 
+        "rotation" : [3.11827e-09, 0.000591612, -7.86968e-08, 1], 
+        "scale" : [1, 1, 1], 
+        "translation" : [2.39466e-07, 0.252319, 8.95932e-07]
+    }, {
+        "children" : [15, 18, 21, 24, 27], 
+        "name" : "Untitled_hand_l", 
+        "rotation" : [0.102237, 0.41515, -0.0171244, 0.903828], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-1.85054e-06, 0.266781, 2.74181e-06]
+    }, {
+        "children" : [16], 
+        "name" : "Untitled_index_01_l", 
+        "rotation" : [0.11401, 0.474742, -0.00480595, 0.872696], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.0137888, 0.115683, 0.0102412]
+    }, {
+        "children" : [17], 
+        "name" : "Untitled_index_02_l", 
+        "rotation" : [0.105429, 0.00266269, 0.00662353, 0.994401], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-1.49012e-07, 0.0284246, -4.45545e-06]
+    }, {
+        "name" : "Untitled_index_03_l", 
+        "rotation" : [0.0611125, 7.16144e-05, 0.0173603, 0.99798], 
+        "translation" : [1.51992e-06, 0.0255061, 3.93391e-06]
+    }, {
+        "children" : [19], 
+        "name" : "Untitled_middle_01_l", 
+        "rotation" : [0.102387, 0.406762, -0.154915, 0.894462], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.00378726, 0.111881, -0.0125262]
+    }, {
+        "children" : [20], 
+        "name" : "Untitled_middle_02_l", 
+        "rotation" : [0.0452392, 0.00143388, 0.0373335, 0.998277], 
+        "translation" : [-1.43051e-06, 0.037111, 3.46452e-06]
+    }, {
+        "name" : "Untitled_middle_03_l", 
+        "rotation" : [0.0682409, 5.78779e-06, -0.00572991, 0.997652], 
+        "scale" : [1, 1, 1], 
+        "translation" : [4.02331e-07, 0.0300806, -2.16067e-06]
+    }, {
+        "children" : [22], 
+        "name" : "Untitled_pinky_01_l", 
+        "rotation" : [0.0500937, 0.28598, -0.302753, 0.90777], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.0374122, 0.091045, -0.0345602]
+    }, {
+        "children" : [23], 
+        "name" : "Untitled_pinky_02_l", 
+        "rotation" : [0.0812892, 0.000865353, 0.0221199, 0.996445], 
+        "scale" : [1, 1, 1], 
+        "translation" : [2.71201e-06, 0.0233644, -2.78652e-06]
+    }, {
+        "name" : "Untitled_pinky_03_l", 
+        "rotation" : [-0.00364771, 7.81612e-06, -0.010281, 0.999941], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-6.25849e-07, 0.0171166, -8.00937e-07]
+    }, {
+        "children" : [25], 
+        "name" : "Untitled_ring_01_l", 
+        "rotation" : [0.0575066, 0.381211, -0.234049, 0.89252], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.018971, 0.103255, -0.0263871]
+    }, {
+        "children" : [26], 
+        "name" : "Untitled_ring_02_l", 
+        "rotation" : [0.0530811, 0.000926198, 0.0459393, 0.997533], 
+        "translation" : [-9.23872e-07, 0.0326612, 0]
+    }, {
+        "name" : "Untitled_ring_03_l", 
+        "rotation" : [0.0677685, -6.19386e-05, -0.02751, 0.997322], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-2.20537e-06, 0.0272434, -9.16421e-07]
+    }, {
+        "children" : [28], 
+        "name" : "Untitled_thumb_01_l", 
+        "rotation" : [0.276983, 0.723735, 0.438548, 0.455153], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.0158103, 0.0438234, 0.0160551]
+    }, {
+        "children" : [29], 
+        "name" : "Untitled_thumb_02_l", 
+        "rotation" : [0.0639503, -0.0166148, -0.185834, 0.980357], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-9.42498e-07, 0.0337987, -5.09247e-06]
+    }, {
+        "name" : "Untitled_thumb_03_l", 
+        "rotation" : [0.149071, -0.00499007, -0.0330632, 0.988261], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-3.42727e-07, 0.040009, 8.27014e-07]
+    }, {
+        "children" : [31], 
+        "name" : "Untitled_clavicle_r", 
+        "rotation" : [0.00703048, -0.042334, 0.766056, 0.64134], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.022819, 0.257339, 0.0926178]
+    }, {
+        "children" : [32], 
+        "name" : "Untitled_upperarm_r", 
+        "rotation" : [0.0225234, 0.00746446, -0.0888413, 0.995763], 
+        "translation" : [4.69154e-06, 0.166701, 1.69501e-07]
+    }, {
+        "children" : [33], 
+        "name" : "Untitled_lowerarm_r", 
+        "rotation" : [-1.88609e-08, -0.000591577, 3.58559e-08, 1], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-3.58792e-07, 0.25232, 8.86619e-07]
+    }, {
+        "children" : [34, 37, 40, 43, 46], 
+        "name" : "Untitled_hand_r", 
+        "rotation" : [0.102237, -0.41515, 0.0171243, 0.903828], 
+        "scale" : [1, 1, 1], 
+        "translation" : [1.79838e-06, 0.266781, 2.72691e-06]
+    }, {
+        "children" : [35], 
+        "name" : "Untitled_index_01_r", 
+        "rotation" : [0.11401, -0.474742, 0.00480602, 0.872696], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.0137888, 0.115683, 0.0102412]
+    }, {
+        "children" : [36], 
+        "name" : "Untitled_index_02_r", 
+        "rotation" : [0.105429, -0.00266273, -0.00662358, 0.994401], 
+        "scale" : [1, 1, 1], 
+        "translation" : [1.3411e-07, 0.0284245, -4.5523e-06]
+    }, {
+        "name" : "Untitled_index_03_r", 
+        "rotation" : [0.0611125, -7.16667e-05, -0.0173602, 0.99798], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-1.51992e-06, 0.0255061, 3.93391e-06]
+    }, {
+        "children" : [38], 
+        "name" : "Untitled_middle_01_r", 
+        "rotation" : [0.102387, -0.406761, 0.154915, 0.894462], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.0037872, 0.111881, -0.0125262]
+    }, {
+        "children" : [39], 
+        "name" : "Untitled_middle_02_r", 
+        "rotation" : [0.0452392, -0.001434, -0.0373336, 0.998277], 
+        "scale" : [1, 1, 1], 
+        "translation" : [1.43051e-06, 0.0371111, 3.43472e-06]
+    }, {
+        "name" : "Untitled_middle_03_r", 
+        "rotation" : [0.0682409, -5.78029e-06, 0.00572994, 0.997652], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-3.72529e-07, 0.0300807, -2.23517e-06]
+    }, {
+        "children" : [41], 
+        "name" : "Untitled_pinky_01_r", 
+        "rotation" : [0.0500937, -0.28598, 0.302753, 0.90777], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.0374121, 0.091045, -0.0345602]
+    }, {
+        "children" : [42], 
+        "name" : "Untitled_pinky_02_r", 
+        "rotation" : [0.0812892, -0.000865409, -0.0221201, 0.996445], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-2.65241e-06, 0.0233645, -2.74181e-06]
+    }, {
+        "name" : "Untitled_pinky_03_r", 
+        "rotation" : [-0.00364773, -7.8273e-06, 0.010281, 0.999941], 
+        "translation" : [6.70552e-07, 0.0171166, -7.86036e-07]
+    }, {
+        "children" : [44], 
+        "name" : "Untitled_ring_01_r", 
+        "rotation" : [0.0575066, -0.381211, 0.234049, 0.89252], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-0.0189709, 0.103255, -0.0263871]
+    }, {
+        "children" : [45], 
+        "name" : "Untitled_ring_02_r", 
+        "rotation" : [0.053081, -0.000926318, -0.0459394, 0.997533], 
+        "scale" : [1, 1, 1], 
+        "translation" : [9.53674e-07, 0.0326612, -6.70552e-08]
+    }, {
+        "name" : "Untitled_ring_03_r", 
+        "rotation" : [0.0677686, 6.19386e-05, 0.02751, 0.997322], 
+        "scale" : [1, 1, 1], 
+        "translation" : [2.23517e-06, 0.0272433, -9.98378e-07]
+    }, {
+        "children" : [47], 
+        "name" : "Untitled_thumb_01_r", 
+        "rotation" : [0.276983, -0.723735, -0.438548, 0.455153], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.0158104, 0.0438234, 0.0160551]
+    }, {
+        "children" : [48], 
+        "name" : "Untitled_thumb_02_r", 
+        "rotation" : [0.0639504, 0.0166147, 0.185834, 0.980357], 
+        "scale" : [1, 1, 1], 
+        "translation" : [9.38773e-07, 0.0337986, -5.10365e-06]
+    }, {
+        "name" : "Untitled_thumb_03_r", 
+        "rotation" : [0.149071, 0.00499008, 0.0330632, 0.988261], 
+        "translation" : [3.72529e-07, 0.040009, 8.27014e-07]
+    }, {
+        "children" : [50], 
+        "name" : "Untitled_neck_01", 
+        "rotation" : [0.252503, 2.43186e-15, 9.04773e-15, 0.967596], 
+        "translation" : [8.09698e-17, 0.332709, 0.093581]
+    }, {
+        "name" : "Untitled_head", 
+        "rotation" : [-0.193266, 1.27658e-15, 1.40407e-15, 0.981146], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-2.68689e-17, 0.102921, 3.23355e-06]
+    }, {
+        "children" : [52], 
+        "name" : "Untitled_thigh_l", 
+        "rotation" : [-0.96032, -0.0385181, 0.217934, 0.169726], 
+        "scale" : [1, 1, 1], 
+        "translation" : [0.10867, -0.00108788, -0.0117512]
+    }, {
+        "children" : [53], 
+        "name" : "Untitled_calf_l", 
+        "rotation" : [-5.3855e-08, 0.232531, 9.19394e-09, 0.972589], 
+        "scale" : [1, 1, 1], 
+        "translation" : [3.05753e-06, 0.419223, -1.07288e-06]
+    }, {
+        "children" : [54], 
+        "name" : "Untitled_foot_l", 
+        "rotation" : [-0.535842, 7.50838e-07, 3.57378e-07, 0.844318], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-5.02309e-06, 0.436339, -4.56348e-07]
+    }, {
+        "name" : "Untitled_ball_l", 
+        "rotation" : [-0.271768, 0.0166773, 0.0103945, 0.962162], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-2.48587e-06, 0.140909, 1.43051e-06]
+    }, {
+        "children" : [56], 
+        "name" : "Untitled_thigh_r", 
+        "rotation" : [-0.96032, 0.0385148, -0.217933, 0.169725], 
+        "scale" : [1, 1, 0.999998], 
+        "translation" : [-0.10867, -0.00108791, -0.0117512]
+    }, {
+        "children" : [57], 
+        "name" : "Untitled_calf_r", 
+        "rotation" : [-3.45504e-08, -0.232531, -3.30918e-09, 0.972589], 
+        "scale" : [1, 1, 1], 
+        "translation" : [-3.02587e-06, 0.419223, -1.06543e-06]
+    }, {
+        "children" : [58], 
+        "name" : "Untitled_foot_r", 
+        "rotation" : [-0.535842, -5.08878e-07, -1.99942e-07, 0.844318], 
+        "scale" : [1, 1, 1], 
+        "translation" : [4.99454e-06, 0.436339, -4.55882e-07]
+    }, {
+        "name" : "Untitled_ball_r", 
+        "rotation" : [-0.271768, -0.0166773, -0.0103945, 0.962162], 
+        "scale" : [1, 1, 1], 
+        "translation" : [2.48727e-06, 0.140909, 1.43424e-06]
+    }], 
+    "samplers" : [{}], 
+    "scene" : 0, 
+    "scenes" : [{
+        "name" : "Scene", 
+        "nodes" : [0]
+    }], 
+    "skins" : [{
+        "inverseBindMatrices" : 39, 
+        "joints" : [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], 
+        "skeleton" : 0
+    }, {
+        "inverseBindMatrices" : 40, 
+        "joints" : [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], 
+        "skeleton" : 0
+    }, {
+        "inverseBindMatrices" : 41, 
+        "joints" : [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], 
+        "skeleton" : 0
+    }, {
+        "inverseBindMatrices" : 42, 
+        "joints" : [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], 
+        "skeleton" : 0
+    }, {
+        "inverseBindMatrices" : 43, 
+        "joints" : [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58], 
+        "skeleton" : 0
+    }], 
+    "textures" : [{
+        "sampler" : 0, 
+        "source" : 0
+    }, {
+        "sampler" : 0, 
+        "source" : 1
+    }, {
+        "sampler" : 0, 
+        "source" : 2
+    }, {
+        "sampler" : 0, 
+        "source" : 3
+    }, {
+        "sampler" : 0, 
+        "source" : 4
+    }, {
+        "sampler" : 0, 
+        "source" : 5
+    }]
+}

BIN
public/assets/avatars/male/brown_eye.png


BIN
public/assets/avatars/male/eyebrow001.png


BIN
public/assets/avatars/male/male_casualsuit01_diffuse.png


BIN
public/assets/avatars/male/male_casualsuit01_normal.png


BIN
public/assets/avatars/male/middleage_lightskinned_male_diffuse.png


BIN
public/assets/avatars/male/short02_diffuse.png


+ 64 - 24
public/index.html

@@ -1,24 +1,64 @@
-<html xmlns="http://www.w3.org/1999/xhtml">    
-  <head>      
-    <title>Live Coding Space</title>
-    <link rel="stylesheet" href="./web/lib/mdl/material.min.css">
-    <script src="./web/lib/mdl/material.min.js"></script>
-    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
-    <script src="./web/lib/socketio/socket.io.js"></script>
-    <link rel="stylesheet" href="./web/lib/app.css">
-    <script src="./web/lib/app.js"></script>
-    <script>
-      //var socket = initWebSocket();
-      window.onload = getAppDetails(); 
-    </script>
-  </head>
-  <body>
-    <a href="https://github.com/NikolaySuslov/livecodingspace"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/e7bbb0521b397edbd5fe43e7f760759336b5e05f/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677265656e5f3030373230302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"></a>
-   <div id="main" class="mdl-grid">
-     <div class="mdl-cell mdl-cell--12-col mdl-shadow--1dp">
-       <h2 class="mdl-color-text--grey-700">Welcome to <strong>LiveCoding.space</strong>!</h2>
-       <span class="mdl-color-text--grey-500">Based on: <strong> Virtual World Framework | A-Frame | Ohm language | OSC.js | and more... </strong>  by Krestianstvo.org </span>
-     </div>
-</div>
-  </body>  
-</html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+  <title>Live Coding Space</title>
+  <script type="text/javascript" src="./web/lib/cell.js"></script>
+  <script type="text/javascript" src="./web/lib/he.js"></script>
+
+  <link rel="stylesheet" href="./web/lib/mdc/dist/material-components-web.css">
+  <script src="./web/lib/mdc/dist/material-components-web.js"></script>
+
+
+  <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500" rel="stylesheet">
+  <script src="./web/lib/socketio/socket.io.js"></script>
+  <link rel="stylesheet" href="./web/lib/app.css">
+  <script src="./web/lib/app.js"></script>
+
+  <!-- Global Site Tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-11815598-9"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag() { dataLayer.push(arguments) };
+    gtag('js', new Date());
+
+    gtag('config', 'UA-11815598-9');
+
+  </script>
+
+
+</head>
+
+<body class="mdc-typography">
+
+  <a href="https://github.com/NikolaySuslov/livecodingspace"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/e7bbb0521b397edbd5fe43e7f760759336b5e05f/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677265656e5f3030373230302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_green_007200.png"></a>
+
+  <div id="header" class="mdc-layout-grid mdc-layout-grid--align-left">
+    <div class="mdc-layout-grid__inner">
+      <div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-12">
+        <h1 class="mdc-typography--display3 mdc-theme--text-secondary-on-background mdc-typography">
+          <strong>LiveCoding</strong>.space
+        </h1>
+      </div>
+      <div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-12">
+        <h1 class="mdc-typography mdc-typography--headline mdc-typography--adjust-margin mdc-theme--text-hint-on-background">
+          Based on: <strong>Virtual World Framework | A-Frame | Ohm language | OSC.js | and more... </strong> by Krestianstvo.org
+        </h1>
+      </div>
+    </div>
+  </div>
+
+  <div id="main">
+  </div>
+
+
+  <script>
+    //var socket = initWebSocket();
+    window.onload = getAppDetails();
+  </script>
+
+  <script>
+    mdc.autoInit()
+  </script>
+</body>
+
+</html>

+ 8 - 0
public/vr/assets.json

@@ -10,9 +10,17 @@
     "mon":{
         "tag": "a-asset-item",
         "src": "./assets/mon/model.gltf"
+    },
+    "av":{
+        "tag": "a-asset-item",
+        "src": "./assets/av/avatar1.gltf"
     },
      "bg2":{
         "tag": "img",
         "src": "./assets/checker.jpg"
+    },
+    "maleAvatar":{
+        "tag": "a-asset-item",
+        "src": "/../assets/avatars/male/avatar1.gltf"
     }
 }

BIN
public/vr/assets/MarineCv2_color.jpg


BIN
public/vr/assets/images/planeDiffuse.png


File diff suppressed because it is too large
+ 0 - 10
public/vr/assets/marine_anims_core.json


+ 0 - 867
public/vr/assets/pirouette.bvh

@@ -1,867 +0,0 @@
-HIERARCHY
-ROOT hip
-{
-  OFFSET 0 0 0
-  CHANNELS 6 Xposition Yposition Zposition Zrotation Yrotation Xrotation
-  JOINT abdomen
-  {
-    OFFSET 0 20.6881 -0.73152
-    CHANNELS 3 Zrotation Xrotation Yrotation
-    JOINT chest
-    {
-      OFFSET 0 11.7043 -0.48768
-      CHANNELS 3 Zrotation Xrotation Yrotation
-      JOINT neck
-      {
-        OFFSET 0 22.1894 -2.19456
-        CHANNELS 3 Zrotation Xrotation Yrotation
-        JOINT head
-        {
-          OFFSET -0.24384 7.07133 1.2192
-          CHANNELS 3 Zrotation Xrotation Yrotation
-          JOINT leftEye
-          {
-            OFFSET 4.14528 8.04674 8.04672
-            CHANNELS 3 Zrotation Xrotation Yrotation
-            End Site
-            {
-              OFFSET 1 0 0
-            }
-          }
-          JOINT rightEye
-          {
-            OFFSET -3.6576 8.04674 8.04672
-            CHANNELS 3 Zrotation Xrotation Yrotation
-            End Site
-            {
-              OFFSET 1 0 0
-            }
-          }
-        }
-      }
-      JOINT rCollar
-      {
-        OFFSET -2.68224 19.2634 -4.8768
-        CHANNELS 3 Zrotation Xrotation Yrotation
-        JOINT rShldr
-        {
-          OFFSET -8.77824 -1.95073 1.46304
-          CHANNELS 3 Zrotation Xrotation Yrotation
-          JOINT rForeArm
-          {
-            OFFSET -28.1742 -1.7115 0.48768
-            CHANNELS 3 Zrotation Xrotation Yrotation
-            JOINT rHand
-            {
-              OFFSET -22.5879 0.773209 7.07136
-              CHANNELS 3 Zrotation Xrotation Yrotation
-              JOINT rThumb1
-              {
-                OFFSET -1.2192 -0.487915 3.41376
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT rThumb2
-                {
-                  OFFSET -3.37035 -0.52449 3.41376
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET -1.78271 -1.18214 1.43049
-                  }
-                }
-              }
-              JOINT rIndex1
-              {
-                OFFSET -7.75947 0.938293 5.60832
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT rIndex2
-                {
-                  OFFSET -2.54057 -0.884171 1.56538
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET -1.62519 -0.234802 1.16502
-                  }
-                }
-              }
-              JOINT rMid1
-              {
-                OFFSET -8.24714 1.18213 3.41376
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT rMid2
-                {
-                  OFFSET -3.10165 -0.590103 1.0647
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET -2.48547 -0.328903 0.83742
-                  }
-                }
-              }
-              JOINT rRing1
-              {
-                OFFSET -8.82822 0.546677 1.51678
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT rRing2
-                {
-                  OFFSET -2.60934 -0.819778 -0.0198488
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET -2.33842 -0.294052 0.168128
-                  }
-                }
-              }
-              JOINT rPinky1
-              {
-                OFFSET -8.27202 -0.0477905 -0.4584
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT rPinky2
-                {
-                  OFFSET -1.82734 -0.647385 -0.700984
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET -1.69225 -0.51767 -0.607171
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-      JOINT lCollar
-      {
-        OFFSET 2.68224 19.2634 -4.8768
-        CHANNELS 3 Zrotation Xrotation Yrotation
-        JOINT lShldr
-        {
-          OFFSET 8.77824 -1.95073 1.46304
-          CHANNELS 3 Zrotation Xrotation Yrotation
-          JOINT lForeArm
-          {
-            OFFSET 28.1742 -1.7115 0.48768
-            CHANNELS 3 Zrotation Xrotation Yrotation
-            JOINT lHand
-            {
-              OFFSET 22.5879 0.773209 7.07136
-              CHANNELS 3 Zrotation Xrotation Yrotation
-              JOINT lThumb1
-              {
-                OFFSET 1.2192 -0.487915 3.41376
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT lThumb2
-                {
-                  OFFSET 3.37035 -0.52449 3.41376
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET 1.78271 -1.18214 1.43049
-                  }
-                }
-              }
-              JOINT lIndex1
-              {
-                OFFSET 7.75947 0.938293 5.60832
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT lIndex2
-                {
-                  OFFSET 2.54057 -0.884171 1.56538
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET 1.62519 -0.234802 1.16502
-                  }
-                }
-              }
-              JOINT lMid1
-              {
-                OFFSET 8.24714 1.18213 3.41376
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT lMid2
-                {
-                  OFFSET 3.10165 -0.590103 1.0647
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET 2.48547 -0.328903 0.83742
-                  }
-                }
-              }
-              JOINT lRing1
-              {
-                OFFSET 8.82822 0.546677 1.51678
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT lRing2
-                {
-                  OFFSET 2.60934 -0.819778 -0.0198488
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET 2.33842 -0.294052 0.168128
-                  }
-                }
-              }
-              JOINT lPinky1
-              {
-                OFFSET 8.27202 -0.0477905 -0.4584
-                CHANNELS 3 Zrotation Xrotation Yrotation
-                JOINT lPinky2
-                {
-                  OFFSET 1.82734 -0.647385 -0.700984
-                  CHANNELS 3 Zrotation Xrotation Yrotation
-                  End Site
-                  {
-                    OFFSET 1.69225 -0.51767 -0.607171
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  JOINT rButtock
-  {
-    OFFSET -8.77824 4.35084 1.2192
-    CHANNELS 3 Zrotation Xrotation Yrotation
-    JOINT rThigh
-    {
-      OFFSET 0 -1.70687 -2.19456
-      CHANNELS 3 Zrotation Xrotation Yrotation
-      JOINT rShin
-      {
-        OFFSET 0 -36.8199 0.73152
-        CHANNELS 3 Zrotation Xrotation Yrotation
-        JOINT rFoot
-        {
-          OFFSET 0.73152 -45.1104 -5.12064
-          CHANNELS 3 Zrotation Xrotation Yrotation
-          End Site
-          {
-            OFFSET -1.1221 -3.69964 12.103
-          }
-        }
-      }
-    }
-  }
-  JOINT lButtock
-  {
-    OFFSET 8.77824 4.35084 1.2192
-    CHANNELS 3 Zrotation Xrotation Yrotation
-    JOINT lThigh
-    {
-      OFFSET 0 -1.70687 -2.19456
-      CHANNELS 3 Zrotation Xrotation Yrotation
-      JOINT lShin
-      {
-        OFFSET 0 -36.8199 0.73152
-        CHANNELS 3 Zrotation Xrotation Yrotation
-        JOINT lFoot
-        {
-          OFFSET -0.73152 -45.1104 -5.12064
-          CHANNELS 3 Zrotation Xrotation Yrotation
-          End Site
-          {
-            OFFSET 1.1221 -3.69964 12.103
-          }
-        }
-      }
-    }
-  }
-}
-MOTION
-Frames:	592
-Frame Time:	0.00833333
-15.3137 84.8855 152.037 0.0 0.0 0.0 -0.188091 -0.00125237 -0.00538531 -0.0519266 -0.00198482 -0.00899599 9.27476e-16 0.0 6.83322e-17 2.82958e-15 3.18055e-15 2.0655e-16 -0.0 0.0 0.0 -0.0 0.0 0.0 4.9566e-16 1.55301e-18 1.98785e-16 1.19007e-14 7.45443e-17 1.59028e-15 1.72644e-13 -4.96962e-14 2.54444e-14 1.97338e-12 5.92627e-14 1.20861e-13 4.6541e-12 1.76179e-14 3.40319e-13 8.02812e-12 2.8625e-14 5.78066e-13 4.65912e-12 1.94809e-14 3.30778e-13 7.73091 5.47488 0.417314 4.65489e-12 1.80894e-14 3.40319e-13 2.90554 0.965183 0.102902 4.66527e-12 1.799e-14 3.36344e-13 10.2786 0.731801 0.0259123 4.65534e-12 1.70955e-14 3.49861e-13 2.22167 -0.733487 -0.20892 3.98899e-16 1.55301e-18 -9.93923e-17 7.98235e-15 -1.86361e-17 0.0 1.7006e-13 5.48646e-14 2.8625e-14 1.97459e-12 -4.06515e-14 1.39944e-13 4.65535e-12 2.6555e-14 3.40319e-13 8.04839e-12 4.13472e-14 5.89198e-13 4.64798e-12 2.8625e-14 3.49861e-13 -7.73091 5.47488 -0.417314 4.65395e-12 2.69353e-14 3.40319e-13 -2.90554 0.965183 -0.102902 4.64407e-12 2.71341e-14 3.39524e-13 -10.2786 0.731801 -0.0259123 4.65912e-12 2.78299e-14 3.37139e-13 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.336734 -2.83766 -0.0337241 -0.00646394 -0.412343 -0.0567805 -0.478874 3.24961 0.120274 2.03217e-16 0.0 3.88251e-19 -0.623535 -3.58112 0.0516575 0.00431627 0.934347 0.0368639 0.481733 2.64641 -0.108456
-13.5585 81.9462 146.03 176.763 -59.1987 -158.376 -2.46068 -4.60557 0.233053 0.354285 -1.55493 0.0658666 -1.87797 -0.281619 -2.19851 2.00096 1.5638 -4.15964 -0.0 0.0 0.0 -0.0 0.0 0.0 7.65153e-14 -3.31409e-13 2.90362e-14 11.3211 -31.0768 3.41814 -1.74473 -0.579838 2.91239 1.67246 29.4194 2.39584 -3.22702e-10 9.38411e-10 5.25266e-10 -4.94137e-10 1.30904e-09 9.10659e-10 -3.22699e-10 9.38414e-10 5.25257e-10 7.73091 5.47488 0.417314 -3.22703e-10 9.38413e-10 5.25265e-10 2.90554 0.965183 0.102902 -3.22691e-10 9.38413e-10 5.25262e-10 10.2786 0.731801 0.0259123 -3.22701e-10 9.38412e-10 5.25273e-10 2.22167 -0.733487 -0.20892 7.64336e-14 -3.31412e-13 2.87345e-14 -1.18094 -7.52415 2.57248 2.50317 -0.928147 -4.10751 -0.423596 14.5401 -1.81458 -5.21725e-11 -1.22889e-09 1.0053e-09 -4.65239e-11 -2.21621e-09 1.7317e-09 -5.21786e-11 -1.22889e-09 1.00531e-09 -7.73091 5.47488 -0.417314 -5.21735e-11 -1.22889e-09 1.0053e-09 -2.90554 0.965183 -0.102902 -5.21802e-11 -1.22889e-09 1.0053e-09 -10.2786 0.731801 -0.0259123 -5.21648e-11 -1.22889e-09 1.0053e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.3764 -13.1772 0.781364 -0.0206334 9.17523 0.0535074 -0.5034 3.77905 -5.02658 2.03217e-16 0.0 3.88251e-19 1.53347 -8.44123 -0.640826 -0.100144 8.95271 -0.255 2.12193 -10.6482 6.88046
-13.5951 83.0444 145.353 175.981 -58.7281 -157.765 -4.81345 -9.48478 0.47823 0.791319 -3.18422 0.141924 -3.87803 -0.596318 -4.53053 4.32936 3.14811 -8.56986 -0.0 0.0 0.0 -0.0 0.0 0.0 1.60354e-13 -7.026e-13 5.80234e-14 31.9298 -63.3798 13.6557 -3.526 -1.18819 5.99358 -1.7037 60.3706 8.70213 -6.89256e-10 2.00211e-09 1.11305e-09 -1.05659e-09 2.7963e-09 1.92946e-09 -6.89254e-10 2.00212e-09 1.11304e-09 7.73091 5.47488 0.417314 -6.89258e-10 2.00212e-09 1.11305e-09 2.90554 0.965183 0.102902 -6.89245e-10 2.00212e-09 1.11305e-09 10.2786 0.731801 0.0259123 -6.89255e-10 2.00212e-09 1.11306e-09 2.22167 -0.733487 -0.20892 1.6029e-13 -7.02607e-13 5.77159e-14 -1.68016 -15.5394 5.45181 5.00603 -1.89393 -8.45474 0.270946 29.9384 -4.17872 -1.07539e-10 -2.56828e-09 2.0895e-09 -9.50026e-11 -4.63009e-09 3.59906e-09 -1.07544e-10 -2.56828e-09 2.08951e-09 -7.73091 5.47488 -0.417314 -1.0754e-10 -2.56828e-09 2.08951e-09 -2.90554 0.965183 -0.102902 -1.07543e-10 -2.56828e-09 2.0895e-09 -10.2786 0.731801 -0.0259123 -1.07527e-10 -2.56829e-09 2.0895e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.82255 -24.1415 1.75132 -0.0774464 19.3721 0.181142 -0.449311 4.17656 -10.4457 2.03217e-16 0.0 3.88251e-19 3.76622 -13.5502 -1.42451 -0.119262 17.4239 -0.587095 7.68737 -24.3035 15.3819
-13.7131 84.0414 144.527 176.082 -58.3406 -158.038 -6.888 -13.8133 0.72875 1.17892 -4.6608 0.216234 -5.69858 -0.839883 -6.59616 6.67994 4.5925 -12.5151 -0.0 0.0 0.0 -0.0 0.0 0.0 2.28555e-13 -9.94229e-13 8.67109e-14 139.735 -80.6005 110.811 -5.05803 -1.72155 8.74069 -66.4167 83.5197 75.0579 -9.77415e-10 2.8152e-09 1.57512e-09 -1.49847e-09 3.92707e-09 2.73082e-09 -9.77415e-10 2.8152e-09 1.57511e-09 7.73091 5.47488 0.417314 -9.77418e-10 2.8152e-09 1.57511e-09 2.90554 0.965183 0.102902 -9.77405e-10 2.8152e-09 1.57511e-09 10.2786 0.731801 0.0259123 -9.77414e-10 2.8152e-09 1.57512e-09 2.22167 -0.733487 -0.20892 2.28503e-13 -9.94238e-13 8.64022e-14 -1.38276 -22.3828 8.27853 7.11332 -2.72726 -12.3351 2.36739 43.4107 -7.26279 -1.65828e-10 -3.68671e-09 3.01521e-09 -1.55668e-10 -6.64871e-09 5.19392e-09 -1.65832e-10 -3.68671e-09 3.01522e-09 -7.73091 5.47488 -0.417314 -1.65828e-10 -3.68671e-09 3.01522e-09 -2.90554 0.965183 -0.102902 -1.65829e-10 -3.68672e-09 3.01521e-09 -10.2786 0.731801 -0.0259123 -1.65813e-10 -3.68673e-09 3.01521e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.49371 -33.8276 2.82892 -0.170972 28.35 0.309099 -0.272579 4.70842 -15.3401 2.03217e-16 0.0 3.88251e-19 5.47861 -18.1515 -2.1098 -0.0427632 24.9869 -0.915048 16.6037 -34.732 25.2236
-13.7945 85.1027 143.616 176.213 -58.1302 -158.514 -8.34222 -16.7656 0.976648 1.43533 -5.75565 0.285653 -7.01777 -0.911158 -7.99502 8.63822 5.77551 -15.2677 -0.0 0.0 0.0 -0.0 0.0 0.0 2.5766e-13 -1.08695e-12 1.14649e-13 -167.467 -64.1873 155.509 -6.09131 -2.08459 10.6492 -146.285 71.2918 155.48 -1.06959e-09 3.00174e-09 1.72289e-09 -1.63888e-09 4.16657e-09 2.98857e-09 -1.06959e-09 3.00174e-09 1.72288e-09 7.73091 5.47488 0.417314 -1.06959e-09 3.00174e-09 1.72288e-09 2.90554 0.965183 0.102902 -1.06958e-09 3.00174e-09 1.72288e-09 10.2786 0.731801 0.0259123 -1.06959e-09 3.00174e-09 1.72289e-09 2.22167 -0.733487 -0.20892 2.57607e-13 -1.08696e-12 1.14351e-13 -0.742437 -26.4867 10.3946 8.51052 -3.28411 -15.0363 5.1435 52.2626 -10.4626 -2.31422e-10 -4.25276e-09 3.54468e-09 -2.46802e-10 -7.67915e-09 6.10753e-09 -2.31425e-10 -4.25276e-09 3.5447e-09 -7.73091 5.47488 -0.417314 -2.31422e-10 -4.25276e-09 3.54469e-09 -2.90554 0.965183 -0.102902 -2.31421e-10 -4.25276e-09 3.54469e-09 -10.2786 0.731801 -0.0259123 -2.31405e-10 -4.25278e-09 3.54469e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.94526 -40.3451 3.78926 -0.260496 34.2811 0.400417 0.124087 5.65034 -18.9202 2.03217e-16 0.0 3.88251e-19 6.1762 -21.4945 -2.46884 0.0735407 30.2818 -1.15928 24.8047 -39.6161 33.5827
-13.8647 86.1002 142.86 175.75 -57.7645 -158.432 -9.04621 -17.7578 1.21906 1.49612 -6.3414 0.35289 -7.64297 -0.726406 -8.46353 9.95254 6.68186 -16.3478 -0.0 0.0 0.0 -0.0 0.0 0.0 2.30953e-13 -8.59334e-13 1.68594e-13 -159.371 -56.9712 160.621 -6.474 -2.21807 11.3693 -150.76 65.3108 159.957 -9.44829e-10 2.48609e-09 1.42933e-09 -1.4541e-09 3.47434e-09 2.49016e-09 -9.44829e-10 2.4861e-09 1.42932e-09 7.73091 5.47488 0.417314 -9.44831e-10 2.48609e-09 1.42932e-09 2.90554 0.965183 0.102902 -9.44819e-10 2.4861e-09 1.42933e-09 10.2786 0.731801 0.0259123 -9.44828e-10 2.48609e-09 1.42933e-09 2.22167 -0.733487 -0.20892 2.30877e-13 -8.5934e-13 1.68331e-13 -0.443814 -26.7561 11.0456 9.03283 -3.49089 -16.0762 6.3614 54.7936 -11.7362 -4.49165e-10 -3.92844e-09 3.69266e-09 -6.19361e-10 -7.14558e-09 6.37087e-09 -4.49167e-10 -3.92844e-09 3.69267e-09 -7.73091 5.47488 -0.417314 -4.49164e-10 -3.92844e-09 3.69267e-09 -2.90554 0.965183 -0.102902 -4.49164e-10 -3.92844e-09 3.69267e-09 -10.2786 0.731801 -0.0259123 -4.49148e-10 -3.92846e-09 3.69266e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.53748 -42.3815 4.20114 -0.289626 35.8676 0.394761 1.21705 8.22651 -21.1324 2.03217e-16 0.0 3.88251e-19 5.52352 -23.0366 -2.29922 0.138307 32.4015 -1.22604 26.8445 -38.8485 36.3819
-13.9363 86.9641 142.194 175.183 -57.3365 -158.251 -9.22685 -17.3516 1.45122 1.41664 -6.5623 0.418196 -7.77127 -0.35987 -8.26762 10.7405 7.4122 -16.2257 -0.0 0.0 0.0 -0.0 0.0 0.0 1.64431e-13 -4.04901e-13 2.39827e-13 -159.005 -58.4654 161.998 -6.40458 -2.19109 11.2403 -148.603 67.8603 157.666 -6.62381e-10 1.46055e-09 8.20605e-10 -1.03243e-09 2.10154e-09 1.45142e-09 -6.6238e-10 1.46055e-09 8.20596e-10 7.73091 5.47488 0.417314 -6.62382e-10 1.46055e-09 8.20596e-10 2.90554 0.965183 0.102902 -6.62373e-10 1.46055e-09 8.20602e-10 10.2786 0.731801 0.0259123 -6.62382e-10 1.46055e-09 8.20607e-10 2.22167 -0.733487 -0.20892 1.64317e-13 -4.04899e-13 2.39616e-13 -0.529848 -24.3259 10.5825 8.95739 -3.4584 -15.9274 5.64426 52.8937 -10.8926 -7.68827e-10 -2.97373e-09 3.5599e-09 -1.18157e-09 -5.50347e-09 6.15529e-09 -7.68828e-10 -2.97373e-09 3.55991e-09 -7.73091 5.47488 -0.417314 -7.68826e-10 -2.97373e-09 3.5599e-09 -2.90554 0.965183 -0.102902 -7.68828e-10 -2.97373e-09 3.5599e-09 -10.2786 0.731801 -0.0259123 -7.68813e-10 -2.97373e-09 3.5599e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.36952 -41.2285 4.10689 -0.26782 34.3547 0.314457 2.85674 11.9045 -22.4317 2.03217e-16 0.0 3.88251e-19 3.93697 -23.2942 -1.73875 0.139308 32.2537 -1.1481 23.7712 -34.6386 34.8842
-14.0255 87.7553 141.493 175.123 -57.0662 -158.495 -9.07763 -16.4407 1.66008 1.29442 -6.59676 0.474619 -7.66043 0.0509275 -7.80069 11.1295 8.0358 -15.5934 -0.0 0.0 0.0 -0.0 0.0 0.0 8.37109e-14 7.32758e-14 2.74686e-13 -161.169 -63.3172 162.311 -6.16478 -2.1047 10.7913 -141.899 73.4396 150.781 -2.24942e-10 -4.89115e-11 8.79059e-11 -3.61049e-10 -4.91334e-11 1.88686e-10 -2.24939e-10 -4.89103e-11 8.7898e-11 7.73091 5.47488 0.417314 -2.24942e-10 -4.89108e-11 8.78957e-11 2.90554 0.965183 0.102902 -2.24935e-10 -4.89106e-11 8.79041e-11 10.2786 0.731801 0.0259123 -2.24944e-10 -4.89107e-11 8.79103e-11 2.22167 -0.733487 -0.20892 8.35544e-14 7.32831e-14 2.74521e-13 -0.704258 -21.0302 9.80779 8.64461 -3.33122 -15.3074 4.42079 49.3214 -9.46288 -9.02182e-10 -1.95407e-09 3.03765e-09 -1.4376e-09 -3.70684e-09 5.26257e-09 -9.02183e-10 -1.95407e-09 3.03766e-09 -7.73091 5.47488 -0.417314 -9.02181e-10 -1.95407e-09 3.03765e-09 -2.90554 0.965183 -0.102902 -9.02185e-10 -1.95407e-09 3.03765e-09 -10.2786 0.731801 -0.0259123 -9.02171e-10 -1.95407e-09 3.03765e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.99163 -38.9092 3.87914 -0.235972 31.7285 0.23097 3.93623 14.4343 -22.6203 2.03217e-16 0.0 3.88251e-19 2.0774 -23.1088 -1.05131 0.118362 31.202 -1.01611 19.2984 -29.1127 32.2641
-14.2326 88.6883 140.712 175.581 -56.7643 -159.072 -8.77624 -15.9184 1.837 1.22783 -6.62316 0.515317 -7.55749 0.366872 -7.45555 11.2858 8.61055 -15.1489 -0.0 0.0 0.0 -0.0 0.0 0.0 1.44082e-14 3.72119e-13 2.19508e-13 -162.123 -66.0 162.984 -6.03657 -2.06005 10.5512 -134.776 76.699 143.524 3.64793e-10 -2.01631e-09 -5.7757e-10 5.72865e-10 -3.075e-09 -9.81683e-10 3.64796e-10 -2.01631e-09 -5.77576e-10 7.73091 5.47488 0.417314 3.64793e-10 -2.01631e-09 -5.77579e-10 2.90554 0.965183 0.102902 3.64799e-10 -2.01631e-09 -5.7757e-10 10.2786 0.731801 0.0259123 3.64789e-10 -2.01631e-09 -5.77563e-10 2.22167 -0.733487 -0.20892 1.42177e-14 3.72129e-13 2.19359e-13 -0.833577 -18.7282 9.40374 8.45449 -3.25375 -14.9335 3.7458 46.8695 -8.62838 -5.61004e-10 -1.43495e-09 2.01718e-09 -8.91643e-10 -2.7097e-09 3.49449e-09 -5.61005e-10 -1.43495e-09 2.01719e-09 -7.73091 5.47488 -0.417314 -5.61002e-10 -1.43495e-09 2.01718e-09 -2.90554 0.965183 -0.102902 -5.61008e-10 -1.43495e-09 2.01718e-09 -10.2786 0.731801 -0.0259123 -5.60995e-10 -1.43494e-09 2.01717e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.92293 -37.4477 3.86278 -0.216237 29.9755 0.204263 3.33687 13.5507 -21.3472 2.03217e-16 0.0 3.88251e-19 0.630166 -23.3257 -0.492212 0.112225 30.6099 -0.918346 16.1704 -24.6524 30.6634
-14.5154 89.6608 139.893 176.484 -56.4683 -159.914 -8.28163 -15.9562 1.95533 1.24967 -6.65186 0.531469 -7.45013 0.544487 -7.29154 11.128 9.14033 -14.9961 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.90919e-14 4.4392e-13 -3.50576e-14 -161.234 -65.1694 164.34 -6.08787 -2.08318 10.6428 -134.41 76.8003 143.149 1.51887e-09 -5.9015e-09 -1.51777e-09 2.4387e-09 -9.41368e-09 -2.6797e-09 1.51888e-09 -5.9015e-09 -1.51778e-09 7.73091 5.47488 0.417314 1.51887e-09 -5.9015e-09 -1.51778e-09 2.90554 0.965183 0.102902 1.51888e-09 -5.9015e-09 -1.51777e-09 10.2786 0.731801 0.0259123 1.51887e-09 -5.9015e-09 -1.51777e-09 2.22167 -0.733487 -0.20892 -5.9312e-14 4.43925e-13 -3.52423e-14 -0.989924 -17.7742 9.46338 8.45132 -3.25202 -14.9277 3.56594 46.0256 -8.37828 8.93264e-10 -1.85998e-09 -3.73171e-10 1.52571e-09 -3.1783e-09 -6.72866e-10 8.93262e-10 -1.85998e-09 -3.73161e-10 -7.73091 5.47488 -0.417314 8.93266e-10 -1.85998e-09 -3.73175e-10 -2.90554 0.965183 -0.102902 8.9326e-10 -1.85998e-09 -3.73173e-10 -10.2786 0.731801 -0.0259123 8.93272e-10 -1.85997e-09 -3.73179e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.31942 -37.1934 4.22083 -0.201826 29.4513 0.260857 0.375393 6.19129 -18.5833 2.03217e-16 0.0 3.88251e-19 -0.21239 -24.1233 -0.125525 0.12149 30.6943 -0.865179 14.4087 -21.8385 29.9354
-14.8346 90.4461 139.129 177.455 -56.2277 -160.621 -7.52673 -16.1 2.02839 1.30499 -6.60011 0.52902 -7.23226 0.660024 -7.1141 10.6082 9.59788 -14.7889 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.42969e-13 3.94837e-13 -4.2871e-13 -160.665 -63.732 165.338 -6.1702 -2.12032 10.7902 -135.792 76.3519 144.57 3.10115e-09 -1.12294e-08 -2.7037e-09 5.00764e-09 -1.82094e-08 -4.83929e-09 3.10115e-09 -1.12294e-08 -2.7037e-09 7.73091 5.47488 0.417314 3.10115e-09 -1.12294e-08 -2.7037e-09 2.90554 0.965183 0.102902 3.10115e-09 -1.12294e-08 -2.7037e-09 10.2786 0.731801 0.0259123 3.10115e-09 -1.12294e-08 -2.70369e-09 2.22167 -0.733487 -0.20892 -1.43219e-13 3.94833e-13 -4.28965e-13 -1.22072 -17.2247 9.64003 8.45288 -3.25285 -14.9305 3.432 45.3855 -8.19148 3.11967e-09 -2.82997e-09 -3.79453e-09 5.23764e-09 -4.46655e-09 -6.64343e-09 3.11966e-09 -2.82996e-09 -3.79451e-09 -7.73091 5.47488 -0.417314 3.11967e-09 -2.82997e-09 -3.79453e-09 -2.90554 0.965183 -0.102902 3.11967e-09 -2.82997e-09 -3.79453e-09 -10.2786 0.731801 -0.0259123 3.11967e-09 -2.82996e-09 -3.79453e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.90094 -37.1283 4.74745 -0.182537 29.1545 0.363808 -3.04294 -5.99536 -15.205 2.03217e-16 0.0 3.88251e-19 -0.818127 -25.0669 0.184053 0.130639 30.7769 -0.814562 12.7929 -19.3799 29.1013
-15.157 90.9737 138.427 178.168 -55.9097 -161.001 -6.64097 -16.3043 2.10915 1.36108 -6.50673 0.523346 -7.00051 0.752619 -6.93501 9.96474 9.99117 -14.5536 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.97455e-13 2.52599e-13 -7.60637e-13 -160.505 -62.4897 165.994 -6.24449 -2.15387 10.9236 -136.757 76.0224 145.563 4.28662e-09 -1.50717e-08 -3.38771e-09 6.94515e-09 -2.46193e-08 -6.11499e-09 4.28662e-09 -1.50717e-08 -3.3877e-09 7.73091 5.47488 0.417314 4.28662e-09 -1.50717e-08 -3.3877e-09 2.90554 0.965183 0.102902 4.28662e-09 -1.50717e-08 -3.3877e-09 10.2786 0.731801 0.0259123 4.28662e-09 -1.50717e-08 -3.38769e-09 2.22167 -0.733487 -0.20892 -1.97723e-13 2.52586e-13 -7.60959e-13 -1.4992 -17.017 9.86365 8.45632 -3.2547 -14.9368 3.3415 44.9483 -8.0651 4.93717e-09 -3.64616e-09 -6.5398e-09 8.27058e-09 -5.55997e-09 -1.14354e-08 4.93717e-09 -3.64615e-09 -6.53977e-09 -7.73091 5.47488 -0.417314 4.93718e-09 -3.64616e-09 -6.5398e-09 -2.90554 0.965183 -0.102902 4.93717e-09 -3.64616e-09 -6.5398e-09 -10.2786 0.731801 -0.0259123 4.93718e-09 -3.64615e-09 -6.53981e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.48631 -37.2297 5.19309 -0.164223 29.0359 0.471216 -4.59852 -18.0142 -11.2709 2.03217e-16 0.0 3.88251e-19 -1.31369 -26.0855 0.491416 0.139493 30.8789 -0.768653 11.3555 -17.1983 28.267
-15.4594 91.4912 137.744 178.936 -55.5657 -161.397 -5.75337 -16.5234 2.2507 1.3852 -6.4105 0.529817 -6.8519 0.861459 -6.76607 9.43675 10.328 -14.3166 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.82781e-13 4.49339e-14 -8.30025e-13 -160.761 -62.2424 166.408 -6.27194 -2.16629 10.9729 -135.394 76.5032 144.159 4.25028e-09 -1.45e-08 -2.82216e-09 6.91673e-09 -2.38006e-08 -5.16132e-09 4.25028e-09 -1.45e-08 -2.82216e-09 7.73091 5.47488 0.417314 4.25028e-09 -1.45e-08 -2.82216e-09 2.90554 0.965183 0.102902 4.25028e-09 -1.45e-08 -2.82216e-09 10.2786 0.731801 0.0259123 4.25028e-09 -1.45e-08 -2.82215e-09 2.22167 -0.733487 -0.20892 -1.83045e-13 4.49154e-14 -8.30373e-13 -1.79575 -17.0883 10.0663 8.4588 -3.25604 -14.9414 3.2939 44.7129 -7.99806 5.16475e-09 -3.6098e-09 -6.90191e-09 8.651e-09 -5.44407e-09 -1.20671e-08 5.16474e-09 -3.60979e-09 -6.90188e-09 -7.73091 5.47488 -0.417314 5.16475e-09 -3.60979e-09 -6.90191e-09 -2.90554 0.965183 -0.102902 5.16474e-09 -3.60979e-09 -6.90192e-09 -10.2786 0.731801 -0.0259123 5.16475e-09 -3.60979e-09 -6.90192e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.89128 -37.4784 5.30657 -0.153194 29.0463 0.541411 -3.10025 -24.3938 -5.80625 2.03217e-16 0.0 3.88251e-19 -1.82338 -27.1077 0.85251 0.147821 31.022 -0.729584 10.1124 -15.229 27.5435
-15.7477 91.9834 137.141 179.85 -55.3764 -161.751 -4.8915 -16.8193 2.45811 1.37801 -6.30104 0.548429 -6.84924 0.985365 -6.61171 9.10358 10.6341 -14.0818 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.98584e-14 -3.10023e-13 -4.31659e-13 -161.545 -63.5091 166.58 -6.22269 -2.14412 10.8843 -129.347 78.1802 137.959 1.99994e-09 -5.87893e-09 1.44874e-10 3.33273e-09 -9.81373e-09 6.39098e-11 1.99994e-09 -5.87893e-09 1.44879e-10 7.73091 5.47488 0.417314 1.99994e-09 -5.87893e-09 1.44879e-10 2.90554 0.965183 0.102902 1.99994e-09 -5.87893e-09 1.44878e-10 10.2786 0.731801 0.0259123 1.99993e-09 -5.87893e-09 1.44888e-10 2.22167 -0.733487 -0.20892 -4.00851e-14 -3.10041e-13 -4.31962e-13 -2.11206 -17.5717 10.2541 8.45934 -3.25631 -14.9423 3.30313 44.7581 -8.01097 2.53876e-09 -2.03493e-09 -2.96719e-09 4.27209e-09 -3.14241e-09 -5.19817e-09 2.53875e-09 -2.03493e-09 -2.96716e-09 -7.73091 5.47488 -0.417314 2.53876e-09 -2.03493e-09 -2.96718e-09 -2.90554 0.965183 -0.102902 2.53876e-09 -2.03493e-09 -2.96719e-09 -10.2786 0.731801 -0.0259123 2.53877e-09 -2.03493e-09 -2.96719e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.0098 -37.9595 4.88704 -0.153336 29.2316 0.556407 0.823284 -22.1666 2.76329 2.03217e-16 0.0 3.88251e-19 -2.40146 -28.1943 1.2926 0.155719 31.2269 -0.699404 9.09095 -13.5584 26.9346
-16.009 92.3587 136.651 180.254 -55.0406 -161.687 -3.98665 -17.1912 2.7068 1.35377 -6.16455 0.572346 -6.92839 1.1073 -6.46521 8.83319 10.8969 -13.8357 -0.0 0.0 0.0 -0.0 0.0 0.0 1.93941e-13 -7.97306e-13 2.76808e-13 -162.784 -65.7667 166.482 -6.1238 -2.09959 10.7069 -116.841 80.2786 125.231 -1.76701e-09 8.27812e-09 4.79714e-09 -2.68383e-09 1.32091e-08 8.28198e-09 -1.76701e-09 8.27812e-09 4.79714e-09 7.73091 5.47488 0.417314 -1.76701e-09 8.27812e-09 4.79714e-09 2.90554 0.965183 0.102902 -1.76701e-09 8.27812e-09 4.79715e-09 10.2786 0.731801 0.0259123 -1.76702e-09 8.27812e-09 4.79716e-09 2.22167 -0.733487 -0.20892 1.93777e-13 -7.9732e-13 2.76593e-13 -2.45347 -18.4495 10.4591 8.45951 -3.25639 -14.9426 3.36282 45.0582 -8.0957 -1.99467e-09 5.39226e-10 3.86778e-09 -3.28675e-09 5.68643e-10 6.73272e-09 -1.99467e-09 5.39229e-10 3.86781e-09 -7.73091 5.47488 -0.417314 -1.99466e-09 5.39227e-10 3.86779e-09 -2.90554 0.965183 -0.102902 -1.99467e-09 5.39228e-10 3.86778e-09 -10.2786 0.731801 -0.0259123 -1.99466e-09 5.3923e-10 3.86778e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.94055 -38.6508 4.10205 -0.161 29.5984 0.540955 3.54429 -14.2723 12.775 2.03217e-16 0.0 3.88251e-19 -2.96689 -29.3559 1.78275 0.163231 31.4773 -0.676476 8.24905 -12.1944 26.3517
-16.3425 92.6395 135.962 180.832 -54.3665 -161.964 -3.0245 -17.4998 3.00496 1.30002 -6.03479 0.606678 -6.99632 1.24271 -6.32166 8.54873 11.0676 -13.5795 -0.0 0.0 0.0 -0.0 0.0 0.0 4.13699e-13 -1.24395e-12 9.51878e-13 -164.213 -68.2474 166.18 -6.02213 -2.05384 10.5251 -98.0201 81.6974 106.18 -5.34116e-09 2.16768e-08 9.07997e-09 -8.39856e-09 3.5003e-08 1.5857e-08 -5.34117e-09 2.16768e-08 9.07996e-09 7.73091 5.47488 0.417314 -5.34117e-09 2.16768e-08 9.07996e-09 2.90554 0.965183 0.102902 -5.34117e-09 2.16768e-08 9.07997e-09 10.2786 0.731801 0.0259123 -5.34117e-09 2.16768e-08 9.07998e-09 2.22167 -0.733487 -0.20892 4.136e-13 -1.24395e-12 9.51748e-13 -2.8003 -19.434 10.6504 8.46039 -3.25686 -14.9441 3.44356 45.4556 -8.20946 -6.30197e-09 2.9737e-09 1.03447e-08 -1.04698e-08 4.07438e-09 1.80389e-08 -6.30198e-09 2.97371e-09 1.03447e-08 -7.73091 5.47488 -0.417314 -6.30197e-09 2.9737e-09 1.03447e-08 -2.90554 0.965183 -0.102902 -6.30198e-09 2.97371e-09 1.03447e-08 -10.2786 0.731801 -0.0259123 -6.30197e-09 2.97371e-09 1.03447e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.8133 -39.3755 3.25699 -0.170833 30.0387 0.517302 2.67974 -4.66172 21.4151 2.03217e-16 0.0 3.88251e-19 -3.4448 -30.4452 2.29569 0.170055 31.7383 -0.657406 7.49472 -10.9605 25.7825
-16.7241 92.8442 135.309 181.807 -53.7716 -162.55 -1.99372 -17.6055 3.35971 1.20435 -5.94552 0.656539 -6.96025 1.40709 -6.17617 8.17431 11.0967 -13.3146 -0.0 0.0 0.0 -0.0 0.0 0.0 5.14498e-13 -1.47697e-12 1.25006e-12 -165.52 -70.1823 165.813 -5.96504 -2.02815 10.4232 -80.4229 81.9969 88.4074 -7.01312e-09 2.80225e-08 1.09387e-08 -1.1077e-08 4.53031e-08 1.9153e-08 -7.01312e-09 2.80225e-08 1.09387e-08 7.73091 5.47488 0.417314 -7.01312e-09 2.80225e-08 1.09387e-08 2.90554 0.965183 0.102902 -7.01312e-09 2.80225e-08 1.09387e-08 10.2786 0.731801 0.0259123 -7.01313e-09 2.80225e-08 1.09387e-08 2.22167 -0.733487 -0.20892 5.14445e-13 -1.47697e-12 1.24996e-12 -3.13918 -20.2382 10.7924 8.46303 -3.25828 -14.949 3.51364 45.7928 -8.30745 -8.24959e-09 4.12953e-09 1.32052e-08 -1.37212e-08 5.76008e-09 2.30337e-08 -8.2496e-09 4.12953e-09 1.32052e-08 -7.73091 5.47488 -0.417314 -8.24959e-09 4.12953e-09 1.32052e-08 -2.90554 0.965183 -0.102902 -8.2496e-09 4.12953e-09 1.32052e-08 -10.2786 0.731801 -0.0259123 -8.24959e-09 4.12954e-09 1.32051e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.78713 -39.9639 2.67523 -0.178208 30.4449 0.50803 -0.380984 3.07238 26.6806 2.03217e-16 0.0 3.88251e-19 -3.76887 -31.3154 2.79953 0.175889 31.975 -0.63879 6.74391 -9.67775 25.2255
-17.012 92.9927 134.682 182.588 -53.2296 -163.151 -0.862674 -17.4643 3.82482 1.03762 -5.90608 0.734831 -6.74886 1.63693 -6.03497 7.63706 10.8859 -13.052 -0.0 0.0 0.0 -0.0 0.0 0.0 4.27612e-13 -1.38456e-12 9.00532e-13 -166.869 -71.9797 165.246 -5.9601 -2.02571 10.4147 -65.8238 81.642 73.6626 -5.46525e-09 2.27452e-08 8.88755e-09 -8.60641e-09 3.66325e-08 1.55329e-08 -5.46525e-09 2.27451e-08 8.88754e-09 7.73091 5.47488 0.417314 -5.46525e-09 2.27452e-08 8.88755e-09 2.90554 0.965183 0.102902 -5.46525e-09 2.27452e-08 8.88756e-09 10.2786 0.731801 0.0259123 -5.46526e-09 2.27452e-08 8.88756e-09 2.22167 -0.733487 -0.20892 4.27581e-13 -1.38456e-12 9.00372e-13 -3.47193 -20.8092 10.8287 8.46422 -3.25892 -14.9512 3.56715 46.0465 -8.38192 -6.22308e-09 2.93254e-09 1.01742e-08 -1.03444e-08 4.01882e-09 1.77423e-08 -6.22309e-09 2.93253e-09 1.01742e-08 -7.73091 5.47488 -0.417314 -6.22308e-09 2.93253e-09 1.01742e-08 -2.90554 0.965183 -0.102902 -6.22309e-09 2.93253e-09 1.01742e-08 -10.2786 0.731801 -0.0259123 -6.22308e-09 2.93254e-09 1.01742e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.94888 -40.4074 2.43503 -0.182152 30.8395 0.527039 -3.62077 9.42784 27.1926 2.03217e-16 0.0 3.88251e-19 -3.88814 -31.9276 3.35516 0.180736 32.1844 -0.61876 5.91355 -8.19291 24.625
-17.2533 93.0933 134.07 183.26 -52.5727 -163.733 0.34616 -17.1524 4.37715 0.815126 -5.89833 0.834986 -6.42765 1.91323 -5.89823 6.99919 10.4889 -12.7887 -0.0 0.0 0.0 -0.0 0.0 0.0 2.2258e-13 -1.08086e-12 1.46237e-13 -168.464 -73.8417 164.347 -5.98387 -2.03603 10.4574 -53.8916 80.8604 61.5948 -1.8965e-09 1.01656e-08 4.33505e-09 -2.90623e-09 1.60458e-08 7.49164e-09 -1.8965e-09 1.01656e-08 4.33503e-09 7.73091 5.47488 0.417314 -1.89651e-09 1.01656e-08 4.33505e-09 2.90554 0.965183 0.102902 -1.8965e-09 1.01656e-08 4.33505e-09 10.2786 0.731801 0.0259123 -1.89651e-09 1.01656e-08 4.33506e-09 2.22167 -0.733487 -0.20892 2.22557e-13 -1.08086e-12 1.45961e-13 -3.80858 -21.293 10.7916 8.46456 -3.2591 -14.9519 3.62011 46.2945 -8.45536 -1.70884e-09 2.46982e-10 3.45832e-09 -2.81854e-09 1.03894e-10 6.01695e-09 -1.70885e-09 2.4698e-10 3.45833e-09 -7.73091 5.47488 -0.417314 -1.70884e-09 2.46981e-10 3.45832e-09 -2.90554 0.965183 -0.102902 -1.70884e-09 2.46982e-10 3.45832e-09 -10.2786 0.731801 -0.0259123 -1.70884e-09 2.46984e-10 3.45831e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.2121 -40.7869 2.37473 -0.185566 31.263 0.559934 -6.31639 16.3443 24.6107 2.03217e-16 0.0 3.88251e-19 -3.85682 -32.3595 3.95237 0.184781 32.383 -0.599473 5.07419 -6.63435 24.002
-17.5468 93.1431 133.42 184.393 -51.8577 -164.717 1.5616 -16.7114 4.90817 0.59127 -5.91485 0.932924 -6.10883 2.1682 -5.75188 6.38611 10.0849 -12.5038 -0.0 0.0 0.0 -0.0 0.0 0.0 1.88193e-15 -7.31852e-13 -5.85697e-13 -169.69 -74.6952 163.649 -6.03735 -2.05992 10.5531 -49.3637 80.4198 57.0066 1.62767e-09 -2.67373e-09 -4.32364e-10 2.70919e-09 -4.92509e-09 -9.0831e-10 1.62768e-09 -2.67375e-09 -4.32388e-10 7.73091 5.47488 0.417314 1.62767e-09 -2.67373e-09 -4.32366e-10 2.90554 0.965183 0.102902 1.62768e-09 -2.67373e-09 -4.32361e-10 10.2786 0.731801 0.0259123 1.62767e-09 -2.67372e-09 -4.32359e-10 2.22167 -0.733487 -0.20892 1.8555e-15 -7.31852e-13 -5.86089e-13 -4.14916 -21.7009 10.7753 8.47083 -3.26251 -14.9635 3.67131 46.5311 -8.52607 2.77543e-09 -2.15844e-09 -3.47858e-09 4.64825e-09 -3.30909e-09 -6.08804e-09 2.77542e-09 -2.15844e-09 -3.47856e-09 -7.73091 5.47488 -0.417314 2.77543e-09 -2.15844e-09 -3.47858e-09 -2.90554 0.965183 -0.102902 2.77543e-09 -2.15844e-09 -3.47858e-09 -10.2786 0.731801 -0.0259123 2.77544e-09 -2.15844e-09 -3.47859e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.49498 -41.0705 2.46989 -0.189692 31.6339 0.586838 -7.63933 23.1435 20.6521 2.03217e-16 0.0 3.88251e-19 -3.77657 -32.6413 4.44701 0.188011 32.5652 -0.583573 4.36042 -5.25089 23.4662
-17.9124 93.1558 132.62 186.084 -51.1881 -166.35 2.71714 -16.1839 5.31084 0.420385 -5.9482 1.00456 -5.90416 2.33399 -5.58175 5.92026 9.85353 -12.1751 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.32004e-13 -5.03521e-13 -8.68142e-13 -169.693 -73.4738 163.927 -6.12146 -2.09817 10.7031 -55.8889 81.0837 63.6126 3.04183e-09 -8.73057e-09 -3.12822e-09 4.92558e-09 -1.47479e-08 -5.60447e-09 3.04184e-09 -8.7306e-09 -3.12824e-09 7.73091 5.47488 0.417314 3.04183e-09 -8.73058e-09 -3.12822e-09 2.90554 0.965183 0.102902 3.04183e-09 -8.73058e-09 -3.12821e-09 10.2786 0.731801 0.0259123 3.04182e-09 -8.73057e-09 -3.12821e-09 2.22167 -0.733487 -0.20892 -1.3204e-13 -5.03521e-13 -8.6859e-13 -4.49071 -22.0437 10.8753 8.4898 -3.27287 -14.9984 3.71948 46.7505 -8.59228 4.71202e-09 -2.51504e-09 -7.17256e-09 7.84792e-09 -3.54453e-09 -1.25184e-08 4.71201e-09 -2.51505e-09 -7.17255e-09 -7.73091 5.47488 -0.417314 4.71202e-09 -2.51504e-09 -7.17256e-09 -2.90554 0.965183 -0.102902 4.71202e-09 -2.51504e-09 -7.17256e-09 -10.2786 0.731801 -0.0259123 4.71203e-09 -2.51504e-09 -7.17257e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.7129 -41.2257 2.6942 -0.195031 31.8707 0.587468 -7.80761 28.6957 17.0589 2.03217e-16 0.0 3.88251e-19 -3.75028 -32.8056 4.69433 0.190454 32.7255 -0.573726 3.88798 -4.29947 23.1158
-18.2397 93.1516 131.794 187.497 -50.5515 -167.827 3.86071 -15.5176 5.54691 0.326689 -6.01591 1.03982 -5.86964 2.35729 -5.37032 5.64661 9.90521 -11.7686 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.29196e-13 -4.81767e-13 -4.14036e-13 -167.984 -68.0978 165.409 -6.27599 -2.16927 10.9789 -92.8525 81.9881 100.946 9.88497e-10 -3.88053e-09 -2.62074e-09 1.54992e-09 -6.63603e-09 -4.55319e-09 9.88504e-10 -3.88054e-09 -2.62077e-09 7.73091 5.47488 0.417314 9.88496e-10 -3.88053e-09 -2.62074e-09 2.90554 0.965183 0.102902 9.88502e-10 -3.88053e-09 -2.62074e-09 10.2786 0.731801 0.0259123 9.88492e-10 -3.88052e-09 -2.62074e-09 2.22167 -0.733487 -0.20892 -1.29256e-13 -4.81768e-13 -4.14445e-13 -4.83884 -22.3194 11.1618 8.52688 -3.2931 -15.0664 3.77686 47.0085 -8.67083 2.51557e-09 6.00644e-10 -5.74978e-09 4.12009e-09 1.64591e-09 -9.99114e-09 2.51556e-09 6.00641e-10 -5.74976e-09 -7.73091 5.47488 -0.417314 2.51556e-09 6.00642e-10 -5.74977e-09 -2.90554 0.965183 -0.102902 2.51556e-09 6.00641e-10 -5.74978e-09 -10.2786 0.731801 -0.0259123 2.51557e-09 6.00641e-10 -5.74979e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.91919 -41.1795 3.09678 -0.201109 31.9087 0.552798 -7.38007 32.504 14.3045 2.03217e-16 0.0 3.88251e-19 -3.75424 -32.8468 4.59752 0.1928 32.9045 -0.572009 3.68808 -3.88439 22.9763
-18.5377 93.0334 130.981 187.879 -49.5435 -168.455 5.00771 -14.7118 5.67805 0.277993 -6.11545 1.05279 -5.93554 2.28586 -5.12972 5.49062 10.124 -11.3045 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.18664e-14 -5.64187e-13 4.91101e-13 -166.039 -59.7303 166.574 -6.48628 -2.26646 11.3561 -133.84 77.2823 142.532 -3.16185e-09 7.37169e-09 -3.03416e-10 -5.21378e-09 1.2023e-08 -2.41218e-10 -3.16185e-09 7.37169e-09 -3.03433e-10 7.73091 5.47488 0.417314 -3.16185e-09 7.37169e-09 -3.03415e-10 2.90554 0.965183 0.102902 -3.16185e-09 7.37169e-09 -3.03413e-10 10.2786 0.731801 0.0259123 -3.16186e-09 7.37169e-09 -3.03409e-10 2.22167 -0.733487 -0.20892 -5.19648e-14 -5.64189e-13 4.90784e-13 -5.19071 -22.5225 11.5693 8.57718 -3.32056 -15.1589 3.84024 47.2889 -8.75717 -2.1665e-09 5.92805e-09 -1.37437e-09 -3.77819e-09 1.03236e-08 -2.29135e-09 -2.16651e-09 5.92804e-09 -1.37435e-09 -7.73091 5.47488 -0.417314 -2.1665e-09 5.92804e-09 -1.37436e-09 -2.90554 0.965183 -0.102902 -2.1665e-09 5.92804e-09 -1.37437e-09 -10.2786 0.731801 -0.0259123 -2.16649e-09 5.92804e-09 -1.37437e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.1291 -40.9685 3.66986 -0.207829 31.8058 0.49482 -6.2634 35.0702 11.275 2.03217e-16 0.0 3.88251e-19 -3.75503 -32.7531 4.25073 0.194928 33.0913 -0.57661 3.68003 -3.8648 22.983
-18.6784 92.9384 130.383 188.881 -49.5051 -169.629 6.04773 -13.8865 5.74793 0.243909 -6.20932 1.05554 -6.02542 2.20353 -4.89018 5.39621 10.35 -10.841 -0.0 0.0 0.0 -0.0 0.0 0.0 3.43796e-14 -6.34301e-13 1.41552e-12 -164.67 -52.1826 167.029 -6.67268 -2.35285 11.6924 -147.535 70.5506 156.786 -7.38278e-09 1.91248e-08 2.32241e-09 -1.20842e-08 3.14997e-08 4.59828e-09 -7.38278e-09 1.91248e-08 2.3224e-09 7.73091 5.47488 0.417314 -7.38278e-09 1.91248e-08 2.32241e-09 2.90554 0.965183 0.102902 -7.38278e-09 1.91248e-08 2.32242e-09 10.2786 0.731801 0.0259123 -7.38278e-09 1.91248e-08 2.32242e-09 2.22167 -0.733487 -0.20892 3.42453e-14 -6.34305e-13 1.4153e-12 -5.53111 -22.6598 11.9901 8.63205 -3.35058 -15.2599 3.88372 47.4788 -8.81617 -7.00268e-09 1.12098e-08 3.36062e-09 -1.19288e-08 1.88838e-08 6.03299e-09 -7.00269e-09 1.12098e-08 3.36064e-09 -7.73091 5.47488 -0.417314 -7.00268e-09 1.12098e-08 3.36063e-09 -2.90554 0.965183 -0.102902 -7.00269e-09 1.12098e-08 3.36062e-09 -10.2786 0.731801 -0.0259123 -7.00268e-09 1.12098e-08 3.36062e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.20218 -40.7255 4.30263 -0.215906 31.6639 0.424587 -4.4729 36.6612 7.61895 2.03217e-16 0.0 3.88251e-19 -3.83812 -32.5482 3.79732 0.195634 33.2023 -0.584346 3.80858 -4.13109 23.0966
-18.8387 92.7719 129.694 189.422 -49.1111 -170.476 6.86899 -13.1619 5.79918 0.194102 -6.26003 1.06016 -6.06434 2.19426 -4.68184 5.31311 10.4224 -10.4368 -0.0 0.0 0.0 -0.0 0.0 0.0 6.39384e-14 -5.75629e-13 1.92747e-12 -164.285 -49.244 167.125 -6.75718 -2.39204 11.8455 -150.509 67.6733 159.988 -9.64786e-09 2.54774e-08 3.75539e-09 -1.57802e-08 4.20648e-08 7.23213e-09 -9.64786e-09 2.54774e-08 3.75538e-09 7.73091 5.47488 0.417314 -9.64786e-09 2.54774e-08 3.75539e-09 2.90554 0.965183 0.102902 -9.64785e-09 2.54774e-08 3.75539e-09 10.2786 0.731801 0.0259123 -9.64786e-09 2.54774e-08 3.7554e-09 2.22167 -0.733487 -0.20892 6.37849e-14 -5.75634e-13 1.92732e-12 -5.84628 -22.7391 12.3159 8.68291 -3.37852 -15.3536 3.88026 47.4655 -8.81173 -9.66149e-09 1.41885e-08 5.86214e-09 -1.64137e-08 2.37217e-08 1.04339e-08 -9.66149e-09 1.41885e-08 5.86215e-09 -7.73091 5.47488 -0.417314 -9.66149e-09 1.41885e-08 5.86215e-09 -2.90554 0.965183 -0.102902 -9.66149e-09 1.41885e-08 5.86214e-09 -10.2786 0.731801 -0.0259123 -9.66148e-09 1.41885e-08 5.86214e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.00664 -40.5852 4.88995 -0.225515 31.5851 0.35286 -1.96123 37.5134 2.98714 2.03217e-16 0.0 3.88251e-19 -4.09002 -32.257 3.38013 0.193612 33.154 -0.591972 4.02109 -4.57258 23.2799
-19.0207 92.547 128.962 189.837 -48.5658 -171.195 7.41565 -12.5342 5.82169 0.119762 -6.2612 1.0671 -6.06181 2.27156 -4.51404 5.27534 10.296 -10.1062 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.24151e-15 -2.85601e-13 1.80955e-12 -165.354 -53.4399 166.965 -6.68867 -2.36038 11.7215 -146.437 71.5025 155.617 -8.92721e-09 2.36112e-08 3.27738e-09 -1.46372e-08 3.90803e-08 6.34404e-09 -8.92721e-09 2.36112e-08 3.27738e-09 7.73091 5.47488 0.417314 -8.92721e-09 2.36112e-08 3.27738e-09 2.90554 0.965183 0.102902 -8.92721e-09 2.36112e-08 3.27739e-09 10.2786 0.731801 0.0259123 -8.92721e-09 2.36112e-08 3.2774e-09 2.22167 -0.733487 -0.20892 -2.39239e-15 -2.85606e-13 1.80942e-12 -6.10661 -22.8898 12.5523 8.71202 -3.39422 -15.4078 3.8407 47.2835 -8.75667 -8.98132e-09 1.3774e-08 4.78545e-09 -1.52819e-08 2.3097e-08 8.55441e-09 -8.98133e-09 1.3774e-08 4.78546e-09 -7.73091 5.47488 -0.417314 -8.98132e-09 1.3774e-08 4.78546e-09 -2.90554 0.965183 -0.102902 -8.98133e-09 1.3774e-08 4.78545e-09 -10.2786 0.731801 -0.0259123 -8.98132e-09 1.3774e-08 4.78544e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.46731 -40.5837 5.4321 -0.240769 31.6005 0.252785 1.65266 38.6207 -3.42245 2.03217e-16 0.0 3.88251e-19 -4.61336 -31.8629 2.9102 0.187885 32.9142 -0.60012 4.35448 -5.26766 23.5423
-19.1424 92.2087 128.307 189.959 -48.1503 -171.618 7.75892 -11.9512 5.80028 0.0372774 -6.23163 1.07083 -6.04865 2.39367 -4.37026 5.29742 10.057 -9.81906 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.21986e-13 1.49824e-13 1.32613e-12 -167.567 -62.2542 166.222 -6.51879 -2.28191 11.4151 -127.799 78.8589 136.349 -6.46476e-09 1.70885e-08 1.79505e-09 -1.06685e-08 2.84162e-08 3.58752e-09 -6.46477e-09 1.70886e-08 1.79504e-09 7.73091 5.47488 0.417314 -6.46477e-09 1.70885e-08 1.79505e-09 2.90554 0.965183 0.102902 -6.46476e-09 1.70885e-08 1.79505e-09 10.2786 0.731801 0.0259123 -6.46477e-09 1.70885e-08 1.79506e-09 2.22167 -0.733487 -0.20892 -1.22121e-13 1.49819e-13 1.32598e-12 -6.32896 -23.0659 12.7451 8.72918 -3.40317 -15.4402 3.77415 46.9713 -8.66341 -6.3856e-09 1.13331e-08 1.73126e-09 -1.0925e-08 1.91917e-08 3.20154e-09 -6.38561e-09 1.13331e-08 1.73127e-09 -7.73091 5.47488 -0.417314 -6.3856e-09 1.13331e-08 1.73126e-09 -2.90554 0.965183 -0.102902 -6.38561e-09 1.13331e-08 1.73126e-09 -10.2786 0.731801 -0.0259123 -6.3856e-09 1.13331e-08 1.73125e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.67219 -40.6489 5.97853 -0.259882 31.6543 0.128354 6.21628 39.2127 -11.1826 2.03217e-16 0.0 3.88251e-19 -5.32773 -31.3587 2.35791 0.179217 32.5307 -0.609964 4.82966 -6.23521 23.904
-19.2184 91.8214 127.736 189.684 -47.8674 -171.65 7.97488 -11.4598 5.76874 -0.0458517 -6.17154 1.07449 -5.98283 2.56179 -4.24182 5.30266 9.74136 -9.5678 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.39059e-13 5.64333e-13 7.6807e-13 -170.731 -71.8733 164.318 -6.32452 -2.19203 11.0664 -70.836 82.0267 78.713 -3.64478e-09 9.57883e-09 2.44171e-10 -6.10905e-09 1.61055e-08 6.84102e-10 -3.64478e-09 9.57884e-09 2.4416e-10 7.73091 5.47488 0.417314 -3.64478e-09 9.57883e-09 2.44168e-10 2.90554 0.965183 0.102902 -3.64478e-09 9.57883e-09 2.44171e-10 10.2786 0.731801 0.0259123 -3.64478e-09 9.57883e-09 2.44181e-10 2.22167 -0.733487 -0.20892 -2.39169e-13 5.64328e-13 7.67892e-13 -6.57276 -23.0135 12.8455 8.767 -3.4241 -15.5101 3.65386 46.4221 -8.49778 -3.42036e-09 8.29336e-09 -1.4753e-09 -5.93903e-09 1.42853e-08 -2.42686e-09 -3.42036e-09 8.29337e-09 -1.47529e-09 -7.73091 5.47488 -0.417314 -3.42035e-09 8.29337e-09 -1.4753e-09 -2.90554 0.965183 -0.102902 -3.42037e-09 8.29337e-09 -1.4753e-09 -10.2786 0.731801 -0.0259123 -3.42036e-09 8.29337e-09 -1.47531e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.74002 -40.755 6.50163 -0.273949 31.7184 0.0364691 9.85657 37.218 -18.0809 2.03217e-16 0.0 3.88251e-19 -6.05552 -30.7887 1.94958 0.168917 32.0401 -0.619081 5.36695 -7.27638 24.3404
-19.2572 91.4383 127.123 189.372 -47.6919 -171.761 8.1382 -11.1073 5.7604 -0.122135 -6.08117 1.0812 -5.82234 2.77712 -4.12005 5.21356 9.38516 -9.34463 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.97226e-13 7.91613e-13 4.26244e-13 -174.122 -78.4695 161.574 -6.1843 -2.12655 10.8158 -36.6616 78.5804 44.0889 -1.85151e-09 4.75151e-09 -4.39476e-10 -3.1937e-09 8.18133e-09 -6.44663e-10 -1.85151e-09 4.75152e-09 -4.39489e-10 7.73091 5.47488 0.417314 -1.85151e-09 4.75152e-09 -4.3948e-10 2.90554 0.965183 0.102902 -1.85151e-09 4.75152e-09 -4.39476e-10 10.2786 0.731801 0.0259123 -1.85151e-09 4.75152e-09 -4.39467e-10 2.22167 -0.733487 -0.20892 -2.97308e-13 7.91608e-13 4.26045e-13 -6.89764 -22.4785 12.8049 8.85788 -3.47567 -15.6764 3.45865 45.5283 -8.23055 -1.63162e-09 6.08271e-09 -3.00908e-09 -2.92012e-09 1.06569e-08 -5.1329e-09 -1.63162e-09 6.08272e-09 -3.00907e-09 -7.73091 5.47488 -0.417314 -1.63161e-09 6.08272e-09 -3.00909e-09 -2.90554 0.965183 -0.102902 -1.63162e-09 6.08272e-09 -3.00909e-09 -10.2786 0.731801 -0.0259123 -1.63161e-09 6.08273e-09 -3.00909e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.78788 -40.8767 6.97277 -0.274563 31.7648 0.034295 10.0533 31.2197 -21.714 2.03217e-16 0.0 3.88251e-19 -6.63151 -30.1999 1.90513 0.158414 31.4789 -0.625107 5.8799 -8.19495 24.8209
-19.4035 91.073 126.42 189.484 -47.4504 -172.088 8.2055 -10.9303 5.79083 -0.216492 -5.97265 1.09471 -5.48618 3.08783 -4.00748 4.9707 8.99667 -9.179 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.62261e-13 7.16412e-13 4.26738e-13 -174.555 -81.1042 161.239 -6.12019 -2.09478 10.7009 -29.0015 76.4927 36.2482 -1.70584e-09 4.20326e-09 4.15165e-10 -2.91368e-09 7.2512e-09 8.00348e-10 -1.70584e-09 4.20327e-09 4.15152e-10 7.73091 5.47488 0.417314 -1.70584e-09 4.20327e-09 4.15162e-10 2.90554 0.965183 0.102902 -1.70584e-09 4.20327e-09 4.15165e-10 10.2786 0.731801 0.0259123 -1.70585e-09 4.20327e-09 4.15174e-10 2.22167 -0.733487 -0.20892 -2.62305e-13 7.16406e-13 4.26523e-13 -7.34298 -21.059 12.5311 9.04395 -3.58228 -16.0176 3.1389 43.9794 -7.78571 -1.72646e-09 5.13514e-09 -1.7992e-09 -3.04978e-09 8.96596e-09 -3.04781e-09 -1.72646e-09 5.13515e-09 -1.79918e-09 -7.73091 5.47488 -0.417314 -1.72645e-09 5.13515e-09 -1.7992e-09 -2.90554 0.965183 -0.102902 -1.72647e-09 5.13515e-09 -1.79919e-09 -10.2786 0.731801 -0.0259123 -1.72646e-09 5.13515e-09 -1.7992e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.74314 -41.0332 7.26034 -0.253803 31.859 0.178305 5.71057 18.9829 -21.9959 2.03217e-16 0.0 3.88251e-19 -7.07113 -29.5483 2.37716 0.14688 30.7518 -0.625514 6.36298 -8.95349 25.3895
-19.4964 90.5517 125.75 189.127 -47.1087 -171.974 8.15785 -10.8958 5.83963 -0.324002 -5.84184 1.11238 -5.02053 3.47739 -3.90723 4.62766 8.55737 -9.0647 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.70565e-13 4.51064e-13 5.98246e-13 -171.547 -81.7904 164.076 -6.0904 -2.0778 10.6469 -27.1839 75.8795 34.3763 -2.38559e-09 5.771e-09 2.16851e-09 -3.9453e-09 9.76462e-09 3.8543e-09 -2.38559e-09 5.771e-09 2.16849e-09 7.73091 5.47488 0.417314 -2.38559e-09 5.771e-09 2.1685e-09 2.90554 0.965183 0.102902 -2.38559e-09 5.771e-09 2.16851e-09 10.2786 0.731801 0.0259123 -2.3856e-09 5.771e-09 2.16852e-09 2.22167 -0.733487 -0.20892 -1.70561e-13 4.51058e-13 5.98013e-13 -7.84221 -18.997 12.0987 9.29494 -3.7268 -16.4814 2.76174 41.9231 -7.23724 -2.78207e-09 4.6714e-09 9.8623e-10 -4.78036e-09 7.97974e-09 1.7842e-09 -2.78207e-09 4.6714e-09 9.86248e-10 -7.73091 5.47488 -0.417314 -2.78206e-09 4.6714e-09 9.86232e-10 -2.90554 0.965183 -0.102902 -2.78207e-09 4.6714e-09 9.86234e-10 -10.2786 0.731801 -0.0259123 -2.78206e-09 4.6714e-09 9.8623e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.5776 -41.2311 7.42084 -0.219239 31.9913 0.424899 -1.01975 2.09272 -21.8655 2.03217e-16 0.0 3.88251e-19 -7.46714 -28.825 3.205 0.134155 29.8743 -0.622388 6.85975 -9.64921 26.0443
-19.5222 89.9813 125.165 188.263 -46.8108 -171.375 8.10606 -10.9459 5.88614 -0.392411 -5.66454 1.12776 -4.57373 3.84981 -3.81134 4.27737 8.06292 -8.9405 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.18467e-14 1.70637e-13 7.85555e-13 -167.122 -81.1599 168.197 -6.07858 -2.06942 10.6248 -28.1925 76.3033 35.4146 -3.11039e-09 7.48451e-09 3.79037e-09 -5.05113e-09 1.25172e-08 6.69278e-09 -3.11039e-09 7.48451e-09 3.79036e-09 7.73091 5.47488 0.417314 -3.11039e-09 7.48451e-09 3.79037e-09 2.90554 0.965183 0.102902 -3.11039e-09 7.48451e-09 3.79037e-09 10.2786 0.731801 0.0259123 -3.1104e-09 7.48451e-09 3.79038e-09 2.22167 -0.733487 -0.20892 -7.17994e-14 1.7063e-13 7.85309e-13 -8.31914 -17.009 11.6902 9.53593 -3.86603 -16.9312 2.44656 39.9421 -6.75048 -3.89962e-09 4.29937e-09 3.81376e-09 -6.61411e-09 7.1389e-09 6.69157e-09 -3.89963e-09 4.29937e-09 3.81378e-09 -7.73091 5.47488 -0.417314 -3.89962e-09 4.29937e-09 3.81376e-09 -2.90554 0.965183 -0.102902 -3.89963e-09 4.29937e-09 3.81376e-09 -10.2786 0.731801 -0.0259123 -3.89962e-09 4.29937e-09 3.81376e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.47603 -41.4245 7.70837 -0.183637 32.0211 0.680036 -8.04792 -14.9377 -22.7852 2.03217e-16 0.0 3.88251e-19 -7.76624 -28.1321 4.1406 0.122574 29.0494 -0.620144 7.34673 -10.2929 26.6798
-19.6847 89.3466 124.528 188.421 -46.6436 -171.441 8.16073 -11.0228 5.90969 -0.369409 -5.41657 1.13445 -4.29366 4.10909 -3.71175 4.01487 7.50861 -8.74548 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.58155e-14 5.01964e-14 8.33454e-13 -163.65 -79.8882 171.346 -6.06828 -2.06338 10.606 -30.8137 77.1711 38.1083 -3.09986e-09 7.37361e-09 4.25057e-09 -4.99376e-09 1.23046e-08 7.49138e-09 -3.09986e-09 7.37362e-09 4.25056e-09 7.73091 5.47488 0.417314 -3.09986e-09 7.37361e-09 4.25057e-09 2.90554 0.965183 0.102902 -3.09986e-09 7.37361e-09 4.25057e-09 10.2786 0.731801 0.0259123 -3.09987e-09 7.37361e-09 4.25058e-09 2.22167 -0.733487 -0.20892 -1.57425e-14 5.01906e-14 8.33206e-13 -8.74046 -15.8191 11.4545 9.6946 -3.95781 -17.2299 2.26139 38.6239 -6.44724 -4.18031e-09 3.62692e-09 5.14996e-09 -7.05325e-09 5.88409e-09 9.00276e-09 -4.18032e-09 3.62692e-09 5.14998e-09 -7.73091 5.47488 -0.417314 -4.18031e-09 3.62692e-09 5.14996e-09 -2.90554 0.965183 -0.102902 -4.18032e-09 3.62692e-09 5.14996e-09 -10.2786 0.731801 -0.0259123 -4.18031e-09 3.62692e-09 5.14996e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.6265 -41.5643 8.37895 -0.156674 31.8084 0.848045 -13.5629 -27.5632 -24.2144 2.03217e-16 0.0 3.88251e-19 -7.89484 -27.5766 4.94553 0.114173 28.4798 -0.622924 7.79571 -10.8987 27.1904
-19.9564 88.7087 123.809 189.224 -46.5175 -171.861 8.42895 -11.141 5.9178 -0.191924 -5.0262 1.13221 -4.27606 4.22647 -3.60749 3.87519 6.81079 -8.43884 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.4382e-14 2.2179e-13 6.38765e-13 -161.577 -77.5307 173.088 -6.06077 -2.06112 10.5927 -37.1745 78.717 44.6145 -1.73157e-09 3.91473e-09 2.62387e-09 -2.78479e-09 6.66053e-09 4.62617e-09 -1.73157e-09 3.91474e-09 2.62386e-09 7.73091 5.47488 0.417314 -1.73157e-09 3.91473e-09 2.62387e-09 2.90554 0.965183 0.102902 -1.73156e-09 3.91473e-09 2.62388e-09 10.2786 0.731801 0.0259123 -1.73158e-09 3.91474e-09 2.62388e-09 2.22167 -0.733487 -0.20892 -3.43085e-14 2.21787e-13 6.38531e-13 -9.15386 -15.8493 11.4238 9.7381 -3.98281 -17.3124 2.21624 38.2707 -6.36949 -3.00844e-09 2.37111e-09 3.94098e-09 -5.07004e-09 3.79761e-09 6.88225e-09 -3.00844e-09 2.37111e-09 3.941e-09 -7.73091 5.47488 -0.417314 -3.00844e-09 2.37111e-09 3.94098e-09 -2.90554 0.965183 -0.102902 -3.00844e-09 2.37111e-09 3.94098e-09 -10.2786 0.731801 -0.0259123 -3.00844e-09 2.37111e-09 3.94098e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.24519 -41.6148 9.7524 -0.140657 31.2393 0.895083 -15.7352 -34.3463 -23.9786 2.03217e-16 0.0 3.88251e-19 -7.72139 -27.2285 5.62304 0.110427 28.2805 -0.631571 8.14982 -11.3749 27.5526
-20.4301 88.0851 123.037 190.196 -45.9388 -172.488 8.82588 -11.3212 5.9172 0.0959384 -4.52808 1.12404 -4.42245 4.25414 -3.50242 3.81086 5.99836 -8.06282 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.48165e-14 5.63595e-13 3.04864e-13 -160.399 -73.9479 173.865 -6.06295 -2.06493 10.5972 -51.1237 80.7109 58.7895 4.40182e-10 -1.50863e-09 -3.23444e-10 6.96342e-10 -2.16883e-09 -5.50695e-10 4.40182e-10 -1.50863e-09 -3.2346e-10 7.73091 5.47488 0.417314 4.4018e-10 -1.50863e-09 -3.23443e-10 2.90554 0.965183 0.102902 4.40186e-10 -1.50863e-09 -3.23444e-10 10.2786 0.731801 0.0259123 4.40176e-10 -1.50863e-09 -3.23441e-10 2.22167 -0.733487 -0.20892 -9.47588e-14 5.63596e-13 3.04656e-13 -9.57217 -16.6397 11.5102 9.71083 -3.96672 -17.2613 2.25134 38.5229 -6.42692 -9.88705e-10 8.00538e-10 1.21963e-09 -1.67272e-09 1.26727e-09 2.12924e-09 -9.88709e-10 8.00541e-10 1.21965e-09 -7.73091 5.47488 -0.417314 -9.88703e-10 8.00538e-10 1.21963e-09 -2.90554 0.965183 -0.102902 -9.88709e-10 8.00538e-10 1.21963e-09 -10.2786 0.731801 -0.0259123 -9.88703e-10 8.00538e-10 1.21963e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.17608 -41.587 11.606 -0.130902 30.4142 0.875293 -15.0678 -38.0026 -21.5565 2.03217e-16 0.0 3.88251e-19 -7.3114 -27.0173 6.283 0.109943 28.323 -0.643881 8.4321 -11.7504 27.8178
-20.6346 87.4854 122.383 189.844 -45.6078 -172.105 9.17381 -11.5156 5.88595 0.385846 -4.05762 1.10833 -4.5892 4.21753 -3.39567 3.78999 5.23589 -7.67972 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.49867e-13 8.69871e-13 -1.36327e-14 -159.474 -70.304 174.314 -6.06682 -2.06989 10.6047 -71.4382 81.8855 79.3348 2.43063e-09 -6.50607e-09 -3.08431e-09 3.88531e-09 -1.03189e-08 -5.39948e-09 2.43063e-09 -6.50606e-09 -3.08433e-09 7.73091 5.47488 0.417314 2.43062e-09 -6.50606e-09 -3.08431e-09 2.90554 0.965183 0.102902 2.43063e-09 -6.50606e-09 -3.08431e-09 10.2786 0.731801 0.0259123 2.43062e-09 -6.50606e-09 -3.08431e-09 2.22167 -0.733487 -0.20892 -1.49832e-13 8.69876e-13 -1.38101e-14 -9.92594 -17.5944 11.6704 9.65726 -3.93541 -17.1606 2.31441 38.9768 -6.53045 9.47094e-10 -6.49618e-10 -1.41753e-09 1.58245e-09 -1.05791e-09 -2.47579e-09 9.4709e-10 -6.49613e-10 -1.41752e-09 -7.73091 5.47488 -0.417314 9.47097e-10 -6.49615e-10 -1.41754e-09 -2.90554 0.965183 -0.102902 9.4709e-10 -6.49615e-10 -1.41753e-09 -10.2786 0.731801 -0.0259123 9.47096e-10 -6.49615e-10 -1.41755e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.04848 -41.5175 13.383 -0.126115 29.515 0.824653 -12.9391 -40.1871 -17.9744 2.03217e-16 0.0 3.88251e-19 -6.87673 -26.8437 6.85174 0.110311 28.4453 -0.659325 8.73499 -12.2204 27.9954
-20.7648 86.894 121.74 189.574 -45.5155 -171.769 9.29478 -11.6762 5.80199 0.569381 -3.7502 1.08337 -4.63286 4.1421 -3.28639 3.77318 4.68912 -7.34992 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.52281e-13 9.34881e-13 -1.62109e-13 -158.383 -67.756 174.879 -6.06438 -2.07107 10.6008 -87.946 81.9564 96.0046 3.25501e-09 -8.68717e-09 -4.15166e-09 5.21779e-09 -1.3925e-08 -7.28047e-09 3.25501e-09 -8.68717e-09 -4.15168e-09 7.73091 5.47488 0.417314 3.255e-09 -8.68717e-09 -4.15166e-09 2.90554 0.965183 0.102902 3.25501e-09 -8.68717e-09 -4.15166e-09 10.2786 0.731801 0.0259123 3.255e-09 -8.68717e-09 -4.15166e-09 2.22167 -0.733487 -0.20892 -1.52267e-13 9.34888e-13 -1.62258e-13 -10.1518 -18.118 11.8535 9.62204 -3.91482 -17.0946 2.35023 39.2288 -6.58862 1.86716e-09 -1.54416e-09 -2.37397e-09 3.1392e-09 -2.52893e-09 -4.15236e-09 1.86716e-09 -1.54416e-09 -2.37396e-09 -7.73091 5.47488 -0.417314 1.86717e-09 -1.54416e-09 -2.37398e-09 -2.90554 0.965183 -0.102902 1.86716e-09 -1.54416e-09 -2.37397e-09 -10.2786 0.731801 -0.0259123 1.86716e-09 -1.54416e-09 -2.37399e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.49707 -41.4757 14.5332 -0.122564 28.7234 0.777714 -10.8599 -42.6665 -14.5792 2.03217e-16 0.0 3.88251e-19 -6.63316 -26.6098 7.25401 0.108975 28.4852 -0.677302 9.15354 -12.9791 28.0988
-20.9119 86.279 121.105 189.327 -45.3798 -171.448 9.20718 -11.7968 5.66472 0.571825 -3.66498 1.04572 -4.49437 4.03066 -3.17009 3.76247 4.43052 -7.0885 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.58024e-14 5.93337e-13 -6.00761e-14 -156.905 -67.0852 175.797 -6.04276 -2.0623 10.5622 -92.0013 81.8555 100.101 2.33213e-09 -6.57385e-09 -2.47345e-09 3.78113e-09 -1.06234e-08 -4.36275e-09 2.33213e-09 -6.57384e-09 -2.47347e-09 7.73091 5.47488 0.417314 2.33213e-09 -6.57384e-09 -2.47345e-09 2.90554 0.965183 0.102902 2.33214e-09 -6.57384e-09 -2.47345e-09 10.2786 0.731801 0.0259123 2.33213e-09 -6.57384e-09 -2.47345e-09 2.22167 -0.733487 -0.20892 -5.58056e-14 5.93342e-13 -6.01933e-14 -10.2167 -17.9781 12.0581 9.6173 -3.912 -17.0858 2.33987 39.1594 -6.57226 1.29796e-09 -1.86569e-09 -5.33204e-10 2.21607e-09 -3.1806e-09 -9.61198e-10 1.29795e-09 -1.86568e-09 -5.33192e-10 -7.73091 5.47488 -0.417314 1.29796e-09 -1.86568e-09 -5.33207e-10 -2.90554 0.965183 -0.102902 1.29795e-09 -1.86568e-09 -5.33205e-10 -10.2786 0.731801 -0.0259123 1.29796e-09 -1.86568e-09 -5.33221e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.569547 -41.5045 14.8459 -0.119013 28.0449 0.733853 -8.83912 -45.7933 -11.36 2.03217e-16 0.0 3.88251e-19 -6.58354 -26.3085 7.44459 0.105361 28.4329 -0.699869 9.75785 -14.1899 28.1114
-21.1187 85.7068 120.39 189.178 -45.2504 -171.275 8.98359 -11.9007 5.48404 0.466054 -3.72207 0.997226 -4.25662 3.87092 -3.04871 3.76845 4.3632 -6.86207 -0.0 0.0 0.0 -0.0 0.0 0.0 1.03149e-13 -8.22487e-15 1.96918e-13 -155.095 -67.5116 177.0 -6.00976 -2.04781 10.5033 -88.9825 81.9056 97.0542 2.93392e-10 -1.7212e-09 9.29827e-10 5.748e-10 -2.91955e-09 1.57018e-09 2.93393e-10 -1.72119e-09 9.29803e-10 7.73091 5.47488 0.417314 2.93389e-10 -1.72119e-09 9.29823e-10 2.90554 0.965183 0.102902 2.93401e-10 -1.72119e-09 9.29822e-10 10.2786 0.731801 0.0259123 2.93389e-10 -1.72119e-09 9.29825e-10 2.22167 -0.733487 -0.20892 1.03128e-13 -8.22462e-15 1.96837e-13 -10.1645 -17.5173 12.3055 9.61915 -3.91307 -17.0892 2.31445 38.9879 -6.53197 -1.88544e-10 -1.81341e-09 3.02303e-09 -2.348e-10 -3.28976e-09 5.2155e-09 -1.88546e-10 -1.8134e-09 3.02305e-09 -7.73091 5.47488 -0.417314 -1.88542e-10 -1.8134e-09 3.02303e-09 -2.90554 0.965183 -0.102902 -1.88548e-10 -1.8134e-09 3.02303e-09 -10.2786 0.731801 -0.0259123 -1.88543e-10 -1.8134e-09 3.02302e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -1.95961 -41.575 14.6368 -0.11827 27.3967 0.678212 -6.16966 -48.5821 -7.63415 2.03217e-16 0.0 3.88251e-19 -6.6274 -25.987 7.47381 0.100747 28.3637 -0.726583 10.476 -15.7171 28.046
-21.2545 85.0732 119.897 188.713 -45.0725 -170.741 8.52737 -11.9842 5.25362 0.364919 -3.8483 0.944065 -3.98931 3.66571 -2.93101 3.76156 4.39936 -6.65774 -0.0 0.0 0.0 -0.0 0.0 0.0 2.47811e-13 -6.07812e-13 4.99435e-13 -153.177 -67.8503 178.267 -5.98852 -2.03834 10.4653 -87.3502 81.9336 95.4063 -2.02706e-09 3.71139e-09 4.45647e-09 -3.09735e-09 5.74702e-09 7.73637e-09 -2.02706e-09 3.71139e-09 4.45644e-09 7.73091 5.47488 0.417314 -2.02707e-09 3.71139e-09 4.45646e-09 2.90554 0.965183 0.102902 -2.02705e-09 3.71139e-09 4.45646e-09 10.2786 0.731801 0.0259123 -2.02707e-09 3.71139e-09 4.45647e-09 2.22167 -0.733487 -0.20892 2.47771e-13 -6.07816e-13 4.99382e-13 -10.0519 -17.0042 12.5733 9.61841 -3.91263 -17.0879 2.2897 38.8188 -6.49251 -1.95585e-09 -1.27709e-09 6.59397e-09 -3.16918e-09 -2.57045e-09 1.1426e-08 -1.95585e-09 -1.27709e-09 6.59398e-09 -7.73091 5.47488 -0.417314 -1.95585e-09 -1.27709e-09 6.59397e-09 -2.90554 0.965183 -0.102902 -1.95586e-09 -1.27709e-09 6.59397e-09 -10.2786 0.731801 -0.0259123 -1.95585e-09 -1.27709e-09 6.59396e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -3.60885 -41.6615 14.1508 -0.119788 26.8289 0.622452 -3.17594 -50.9928 -3.78321 2.03217e-16 0.0 3.88251e-19 -6.82798 -25.6299 7.40879 0.0951397 28.2436 -0.752999 11.1934 -17.304 27.9571
-21.3475 84.455 119.387 187.827 -44.9173 -170.06 7.74201 -12.0438 4.96716 0.381521 -3.97053 0.892424 -3.7623 3.41785 -2.82573 3.71386 4.45096 -6.46283 -0.0 0.0 0.0 -0.0 0.0 0.0 3.01422e-13 -9.43429e-13 7.38038e-13 -151.633 -66.9251 179.143 -6.0022 -2.04464 10.4896 -95.5553 81.7692 103.691 -3.7951e-09 7.56452e-09 6.50477e-09 -5.9315e-09 1.19369e-08 1.13539e-08 -3.7951e-09 7.56453e-09 6.50474e-09 7.73091 5.47488 0.417314 -3.7951e-09 7.56452e-09 6.50476e-09 2.90554 0.965183 0.102902 -3.79509e-09 7.56452e-09 6.50476e-09 10.2786 0.731801 0.0259123 -3.79511e-09 7.56452e-09 6.50477e-09 2.22167 -0.733487 -0.20892 3.01363e-13 -9.43436e-13 7.37988e-13 -9.93006 -16.7063 12.8386 9.6059 -3.90527 -17.0645 2.2807 38.7569 -6.47813 -3.36748e-09 -1.46512e-10 8.47883e-09 -5.54287e-09 -7.36696e-10 1.47186e-08 -3.36748e-09 -1.46509e-10 8.47885e-09 -7.73091 5.47488 -0.417314 -3.36748e-09 -1.46509e-10 8.47884e-09 -2.90554 0.965183 -0.102902 -3.36748e-09 -1.46508e-10 8.47884e-09 -10.2786 0.731801 -0.0259123 -3.36748e-09 -1.46509e-10 8.47882e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.45145 -41.7385 13.6339 -0.122274 26.3914 0.577876 -0.307835 -53.0421 -0.296646 2.03217e-16 0.0 3.88251e-19 -7.24987 -25.2216 7.31608 0.0885165 28.0384 -0.774658 11.8016 -18.6893 27.8861
-21.3808 83.8609 118.852 186.556 -44.9053 -169.145 6.47304 -12.0531 4.58721 0.57031 -4.09104 0.840831 -3.6057 3.05204 -2.73419 3.63897 4.58465 -6.27066 -0.0 0.0 0.0 -0.0 0.0 0.0 1.97524e-13 -8.5819e-13 8.8524e-13 -150.892 -63.7209 179.151 -6.07378 -2.07713 10.6174 -117.164 80.2736 125.551 -4.79346e-09 9.2003e-09 6.24489e-09 -7.61397e-09 1.46754e-08 1.1001e-08 -4.79345e-09 9.20031e-09 6.24487e-09 7.73091 5.47488 0.417314 -4.79346e-09 9.20031e-09 6.24488e-09 2.90554 0.965183 0.102902 -4.79345e-09 9.20031e-09 6.24489e-09 10.2786 0.731801 0.0259123 -4.79346e-09 9.20031e-09 6.24489e-09 2.22167 -0.733487 -0.20892 1.97444e-13 -8.58197e-13 8.85161e-13 -9.80925 -16.6742 13.1021 9.57893 -3.88939 -17.0142 2.28833 38.8079 -6.49012 -4.31221e-09 2.18994e-09 7.55589e-09 -7.19953e-09 3.32702e-09 1.31558e-08 -4.31222e-09 2.18994e-09 7.55591e-09 -7.73091 5.47488 -0.417314 -4.31221e-09 2.18994e-09 7.5559e-09 -2.90554 0.965183 -0.102902 -4.31222e-09 2.18994e-09 7.5559e-09 -10.2786 0.731801 -0.0259123 -4.31221e-09 2.18994e-09 7.55588e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.62443 -41.8161 13.0638 -0.125081 26.1378 0.547848 2.07068 -54.7119 2.4729 2.03217e-16 0.0 3.88251e-19 -8.02294 -24.7348 7.16548 0.0803113 27.7117 -0.790974 12.3015 -19.853 27.8473
-21.4285 83.3421 118.313 185.101 -44.8271 -168.098 4.81583 -12.0221 4.12923 0.862715 -4.24158 0.78702 -3.47795 2.59212 -2.65219 3.54328 4.81753 -6.08906 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.61342e-15 -5.20832e-13 9.98843e-13 -150.463 -59.103 178.77 -6.18503 -2.12749 10.8165 -135.807 76.5308 144.565 -5.46528e-09 9.7911e-09 4.66531e-09 -8.8288e-09 1.5816e-08 8.38793e-09 -5.46528e-09 9.7911e-09 4.6653e-09 7.73091 5.47488 0.417314 -5.46528e-09 9.7911e-09 4.66531e-09 2.90554 0.965183 0.102902 -5.46527e-09 9.7911e-09 4.66532e-09 10.2786 0.731801 0.0259123 -5.46528e-09 9.7911e-09 4.66533e-09 2.22167 -0.733487 -0.20892 -7.7152e-15 -5.20838e-13 9.9871e-13 -9.66012 -16.7714 13.3741 9.54246 -3.8679 -16.9462 2.30558 38.9232 -6.51727 -5.11001e-09 5.4794e-09 4.95495e-09 -8.65535e-09 9.12176e-09 8.69527e-09 -5.11002e-09 5.47941e-09 4.95498e-09 -7.73091 5.47488 -0.417314 -5.11001e-09 5.4794e-09 4.95496e-09 -2.90554 0.965183 -0.102902 -5.11002e-09 5.4794e-09 4.95496e-09 -10.2786 0.731801 -0.0259123 -5.11001e-09 5.47941e-09 4.95495e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.1126 -41.8986 12.3373 -0.128199 26.0279 0.525806 4.01797 -56.0592 4.66858 2.03217e-16 0.0 3.88251e-19 -9.07125 -24.1851 6.93943 0.0706359 27.2909 -0.804114 12.7414 -20.9169 27.811
-21.5182 82.9052 117.777 183.438 -44.6678 -166.859 3.04763 -12.0014 3.66615 1.18766 -4.39318 0.736 -3.34232 2.18964 -2.58004 3.3907 4.98688 -5.92719 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.06663e-13 -1.57797e-13 1.09734e-12 -149.844 -54.7242 178.611 -6.2975 -2.17841 11.0184 -145.255 72.1224 154.381 -5.96705e-09 9.8929e-09 2.89182e-09 -9.76871e-09 1.61618e-08 5.43111e-09 -5.96705e-09 9.89291e-09 2.89181e-09 7.73091 5.47488 0.417314 -5.96705e-09 9.8929e-09 2.89182e-09 2.90554 0.965183 0.102902 -5.96704e-09 9.8929e-09 2.89182e-09 10.2786 0.731801 0.0259123 -5.96705e-09 9.8929e-09 2.89184e-09 2.22167 -0.733487 -0.20892 -2.06788e-13 -1.57801e-13 1.09714e-12 -9.4706 -16.9845 13.6473 9.49867 -3.84219 -16.8647 2.33566 39.1266 -6.56499 -5.77113e-09 8.53541e-09 2.35256e-09 -9.87496e-09 1.45118e-08 4.22814e-09 -5.77114e-09 8.53542e-09 2.35259e-09 -7.73091 5.47488 -0.417314 -5.77113e-09 8.53541e-09 2.35257e-09 -2.90554 0.965183 -0.102902 -5.77114e-09 8.53541e-09 2.35256e-09 -10.2786 0.731801 -0.0259123 -5.77113e-09 8.53541e-09 2.35256e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.6184 -41.9568 11.5821 -0.131135 25.9717 0.508115 5.71802 -57.2393 6.53606 2.03217e-16 0.0 3.88251e-19 -10.1547 -23.6211 6.72155 0.0605835 26.8375 -0.813796 13.0861 -21.8296 27.7419
-21.5884 82.5452 117.244 181.598 -44.7402 -165.42 1.44399 -12.0421 3.27055 1.47421 -4.51688 0.692787 -3.16284 1.99617 -2.51783 3.14702 4.92979 -5.79422 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.92298e-13 4.47343e-15 1.19922e-12 -148.835 -52.2382 179.046 -6.3732 -2.21271 11.1547 -148.906 69.2177 158.265 -6.45526e-09 1.00617e-08 2.05018e-09 -1.06264e-08 1.65159e-08 4.04694e-09 -6.45526e-09 1.00617e-08 2.05017e-09 7.73091 5.47488 0.417314 -6.45526e-09 1.00617e-08 2.05018e-09 2.90554 0.965183 0.102902 -6.45525e-09 1.00617e-08 2.05018e-09 10.2786 0.731801 0.0259123 -6.45526e-09 1.00617e-08 2.0502e-09 2.22167 -0.733487 -0.20892 -2.92446e-13 4.4711e-15 1.19897e-12 -9.22895 -17.2999 13.9142 9.44976 -3.81362 -16.7736 2.38218 39.4419 -6.63904 -6.30582e-09 1.01715e-08 1.42525e-09 -1.0823e-08 1.73615e-08 2.64552e-09 -6.30583e-09 1.01715e-08 1.42529e-09 -7.73091 5.47488 -0.417314 -6.30582e-09 1.01715e-08 1.42526e-09 -2.90554 0.965183 -0.102902 -6.30583e-09 1.01715e-08 1.42526e-09 -10.2786 0.731801 -0.0259123 -6.30582e-09 1.01715e-08 1.42525e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -14.8421 -41.9644 10.9275 -0.133597 25.8791 0.491234 7.44577 -58.3832 8.39453 2.03217e-16 0.0 3.88251e-19 -11.0375 -23.0928 6.59353 0.0513245 26.4131 -0.819747 13.2991 -22.5399 27.6026
-21.6608 82.2902 116.636 180.077 -44.6955 -164.211 -0.00123031 -12.1738 2.95283 1.72414 -4.60144 0.658962 -2.88885 2.11831 -2.47338 2.72838 4.50213 -5.71236 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.95379e-13 -1.56279e-13 1.3678e-12 -147.18 -52.7704 -179.533 -6.38781 -2.21922 11.1812 -148.929 69.1411 158.294 -7.2e-09 1.06616e-08 2.80315e-09 -1.18074e-08 1.74065e-08 5.37825e-09 -7.2e-09 1.06616e-08 2.80314e-09 7.73091 5.47488 0.417314 -7.2e-09 1.06616e-08 2.80315e-09 2.90554 0.965183 0.102902 -7.19999e-09 1.06616e-08 2.80316e-09 10.2786 0.731801 0.0259123 -7.2e-09 1.06616e-08 2.80317e-09 2.22167 -0.733487 -0.20892 -1.95559e-13 -1.56281e-13 1.3675e-12 -8.91492 -17.7643 14.1709 9.39056 -3.77926 -16.6633 2.45592 39.932 -6.75545 -6.95575e-09 9.88938e-09 3.48999e-09 -1.1873e-08 1.67289e-08 6.22573e-09 -6.95576e-09 9.88939e-09 3.49002e-09 -7.73091 5.47488 -0.417314 -6.95575e-09 9.88939e-09 3.49e-09 -2.90554 0.965183 -0.102902 -6.95576e-09 9.88939e-09 3.48999e-09 -10.2786 0.731801 -0.0259123 -6.95575e-09 9.88939e-09 3.48999e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.7985 -41.9144 10.3631 -0.135223 25.7147 0.475481 9.17421 -59.5559 10.2108 2.03217e-16 0.0 3.88251e-19 -11.7061 -22.6231 6.60501 0.0434029 26.0346 -0.821461 13.3426 -23.0572 27.3114
-21.7611 82.1591 116.049 178.734 -44.5327 -163.079 -1.40995 -12.3643 2.67699 1.96851 -4.66347 0.631778 -2.55422 2.4532 -2.444 2.17922 3.82425 -5.67084 -0.0 0.0 0.0 -0.0 0.0 0.0 1.33464e-14 -4.9866e-13 1.57377e-12 -144.826 -55.1784 -177.237 -6.36652 -2.20934 11.143 -146.868 70.8344 156.099 -8.04169e-09 1.1324e-08 4.42947e-09 -1.30908e-08 1.83007e-08 8.19237e-09 -8.04169e-09 1.1324e-08 4.42946e-09 7.73091 5.47488 0.417314 -8.04169e-09 1.1324e-08 4.42947e-09 2.90554 0.965183 0.102902 -8.04168e-09 1.1324e-08 4.42948e-09 10.2786 0.731801 0.0259123 -8.04169e-09 1.1324e-08 4.42949e-09 2.22167 -0.733487 -0.20892 1.31301e-14 -4.98663e-13 1.57341e-12 -8.53732 -18.3677 14.4242 9.32172 -3.73942 -16.5353 2.55486 40.565 -6.90897 -7.63582e-09 8.38248e-09 7.36265e-09 -1.29162e-08 1.38772e-08 1.29244e-08 -7.63583e-09 8.38248e-09 7.36268e-09 -7.73091 5.47488 -0.417314 -7.63582e-09 8.38248e-09 7.36266e-09 -2.90554 0.965183 -0.102902 -7.63583e-09 8.38248e-09 7.36265e-09 -10.2786 0.731801 -0.0259123 -7.63582e-09 8.38248e-09 7.36265e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.6132 -41.8218 9.83696 -0.136258 25.5303 0.462321 10.7393 -60.6957 11.8153 2.03217e-16 0.0 3.88251e-19 -12.2739 -22.1827 6.7014 0.0362799 25.669 -0.819297 13.2437 -23.3998 26.9054
-21.8588 82.1094 115.398 177.442 -44.3557 -162.141 -2.68037 -12.5723 2.44593 2.18044 -4.7158 0.609755 -2.24988 2.83827 -2.41388 1.65869 3.12987 -5.62896 -0.0 0.0 0.0 -0.0 0.0 0.0 2.31377e-13 -8.53634e-13 1.69663e-12 -142.089 -57.726 -174.603 -6.34575 -2.19984 11.1057 -144.059 72.7035 153.142 -8.49229e-09 1.15063e-08 5.97888e-09 -1.373e-08 1.84097e-08 1.08424e-08 -8.49229e-09 1.15063e-08 5.97886e-09 7.73091 5.47488 0.417314 -8.4923e-09 1.15063e-08 5.97888e-09 2.90554 0.965183 0.102902 -8.49229e-09 1.15063e-08 5.97889e-09 10.2786 0.731801 0.0259123 -8.4923e-09 1.15063e-08 5.9789e-09 2.22167 -0.733487 -0.20892 2.31132e-13 -8.53638e-13 1.69624e-12 -8.12951 -19.0115 14.6819 9.25424 -3.70045 -16.4101 2.66212 41.2228 -7.07233 -7.86608e-09 6.25186e-09 1.09682e-08 -1.31936e-08 9.97825e-09 1.91486e-08 -7.86609e-09 6.25186e-09 1.09682e-08 -7.73091 5.47488 -0.417314 -7.86608e-09 6.25186e-09 1.09682e-08 -2.90554 0.965183 -0.102902 -7.86609e-09 6.25186e-09 1.09682e-08 -10.2786 0.731801 -0.0259123 -7.86608e-09 6.25186e-09 1.09682e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -20.1523 -41.6965 9.41636 -0.137411 25.3668 0.449983 12.2798 -61.719 13.3789 2.03217e-16 0.0 3.88251e-19 -12.6962 -21.7431 6.80749 0.0295089 25.3031 -0.81426 13.0668 -23.5294 26.528
-22.0199 82.1368 114.611 176.649 -44.2275 -161.602 -3.70983 -12.7563 2.26274 2.33302 -4.77123 0.591413 -2.06677 3.11095 -2.36709 1.32689 2.65261 -5.54509 -0.0 0.0 0.0 -0.0 0.0 0.0 3.56212e-13 -1.05217e-12 1.61592e-12 -139.953 -58.7436 -172.728 -6.36197 -2.2075 11.1345 -143.112 73.2565 152.15 -8.06378e-09 1.06656e-08 6.50113e-09 -1.29783e-08 1.69451e-08 1.16815e-08 -8.06377e-09 1.06656e-08 6.50111e-09 7.73091 5.47488 0.417314 -8.06378e-09 1.06656e-08 6.50113e-09 2.90554 0.965183 0.102902 -8.06377e-09 1.06656e-08 6.50113e-09 10.2786 0.731801 0.0259123 -8.06378e-09 1.06656e-08 6.50115e-09 2.22167 -0.733487 -0.20892 3.55958e-13 -1.05217e-12 1.61552e-12 -7.72635 -19.5975 14.9507 9.1992 -3.66873 -16.3081 2.75758 41.7876 -7.21559 -7.16661e-09 4.09863e-09 1.22315e-08 -1.19463e-08 6.20379e-09 2.13053e-08 -7.16661e-09 4.09862e-09 1.22315e-08 -7.73091 5.47488 -0.417314 -7.1666e-09 4.09863e-09 1.22315e-08 -2.90554 0.965183 -0.102902 -7.16661e-09 4.09863e-09 1.22315e-08 -10.2786 0.731801 -0.0259123 -7.16661e-09 4.09862e-09 1.22315e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.2838 -41.5489 9.16759 -0.139375 25.2651 0.436684 13.9414 -62.533 15.0759 2.03217e-16 0.0 3.88251e-19 -12.9259 -21.2754 6.8491 0.0226181 24.924 -0.807351 12.8784 -23.4083 26.3247
-22.2599 82.271 113.714 176.347 -44.0261 -161.436 -4.48227 -12.887 2.13511 2.41206 -4.85626 0.578244 -2.01979 3.22664 -2.28893 1.25663 2.46041 -5.39053 -0.0 0.0 0.0 -0.0 0.0 0.0 3.43077e-13 -1.03124e-12 1.18331e-12 -139.244 -57.4626 -172.459 -6.43625 -2.24209 11.2675 -145.572 71.8196 154.723 -6.13962e-09 8.04898e-09 5.40187e-09 -9.85136e-09 1.27288e-08 9.65148e-09 -6.13962e-09 8.04898e-09 5.40185e-09 7.73091 5.47488 0.417314 -6.13962e-09 8.04898e-09 5.40187e-09 2.90554 0.965183 0.102902 -6.13962e-09 8.04898e-09 5.40187e-09 10.2786 0.731801 0.0259123 -6.13963e-09 8.04898e-09 5.40188e-09 2.22167 -0.733487 -0.20892 3.42853e-13 -1.03125e-12 1.18298e-12 -7.27805 -20.1724 15.2467 9.15648 -3.64423 -16.229 2.84357 42.2862 -7.34381 -4.80142e-09 1.58038e-09 9.75133e-09 -7.95234e-09 2.06612e-09 1.69554e-08 -4.80143e-09 1.58039e-09 9.75134e-09 -7.73091 5.47488 -0.417314 -4.80142e-09 1.58039e-09 9.75133e-09 -2.90554 0.965183 -0.102902 -4.80142e-09 1.58038e-09 9.75133e-09 -10.2786 0.731801 -0.0259123 -4.80142e-09 1.58038e-09 9.75133e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.8845 -41.3895 9.28824 -0.143045 25.2391 0.417253 16.0541 -63.1059 17.2656 2.03217e-16 0.0 3.88251e-19 -12.9091 -20.7536 6.86386 0.0150625 24.5022 -0.797852 12.6578 -22.9531 26.3247
-22.4485 82.4753 112.808 175.952 -43.8076 -161.3 -5.04764 -12.9928 2.05931 2.43428 -4.95638 0.570411 -2.06341 3.27245 -2.19134 1.35173 2.42686 -5.19287 -0.0 0.0 0.0 -0.0 0.0 0.0 2.52455e-13 -8.86992e-13 5.01798e-13 -139.323 -54.9062 -173.074 -6.54509 -2.29281 11.4629 -148.996 69.2166 158.35 -3.14224e-09 4.14867e-09 3.30155e-09 -5.00913e-09 6.50411e-09 5.83712e-09 -3.14224e-09 4.14867e-09 3.30154e-09 7.73091 5.47488 0.417314 -3.14224e-09 4.14867e-09 3.30155e-09 2.90554 0.965183 0.102902 -3.14223e-09 4.14867e-09 3.30155e-09 10.2786 0.731801 0.0259123 -3.14225e-09 4.14867e-09 3.30156e-09 2.22167 -0.733487 -0.20892 2.52285e-13 -8.86995e-13 5.0158e-13 -6.78454 -20.7638 15.5623 9.12127 -3.62415 -16.1637 2.92737 42.7622 -7.46791 -1.22914e-09 -1.45588e-09 4.91698e-09 -1.95634e-09 -2.79298e-09 8.50875e-09 -1.22916e-09 -1.45587e-09 4.91699e-09 -7.73091 5.47488 -0.417314 -1.22915e-09 -1.45587e-09 4.91698e-09 -2.90554 0.965183 -0.102902 -1.22915e-09 -1.45588e-09 4.91698e-09 -10.2786 0.731801 -0.0259123 -1.22914e-09 -1.45588e-09 4.91698e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -22.0584 -41.2104 9.68019 -0.147733 25.2661 0.394168 18.402 -63.4747 19.7108 2.03217e-16 0.0 3.88251e-19 -12.6842 -20.1991 6.87261 0.00736239 24.0535 -0.785622 12.3814 -22.2097 26.4568
-22.6148 82.689 112.007 175.46 -43.5371 -160.92 -5.40226 -13.1184 2.0213 2.41908 -5.02282 0.564439 -2.19772 3.28335 -2.09827 1.5189 2.49398 -4.99445 -0.0 0.0 0.0 -0.0 0.0 0.0 1.39722e-13 -6.891e-13 -1.7216e-13 -139.532 -52.1505 -173.816 -6.65827 -2.34566 11.6668 -151.753 66.3471 161.332 -1.4198e-10 2.89614e-10 1.07211e-09 -1.71437e-10 3.63922e-10 1.80548e-09 -1.41981e-10 2.89615e-10 1.0721e-09 7.73091 5.47488 0.417314 -1.41981e-10 2.89614e-10 1.07211e-09 2.90554 0.965183 0.102902 -1.41976e-10 2.89614e-10 1.07211e-09 10.2786 0.731801 0.0259123 -1.41987e-10 2.89617e-10 1.07212e-09 2.22167 -0.733487 -0.20892 1.39605e-13 -6.89102e-13 -1.72266e-13 -6.35975 -21.2461 15.8648 9.09773 -3.61078 -16.1201 2.99228 43.1229 -7.56326 2.23824e-09 -4.12505e-09 -1.60554e-10 3.85081e-09 -7.00749e-09 -3.53815e-10 2.23822e-09 -4.12504e-09 -1.60544e-10 -7.73091 5.47488 -0.417314 2.23823e-09 -4.12504e-09 -1.60556e-10 -2.90554 0.965183 -0.102902 2.23824e-09 -4.12505e-09 -1.6055e-10 -10.2786 0.731801 -0.0259123 2.23824e-09 -4.12505e-09 -1.60552e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -22.0122 -40.9974 9.96798 -0.151759 25.3317 0.377122 20.2732 -63.6801 21.6578 2.03217e-16 0.0 3.88251e-19 -12.3372 -19.654 6.77762 0.000551848 23.6319 -0.772474 12.1081 -21.3367 26.7145
-22.773 82.9709 111.205 175.229 -43.4704 -160.656 -5.54265 -13.3087 2.00702 2.3859 -5.00685 0.55685 -2.42299 3.29433 -2.03366 1.6656 2.60375 -4.83768 -0.0 0.0 0.0 -0.0 0.0 0.0 6.02554e-14 -5.07249e-13 -5.82091e-13 -139.464 -50.2854 -174.156 -6.74597 -2.38675 11.8252 -153.35 64.2015 163.098 1.7908e-09 -2.20322e-09 -4.14525e-10 2.9419e-09 -3.59872e-09 -8.7633e-10 1.7908e-09 -2.20322e-09 -4.14531e-10 7.73091 5.47488 0.417314 1.7908e-09 -2.20322e-09 -4.14525e-10 2.90554 0.965183 0.102902 1.79081e-09 -2.20322e-09 -4.14522e-10 10.2786 0.731801 0.0259123 1.7908e-09 -2.20322e-09 -4.14515e-10 2.22167 -0.733487 -0.20892 6.01624e-14 -5.0725e-13 -5.82141e-13 -6.12156 -21.4943 16.1192 9.09001 -3.60642 -16.1057 3.0202 43.2757 -7.60405 4.28875e-09 -5.542e-09 -3.37029e-09 7.27825e-09 -9.21141e-09 -5.95154e-09 4.28873e-09 -5.54198e-09 -3.37028e-09 -7.73091 5.47488 -0.417314 4.28874e-09 -5.54198e-09 -3.3703e-09 -2.90554 0.965183 -0.102902 4.28875e-09 -5.542e-09 -3.37029e-09 -10.2786 0.731801 -0.0259123 4.28875e-09 -5.542e-09 -3.37029e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.946 -40.7383 9.78082 -0.15352 25.422 0.375841 20.9495 -63.8002 22.3526 2.03217e-16 0.0 3.88251e-19 -11.9509 -19.1593 6.48216 -0.00444614 23.2916 -0.760155 11.8975 -20.4918 27.0878
-22.8855 83.3161 110.325 175.307 -43.6922 -160.617 -5.4168 -13.6097 1.99109 2.34136 -4.83334 0.539258 -2.80352 3.26613 -2.00401 1.7829 2.76819 -4.71463 -0.0 0.0 0.0 -0.0 0.0 0.0 2.97055e-14 -3.36879e-13 -6.10616e-13 -139.249 -49.4705 -174.166 -6.80912 -2.41658 11.9393 -154.17 62.9305 164.017 2.26345e-09 -2.81749e-09 -8.7435e-10 3.69719e-09 -4.56775e-09 -1.694e-09 2.26345e-09 -2.8175e-09 -8.74355e-10 7.73091 5.47488 0.417314 2.26345e-09 -2.81749e-09 -8.7435e-10 2.90554 0.965183 0.102902 2.26345e-09 -2.8175e-09 -8.74348e-10 10.2786 0.731801 0.0259123 2.26344e-09 -2.81749e-09 -8.74342e-10 2.22167 -0.733487 -0.20892 2.95852e-14 -3.36879e-13 -6.10696e-13 -6.20144 -21.3083 16.3086 9.11823 -3.62245 -16.158 2.98073 43.0611 -7.54661 4.33554e-09 -5.19603e-09 -3.97307e-09 7.33895e-09 -8.58217e-09 -6.99182e-09 4.33552e-09 -5.19601e-09 -3.97306e-09 -7.73091 5.47488 -0.417314 4.33552e-09 -5.19602e-09 -3.97307e-09 -2.90554 0.965183 -0.102902 4.33553e-09 -5.19603e-09 -3.97307e-09 -10.2786 0.731801 -0.0259123 4.33554e-09 -5.19603e-09 -3.97307e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.8804 -40.4408 8.99281 -0.152509 25.565 0.397227 20.0875 -63.8998 21.4332 2.03217e-16 0.0 3.88251e-19 -11.5696 -18.6968 5.84592 -0.00856857 22.9873 -0.748479 11.7913 -19.6829 27.6724
-22.988 83.7038 109.397 175.347 -43.8788 -160.664 -5.04339 -13.9862 1.98833 2.27481 -4.54899 0.516031 -3.31766 3.19628 -1.99653 1.91415 3.00914 -4.60913 -0.0 0.0 0.0 -0.0 0.0 0.0 1.82431e-14 -1.48539e-13 -4.10848e-13 -139.062 -49.1693 -174.094 -6.86081 -2.44121 12.0326 -154.686 62.0743 164.6 1.88255e-09 -2.31286e-09 -7.89558e-10 3.07003e-09 -3.74543e-09 -1.51545e-09 1.88256e-09 -2.31286e-09 -7.89562e-10 7.73091 5.47488 0.417314 1.88255e-09 -2.31286e-09 -7.89558e-10 2.90554 0.965183 0.102902 1.88255e-09 -2.31286e-09 -7.89558e-10 10.2786 0.731801 0.0259123 1.88254e-09 -2.31285e-09 -7.89553e-10 2.22167 -0.733487 -0.20892 1.80642e-14 -1.48539e-13 -4.11009e-13 -6.50925 -20.8119 16.4524 9.17376 -3.65404 -16.261 2.89311 42.5733 -7.41791 3.15732e-09 -3.65077e-09 -3.15349e-09 5.33564e-09 -6.00108e-09 -5.54144e-09 3.1573e-09 -3.65076e-09 -3.15348e-09 -7.73091 5.47488 -0.417314 3.15731e-09 -3.65076e-09 -3.15349e-09 -2.90554 0.965183 -0.102902 3.15731e-09 -3.65077e-09 -3.15348e-09 -10.2786 0.731801 -0.0259123 3.15732e-09 -3.65077e-09 -3.15349e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.7035 -40.0977 7.82057 -0.149845 25.7577 0.434761 18.0863 -63.9178 19.3228 2.03217e-16 0.0 3.88251e-19 -11.1317 -18.2501 4.96162 -0.0119568 22.71 -0.736697 11.7356 -18.8403 28.4374
-23.1765 84.1391 108.367 175.56 -44.0227 -160.941 -4.52412 -14.3609 2.04512 2.17948 -4.2878 0.502783 -3.83693 3.17499 -2.00618 2.04676 3.28327 -4.55126 -0.0 0.0 0.0 -0.0 0.0 0.0 1.30286e-14 2.54235e-14 -1.32057e-13 -138.682 -49.4358 -173.779 -6.88974 -2.45512 12.0847 -154.892 61.7348 164.832 1.07666e-09 -1.27235e-09 -4.37506e-10 1.75454e-09 -2.06619e-09 -8.46939e-10 1.07668e-09 -1.27236e-09 -4.37511e-10 7.73091 5.47488 0.417314 1.07666e-09 -1.27235e-09 -4.37506e-10 2.90554 0.965183 0.102902 1.07666e-09 -1.27235e-09 -4.37507e-10 10.2786 0.731801 0.0259123 1.07665e-09 -1.27235e-09 -4.37502e-10 2.22167 -0.733487 -0.20892 1.27929e-14 2.54242e-14 -1.32307e-13 -6.82881 -20.3664 16.5681 9.21781 -3.67917 -16.3428 2.811 42.1007 -7.29565 1.49047e-09 -1.63255e-09 -1.68622e-09 2.51207e-09 -2.65791e-09 -2.95864e-09 1.49046e-09 -1.63255e-09 -1.68621e-09 -7.73091 5.47488 -0.417314 1.49047e-09 -1.63255e-09 -1.68622e-09 -2.90554 0.965183 -0.102902 1.49047e-09 -1.63255e-09 -1.68622e-09 -10.2786 0.731801 -0.0259123 1.49048e-09 -1.63255e-09 -1.68622e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.4093 -39.6732 6.41257 -0.146275 25.9388 0.478004 15.3931 -63.7433 16.4927 2.03217e-16 0.0 3.88251e-19 -10.5674 -17.8663 4.07965 -0.0126537 22.5685 -0.725616 11.6597 -18.0019 29.1838
-23.3731 84.5195 107.538 175.954 -43.9337 -161.209 -3.95969 -14.6565 2.20805 2.0482 -4.18376 0.515079 -4.23278 3.29244 -2.02795 2.16906 3.54718 -4.57112 -0.0 0.0 0.0 -0.0 0.0 0.0 1.22213e-15 1.52665e-13 7.64824e-14 -137.863 -50.3205 -173.041 -6.88458 -2.45282 12.0752 -154.749 62.0113 164.666 2.74336e-10 -2.79008e-10 -9.55502e-11 4.44822e-10 -4.64475e-10 -1.94702e-10 2.74362e-10 -2.79017e-10 -9.55566e-11 7.73091 5.47488 0.417314 2.74334e-10 -2.79007e-10 -9.55502e-11 2.90554 0.965183 0.102902 2.74338e-10 -2.79008e-10 -9.5551e-11 10.2786 0.731801 0.0259123 2.7433e-10 -2.79005e-10 -9.5547e-11 2.22167 -0.733487 -0.20892 9.64568e-16 1.52667e-13 7.61842e-14 -6.94099 -20.332 16.6717 9.21176 -3.67592 -16.3313 2.78221 41.9321 -7.2525 7.13796e-11 1.32271e-10 -3.45936e-10 1.11992e-10 2.57545e-10 -6.01662e-10 7.13756e-11 1.32273e-10 -3.45933e-10 -7.73091 5.47488 -0.417314 7.13798e-11 1.32271e-10 -3.45933e-10 -2.90554 0.965183 -0.102902 7.13751e-11 1.3227e-10 -3.45936e-10 -10.2786 0.731801 -0.0259123 7.1387e-11 1.32272e-10 -3.45946e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -20.9915 -39.1366 4.91763 -0.14222 26.0474 0.516368 12.506 -63.2854 13.4647 2.03217e-16 0.0 3.88251e-19 -9.81791 -17.5973 3.4471 -0.00879514 22.6712 -0.716007 11.5048 -17.2035 29.7165
-23.6338 84.9715 106.352 176.858 -44.2492 -162.099 -3.25227 -14.8216 2.54712 1.84628 -4.31735 0.567163 -4.46876 3.61881 -2.07478 2.26286 3.78871 -4.713 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.84308e-14 2.14606e-13 1.81083e-13 -136.245 -52.1201 -171.483 -6.82883 -2.42641 11.9743 -153.982 63.2996 163.798 -6.53942e-10 8.28743e-10 2.76322e-10 -1.07182e-09 1.31518e-09 5.19131e-10 -6.53918e-10 8.28735e-10 2.76311e-10 7.73091 5.47488 0.417314 -6.53944e-10 8.28744e-10 2.76322e-10 2.90554 0.965183 0.102902 -6.53938e-10 8.28743e-10 2.76322e-10 10.2786 0.731801 0.0259123 -6.53948e-10 8.28746e-10 2.76326e-10 2.22167 -0.733487 -0.20892 -2.86545e-14 2.14609e-13 1.808e-13 -6.75576 -21.0349 16.7604 9.11915 -3.62372 -16.1586 2.85148 42.3376 -7.3564 -1.09717e-09 1.73351e-09 8.37585e-10 -1.85937e-09 2.89884e-09 1.47916e-09 -1.09718e-09 1.73351e-09 8.3759e-10 -7.73091 5.47488 -0.417314 -1.09717e-09 1.73351e-09 8.37588e-10 -2.90554 0.965183 -0.102902 -1.09718e-09 1.73351e-09 8.37584e-10 -10.2786 0.731801 -0.0259123 -1.09717e-09 1.73351e-09 8.37573e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -20.3809 -38.4313 3.21277 -0.137073 26.0467 0.547971 9.56185 -62.499 10.3716 2.03217e-16 0.0 3.88251e-19 -8.7982 -17.4674 3.11602 0.00120319 23.1071 -0.708034 11.2517 -16.4254 29.9742
-23.9298 85.3753 105.363 177.826 -44.4616 -162.781 -2.38902 -14.9068 3.01841 1.589 -4.60219 0.647417 -4.61325 4.09059 -2.14475 2.3414 4.03102 -4.9489 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.6472e-14 2.31814e-13 2.59318e-13 -133.789 -54.6708 -169.095 -6.73284 -2.38091 11.8011 -152.507 65.4081 162.158 -1.85547e-09 2.25617e-09 7.88042e-10 -3.033e-09 3.60294e-09 1.4936e-09 -1.85545e-09 2.25617e-09 7.88025e-10 7.73091 5.47488 0.417314 -1.85547e-09 2.25617e-09 7.88042e-10 2.90554 0.965183 0.102902 -1.85546e-09 2.25617e-09 7.88043e-10 10.2786 0.731801 0.0259123 -1.85547e-09 2.25618e-09 7.88049e-10 2.22167 -0.733487 -0.20892 -6.6628e-14 2.31819e-13 2.59085e-13 -6.39699 -22.2061 16.8346 8.96865 -3.5389 -15.8795 2.9871 43.0985 -7.55625 -2.3434e-09 3.46404e-09 2.21857e-09 -3.95653e-09 5.74359e-09 3.90427e-09 -2.3434e-09 3.46404e-09 2.21858e-09 -7.73091 5.47488 -0.417314 -2.3434e-09 3.46404e-09 2.21857e-09 -2.90554 0.965183 -0.102902 -2.34341e-09 3.46405e-09 2.21857e-09 -10.2786 0.731801 -0.0259123 -2.34339e-09 3.46405e-09 2.21856e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -19.5639 -37.5742 1.29707 -0.13062 25.976 0.578044 6.48403 -61.3995 7.10738 2.03217e-16 0.0 3.88251e-19 -7.57132 -17.4481 2.95647 0.0157995 23.7982 -0.701304 10.945 -15.655 30.0683
-24.1391 85.7675 104.385 178.072 -44.5665 -163.137 -1.59791 -14.9885 3.49767 1.34386 -4.92196 0.732576 -4.69553 4.59745 -2.21051 2.43975 4.28362 -5.20039 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.46728e-14 2.30668e-13 3.28804e-13 -130.841 -57.3498 -166.347 -6.62562 -2.33022 11.6082 -150.648 67.5614 160.133 -2.92835e-09 3.48578e-09 1.26714e-09 -4.78189e-09 5.57636e-09 2.40421e-09 -2.92834e-09 3.48578e-09 1.26711e-09 7.73091 5.47488 0.417314 -2.92836e-09 3.48578e-09 1.26714e-09 2.90554 0.965183 0.102902 -2.92835e-09 3.48578e-09 1.26714e-09 10.2786 0.731801 0.0259123 -2.92836e-09 3.48579e-09 1.26714e-09 2.22167 -0.733487 -0.20892 -9.4757e-14 2.30675e-13 3.28626e-13 -5.96679 -23.3119 16.9081 8.82003 -3.45523 -15.6055 3.11284 43.7711 -7.73809 -3.4274e-09 4.90215e-09 3.59834e-09 -5.77537e-09 8.08809e-09 6.32156e-09 -3.4274e-09 4.90216e-09 3.59835e-09 -7.73091 5.47488 -0.417314 -3.42739e-09 4.90216e-09 3.59834e-09 -2.90554 0.965183 -0.102902 -3.42741e-09 4.90216e-09 3.59833e-09 -10.2786 0.731801 -0.0259123 -3.42739e-09 4.90216e-09 3.59832e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.6472 -36.6656 -0.515613 -0.12375 25.8885 0.606614 3.44068 -60.0237 3.8289 2.03217e-16 0.0 3.88251e-19 -6.30354 -17.5147 2.94171 0.0322043 24.6031 -0.69575 10.6274 -14.9368 30.0619
-24.3716 86.1398 103.352 178.294 -44.6888 -163.555 -1.10542 -15.1439 3.86108 1.17726 -5.16038 0.799268 -4.74625 5.02916 -2.24444 2.59173 4.55623 -5.38896 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.48042e-14 2.37544e-13 4.07161e-13 -128.097 -59.5985 -164.008 -6.53654 -2.2883 11.4482 -149.13 69.0161 158.504 -3.47071e-09 4.00007e-09 1.54113e-09 -5.66171e-09 6.41303e-09 2.92647e-09 -3.4707e-09 4.00007e-09 1.5411e-09 7.73091 5.47488 0.417314 -3.47071e-09 4.00007e-09 1.54113e-09 2.90554 0.965183 0.102902 -3.4707e-09 4.00007e-09 1.54113e-09 10.2786 0.731801 0.0259123 -3.47072e-09 4.00008e-09 1.54113e-09 2.22167 -0.733487 -0.20892 -9.48427e-14 2.37551e-13 4.07012e-13 -5.56973 -23.8181 16.982 8.73428 -3.40694 -15.4483 3.13899 43.9128 -7.77631 -4.10927e-09 5.62612e-09 4.7782e-09 -6.91173e-09 9.22865e-09 8.37895e-09 -4.10928e-09 5.62612e-09 4.77822e-09 -7.73091 5.47488 -0.417314 -4.10927e-09 5.62612e-09 4.7782e-09 -2.90554 0.965183 -0.102902 -4.10928e-09 5.62612e-09 4.7782e-09 -10.2786 0.731801 -0.0259123 -4.10927e-09 5.62612e-09 4.77819e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -17.7781 -35.8245 -1.9362 -0.117473 25.8369 0.633759 0.554943 -58.4195 0.650376 2.03217e-16 0.0 3.88251e-19 -5.15962 -17.6423 3.04542 0.0477037 25.3805 -0.69126 10.3383 -14.3166 30.0158
-24.7152 86.4598 102.28 178.987 -44.7571 -164.131 -0.984808 -15.3833 4.06574 1.11118 -5.30636 0.838605 -4.75432 5.38812 -2.2334 2.80707 4.86809 -5.49654 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.18959e-14 2.45123e-13 5.20818e-13 -125.594 -61.7598 -162.099 -6.45399 -2.2498 11.2999 -148.025 69.9274 157.332 -3.2408e-09 3.41194e-09 1.53396e-09 -5.27353e-09 5.50121e-09 2.91734e-09 -3.24079e-09 3.41195e-09 1.53393e-09 7.73091 5.47488 0.417314 -3.2408e-09 3.41194e-09 1.53396e-09 2.90554 0.965183 0.102902 -3.24079e-09 3.41195e-09 1.53396e-09 10.2786 0.731801 0.0259123 -3.24081e-09 3.41195e-09 1.53397e-09 2.22167 -0.733487 -0.20892 -4.19273e-14 2.45127e-13 5.20658e-13 -5.24512 -23.4324 17.039 8.73934 -3.40956 -15.4579 3.01488 43.2675 -7.59921 -4.24992e-09 5.25878e-09 5.89705e-09 -7.12417e-09 8.50931e-09 1.031e-08 -4.24992e-09 5.25878e-09 5.89706e-09 -7.73091 5.47488 -0.417314 -4.24992e-09 5.25878e-09 5.89705e-09 -2.90554 0.965183 -0.102902 -4.24993e-09 5.25878e-09 5.89704e-09 -10.2786 0.731801 -0.0259123 -4.24991e-09 5.25878e-09 5.89703e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -17.0587 -35.06 -3.02469 -0.112007 25.8482 0.659918 -2.30219 -56.3497 -2.59708 2.03217e-16 0.0 3.88251e-19 -4.1556 -17.8311 3.30635 0.0624069 26.1502 -0.689509 10.1239 -13.905 29.8909
-24.9724 86.7262 101.293 178.962 -44.8699 -164.179 -1.1115 -15.6697 4.18095 1.1084 -5.41528 0.863899 -4.71083 5.72258 -2.19391 3.06673 5.20855 -5.56406 -0.0 0.0 0.0 -0.0 0.0 0.0 4.7627e-14 2.44121e-13 6.53135e-13 -123.058 -63.9921 -160.291 -6.36879 -2.2103 11.1471 -147.131 70.5855 156.39 -2.49782e-09 2.08043e-09 1.34764e-09 -4.04223e-09 3.41034e-09 2.5687e-09 -2.49781e-09 2.08044e-09 1.34761e-09 7.73091 5.47488 0.417314 -2.49782e-09 2.08043e-09 1.34764e-09 2.90554 0.965183 0.102902 -2.49781e-09 2.08043e-09 1.34764e-09 10.2786 0.731801 0.0259123 -2.49782e-09 2.08044e-09 1.34765e-09 2.22167 -0.733487 -0.20892 4.75815e-14 2.44119e-13 6.52942e-13 -4.93652 -22.4906 17.0834 8.79909 -3.44282 -15.5679 2.80791 42.1163 -7.29568 -4.00233e-09 4.11328e-09 6.99688e-09 -6.67279e-09 6.46146e-09 1.21934e-08 -4.00233e-09 4.11328e-09 6.9969e-09 -7.73091 5.47488 -0.417314 -4.00232e-09 4.11328e-09 6.99688e-09 -2.90554 0.965183 -0.102902 -4.00233e-09 4.11328e-09 6.99688e-09 -10.2786 0.731801 -0.0259123 -4.00231e-09 4.11327e-09 6.99687e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.4161 -34.3302 -3.90641 -0.106909 25.8899 0.684944 -4.95775 -53.8617 -5.76502 2.03217e-16 0.0 3.88251e-19 -3.2096 -18.0911 3.72433 0.0776241 26.9684 -0.690082 9.95454 -13.6427 29.6702
-25.193 86.9742 100.205 178.403 -44.8784 -164.009 -1.41425 -16.0088 4.25141 1.14582 -5.47061 0.884994 -4.65009 5.99102 -2.14277 3.36034 5.54274 -5.60143 -0.0 0.0 0.0 -0.0 0.0 0.0 1.299e-13 2.57971e-13 7.57124e-13 -121.372 -65.5496 -159.444 -6.31445 -2.18531 11.0496 -147.254 70.4904 156.521 -1.59128e-09 6.0723e-10 1.07679e-09 -2.54674e-09 1.08973e-09 2.0585e-09 -1.59127e-09 6.07236e-10 1.07676e-09 7.73091 5.47488 0.417314 -1.59128e-09 6.0723e-10 1.07679e-09 2.90554 0.965183 0.102902 -1.59127e-09 6.07232e-10 1.07679e-09 10.2786 0.731801 0.0259123 -1.59128e-09 6.07234e-10 1.0768e-09 2.22167 -0.733487 -0.20892 1.29835e-13 2.57965e-13 7.56896e-13 -4.60653 -21.3997 17.1429 8.87904 -3.48748 -15.7154 2.59414 40.8237 -6.97109 -3.56474e-09 2.80337e-09 7.73371e-09 -5.90578e-09 4.16248e-09 1.34445e-08 -3.56474e-09 2.80338e-09 7.73373e-09 -7.73091 5.47488 -0.417314 -3.56474e-09 2.80338e-09 7.73371e-09 -2.90554 0.965183 -0.102902 -3.56475e-09 2.80338e-09 7.73371e-09 -10.2786 0.731801 -0.0259123 -3.56472e-09 2.80336e-09 7.73371e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -15.772 -33.6892 -4.41144 -0.102222 25.9259 0.708046 -7.11586 -51.4689 -8.501 2.03217e-16 0.0 3.88251e-19 -2.33945 -18.4125 4.21475 0.0923309 27.7482 -0.68957 9.7522 -13.3217 29.4497
-25.5575 87.1701 99.2223 178.244 -44.6786 -163.778 -1.82101 -16.4065 4.3221 1.20044 -5.45583 0.911741 -4.6059 6.15191 -2.09678 3.67765 5.83574 -5.61845 -0.0 0.0 0.0 -0.0 0.0 0.0 1.61059e-13 3.10109e-13 7.85796e-13 -121.645 -65.691 -160.649 -6.32463 -2.19039 11.0674 -149.009 69.1257 158.375 -8.70693e-10 -4.05968e-10 8.16022e-10 -1.36594e-09 -5.11325e-10 1.56467e-09 -8.70687e-10 -4.0596e-10 8.15994e-10 7.73091 5.47488 0.417314 -8.70695e-10 -4.05967e-10 8.16019e-10 2.90554 0.965183 0.102902 -8.70688e-10 -4.05966e-10 8.16018e-10 10.2786 0.731801 0.0259123 -8.70697e-10 -4.05964e-10 8.16025e-10 2.22167 -0.733487 -0.20892 1.60983e-13 3.10099e-13 7.85547e-13 -4.21781 -20.5657 17.2372 8.94494 -3.52439 -15.8372 2.42989 39.756 -6.71389 -3.13541e-09 1.94282e-09 7.76356e-09 -5.17134e-09 2.68973e-09 1.34788e-08 -3.13541e-09 1.94282e-09 7.76357e-09 -7.73091 5.47488 -0.417314 -3.13541e-09 1.94283e-09 7.76356e-09 -2.90554 0.965183 -0.102902 -3.13542e-09 1.94283e-09 7.76356e-09 -10.2786 0.731801 -0.0259123 -3.13539e-09 1.94281e-09 7.76356e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -15.0561 -33.1907 -4.3739 -0.0979235 25.9204 0.728401 -8.71819 -49.7057 -10.6335 2.03217e-16 0.0 3.88251e-19 -1.56465 -18.7859 4.69253 0.105303 28.4026 -0.684415 9.43942 -12.735 29.328
-25.911 87.3588 98.2658 177.974 -44.3943 -163.47 -2.35739 -16.8857 4.39049 1.28042 -5.35456 0.944492 -4.57768 6.14277 -2.05121 4.02601 6.13489 -5.60278 -0.0 0.0 0.0 -0.0 0.0 0.0 1.10295e-13 4.34791e-13 7.06932e-13 -124.555 -63.4724 -164.66 -6.44119 -2.24511 11.2754 -152.462 65.6283 162.083 -4.64743e-10 -6.07024e-10 5.06598e-10 -7.19539e-10 -8.37444e-10 9.93416e-10 -4.64738e-10 -6.07017e-10 5.06571e-10 7.73091 5.47488 0.417314 -4.64746e-10 -6.07023e-10 5.06595e-10 2.90554 0.965183 0.102902 -4.64738e-10 -6.07022e-10 5.06594e-10 10.2786 0.731801 0.0259123 -4.64747e-10 -6.0702e-10 5.066e-10 2.22167 -0.733487 -0.20892 1.10224e-13 4.34783e-13 7.06685e-13 -3.73868 -20.0394 17.3808 8.99545 -3.55287 -15.9306 2.30912 38.9449 -6.52263 -2.72449e-09 1.75707e-09 6.75861e-09 -4.4955e-09 2.45644e-09 1.17322e-08 -2.72449e-09 1.75707e-09 6.75862e-09 -7.73091 5.47488 -0.417314 -2.72449e-09 1.75707e-09 6.75861e-09 -2.90554 0.965183 -0.102902 -2.7245e-09 1.75707e-09 6.75861e-09 -10.2786 0.731801 -0.0259123 -2.72447e-09 1.75706e-09 6.7586e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -14.215 -32.8657 -3.48479 -0.0940329 25.8369 0.743437 -9.81632 -48.9372 -12.0876 2.03217e-16 0.0 3.88251e-19 -0.881625 -19.2226 5.20801 0.116737 28.929 -0.671241 8.90617 -11.6287 29.3915
-26.2348 87.5503 97.2637 177.692 -44.2455 -163.191 -3.04723 -17.4363 4.43757 1.39307 -5.17962 0.978737 -4.55012 6.00287 -2.00017 4.40662 6.44001 -5.55407 -0.0 0.0 0.0 -0.0 0.0 0.0 7.37466e-15 6.10185e-13 5.52155e-13 -128.137 -59.3511 -169.588 -6.63439 -2.33581 11.6221 -155.853 60.3942 165.871 -1.75195e-10 -3.80737e-10 1.26047e-10 -2.77e-10 -4.95665e-10 2.96921e-10 -1.7519e-10 -3.80731e-10 1.26023e-10 7.73091 5.47488 0.417314 -1.75198e-10 -3.80736e-10 1.26046e-10 2.90554 0.965183 0.102902 -1.75189e-10 -3.80735e-10 1.26045e-10 10.2786 0.731801 0.0259123 -1.75197e-10 -3.80733e-10 1.26048e-10 2.22167 -0.733487 -0.20892 7.31419e-15 6.10179e-13 5.51922e-13 -3.19692 -19.6231 17.558 9.04624 -3.58164 -16.0246 2.20355 38.2176 -6.35392 -2.24049e-09 1.89819e-09 4.98101e-09 -3.71483e-09 2.84604e-09 8.65257e-09 -2.24049e-09 1.89819e-09 4.98102e-09 -7.73091 5.47488 -0.417314 -2.24049e-09 1.89819e-09 4.98101e-09 -2.90554 0.965183 -0.102902 -2.2405e-09 1.89819e-09 4.98101e-09 -10.2786 0.731801 -0.0259123 -2.24048e-09 1.89818e-09 4.981e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -13.3203 -32.6661 -1.93267 -0.0904961 25.7036 0.754353 -10.6705 -48.8336 -13.1591 2.03217e-16 0.0 3.88251e-19 -0.277879 -19.7219 5.78415 0.126897 29.3671 -0.652586 8.21454 -10.1858 29.5804
-26.5987 87.7006 96.2667 177.463 -44.0931 -162.765 -3.81454 -18.0141 4.48385 1.51402 -4.95821 1.01704 -4.53492 5.84331 -1.95881 4.80083 6.64485 -5.50001 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.0071e-13 7.75583e-13 3.70242e-13 -130.658 -54.8275 -173.655 -6.8312 -2.42835 11.9774 -158.118 54.8819 168.576 1.388e-10 -2.30816e-10 -1.76629e-10 2.08069e-10 -2.80311e-10 -2.77912e-10 1.38806e-10 -2.30811e-10 -1.7665e-10 7.73091 5.47488 0.417314 1.38797e-10 -2.30814e-10 -1.7663e-10 2.90554 0.965183 0.102902 1.38807e-10 -2.30814e-10 -1.7663e-10 10.2786 0.731801 0.0259123 1.38799e-10 -2.30811e-10 -1.7663e-10 2.22167 -0.733487 -0.20892 -1.00758e-13 7.7558e-13 3.70027e-13 -2.64209 -19.3496 17.738 9.08885 -3.60584 -16.1035 2.12142 37.6344 -6.22092 -1.72917e-09 2.11987e-09 2.97172e-09 -2.89331e-09 3.39119e-09 5.17322e-09 -1.72918e-09 2.11987e-09 2.97173e-09 -7.73091 5.47488 -0.417314 -1.72917e-09 2.11987e-09 2.97173e-09 -2.90554 0.965183 -0.102902 -1.72918e-09 2.11987e-09 2.97172e-09 -10.2786 0.731801 -0.0259123 -1.72916e-09 2.11987e-09 2.97171e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.4791 -32.5362 -0.292532 -0.0871624 25.5814 0.765981 -11.5514 -48.8797 -14.2361 2.03217e-16 0.0 3.88251e-19 0.234642 -20.2583 6.29291 0.13476 29.6926 -0.633788 7.55329 -8.84906 29.7646
-26.9408 87.7964 95.3876 176.851 -43.7547 -161.938 -4.5827 -18.5751 4.5499 1.61895 -4.71754 1.06196 -4.54429 5.7752 -1.94216 5.19084 6.64309 -5.46826 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.66964e-13 8.70279e-13 2.09966e-13 -131.916 -51.5787 -176.479 -6.96011 -2.48904 12.2114 -159.323 50.6404 170.134 6.18093e-10 -6.60969e-10 -2.52431e-10 9.82068e-10 -9.85702e-10 -4.8418e-10 6.18099e-10 -6.60965e-10 -2.5245e-10 7.73091 5.47488 0.417314 6.1809e-10 -6.60967e-10 -2.52431e-10 2.90554 0.965183 0.102902 6.181e-10 -6.60967e-10 -2.5243e-10 10.2786 0.731801 0.0259123 6.18093e-10 -6.60965e-10 -2.52431e-10 2.22167 -0.733487 -0.20892 -1.67005e-13 8.70279e-13 2.09768e-13 -2.12255 -19.2514 17.8907 9.11487 -3.62061 -16.1518 2.07013 37.2557 -6.13617 -1.23631e-09 2.17578e-09 1.2717e-09 -2.09492e-09 3.62459e-09 2.22757e-09 -1.23632e-09 2.17578e-09 1.27171e-09 -7.73091 5.47488 -0.417314 -1.23631e-09 2.17578e-09 1.27171e-09 -2.90554 0.965183 -0.102902 -1.23632e-09 2.17578e-09 1.2717e-09 -10.2786 0.731801 -0.0259123 -1.2363e-09 2.17578e-09 1.27169e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.7936 -32.4464 0.862803 -0.0838991 25.531 0.783152 -12.6621 -48.5498 -15.6545 2.03217e-16 0.0 3.88251e-19 0.637731 -20.8084 6.60412 0.139499 29.8816 -0.620283 7.12801 -8.05022 29.7948
-27.2585 87.8578 94.5286 176.244 -43.5173 -161.189 -5.42914 -19.1628 4.63095 1.74129 -4.40363 1.11752 -4.59352 5.81984 -1.96011 5.57722 6.32501 -5.45842 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.70986e-13 8.54618e-13 6.25422e-14 -132.408 -50.6089 -178.363 -6.95665 -2.4861 12.2068 -159.759 48.6619 170.746 1.48108e-09 -2.19262e-09 4.64548e-11 2.41504e-09 -3.44364e-09 -9.64434e-11 1.48109e-09 -2.19262e-09 4.64369e-11 7.73091 5.47488 0.417314 1.48108e-09 -2.19262e-09 4.64543e-11 2.90554 0.965183 0.102902 1.48109e-09 -2.19262e-09 4.64561e-11 10.2786 0.731801 0.0259123 1.48108e-09 -2.19262e-09 4.64573e-11 2.22167 -0.733487 -0.20892 -1.71027e-13 8.54619e-13 6.23594e-14 -1.63831 -19.4269 18.0173 9.12006 -3.6235 -16.1614 2.0578 37.1592 -6.1151 -7.17595e-10 2.01582e-09 -1.75007e-10 -1.24556e-09 3.4632e-09 -2.82196e-10 -7.17605e-10 2.01581e-09 -1.74998e-10 -7.73091 5.47488 -0.417314 -7.17595e-10 2.01581e-09 -1.75004e-10 -2.90554 0.965183 -0.102902 -7.17604e-10 2.01581e-09 -1.75011e-10 -10.2786 0.731801 -0.0259123 -7.17591e-10 2.01582e-09 -1.75024e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.3533 -32.475 1.33615 -0.0809484 25.6003 0.808947 -14.008 -47.6889 -17.4735 2.03217e-16 0.0 3.88251e-19 0.852623 -21.3774 6.64311 0.140443 29.8831 -0.611368 6.93359 -7.81508 29.5553
-27.5883 87.8879 93.6134 175.976 -43.3385 -160.697 -6.36145 -19.7823 4.7198 1.88024 -4.02238 1.18123 -4.67207 5.92073 -2.00267 5.96792 5.7744 -5.4587 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.40461e-13 7.68799e-13 -9.07794e-14 -132.732 -50.91 -179.969 -6.87452 -2.44521 12.0603 -159.887 47.975 170.944 2.59237e-09 -4.42809e-09 6.04535e-10 4.27412e-09 -7.02383e-09 7.00416e-10 2.59238e-09 -4.42809e-09 6.04518e-10 7.73091 5.47488 0.417314 2.59237e-09 -4.42809e-09 6.04533e-10 2.90554 0.965183 0.102902 2.59238e-09 -4.42809e-09 6.04537e-10 10.2786 0.731801 0.0259123 2.59237e-09 -4.42809e-09 6.04541e-10 2.22167 -0.733487 -0.20892 -1.40508e-13 7.688e-13 -9.0944e-14 -1.16506 -19.8281 18.132 9.10962 -3.61751 -16.1421 2.07562 37.2924 -6.14471 -1.6746e-10 1.76615e-09 -1.59018e-09 -3.41472e-10 3.14241e-09 -2.7383e-09 -1.6747e-10 1.76614e-09 -1.59017e-09 -7.73091 5.47488 -0.417314 -1.6746e-10 1.76614e-09 -1.59018e-09 -2.90554 0.965183 -0.102902 -1.67468e-10 1.76614e-09 -1.59018e-09 -10.2786 0.731801 -0.0259123 -1.67457e-10 1.76614e-09 -1.5902e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.074 -32.6194 1.45255 -0.0784646 25.7463 0.840271 -15.4292 -46.5707 -19.4747 2.03217e-16 0.0 3.88251e-19 0.903998 -21.9757 6.48945 0.138401 29.7246 -0.604953 6.8832 -7.94027 29.141
-27.9002 87.9014 92.7793 175.523 -43.0366 -160.143 -7.19762 -20.3313 4.83321 1.96059 -3.69083 1.24591 -4.75356 6.07236 -2.05509 6.35594 5.17533 -5.47943 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.00533e-13 6.71898e-13 -2.16167e-13 -133.114 -51.1638 178.327 -6.82053 -2.41921 11.9632 -160.095 47.1872 171.214 3.56211e-09 -6.49244e-09 1.17585e-09 5.90136e-09 -1.03274e-08 1.53782e-09 3.56211e-09 -6.49244e-09 1.17583e-09 7.73091 5.47488 0.417314 3.56211e-09 -6.49244e-09 1.17585e-09 2.90554 0.965183 0.102902 3.56211e-09 -6.49244e-09 1.17585e-09 10.2786 0.731801 0.0259123 3.56211e-09 -6.49244e-09 1.17586e-09 2.22167 -0.733487 -0.20892 -1.00582e-13 6.71899e-13 -2.16318e-13 -0.715974 -20.2687 18.2236 9.08929 -3.60593 -16.1044 2.10626 37.5202 -6.19552 3.10238e-10 1.44491e-09 -2.68158e-09 4.47765e-10 2.67246e-09 -4.63399e-09 3.10229e-10 1.44491e-09 -2.68158e-09 -7.73091 5.47488 -0.417314 3.10238e-10 1.44491e-09 -2.68158e-09 -2.90554 0.965183 -0.102902 3.10232e-10 1.44491e-09 -2.68159e-09 -10.2786 0.731801 -0.0259123 3.1024e-10 1.44491e-09 -2.6816e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.8008 -32.7425 1.42066 -0.0760999 25.8938 0.872648 -16.8417 -45.3088 -21.5474 2.03217e-16 0.0 3.88251e-19 0.926997 -22.5885 6.24355 0.134731 29.5005 -0.604382 7.061 -8.51306 28.7124
-28.1574 87.9288 92.041 174.905 -42.6963 -159.505 -7.75594 -20.7075 4.98753 1.90785 -3.52601 1.30433 -4.8117 6.26921 -2.10258 6.73396 4.71188 -5.5303 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.63424e-14 6.22991e-13 -2.79789e-13 -133.526 -50.0354 176.346 -6.90196 -2.46107 12.1065 -160.669 44.8972 171.95 4.00044e-09 -7.51071e-09 1.51444e-09 6.63883e-09 -1.19556e-08 2.0472e-09 4.00045e-09 -7.51071e-09 1.51442e-09 7.73091 5.47488 0.417314 4.00044e-09 -7.51071e-09 1.51444e-09 2.90554 0.965183 0.102902 4.00045e-09 -7.51071e-09 1.51444e-09 10.2786 0.731801 0.0259123 4.00044e-09 -7.51071e-09 1.51445e-09 2.22167 -0.733487 -0.20892 -7.63789e-14 6.22991e-13 -2.79939e-13 -0.306049 -20.5625 18.2787 9.0648 -3.59204 -16.0589 2.13187 37.7077 -6.23764 6.1164e-10 1.07024e-09 -3.15699e-09 9.52594e-10 2.06364e-09 -5.46248e-09 6.11631e-10 1.07024e-09 -3.15698e-09 -7.73091 5.47488 -0.417314 6.1164e-10 1.07024e-09 -3.15699e-09 -2.90554 0.965183 -0.102902 6.11636e-10 1.07024e-09 -3.15699e-09 -10.2786 0.731801 -0.0259123 6.11642e-10 1.07024e-09 -3.15701e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.3777 -32.706 1.44969 -0.073282 25.9675 0.901495 -18.1939 -44.0204 -23.6043 2.03217e-16 0.0 3.88251e-19 1.06136 -23.2006 6.00742 0.130684 29.3046 -0.612933 7.55213 -9.62138 28.4372
-28.4284 87.9715 91.2841 174.763 -42.609 -159.298 -7.97718 -20.8855 5.19 1.6438 -3.61785 1.35046 -4.82892 6.57276 -2.13884 7.13655 4.43686 -5.62706 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.92525e-14 6.55519e-13 -2.24497e-13 -133.603 -46.584 174.21 -7.20849 -2.61622 12.653 -161.634 40.0861 173.276 3.6534e-09 -6.95218e-09 1.48777e-09 6.05625e-09 -1.10594e-08 2.04144e-09 3.6534e-09 -6.95218e-09 1.48776e-09 7.73091 5.47488 0.417314 3.65339e-09 -6.95219e-09 1.48777e-09 2.90554 0.965183 0.102902 3.6534e-09 -6.95218e-09 1.48777e-09 10.2786 0.731801 0.0259123 3.65339e-09 -6.95218e-09 1.48778e-09 2.22167 -0.733487 -0.20892 -6.92486e-14 6.55516e-13 -2.24666e-13 0.0987675 -20.6147 18.2761 9.03162 -3.57331 -15.9975 2.15439 37.8702 -6.27441 6.31112e-10 5.02302e-10 -2.47846e-09 1.00745e-09 1.03288e-09 -4.29346e-09 6.31104e-10 5.02301e-10 -2.47845e-09 -7.73091 5.47488 -0.417314 6.31112e-10 5.02302e-10 -2.47846e-09 -2.90554 0.965183 -0.102902 6.3111e-10 5.02301e-10 -2.47846e-09 -10.2786 0.731801 -0.0259123 6.31114e-10 5.02302e-10 -2.47847e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -9.77622 -32.4694 1.53578 -0.0694992 25.948 0.927394 -19.5759 -42.662 -25.7724 2.03217e-16 0.0 3.88251e-19 1.32934 -23.7962 5.77109 0.12547 29.1182 -0.634893 8.53734 -11.5711 28.4033
-28.703 88.0322 90.4729 174.998 -42.7204 -159.447 -7.96327 -20.9192 5.43012 1.22841 -3.88435 1.38956 -4.82254 6.96495 -2.17263 7.55496 4.25088 -5.75986 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.76347e-14 7.32078e-13 -8.43748e-14 -133.114 -41.7217 172.186 -7.65744 -2.84439 13.4639 -162.531 33.6876 174.715 2.7789e-09 -5.38264e-09 1.24934e-09 4.58948e-09 -8.54351e-09 1.74672e-09 2.7789e-09 -5.38263e-09 1.24932e-09 7.73091 5.47488 0.417314 2.77889e-09 -5.38264e-09 1.24933e-09 2.90554 0.965183 0.102902 2.7789e-09 -5.38263e-09 1.24934e-09 10.2786 0.731801 0.0259123 2.77889e-09 -5.38263e-09 1.24935e-09 2.22167 -0.733487 -0.20892 -6.75713e-14 7.32072e-13 -8.45798e-14 0.49296 -20.5396 18.2279 8.98866 -3.5491 -15.9179 2.18134 38.0626 -6.3182 4.50026e-10 -2.20361e-10 -9.55187e-10 7.42878e-10 -3.30012e-10 -1.66227e-09 4.50018e-10 -2.20362e-10 -9.55172e-10 -7.73091 5.47488 -0.417314 4.50026e-10 -2.20361e-10 -9.55187e-10 -2.90554 0.965183 -0.102902 4.50026e-10 -2.20362e-10 -9.5519e-10 -10.2786 0.731801 -0.0259123 4.50028e-10 -2.20358e-10 -9.552e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -9.07602 -32.1077 1.58686 -0.0650262 25.8752 0.952123 -20.9512 -41.1925 -28.0314 2.03217e-16 0.0 3.88251e-19 1.65915 -24.3873 5.4915 0.118568 28.9056 -0.66727 9.93155 -14.2204 28.5602
-28.9251 88.0404 89.658 174.842 -42.7302 -159.47 -7.77525 -20.8249 5.69725 0.794523 -4.18462 1.43137 -4.81881 7.321 -2.2117 7.91739 4.10966 -5.89967 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.71455e-14 8.05481e-13 3.75536e-14 -132.268 -36.8876 170.304 -8.10113 -3.07102 14.2778 -163.092 27.2445 175.903 1.75495e-09 -3.57186e-09 9.82217e-10 2.87971e-09 -5.63957e-09 1.41441e-09 1.75495e-09 -3.57185e-09 9.82206e-10 7.73091 5.47488 0.417314 1.75494e-09 -3.57185e-09 9.82216e-10 2.90554 0.965183 0.102902 1.75495e-09 -3.57185e-09 9.82217e-10 10.2786 0.731801 0.0259123 1.75494e-09 -3.57185e-09 9.82227e-10 2.22167 -0.733487 -0.20892 -7.70283e-14 8.05472e-13 3.7316e-14 0.801459 -20.4659 18.1701 8.94689 -3.52558 -15.8407 2.20207 38.2091 -6.35172 2.45028e-10 -8.12004e-10 4.34366e-10 4.33497e-10 -1.45555e-09 7.39379e-10 2.45021e-10 -8.12004e-10 4.34383e-10 -7.73091 5.47488 -0.417314 2.45028e-10 -8.12004e-10 4.34366e-10 -2.90554 0.965183 -0.102902 2.45029e-10 -8.12005e-10 4.34363e-10 -10.2786 0.731801 -0.0259123 2.4503e-10 -8.12e-10 4.34354e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -8.28383 -31.6555 1.67939 -0.0603568 25.7632 0.972832 -22.143 -39.7452 -30.1183 2.03217e-16 0.0 3.88251e-19 2.05463 -25.0002 5.22307 0.111804 28.7362 -0.702489 11.4275 -16.981 28.8457
-29.2186 88.0436 88.8123 175.236 -42.7945 -159.867 -7.47424 -20.619 5.9808 0.474764 -4.37779 1.48556 -4.84415 7.5161 -2.26366 8.15206 3.96894 -6.01752 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.03442e-13 8.2854e-13 3.8266e-14 -131.526 -33.503 168.488 -8.39973 -3.22412 14.8328 -163.347 22.3246 176.692 9.59554e-10 -2.28964e-09 8.695e-10 1.56815e-09 -3.57924e-09 1.29585e-09 9.59553e-10 -2.28963e-09 8.6949e-10 7.73091 5.47488 0.417314 9.59551e-10 -2.28963e-09 8.695e-10 2.90554 0.965183 0.102902 9.59559e-10 -2.28963e-09 8.69499e-10 10.2786 0.731801 0.0259123 9.59546e-10 -2.28963e-09 8.6951e-10 2.22167 -0.733487 -0.20892 -1.03301e-13 8.28531e-13 3.80176e-14 0.948655 -20.5219 18.1383 8.91732 -3.50894 -15.7862 2.20552 38.2338 -6.35734 1.92764e-10 -9.86886e-10 7.11735e-10 3.53925e-10 -1.77422e-09 1.21978e-09 1.92758e-10 -9.86886e-10 7.11754e-10 -7.73091 5.47488 -0.417314 1.92765e-10 -9.86886e-10 7.11735e-10 -2.90554 0.965183 -0.102902 1.92766e-10 -9.86887e-10 7.11732e-10 -10.2786 0.731801 -0.0259123 1.9277e-10 -9.86885e-10 7.11725e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.4091 -31.1468 1.88843 -0.0560467 25.6259 0.9867 -23.0226 -38.4636 -31.8025 2.03217e-16 0.0 3.88251e-19 2.52163 -25.6615 5.02117 0.1073 28.6795 -0.733109 12.6933 -19.2705 29.1359
-29.5699 88.0424 88.0327 175.949 -42.7361 -160.475 -7.01814 -20.2334 6.27469 0.320449 -4.42903 1.5541 -4.92162 7.47147 -2.33071 8.20739 3.84533 -6.09765 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.71015e-13 8.13153e-13 -1.63521e-13 -131.269 -32.0693 166.598 -8.50652 -3.27906 15.0326 -163.463 19.4877 177.124 4.80162e-10 -1.94576e-09 1.07753e-09 8.15114e-10 -3.01608e-09 1.63688e-09 4.80162e-10 -1.94575e-09 1.07753e-09 7.73091 5.47488 0.417314 4.80159e-10 -1.94575e-09 1.07753e-09 2.90554 0.965183 0.102902 4.80168e-10 -1.94576e-09 1.07753e-09 10.2786 0.731801 0.0259123 4.80155e-10 -1.94576e-09 1.07754e-09 2.22167 -0.733487 -0.20892 -1.70901e-13 8.13149e-13 -1.63743e-13 0.861876 -20.7055 18.17 8.90738 -3.50332 -15.7679 2.17718 38.035 -6.31173 3.37409e-10 -3.01109e-10 -8.58926e-10 5.58405e-10 -4.64778e-10 -1.49037e-09 3.37404e-10 -3.01108e-10 -8.58905e-10 -7.73091 5.47488 -0.417314 3.3741e-10 -3.01108e-10 -8.58925e-10 -2.90554 0.965183 -0.102902 3.37412e-10 -3.0111e-10 -8.58928e-10 -10.2786 0.731801 -0.0259123 3.37423e-10 -3.01117e-10 -8.58932e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -6.36801 -30.5307 2.35671 -0.052016 25.4434 0.993341 -23.6448 -37.5488 -33.0316 2.03217e-16 0.0 3.88251e-19 3.11733 -26.3634 4.94017 0.106244 28.7817 -0.758166 13.6483 -20.8673 29.4677
-29.8411 88.0488 87.2364 176.401 -42.9795 -161.132 -6.39858 -19.6838 6.58449 0.255245 -4.41255 1.63201 -5.03255 7.26886 -2.40861 8.13295 3.75293 -6.15819 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.69188e-13 7.76327e-13 -4.94924e-13 -131.41 -31.7639 164.592 -8.50282 -3.27726 15.0255 -163.549 17.8648 177.381 1.1962e-10 -2.06151e-09 1.4695e-09 2.82191e-10 -3.18482e-09 2.24383e-09 1.19624e-10 -2.0615e-09 1.46949e-09 7.73091 5.47488 0.417314 1.19617e-10 -2.06149e-09 1.4695e-09 2.90554 0.965183 0.102902 1.19629e-10 -2.0615e-09 1.4695e-09 10.2786 0.731801 0.0259123 1.19616e-10 -2.0615e-09 1.46951e-09 2.22167 -0.733487 -0.20892 -2.69132e-13 7.76332e-13 -4.95098e-13 0.599439 -20.9599 18.2375 8.90973 -3.50462 -15.7722 2.12767 37.6802 -6.23118 5.8573e-10 9.70365e-10 -3.59746e-09 9.06804e-10 1.94592e-09 -6.21612e-09 5.85725e-10 9.70367e-10 -3.59744e-09 -7.73091 5.47488 -0.417314 5.85731e-10 9.70366e-10 -3.59746e-09 -2.90554 0.965183 -0.102902 5.85731e-10 9.70365e-10 -3.59746e-09 -10.2786 0.731801 -0.0259123 5.85754e-10 9.70344e-10 -3.59746e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.19757 -29.807 2.99681 -0.0480945 25.2161 0.99417 -24.1141 -36.8797 -33.9674 2.03217e-16 0.0 3.88251e-19 3.82457 -27.0965 4.93939 0.107598 28.9965 -0.781436 14.4664 -22.1003 29.8533
-30.0969 88.0583 86.4884 176.719 -42.9911 -161.724 -5.72504 -19.1122 6.91758 0.22004 -4.35108 1.71843 -5.14073 7.02427 -2.49527 8.00822 3.64375 -6.22105 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.50862e-13 6.78536e-13 -8.27719e-13 -131.791 -32.008 162.548 -8.44426 -3.24708 14.9158 -163.622 16.8851 177.547 -1.70959e-10 -2.0739e-09 1.77372e-09 -1.37532e-10 -3.18894e-09 2.70885e-09 -1.70952e-10 -2.07389e-09 1.77372e-09 7.73091 5.47488 0.417314 -1.70962e-10 -2.07387e-09 1.77372e-09 2.90554 0.965183 0.102902 -1.70948e-10 -2.0739e-09 1.77372e-09 10.2786 0.731801 0.0259123 -1.70961e-10 -2.0739e-09 1.77373e-09 2.22167 -0.733487 -0.20892 -3.50867e-13 6.78549e-13 -8.27844e-13 0.28145 -21.3333 18.278 8.91331 -3.50662 -15.7788 2.08241 37.3477 -6.15661 9.08258e-10 2.03499e-09 -6.35834e-09 1.38217e-09 4.00519e-09 -1.09827e-08 9.08254e-10 2.03499e-09 -6.35831e-09 -7.73091 5.47488 -0.417314 9.0826e-10 2.03499e-09 -6.35833e-09 -2.90554 0.965183 -0.102902 9.08258e-10 2.03499e-09 -6.35834e-09 -10.2786 0.731801 -0.0259123 9.08291e-10 2.03495e-09 -6.35833e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -4.07713 -29.0885 3.54421 -0.0447773 24.9888 0.989092 -24.3757 -36.1249 -34.7049 2.03217e-16 0.0 3.88251e-19 4.53594 -27.8861 4.93106 0.110186 29.2546 -0.802614 15.1589 -23.2277 30.0928
-30.3943 88.057 85.7859 177.252 -42.9529 -162.356 -5.10398 -18.6601 7.28181 0.155816 -4.26734 1.81251 -5.20928 6.85367 -2.58861 7.91225 3.4698 -6.30816 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.68937e-13 4.80255e-13 -1.03368e-12 -132.162 -32.2429 160.586 -8.38631 -3.21681 14.8081 -163.676 15.9757 177.694 -4.40462e-10 -1.41996e-09 1.71853e-09 -5.50966e-10 -2.13188e-09 2.62407e-09 -4.40454e-10 -1.41996e-09 1.71853e-09 7.73091 5.47488 0.417314 -4.40465e-10 -1.41993e-09 1.71853e-09 2.90554 0.965183 0.102902 -4.4045e-10 -1.41996e-09 1.71853e-09 10.2786 0.731801 0.0259123 -4.40464e-10 -1.41996e-09 1.71854e-09 2.22167 -0.733487 -0.20892 -3.68976e-13 4.80273e-13 -1.03378e-12 0.0262615 -21.874 18.2287 8.90705 -3.50312 -15.7672 2.06472 37.2156 -6.12724 1.27553e-09 2.10021e-09 -7.99601e-09 1.96755e-09 4.26034e-09 -1.38154e-08 1.27552e-09 2.10021e-09 -7.99599e-09 -7.73091 5.47488 -0.417314 1.27553e-09 2.10021e-09 -7.99601e-09 -2.90554 0.965183 -0.102902 1.27553e-09 2.10021e-09 -7.99601e-09 -10.2786 0.731801 -0.0259123 1.27556e-09 2.10017e-09 -7.99601e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -3.16695 -28.4912 3.74361 -0.0425539 24.8066 0.977994 -24.3503 -34.9585 -35.3335 2.03217e-16 0.0 3.88251e-19 5.13861 -28.7574 4.82503 0.112692 29.4864 -0.821314 15.7261 -24.5157 29.9947
-30.7069 88.0433 85.1079 177.97 -43.1092 -162.915 -4.54863 -18.375 7.68455 0.0392293 -4.14079 1.91558 -5.21603 6.78529 -2.69234 7.85045 3.17953 -6.42642 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.85584e-13 7.17565e-14 -1.07824e-12 -132.435 -32.2982 158.733 -8.35787 -3.20064 14.757 -163.715 14.895 177.856 -7.55356e-10 5.45291e-10 1.03802e-09 -1.07842e-09 1.0118e-09 1.58519e-09 -7.55349e-10 5.45291e-10 1.03801e-09 7.73091 5.47488 0.417314 -7.55359e-10 5.45313e-10 1.03802e-09 2.90554 0.965183 0.102902 -7.55345e-10 5.45287e-10 1.03802e-09 10.2786 0.731801 0.0259123 -7.55359e-10 5.45287e-10 1.03803e-09 2.22167 -0.733487 -0.20892 -2.85616e-13 7.17724e-14 -1.07835e-12 -0.136612 -22.7459 18.0648 8.88751 -3.49217 -15.7311 2.09076 37.4106 -6.17058 1.85478e-09 3.817e-10 -8.18985e-09 2.96079e-09 1.34469e-09 -1.4167e-08 1.85478e-09 3.81703e-10 -8.18983e-09 -7.73091 5.47488 -0.417314 1.85479e-09 3.81701e-10 -8.18985e-09 -2.90554 0.965183 -0.102902 1.85478e-09 3.817e-10 -8.18985e-09 -10.2786 0.731801 -0.0259123 1.85482e-09 3.81665e-10 -8.18985e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.55652 -28.0798 3.38143 -0.0423466 24.7073 0.956694 -23.8622 -33.0833 -35.8382 2.03217e-16 0.0 3.88251e-19 5.59074 -29.7519 4.61745 0.115003 29.6882 -0.836985 16.0896 -26.131 29.3542
-30.9255 88.0268 84.5031 178.398 -43.3011 -163.299 -4.00515 -18.1778 8.12026 -0.0961751 -3.96818 2.02756 -5.18447 6.75817 -2.80616 7.78475 2.81158 -6.56391 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.34347e-13 -4.92817e-13 -1.02992e-12 -132.782 -32.4747 156.909 -8.32457 -3.18122 14.6979 -163.746 13.9784 177.993 -1.07176e-09 3.35665e-09 -5.84383e-11 -1.63229e-09 5.50183e-09 -9.17509e-11 -1.07175e-09 3.35665e-09 -5.84469e-11 7.73091 5.47488 0.417314 -1.07176e-09 3.35666e-09 -5.8438e-11 2.90554 0.965183 0.102902 -1.07175e-09 3.35664e-09 -5.84373e-11 10.2786 0.731801 0.0259123 -1.07176e-09 3.35664e-09 -5.84265e-11 2.22167 -0.733487 -0.20892 -1.34348e-13 -4.92807e-13 -1.03005e-12 -0.277598 -23.8751 17.8244 8.86072 -3.47716 -15.6816 2.14551 37.8111 -6.2606 2.60338e-09 -2.50685e-09 -7.55586e-09 4.27012e-09 -3.64056e-09 -1.30975e-08 2.60337e-09 -2.50684e-09 -7.55584e-09 -7.73091 5.47488 -0.417314 2.60338e-09 -2.50685e-09 -7.55585e-09 -2.90554 0.965183 -0.102902 2.60337e-09 -2.50685e-09 -7.55586e-09 -10.2786 0.731801 -0.0259123 2.6034e-09 -2.50687e-09 -7.55586e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.12853 -27.7788 2.64987 -0.0436603 24.6583 0.926639 -23.0041 -30.7625 -36.2295 2.03217e-16 0.0 3.88251e-19 5.9486 -30.8447 4.34632 0.117684 29.8919 -0.849955 16.2163 -27.9172 28.3063
-31.0802 88.0195 83.9652 178.534 -43.3745 -163.535 -3.47753 -18.0194 8.5777 -0.223713 -3.79817 2.14547 -5.14574 6.75444 -2.92202 7.72926 2.4532 -6.71424 -0.0 0.0 0.0 -0.0 0.0 0.0 2.48167e-14 -1.00718e-12 -9.1509e-13 -133.291 -32.9357 155.102 -8.24712 -3.13964 14.5562 -163.763 13.5189 178.061 -1.27303e-09 5.9118e-09 -1.12957e-09 -2.00756e-09 9.58614e-09 -1.73408e-09 -1.27303e-09 5.9118e-09 -1.12958e-09 7.73091 5.47488 0.417314 -1.27303e-09 5.91181e-09 -1.12957e-09 2.90554 0.965183 0.102902 -1.27302e-09 5.9118e-09 -1.12957e-09 10.2786 0.731801 0.0259123 -1.27304e-09 5.9118e-09 -1.12956e-09 2.22167 -0.733487 -0.20892 2.48504e-14 -1.00718e-12 -9.15261e-13 -0.426652 -24.9525 17.5357 8.82988 -3.45993 -15.6246 2.20365 38.2237 -6.35475 3.17699e-09 -5.26097e-09 -6.35347e-09 5.29425e-09 -8.44627e-09 -1.10433e-08 3.17699e-09 -5.26097e-09 -6.35346e-09 -7.73091 5.47488 -0.417314 3.17699e-09 -5.26097e-09 -6.35346e-09 -2.90554 0.965183 -0.102902 3.17698e-09 -5.26097e-09 -6.35346e-09 -10.2786 0.731801 -0.0259123 3.177e-09 -5.26098e-09 -6.35347e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -1.72964 -27.4976 1.90392 -0.0448585 24.5987 0.89616 -22.0878 -28.5035 -36.6053 2.03217e-16 0.0 3.88251e-19 6.2402 -31.9609 3.9808 0.120347 30.0825 -0.8611 16.1973 -29.6498 27.1784
-31.2625 88.0172 83.4041 178.706 -43.3995 -163.734 -2.97109 -17.8512 9.04529 -0.316277 -3.67939 2.26636 -5.13109 6.75622 -3.03187 7.69908 2.19155 -6.87083 -0.0 0.0 0.0 -0.0 0.0 0.0 1.31947e-13 -1.26507e-12 -7.60153e-13 -134.077 -33.8377 153.282 -8.08567 -3.05676 14.2574 -163.76 13.8096 178.02 -1.24254e-09 7.10844e-09 -1.73412e-09 -1.99926e-09 1.15127e-08 -2.66912e-09 -1.24254e-09 7.10844e-09 -1.73413e-09 7.73091 5.47488 0.417314 -1.24254e-09 7.10844e-09 -1.73412e-09 2.90554 0.965183 0.102902 -1.24253e-09 7.10844e-09 -1.73412e-09 10.2786 0.731801 0.0259123 -1.24255e-09 7.10844e-09 -1.73411e-09 2.22167 -0.733487 -0.20892 1.31998e-13 -1.26507e-12 -7.60351e-13 -0.605415 -25.6661 17.223 8.79818 -3.44228 -15.5661 2.23712 38.4553 -6.40827 3.2313e-09 -6.57621e-09 -4.84211e-09 5.43186e-09 -1.08233e-08 -8.44053e-09 3.23129e-09 -6.57621e-09 -4.8421e-09 -7.73091 5.47488 -0.417314 3.2313e-09 -6.57621e-09 -4.8421e-09 -2.90554 0.965183 -0.102902 3.23129e-09 -6.57621e-09 -4.8421e-09 -10.2786 0.731801 -0.0259123 3.2313e-09 -6.57621e-09 -4.84211e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -1.2111 -27.1526 1.49663 -0.0443926 24.4672 0.873631 -21.4255 -26.7971 -37.0104 2.03217e-16 0.0 3.88251e-19 6.4925 -33.0252 3.48883 0.122604 30.2446 -0.871292 16.1802 -31.0943 26.3138
-31.4805 88.0571 82.8007 179.083 -43.3903 -164.087 -2.50238 -17.6783 9.52913 -0.356632 -3.63915 2.3919 -5.10177 6.78397 -3.12963 7.63115 2.0385 -7.03294 -0.0 0.0 0.0 -0.0 0.0 0.0 1.7288e-13 -1.1422e-12 -5.04566e-13 -135.208 -35.3251 151.444 -7.80238 -2.9127 13.7356 -163.719 15.0515 177.835 -7.79382e-10 6.45126e-09 -1.72377e-09 -1.29329e-09 1.05249e-08 -2.68889e-09 -7.79382e-10 6.45126e-09 -1.72377e-09 7.73091 5.47488 0.417314 -7.79384e-10 6.45126e-09 -1.72377e-09 2.90554 0.965183 0.102902 -7.79379e-10 6.45126e-09 -1.72377e-09 10.2786 0.731801 0.0259123 -7.7939e-10 6.45126e-09 -1.72376e-09 2.22167 -0.733487 -0.20892 1.72924e-13 -1.1422e-12 -5.04786e-13 -0.833778 -25.8293 16.8538 8.76227 -3.4224 -15.4998 2.23062 38.4097 -6.39778 2.35391e-09 -5.6606e-09 -2.32206e-09 3.99253e-09 -9.48417e-09 -4.07038e-09 2.35391e-09 -5.6606e-09 -2.32205e-09 -7.73091 5.47488 -0.417314 2.35391e-09 -5.6606e-09 -2.32206e-09 -2.90554 0.965183 -0.102902 2.35391e-09 -5.6606e-09 -2.32206e-09 -10.2786 0.731801 -0.0259123 2.35392e-09 -5.66059e-09 -2.32207e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.507294 -26.7258 1.62381 -0.0416038 24.2389 0.863701 -21.2008 -25.8791 -37.4581 2.03217e-16 0.0 3.88251e-19 6.68729 -34.0307 2.80914 0.12418 30.3681 -0.880611 16.2579 -32.1254 25.8679
-31.6952 88.1051 82.2436 179.49 -43.2776 -164.459 -2.06315 -17.5203 10.0324 -0.362096 -3.6467 2.52288 -5.0566 6.83882 -3.22093 7.54057 1.95126 -7.20362 -0.0 0.0 0.0 -0.0 0.0 0.0 1.78986e-13 -7.71687e-13 -1.56782e-13 -136.708 -37.258 149.518 -7.42411 -2.72143 13.0461 -163.632 17.0466 177.529 -2.36805e-12 4.59529e-09 -1.34406e-09 -8.5464e-11 7.65351e-09 -2.16168e-09 -2.36605e-12 4.59528e-09 -1.34406e-09 7.73091 5.47488 0.417314 -2.37022e-12 4.59529e-09 -1.34406e-09 2.90554 0.965183 0.102902 -2.3655e-12 4.59528e-09 -1.34406e-09 10.2786 0.731801 0.0259123 -2.37366e-12 4.59529e-09 -1.34405e-09 2.22167 -0.733487 -0.20892 1.79009e-13 -7.71677e-13 -1.57021e-13 -1.08601 -25.6394 16.4283 8.72183 -3.40008 -15.4253 2.20132 38.2048 -6.35064 8.3533e-10 -3.35789e-09 1.08873e-09 1.47366e-09 -5.85765e-09 1.85478e-09 8.35325e-10 -3.35789e-09 1.08875e-09 -7.73091 5.47488 -0.417314 8.35332e-10 -3.35789e-09 1.08873e-09 -2.90554 0.965183 -0.102902 8.35325e-10 -3.35789e-09 1.08873e-09 -10.2786 0.731801 -0.0259123 8.35335e-10 -3.35788e-09 1.08872e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.281995 -26.2615 2.05795 -0.0373574 23.9493 0.861096 -21.2314 -25.4354 -37.897 2.03217e-16 0.0 3.88251e-19 6.80356 -35.0096 1.967 0.12529 30.4631 -0.888614 16.3714 -32.8793 25.6408
-31.9124 88.1366 81.7787 179.845 -43.1575 -164.608 -1.62327 -17.3511 10.5388 -0.357292 -3.66362 2.65497 -5.08349 6.87391 -3.31525 7.56067 1.93491 -7.38193 -0.0 0.0 0.0 -0.0 0.0 0.0 1.58605e-13 -3.33289e-13 1.53328e-13 -138.626 -39.3571 147.366 -7.00873 -2.51487 12.2963 -163.507 19.4888 177.146 7.25588e-10 2.16368e-09 -7.44557e-10 1.06438e-09 3.82794e-09 -1.27923e-09 7.25592e-10 2.16367e-09 -7.44556e-10 7.73091 5.47488 0.417314 7.25586e-10 2.16368e-09 -7.44563e-10 2.90554 0.965183 0.102902 7.2559e-10 2.16367e-09 -7.44559e-10 10.2786 0.731801 0.0259123 7.25586e-10 2.16368e-09 -7.44552e-10 2.22167 -0.733487 -0.20892 1.58604e-13 -3.33273e-13 1.53077e-13 -1.31337 -25.3613 16.0186 8.68462 -3.37957 -15.3568 2.16812 37.969 -6.29682 -6.14447e-10 -8.17184e-10 3.90436e-09 -9.44372e-10 -1.76903e-09 6.7517e-09 -6.14454e-10 -8.17182e-10 3.90438e-09 -7.73091 5.47488 -0.417314 -6.14445e-10 -8.17183e-10 3.90436e-09 -2.90554 0.965183 -0.102902 -6.14452e-10 -8.17183e-10 3.90436e-09 -10.2786 0.731801 -0.0259123 -6.1444e-10 -8.17179e-10 3.90435e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.05966 -25.7731 2.51826 -0.0324704 23.6281 0.85934 -21.2793 -25.127 -38.2548 2.03217e-16 0.0 3.88251e-19 6.87144 -35.9463 1.06381 0.126293 30.5449 -0.89539 16.4643 -33.512 25.4554
-32.0632 88.1588 81.0875 180.34 -43.2906 -165.323 -1.1534 -17.1444 11.0318 -0.367192 -3.6515 2.78379 -5.27063 6.84239 -3.422 7.82491 1.99448 -7.56692 -0.0 0.0 0.0 -0.0 0.0 0.0 1.20079e-13 -6.76761e-15 2.95891e-13 -140.991 -41.3353 144.884 -6.61709 -2.32594 11.593 -163.363 22.0725 176.733 1.04157e-09 -2.20384e-10 -7.48066e-11 1.59638e-09 -2.25597e-11 -2.33281e-10 1.04158e-09 -2.20397e-10 -7.48035e-11 7.73091 5.47488 0.417314 1.04157e-09 -2.20383e-10 -7.4813e-11 2.90554 0.965183 0.102902 1.04157e-09 -2.20395e-10 -7.4809e-11 10.2786 0.731801 0.0259123 1.04157e-09 -2.20381e-10 -7.48035e-11 2.22167 -0.733487 -0.20892 1.2006e-13 -6.74955e-15 2.95642e-13 -1.47651 -25.2622 15.6922 8.65845 -3.36514 -15.3087 2.14895 37.8309 -6.26553 -1.28542e-09 8.12419e-10 4.6389e-09 -2.08118e-09 9.56393e-10 8.03714e-09 -1.28543e-09 8.12419e-10 4.63893e-09 -7.73091 5.47488 -0.417314 -1.28542e-09 8.12419e-10 4.6389e-09 -2.90554 0.965183 -0.102902 -1.28543e-09 8.12418e-10 4.6389e-09 -10.2786 0.731801 -0.0259123 -1.28541e-09 8.12422e-10 4.63889e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.73909 -25.2766 2.72862 -0.0278952 23.3049 0.852004 -21.0982 -24.6221 -38.4642 2.03217e-16 0.0 3.88251e-19 6.9308 -36.8279 0.206571 0.127558 30.629 -0.90104 16.4671 -34.1826 25.1304
-32.2171 88.1797 80.5192 180.823 -43.2069 -165.832 -0.64631 -16.8876 11.4925 -0.38288 -3.58331 2.90546 -5.7374 6.68564 -3.5546 8.49867 2.19844 -7.77117 -0.0 0.0 0.0 -0.0 0.0 0.0 3.60402e-14 2.08051e-13 1.46524e-13 -143.926 -43.1735 141.998 -6.24599 -2.15519 10.9259 -163.188 24.8386 176.275 6.35163e-10 -3.23323e-09 9.38476e-10 1.06075e-09 -5.08019e-09 1.45758e-09 6.35167e-10 -3.23324e-09 9.38479e-10 7.73091 5.47488 0.417314 6.35162e-10 -3.23323e-09 9.38472e-10 2.90554 0.965183 0.102902 6.35166e-10 -3.23324e-09 9.38475e-10 10.2786 0.731801 0.0259123 6.35162e-10 -3.23322e-09 9.3848e-10 2.22167 -0.733487 -0.20892 3.60115e-14 2.08067e-13 1.46308e-13 -1.58703 -25.432 15.4605 8.64648 -3.35853 -15.2867 2.15071 37.8434 -6.26837 -6.46202e-10 1.21834e-09 1.53026e-09 -1.07312e-09 1.95291e-09 2.65674e-09 -6.46209e-10 1.21834e-09 1.53028e-09 -7.73091 5.47488 -0.417314 -6.462e-10 1.21834e-09 1.53026e-09 -2.90554 0.965183 -0.102902 -6.46206e-10 1.21833e-09 1.53026e-09 -10.2786 0.731801 -0.0259123 -6.46194e-10 1.21834e-09 1.53025e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.29345 -24.7542 2.57394 -0.0237697 22.9692 0.836388 -20.5981 -23.8245 -38.4868 2.03217e-16 0.0 3.88251e-19 6.98031 -37.6488 -0.601167 0.129059 30.7279 -0.907469 16.4151 -34.9065 24.7147
-32.3475 88.2211 80.008 181.067 -42.9333 -166.216 -0.118584 -16.5969 11.9344 -0.396519 -3.48517 3.02321 -6.40584 6.44406 -3.70432 9.46967 2.52141 -7.99118 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.8097e-14 3.91004e-13 -1.95592e-13 -147.462 -44.9436 138.709 -5.86969 -1.98799 10.2509 -162.95 27.9068 175.736 -2.28868e-10 -6.92637e-09 2.27066e-09 -1.43763e-10 -1.13639e-08 3.71809e-09 -2.28866e-10 -6.92638e-09 2.27066e-09 7.73091 5.47488 0.417314 -2.28869e-10 -6.92637e-09 2.27066e-09 2.90554 0.965183 0.102902 -2.28864e-10 -6.92638e-09 2.27066e-09 10.2786 0.731801 0.0259123 -2.2887e-10 -6.92637e-09 2.27067e-09 2.22167 -0.733487 -0.20892 -8.81314e-14 3.91014e-13 -1.95753e-13 -1.66138 -25.7231 15.2888 8.64423 -3.35727 -15.2826 2.163 37.9318 -6.28841 8.10524e-10 1.01547e-09 -4.17379e-09 1.26732e-09 2.15366e-09 -7.22327e-09 8.10518e-10 1.01547e-09 -4.17377e-09 -7.73091 5.47488 -0.417314 8.10526e-10 1.01547e-09 -4.17379e-09 -2.90554 0.965183 -0.102902 8.10521e-10 1.01547e-09 -4.17379e-09 -10.2786 0.731801 -0.0259123 8.10531e-10 1.01547e-09 -4.1738e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.78024 -24.2044 2.21964 -0.0197887 22.6114 0.81632 -19.9262 -22.9119 -38.3751 2.03217e-16 0.0 3.88251e-19 7.00782 -38.4166 -1.40605 0.13064 30.8306 -0.913999 16.3251 -35.6073 24.27
-32.4539 88.2949 79.4848 181.492 -42.809 -166.739 0.422852 -16.2901 12.3894 -0.434721 -3.3983 3.14333 -7.06753 6.21936 -3.84741 10.4532 2.82796 -8.20167 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.94815e-13 4.81821e-13 -5.24979e-13 -151.414 -46.5015 135.105 -5.51847 -1.83541 9.62407 -162.652 31.0913 175.139 -1.05066e-09 -9.73946e-09 3.32533e-09 -1.30418e-09 -1.61995e-08 5.52154e-09 -1.05066e-09 -9.73947e-09 3.32533e-09 7.73091 5.47488 0.417314 -1.05066e-09 -9.73946e-09 3.32533e-09 2.90554 0.965183 0.102902 -1.05065e-09 -9.73947e-09 3.32534e-09 10.2786 0.731801 0.0259123 -1.05066e-09 -9.73945e-09 3.32534e-09 2.22167 -0.733487 -0.20892 -1.94855e-13 4.81825e-13 -5.25092e-13 -1.67186 -26.0483 15.1729 8.64804 -3.35936 -15.2896 2.17719 38.0331 -6.31147 2.25865e-09 4.45957e-10 -9.44435e-09 3.6063e-09 1.68163e-09 -1.63553e-08 2.25864e-09 4.45957e-10 -9.44434e-09 -7.73091 5.47488 -0.417314 2.25865e-09 4.45957e-10 -9.44435e-09 -2.90554 0.965183 -0.102902 2.25864e-09 4.45957e-10 -9.44435e-09 -10.2786 0.731801 -0.0259123 2.25865e-09 4.45957e-10 -9.44437e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.24268 -23.669 1.81179 -0.0162584 22.2624 0.795158 -19.1879 -21.9673 -38.1989 2.03217e-16 0.0 3.88251e-19 7.04527 -39.1405 -2.1712 0.132455 30.9169 -0.916836 16.083 -36.3072 23.6271
-32.5727 88.3841 78.9728 182.058 -42.7058 -167.227 0.971015 -15.9845 12.8891 -0.523788 -3.3639 3.27213 -7.51271 6.11318 -3.96015 11.1621 2.98302 -8.37686 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.26599e-13 4.2023e-13 -6.36161e-13 -155.532 -47.7274 131.332 -5.22366 -1.70875 9.10183 -162.312 34.2074 174.518 -1.33035e-09 -1.01121e-08 3.50606e-09 -1.70751e-09 -1.69129e-08 5.8412e-09 -1.33035e-09 -1.01121e-08 3.50606e-09 7.73091 5.47488 0.417314 -1.33035e-09 -1.01121e-08 3.50607e-09 2.90554 0.965183 0.102902 -1.33034e-09 -1.01121e-08 3.50607e-09 10.2786 0.731801 0.0259123 -1.33035e-09 -1.01121e-08 3.50607e-09 2.22167 -0.733487 -0.20892 -2.26645e-13 4.20231e-13 -6.3626e-13 -1.58965 -26.3196 15.1086 8.65428 -3.36279 -15.301 2.18445 38.0847 -6.32324 2.87206e-09 -2.48082e-10 -1.12525e-08 4.61e-09 6.59793e-10 -1.94916e-08 2.87205e-09 -2.48081e-10 -1.12525e-08 -7.73091 5.47488 -0.417314 2.87206e-09 -2.48082e-10 -1.12525e-08 -2.90554 0.965183 -0.102902 2.87205e-09 -2.48081e-10 -1.12525e-08 -10.2786 0.731801 -0.0259123 2.87206e-09 -2.48081e-10 -1.12525e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.71685 -23.1912 1.49345 -0.0133505 21.9531 0.776198 -18.4837 -21.075 -38.0218 2.03217e-16 0.0 3.88251e-19 7.12625 -39.8309 -2.85863 0.134631 30.9663 -0.912172 15.565 -37.0255 22.6102
-32.7444 88.4465 78.4278 182.747 -42.4502 -167.834 1.53529 -15.682 13.4145 -0.677384 -3.40524 3.4024 -7.71139 6.13219 -4.0188 11.5567 2.99822 -8.47886 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.40853e-13 1.11356e-13 -3.81415e-13 -159.647 -48.5503 127.475 -5.00836 -1.61778 8.722 -161.938 37.1733 173.881 -7.30362e-10 -6.38109e-09 2.21466e-09 -8.8714e-10 -1.0716e-08 3.66463e-09 -7.30362e-10 -6.38109e-09 2.21465e-09 7.73091 5.47488 0.417314 -7.30362e-10 -6.38109e-09 2.21467e-09 2.90554 0.965183 0.102902 -7.30356e-10 -6.3811e-09 2.21466e-09 10.2786 0.731801 0.0259123 -7.30366e-10 -6.38108e-09 2.21467e-09 2.22167 -0.733487 -0.20892 -1.40909e-13 1.11357e-13 -3.81556e-13 -1.38947 -26.424 15.1291 8.66828 -3.37048 -15.3268 2.16618 37.9488 -6.2928 2.08185e-09 -1.03065e-09 -7.40304e-09 3.36315e-09 -1.06439e-09 -1.28294e-08 2.08184e-09 -1.03065e-09 -7.40303e-09 -7.73091 5.47488 -0.417314 2.08185e-09 -1.03065e-09 -7.40303e-09 -2.90554 0.965183 -0.102902 2.08184e-09 -1.03065e-09 -7.40304e-09 -10.2786 0.731801 -0.0259123 2.08185e-09 -1.03065e-09 -7.40305e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.22114 -22.7854 1.30868 -0.0106747 21.681 0.76184 -17.8942 -20.3457 -37.8563 2.03217e-16 0.0 3.88251e-19 7.27769 -40.5051 -3.45177 0.13745 30.9676 -0.896687 14.6198 -37.8247 20.9939
-32.8782 88.4868 77.9538 183.22 -42.0524 -168.3 2.11484 -15.3743 13.9578 -0.878709 -3.49624 3.53377 -7.7661 6.22897 -4.04186 11.7764 2.92992 -8.53156 -0.0 0.0 0.0 -0.0 0.0 0.0 2.26595e-14 -3.8639e-13 9.86935e-14 -163.821 -49.031 123.551 -4.85309 -1.55474 8.44683 -161.51 40.0974 173.198 4.14611e-10 2.05749e-10 -8.43967e-11 6.84509e-10 2.73191e-10 -2.14356e-10 4.14611e-10 2.05746e-10 -8.44121e-11 7.73091 5.47488 0.417314 4.1461e-10 2.05746e-10 -8.43928e-11 2.90554 0.965183 0.102902 4.14615e-10 2.05737e-10 -8.43958e-11 10.2786 0.731801 0.0259123 4.14606e-10 2.05751e-10 -8.43886e-11 2.22167 -0.733487 -0.20892 2.25935e-14 -3.86386e-13 9.84761e-14 -1.09138 -26.438 15.2255 8.68988 -3.38236 -15.3665 2.13296 37.6991 -6.23718 4.44813e-10 -2.02135e-09 2.61804e-11 7.63663e-10 -3.49472e-09 3.13856e-11 4.44811e-10 -2.02135e-09 2.61897e-11 -7.73091 5.47488 -0.417314 4.44814e-10 -2.02135e-09 2.61853e-11 -2.90554 0.965183 -0.102902 4.44808e-10 -2.02135e-09 2.61853e-11 -10.2786 0.731801 -0.0259123 4.44816e-10 -2.02135e-09 2.61777e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.73 -22.4281 1.17773 -0.00818562 21.4334 0.749769 -17.3487 -19.703 -37.666 2.03217e-16 0.0 3.88251e-19 7.48389 -41.155 -3.96825 0.14078 30.9336 -0.873188 13.3165 -38.6527 18.904
-32.9734 88.5665 77.5481 183.573 -41.6043 -168.625 2.68667 -15.063 14.5669 -1.10825 -3.60398 3.68282 -7.66501 6.424 -4.06912 11.8011 2.71045 -8.60176 -0.0 0.0 0.0 -0.0 0.0 0.0 1.97926e-13 -9.03343e-13 5.77214e-13 -168.129 -49.2744 119.619 -4.72521 -1.50463 8.21921 -161.008 43.0802 172.44 1.59605e-09 6.84188e-09 -2.39354e-09 2.31186e-09 1.13703e-08 -4.11314e-09 1.59605e-09 6.84188e-09 -2.39356e-09 7.73091 5.47488 0.417314 1.59605e-09 6.84188e-09 -2.39354e-09 2.90554 0.965183 0.102902 1.59605e-09 6.84187e-09 -2.39354e-09 10.2786 0.731801 0.0259123 1.59605e-09 6.84188e-09 -2.39353e-09 2.22167 -0.733487 -0.20892 1.97848e-13 -9.03336e-13 5.76916e-13 -0.734059 -26.5581 15.3303 8.70718 -3.39187 -15.3983 2.11836 37.5904 -6.21291 -1.1766e-09 -3.21148e-09 7.65421e-09 -1.80255e-09 -6.28516e-09 1.32342e-08 -1.1766e-09 -3.21148e-09 7.65422e-09 -7.73091 5.47488 -0.417314 -1.1766e-09 -3.21148e-09 7.65421e-09 -2.90554 0.965183 -0.102902 -1.17661e-09 -3.21148e-09 7.65422e-09 -10.2786 0.731801 -0.0259123 -1.1766e-09 -3.21148e-09 7.65421e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.21006 -22.1065 1.05659 -0.00652715 21.2253 0.736186 -16.7189 -18.9532 -37.4433 2.03217e-16 0.0 3.88251e-19 7.71591 -41.7532 -4.42025 0.144126 30.88 -0.847056 11.8848 -39.3624 16.7055
-33.0194 88.6559 77.1675 183.835 -41.1288 -168.958 3.22689 -14.7493 15.2898 -1.34669 -3.69558 3.8661 -7.39579 6.73773 -4.14045 11.6089 2.27228 -8.75646 -0.0 0.0 0.0 -0.0 0.0 0.0 3.18932e-13 -1.26984e-12 8.27193e-13 -172.681 -49.3845 115.697 -4.59148 -1.45229 7.98205 -160.396 46.2212 171.566 2.30544e-09 1.07208e-08 -3.7152e-09 3.29932e-09 1.78907e-08 -6.3491e-09 2.30545e-09 1.07208e-08 -3.71522e-09 7.73091 5.47488 0.417314 2.30544e-09 1.07208e-08 -3.7152e-09 2.90554 0.965183 0.102902 2.30544e-09 1.07208e-08 -3.7152e-09 10.2786 0.731801 0.0259123 2.30544e-09 1.07208e-08 -3.71519e-09 2.22167 -0.733487 -0.20892 3.1884e-13 -1.26983e-12 8.26845e-13 -0.355457 -26.981 15.3771 8.70833 -3.39251 -15.4004 2.1554 37.8773 -6.27604 -1.91995e-09 -4.59231e-09 1.21001e-08 -2.94959e-09 -9.08964e-09 2.09225e-08 -1.91995e-09 -4.5923e-09 1.21001e-08 -7.73091 5.47488 -0.417314 -1.91995e-09 -4.5923e-09 1.21001e-08 -2.90554 0.965183 -0.102902 -1.91996e-09 -4.5923e-09 1.21001e-08 -10.2786 0.731801 -0.0259123 -1.91995e-09 -4.5923e-09 1.21001e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.62922 -21.8077 0.901755 -0.00638399 21.0719 0.717303 -15.8805 -17.9019 -37.1897 2.03217e-16 0.0 3.88251e-19 7.94489 -42.2722 -4.81971 0.146954 30.8227 -0.823648 10.5977 -39.8291 14.7945
-33.0762 88.7029 76.7645 184.229 -40.4996 -169.386 3.72199 -14.4484 16.2739 -1.63917 -3.76808 4.12415 -6.73247 7.34311 -4.3217 11.0039 1.38131 -9.14276 -0.0 0.0 0.0 -0.0 0.0 0.0 3.69374e-13 -1.44645e-12 7.41917e-13 -177.334 -49.3954 112.003 -4.46249 -1.401 7.75496 -159.621 49.5465 170.519 2.36059e-09 1.09791e-08 -3.72431e-09 3.40212e-09 1.8409e-08 -6.37999e-09 2.3606e-09 1.09791e-08 -3.72433e-09 7.73091 5.47488 0.417314 2.36059e-09 1.09791e-08 -3.72431e-09 2.90554 0.965183 0.102902 2.36059e-09 1.09791e-08 -3.72431e-09 10.2786 0.731801 0.0259123 2.36059e-09 1.09791e-08 -3.7243e-09 2.22167 -0.733487 -0.20892 3.69259e-13 -1.44644e-12 7.41561e-13 0.0266247 -27.8446 15.1616 8.68468 -3.37952 -15.3568 2.27622 38.7588 -6.47547 -1.36103e-09 -6.50888e-09 1.20204e-08 -1.98446e-09 -1.23775e-08 2.0766e-08 -1.36103e-09 -6.50888e-09 1.20204e-08 -7.73091 5.47488 -0.417314 -1.36103e-09 -6.50888e-09 1.20204e-08 -2.90554 0.965183 -0.102902 -1.36104e-09 -6.50887e-09 1.20204e-08 -10.2786 0.731801 -0.0259123 -1.36103e-09 -6.50887e-09 1.20204e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.977 -21.5299 0.702307 -0.00795936 20.9817 0.691517 -14.7915 -16.4421 -36.9617 2.03217e-16 0.0 3.88251e-19 8.18127 -42.7013 -5.1211 0.149288 30.7603 -0.802383 9.47767 -40.0016 13.1898
-33.1479 88.7407 76.3036 184.759 -39.832 -169.893 4.1836 -14.1522 17.4479 -1.97897 -3.83698 4.43612 -5.75025 8.17289 -4.57464 10.0433 0.148407 -9.6848 -0.0 0.0 0.0 -0.0 0.0 0.0 3.84027e-13 -1.52171e-12 4.57826e-13 177.965 -49.282 108.493 -4.34973 -1.35645 7.55676 -158.634 52.9964 169.253 2.04824e-09 9.15191e-09 -2.97259e-09 3.01099e-09 1.54825e-08 -5.13438e-09 2.04825e-09 9.15191e-09 -2.97261e-09 7.73091 5.47488 0.417314 2.04824e-09 9.15191e-09 -2.97259e-09 2.90554 0.965183 0.102902 2.04824e-09 9.1519e-09 -2.97259e-09 10.2786 0.731801 0.0259123 2.04824e-09 9.15191e-09 -2.97258e-09 2.22167 -0.733487 -0.20892 3.83882e-13 -1.52171e-12 4.57484e-13 0.421076 -29.0177 14.7796 8.64435 -3.35736 -15.2824 2.46896 40.0542 -6.78107 -2.45505e-11 -8.85006e-09 9.36537e-09 2.4586e-10 -1.61461e-08 1.61444e-08 -2.45525e-11 -8.85005e-09 9.36538e-09 -7.73091 5.47488 -0.417314 -2.45497e-11 -8.85005e-09 9.36537e-09 -2.90554 0.965183 -0.102902 -2.4559e-11 -8.85005e-09 9.36537e-09 -10.2786 0.731801 -0.0259123 -2.45502e-11 -8.85005e-09 9.36537e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.27128 -21.2793 0.481229 -0.0108205 20.9451 0.661015 -13.5271 -14.6966 -36.7653 2.03217e-16 0.0 3.88251e-19 8.44256 -43.0579 -5.32875 0.151383 30.6863 -0.781088 8.43987 -39.9591 11.738
-33.1767 88.7721 75.8893 184.935 -39.0849 -170.147 4.62667 -13.8303 18.5313 -2.26955 -3.89721 4.72642 -4.89546 8.88782 -4.78132 9.10649 -0.979719 -10.1127 -0.0 0.0 0.0 -0.0 0.0 0.0 3.73491e-13 -1.51795e-12 1.12695e-13 172.941 -48.9908 104.793 -4.22064 -1.30699 7.3292 -157.376 56.5395 167.716 1.56326e-09 6.03061e-09 -1.77765e-09 2.38365e-09 1.04002e-08 -3.1359e-09 1.56327e-09 6.03061e-09 -1.77766e-09 7.73091 5.47488 0.417314 1.56326e-09 6.03061e-09 -1.77764e-09 2.90554 0.965183 0.102902 1.56326e-09 6.0306e-09 -1.77765e-09 10.2786 0.731801 0.0259123 1.56325e-09 6.03061e-09 -1.77764e-09 2.22167 -0.733487 -0.20892 3.73322e-13 -1.51795e-12 1.12378e-13 0.853695 -30.2912 14.6249 8.60064 -3.33336 -15.202 2.69624 41.4492 -7.12695 1.52856e-09 -1.09228e-08 5.6954e-09 2.81742e-09 -1.93414e-08 9.7659e-09 1.52856e-09 -1.09228e-08 5.69541e-09 -7.73091 5.47488 -0.417314 1.52856e-09 -1.09228e-08 5.6954e-09 -2.90554 0.965183 -0.102902 1.52855e-09 -1.09228e-08 5.6954e-09 -10.2786 0.731801 -0.0259123 1.52856e-09 -1.09228e-08 5.69539e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.52324 -21.0549 0.246169 -0.0146998 20.9504 0.627699 -12.1455 -12.8102 -36.5295 2.03217e-16 0.0 3.88251e-19 8.70724 -43.3555 -5.53144 0.152988 30.6085 -0.762696 7.60815 -39.7978 10.588
-33.2161 88.7936 75.5262 185.161 -38.2472 -170.43 5.06906 -13.4566 19.245 -2.41478 -3.9438 4.91942 -4.62441 9.14967 -4.82108 8.60507 -1.56192 -10.1508 -0.0 0.0 0.0 -0.0 0.0 0.0 3.4837e-13 -1.45749e-12 -1.55698e-13 167.36 -48.3846 100.594 -4.04225 -1.24089 7.01404 -155.766 60.1429 165.828 1.10052e-09 2.40663e-09 -4.57084e-10 1.77782e-09 4.45169e-09 -9.08155e-10 1.10053e-09 2.40663e-09 -4.57097e-10 7.73091 5.47488 0.417314 1.10052e-09 2.40663e-09 -4.57078e-10 2.90554 0.965183 0.102902 1.10052e-09 2.40663e-09 -4.57085e-10 10.2786 0.731801 0.0259123 1.10052e-09 2.40664e-09 -4.57074e-10 2.22167 -0.733487 -0.20892 3.48194e-13 -1.45749e-12 -1.55996e-13 1.39263 -31.4493 15.1083 8.56692 -3.31487 -15.1401 2.90394 42.631 -7.43343 2.73739e-09 -1.20342e-08 2.57066e-09 4.80625e-09 -2.09094e-08 4.33847e-09 2.73738e-09 -1.20342e-08 2.57067e-09 -7.73091 5.47488 -0.417314 2.73739e-09 -1.20342e-08 2.57066e-09 -2.90554 0.965183 -0.102902 2.73738e-09 -1.20342e-08 2.57066e-09 -10.2786 0.731801 -0.0259123 2.73739e-09 -1.20342e-08 2.57065e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.7439 -20.8561 0.00471797 -0.0193409 20.986 0.593472 -10.7132 -10.9193 -36.1726 2.03217e-16 0.0 3.88251e-19 8.95062 -43.6067 -5.82014 0.153817 30.5347 -0.750125 7.0896 -39.6193 9.87781
-33.2256 88.8131 75.1325 185.343 -37.4387 -170.758 5.55453 -12.9739 19.26 -2.2889 -3.97448 4.926 -5.39177 8.6352 -4.55483 8.8397 -1.2396 -9.46592 -0.0 0.0 0.0 -0.0 0.0 0.0 2.98268e-13 -1.31139e-12 -3.437e-13 160.765 -47.1778 95.4752 -3.76262 -1.14017 6.52034 -153.61 63.8479 163.386 5.99933e-10 -2.86536e-09 1.36376e-09 1.1126e-09 -4.2704e-09 2.19346e-09 5.99938e-10 -2.86536e-09 1.36375e-09 7.73091 5.47488 0.417314 5.99931e-10 -2.86536e-09 1.36377e-09 2.90554 0.965183 0.102902 5.99935e-10 -2.86536e-09 1.36376e-09 10.2786 0.731801 0.0259123 5.99926e-10 -2.86536e-09 1.36377e-09 2.22167 -0.733487 -0.20892 2.98107e-13 -1.31139e-12 -3.43989e-13 2.20755 -32.5762 16.8176 8.54613 -3.30349 -15.1019 3.09337 43.6651 -7.70952 3.60036e-09 -1.17863e-08 -1.36494e-10 6.20116e-09 -2.01227e-08 -3.58118e-10 3.60036e-09 -1.17863e-08 -1.36485e-10 -7.73091 5.47488 -0.417314 3.60036e-09 -1.17863e-08 -1.36491e-10 -2.90554 0.965183 -0.102902 3.60035e-09 -1.17863e-08 -1.36495e-10 -10.2786 0.731801 -0.0259123 3.60037e-09 -1.17863e-08 -1.36504e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.93161 -20.6854 -0.26379 -0.0248752 21.0582 0.5572 -9.19749 -8.96508 -35.6516 2.03217e-16 0.0 3.88251e-19 9.17654 -43.8177 -6.18835 0.153549 30.4716 -0.746012 7.0149 -39.3819 9.80873
-33.2118 88.8279 74.7071 185.481 -36.499 -170.962 6.07565 -12.4109 18.8146 -1.97705 -3.99228 4.80943 -6.83252 7.6013 -4.08489 9.50704 -0.324711 -8.29193 -0.0 0.0 0.0 -0.0 0.0 0.0 2.21937e-13 -1.07939e-12 -5.13762e-13 153.725 -45.2898 90.1366 -3.41197 -1.01575 5.90433 -150.585 67.6229 160.066 -5.08685e-12 -9.75533e-09 3.70117e-09 3.00424e-10 -1.57033e-08 6.18678e-09 -5.08279e-12 -9.75531e-09 3.70115e-09 7.73091 5.47488 0.417314 -5.08907e-12 -9.75532e-09 3.70117e-09 2.90554 0.965183 0.102902 -5.08479e-12 -9.75532e-09 3.70117e-09 10.2786 0.731801 0.0259123 -5.09495e-12 -9.75533e-09 3.70118e-09 2.22167 -0.733487 -0.20892 2.21809e-13 -1.07939e-12 -5.14045e-13 3.31698 -33.6764 19.427 8.53137 -3.29545 -15.0748 3.286 44.669 -7.98616 4.36732e-09 -1.06198e-08 -3.07694e-09 7.41652e-09 -1.76921e-08 -5.45404e-09 4.36731e-09 -1.06198e-08 -3.07693e-09 -7.73091 5.47488 -0.417314 4.36732e-09 -1.06198e-08 -3.07694e-09 -2.90554 0.965183 -0.102902 4.36731e-09 -1.06198e-08 -3.07694e-09 -10.2786 0.731801 -0.0259123 4.36732e-09 -1.06198e-08 -3.07695e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.08172 -20.542 -0.555972 -0.0312273 21.17 0.518362 -7.60522 -6.88746 -35.0311 2.03217e-16 0.0 3.88251e-19 9.39524 -43.9802 -6.5973 0.152373 30.4135 -0.748156 7.28343 -39.064 10.2473
-33.223 88.8298 74.3167 185.784 -35.4655 -171.198 6.56178 -11.8775 18.4781 -1.69943 -4.00032 4.72273 -8.19072 6.58193 -3.64821 10.1541 0.609651 -7.19795 -0.0 0.0 0.0 -0.0 0.0 0.0 1.43703e-13 -8.26764e-13 -6.27269e-13 147.351 -43.1033 85.6914 -3.08194 -0.899537 5.32854 -146.273 71.3152 155.463 -5.29388e-10 -1.57088e-08 5.69993e-09 -4.1104e-10 -2.56029e-08 9.60807e-09 -5.29385e-10 -1.57088e-08 5.69991e-09 7.73091 5.47488 0.417314 -5.2939e-10 -1.57088e-08 5.69993e-09 2.90554 0.965183 0.102902 -5.29385e-10 -1.57088e-08 5.69992e-09 10.2786 0.731801 0.0259123 -5.29396e-10 -1.57088e-08 5.69994e-09 2.22167 -0.733487 -0.20892 1.43614e-13 -8.26768e-13 -6.2754e-13 4.471 -34.4681 21.923 8.52133 -3.29 -15.0563 3.43481 45.4094 -8.19663 4.85438e-09 -9.09939e-09 -5.47532e-09 8.16675e-09 -1.47213e-08 -9.60604e-09 4.85437e-09 -9.0994e-09 -5.47531e-09 -7.73091 5.47488 -0.417314 4.85438e-09 -9.0994e-09 -5.47532e-09 -2.90554 0.965183 -0.102902 4.85437e-09 -9.0994e-09 -5.47532e-09 -10.2786 0.731801 -0.0259123 4.85438e-09 -9.0994e-09 -5.47533e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.2002 -20.4208 -0.828309 -0.0378939 21.3052 0.479815 -6.0601 -4.81946 -34.3692 2.03217e-16 0.0 3.88251e-19 9.58978 -44.0837 -7.09083 0.150765 30.3497 -0.752225 7.65272 -38.7956 10.8273
-33.2555 88.8221 73.9981 186.012 -34.2645 -171.286 6.91905 -11.493 18.8134 -1.67613 -4.00172 4.81894 -8.73999 6.11392 -3.47549 10.3989 0.979911 -6.74813 -0.0 0.0 0.0 -0.0 0.0 0.0 8.78936e-14 -6.18815e-13 -6.45603e-13 142.359 -41.2702 82.7049 -2.86666 -0.82378 4.95538 -140.047 74.7532 148.962 -7.8782e-10 -1.81713e-08 6.50484e-09 -7.74122e-10 -2.97249e-08 1.09935e-08 -7.87817e-10 -1.81713e-08 6.50483e-09 7.73091 5.47488 0.417314 -7.87822e-10 -1.81713e-08 6.50484e-09 2.90554 0.965183 0.102902 -7.87816e-10 -1.81713e-08 6.50484e-09 10.2786 0.731801 0.0259123 -7.87829e-10 -1.81713e-08 6.50485e-09 2.22167 -0.733487 -0.20892 8.78379e-14 -6.18819e-13 -6.45851e-13 5.28389 -34.7809 23.2231 8.51472 -3.2864 -15.0442 3.48467 45.6539 -8.26699 4.87768e-09 -7.78997e-09 -6.55626e-09 8.16624e-09 -1.23143e-08 -1.14709e-08 4.87767e-09 -7.78996e-09 -6.55626e-09 -7.73091 5.47488 -0.417314 4.87768e-09 -7.78997e-09 -6.55626e-09 -2.90554 0.965183 -0.102902 4.87767e-09 -7.78997e-09 -6.55626e-09 -10.2786 0.731801 -0.0259123 4.87768e-09 -7.78997e-09 -6.55627e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.29279 -20.3165 -1.03738 -0.0444448 21.4474 0.444441 -4.67203 -2.90324 -33.7078 2.03217e-16 0.0 3.88251e-19 9.74376 -44.1168 -7.71229 0.149224 30.2697 -0.753892 7.89397 -38.7102 11.191
-33.2593 88.8158 73.6709 186.119 -33.0357 -171.366 7.05699 -11.3128 20.2246 -2.10564 -4.08476 5.20588 -8.00666 6.58095 -3.71621 10.0596 0.453982 -7.32864 -0.0 0.0 0.0 -0.0 0.0 0.0 6.37211e-14 -4.54435e-13 -5.13206e-13 138.995 -40.4338 81.1171 -2.81142 -0.803862 4.86037 -130.95 77.756 139.604 -6.73904e-10 -1.53004e-08 5.46571e-09 -6.64745e-10 -2.50339e-08 9.23764e-09 -6.73901e-10 -1.53004e-08 5.4657e-09 7.73091 5.47488 0.417314 -6.73905e-10 -1.53004e-08 5.46571e-09 2.90554 0.965183 0.102902 -6.73897e-10 -1.53004e-08 5.46571e-09 10.2786 0.731801 0.0259123 -6.73911e-10 -1.53004e-08 5.46573e-09 2.22167 -0.733487 -0.20892 6.36983e-14 -4.54441e-13 -5.13408e-13 5.41802 -34.2184 22.4899 8.51898 -3.28869 -15.0521 3.34619 44.9927 -8.07462 4.17826e-09 -6.71021e-09 -5.64877e-09 6.9932e-09 -1.06042e-08 -9.88297e-09 4.17825e-09 -6.71021e-09 -5.64876e-09 -7.73091 5.47488 -0.417314 4.17826e-09 -6.71021e-09 -5.64877e-09 -2.90554 0.965183 -0.102902 4.17825e-09 -6.71021e-09 -5.64877e-09 -10.2786 0.731801 -0.0259123 4.17826e-09 -6.71021e-09 -5.64878e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.34226 -20.2302 -1.15569 -0.0508737 21.5973 0.412769 -3.46534 -1.18025 -33.0602 2.03217e-16 0.0 3.88251e-19 9.80531 -44.0436 -8.5892 0.14774 30.1557 -0.751696 7.89132 -39.0549 11.1201
-33.1863 88.8078 73.3435 186.006 -31.9306 -171.38 7.04695 -11.2525 22.3246 -2.82177 -4.21809 5.77977 -6.46429 7.61593 -4.21914 9.34653 -0.595811 -8.56089 -0.0 0.0 0.0 -0.0 0.0 0.0 5.7303e-14 -3.04975e-13 -2.6576e-13 136.558 -40.3119 80.2615 -2.8607 -0.820521 4.94611 -117.112 80.1929 125.509 -3.0542e-10 -8.84563e-09 3.17936e-09 -2.34343e-10 -1.44279e-08 5.35942e-09 -3.05417e-10 -8.84562e-09 3.17935e-09 7.73091 5.47488 0.417314 -3.0542e-10 -8.84562e-09 3.17937e-09 2.90554 0.965183 0.102902 -3.05411e-10 -8.84563e-09 3.17936e-09 10.2786 0.731801 0.0259123 -3.05426e-10 -8.84563e-09 3.17937e-09 2.22167 -0.733487 -0.20892 5.73157e-14 -3.04983e-13 -2.65899e-13 5.18346 -32.9827 20.5042 8.53222 -3.29585 -15.0764 3.08719 43.6645 -7.70518 2.92416e-09 -5.60287e-09 -3.32111e-09 4.91515e-09 -9.05604e-09 -5.82783e-09 2.92415e-09 -5.60287e-09 -3.3211e-09 -7.73091 5.47488 -0.417314 2.92416e-09 -5.60287e-09 -3.32111e-09 -2.90554 0.965183 -0.102902 2.92415e-09 -5.60287e-09 -3.32111e-09 -10.2786 0.731801 -0.0259123 2.92416e-09 -5.60287e-09 -3.32112e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.35093 -20.1639 -1.21202 -0.057358 21.7621 0.383338 -2.38091 0.426027 -32.3854 2.03217e-16 0.0 3.88251e-19 9.80717 -43.8752 -9.65359 0.146113 30.0184 -0.748057 7.78171 -39.6884 10.8452
-33.1272 88.8034 72.9819 186.185 -30.9699 -171.575 7.02753 -11.2323 24.4877 -3.50291 -4.22609 6.37578 -4.83222 8.63128 -4.7598 8.52308 -1.70152 -9.86069 -0.0 0.0 0.0 -0.0 0.0 0.0 5.83215e-14 -1.94406e-13 -1.51148e-15 134.234 -40.2034 79.6568 -2.95829 -0.854139 5.11563 -96.1454 81.7404 104.285 1.66386e-10 -1.64021e-09 6.61126e-10 3.51485e-10 -2.56339e-09 1.08216e-09 1.6639e-10 -1.64021e-09 6.61118e-10 7.73091 5.47488 0.417314 1.66386e-10 -1.6402e-09 6.61134e-10 2.90554 0.965183 0.102902 1.66398e-10 -1.64021e-09 6.61124e-10 10.2786 0.731801 0.0259123 1.66382e-10 -1.64021e-09 6.61137e-10 2.22167 -0.733487 -0.20892 5.83608e-14 -1.94415e-13 -1.59338e-15 5.02415 -31.9029 18.525 8.53908 -3.29958 -15.089 2.86402 42.4118 -7.37538 1.57201e-09 -4.6188e-09 -6.56847e-10 2.6805e-09 -7.77119e-09 -1.1889e-09 1.572e-09 -4.61879e-09 -6.56832e-10 -7.73091 5.47488 -0.417314 1.57201e-09 -4.61879e-09 -6.56838e-10 -2.90554 0.965183 -0.102902 1.572e-09 -4.61879e-09 -6.56844e-10 -10.2786 0.731801 -0.0259123 1.57201e-09 -4.6188e-09 -6.5685e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.35394 -20.1149 -1.24727 -0.0638142 21.9346 0.356062 -1.39825 1.94621 -31.636 2.03217e-16 0.0 3.88251e-19 9.85583 -43.6759 -10.6589 0.144555 29.8895 -0.744476 7.73406 -40.1655 10.6921
-33.1092 88.7487 72.6392 186.319 -29.8444 -171.644 7.12439 -11.1963 26.0871 -3.83473 -3.9344 6.8286 -3.8632 9.04276 -5.10663 7.92787 -2.40676 -10.6386 -0.0 0.0 0.0 -0.0 0.0 0.0 5.64589e-14 -1.46699e-13 1.81292e-13 131.279 -39.3743 78.9235 -3.04811 -0.885115 5.27197 -69.5099 81.8048 77.3851 5.9027e-10 3.48259e-09 -1.07365e-09 9.27141e-10 5.90342e-09 -1.8709e-09 5.90274e-10 3.48259e-09 -1.07366e-09 7.73091 5.47488 0.417314 5.9027e-10 3.4826e-09 -1.07364e-09 2.90554 0.965183 0.102902 5.90283e-10 3.4826e-09 -1.07365e-09 10.2786 0.731801 0.0259123 5.90267e-10 3.48259e-09 -1.07364e-09 2.22167 -0.733487 -0.20892 5.65043e-14 -1.46708e-13 1.81242e-13 5.15273 -31.9249 17.6732 8.52423 -3.29157 -15.0616 2.79059 41.981 -7.26503 5.78432e-10 -3.90885e-09 1.26048e-09 1.03762e-09 -6.85094e-09 2.15037e-09 5.7843e-10 -3.90885e-09 1.2605e-09 -7.73091 5.47488 -0.417314 5.78433e-10 -3.90885e-09 1.26049e-09 -2.90554 0.965183 -0.102902 5.78426e-10 -3.90885e-09 1.26048e-09 -10.2786 0.731801 -0.0259123 5.78436e-10 -3.90885e-09 1.26048e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.38667 -20.08 -1.30229 -0.0701748 22.1078 0.330864 -0.502382 3.4138 -30.7671 2.03217e-16 0.0 3.88251e-19 10.0483 -43.5176 -11.3656 0.143255 29.8006 -0.742436 7.93296 -40.0404 10.9943
-33.077 88.6714 72.3201 186.521 -28.5545 -171.743 7.39767 -11.1826 26.8152 -3.57351 -3.04302 7.06645 -3.92555 8.47461 -5.16029 7.67663 -2.56318 -10.6096 -0.0 0.0 0.0 -0.0 0.0 0.0 4.85908e-14 -2.0992e-13 2.54126e-13 127.43 -37.3486 78.2048 -3.11579 -0.908162 5.39024 -46.1707 80.1233 53.7654 1.12641e-09 5.99951e-09 -1.71479e-09 1.79731e-09 1.01705e-08 -2.98461e-09 1.12642e-09 5.99951e-09 -1.71479e-09 7.73091 5.47488 0.417314 1.12642e-09 5.99952e-09 -1.71478e-09 2.90554 0.965183 0.102902 1.12643e-09 5.99951e-09 -1.71479e-09 10.2786 0.731801 0.0259123 1.12641e-09 5.99951e-09 -1.71478e-09 2.22167 -0.733487 -0.20892 4.86069e-14 -2.09928e-13 2.54073e-13 5.62553 -33.8817 18.551 8.47006 -3.26234 -14.9617 2.95 42.937 -7.50778 1.09044e-10 -3.75984e-09 2.16826e-09 2.63138e-10 -6.75251e-09 3.73177e-09 1.09043e-10 -3.75984e-09 2.16828e-09 -7.73091 5.47488 -0.417314 1.09045e-10 -3.75984e-09 2.16827e-09 -2.90554 0.965183 -0.102902 1.09039e-10 -3.75984e-09 2.16826e-09 -10.2786 0.731801 -0.0259123 1.09049e-10 -3.75984e-09 2.16826e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.48149 -20.0474 -1.39179 -0.0763907 22.2546 0.306528 0.330135 4.88641 -29.7301 2.03217e-16 0.0 3.88251e-19 10.4327 -43.4256 -11.7295 0.142004 29.7493 -0.742812 8.37697 -39.1684 11.7923
-32.9924 88.585 72.0496 186.757 -27.3803 -171.711 7.7722 -11.2129 27.0539 -2.94441 -1.73021 7.18945 -4.56685 7.31236 -5.05729 7.60075 -2.42627 -10.1289 -0.0 0.0 0.0 -0.0 0.0 0.0 4.03443e-14 -3.57394e-13 2.70164e-13 123.161 -34.6308 77.7631 -3.19096 -0.933743 5.52183 -30.9769 77.2254 38.2743 1.78865e-09 7.34419e-09 -1.81694e-09 2.93404e-09 1.25746e-08 -3.19659e-09 1.78865e-09 7.34419e-09 -1.81694e-09 7.73091 5.47488 0.417314 1.78865e-09 7.3442e-09 -1.81694e-09 2.90554 0.965183 0.102902 1.78866e-09 7.3442e-09 -1.81694e-09 10.2786 0.731801 0.0259123 1.78865e-09 7.3442e-09 -1.81694e-09 2.22167 -0.733487 -0.20892 4.0306e-14 -3.57399e-13 2.70086e-13 6.50161 -37.0379 20.6014 8.38908 -3.21867 -14.8129 3.28769 44.7576 -7.99977 -9.43053e-11 -4.00911e-09 2.63562e-09 -6.77808e-11 -7.27847e-09 4.54513e-09 -9.43073e-11 -4.00912e-09 2.63562e-09 -7.73091 5.47488 -0.417314 -9.43049e-11 -4.00912e-09 2.63562e-09 -2.90554 0.965183 -0.102902 -9.43107e-11 -4.00912e-09 2.63561e-09 -10.2786 0.731801 -0.0259123 -9.42993e-11 -4.00911e-09 2.6356e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.61187 -20.0224 -1.49274 -0.0825564 22.3871 0.28351 1.07056 6.33472 -28.5525 2.03217e-16 0.0 3.88251e-19 10.9457 -43.3648 -11.875 0.140776 29.7222 -0.744646 8.935 -37.793 12.897
-32.9114 88.4622 71.7857 187.067 -26.3367 -171.703 8.16058 -11.2203 27.2102 -2.3361 -0.53914 7.28713 -5.32801 6.116 -4.91381 7.65183 -2.15399 -9.56288 -0.0 0.0 0.0 -0.0 0.0 0.0 3.45289e-14 -5.00976e-13 2.53706e-13 118.859 -31.9281 77.4121 -3.28381 -0.965911 5.68419 -21.7012 73.6884 28.6943 2.20618e-09 7.61875e-09 -1.66203e-09 3.67274e-09 1.31677e-08 -2.96267e-09 2.20619e-09 7.61875e-09 -1.66203e-09 7.73091 5.47488 0.417314 2.20618e-09 7.61876e-09 -1.66203e-09 2.90554 0.965183 0.102902 2.20619e-09 7.61876e-09 -1.66203e-09 10.2786 0.731801 0.0259123 2.20618e-09 7.61876e-09 -1.66202e-09 2.22167 -0.733487 -0.20892 3.44365e-14 -5.00979e-13 2.53592e-13 7.77265 -40.0636 23.0552 8.31126 -3.17673 -14.6702 3.66932 46.5625 -8.52908 -2.1063e-10 -4.13333e-09 2.82656e-09 -2.58889e-10 -7.54813e-09 4.87904e-09 -2.10632e-10 -4.13336e-09 2.82656e-09 -7.73091 5.47488 -0.417314 -2.1063e-10 -4.13336e-09 2.82656e-09 -2.90554 0.965183 -0.102902 -2.10635e-10 -4.13336e-09 2.82655e-09 -10.2786 0.731801 -0.0259123 -2.10623e-10 -4.13334e-09 2.82654e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.72472 -20.0276 -1.5893 -0.088782 22.5572 0.264226 1.66321 7.65681 -27.3023 2.03217e-16 0.0 3.88251e-19 11.5118 -43.3194 -11.8201 0.140027 29.7349 -0.746664 9.57903 -36.0485 14.2884
-32.8249 88.3456 71.5025 187.222 -25.221 -171.741 8.47506 -11.1357 27.6908 -2.13938 -0.0131974 7.44358 -5.76182 5.44662 -4.84091 7.78937 -1.90614 -9.27759 -0.0 0.0 0.0 -0.0 0.0 0.0 3.39541e-14 -5.52522e-13 2.2905e-13 114.899 -29.9169 76.8657 -3.40441 -1.0087 5.89475 -15.8178 69.8406 22.5082 2.00824e-09 6.92529e-09 -1.53196e-09 3.34884e-09 1.20019e-08 -2.73871e-09 2.00824e-09 6.92529e-09 -1.53196e-09 7.73091 5.47488 0.417314 2.00824e-09 6.9253e-09 -1.53196e-09 2.90554 0.965183 0.102902 2.00825e-09 6.9253e-09 -1.53196e-09 10.2786 0.731801 0.0259123 2.00824e-09 6.9253e-09 -1.53196e-09 2.22167 -0.733487 -0.20892 3.38337e-14 -5.52523e-13 2.28901e-13 8.96895 -41.7656 24.7798 8.26689 -3.15282 -14.5891 3.88316 47.4781 -8.81566 -4.18941e-10 -3.60919e-09 2.90511e-09 -6.13945e-10 -6.68078e-09 5.02213e-09 -4.18944e-10 -3.60922e-09 2.90511e-09 -7.73091 5.47488 -0.417314 -4.18941e-10 -3.60922e-09 2.90511e-09 -2.90554 0.965183 -0.102902 -4.18946e-10 -3.60922e-09 2.90511e-09 -10.2786 0.731801 -0.0259123 -4.18934e-10 -3.60919e-09 2.90509e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.76683 -20.0859 -1.66571 -0.0951431 22.8166 0.251078 2.06846 8.74262 -26.0449 2.03217e-16 0.0 3.88251e-19 12.0561 -43.2726 -11.5826 0.140217 29.8029 -0.747597 10.2856 -34.0693 15.951
-32.6992 88.2479 71.2492 187.117 -24.0683 -171.637 8.67626 -10.9107 28.6937 -2.5722 -0.499828 7.69447 -5.71983 5.5792 -4.87938 8.09953 -1.67979 -9.43442 -0.0 0.0 0.0 -0.0 0.0 0.0 4.48625e-14 -4.63551e-13 1.82284e-13 111.421 -28.9003 75.8063 -3.58278 -1.07332 6.20615 -11.8701 65.8332 18.2513 7.4619e-10 4.34637e-09 -1.36389e-09 1.19114e-09 7.43644e-09 -2.39286e-09 7.46192e-10 4.34637e-09 -1.36389e-09 7.73091 5.47488 0.417314 7.46188e-10 4.34638e-09 -1.36389e-09 2.90554 0.965183 0.102902 7.46194e-10 4.34638e-09 -1.36389e-09 10.2786 0.731801 0.0259123 7.46188e-10 4.34638e-09 -1.36388e-09 2.22167 -0.733487 -0.20892 4.47563e-14 -4.63552e-13 1.82098e-13 9.67262 -41.671 25.0688 8.26607 -3.15229 -14.5877 3.81353 47.1676 -8.72022 -8.18888e-10 -1.8516e-09 2.77545e-09 -1.30845e-09 -3.6578e-09 4.81251e-09 -8.1889e-10 -1.85163e-09 2.77544e-09 -7.73091 5.47488 -0.417314 -8.18888e-10 -1.85163e-09 2.77545e-09 -2.90554 0.965183 -0.102902 -8.18892e-10 -1.85163e-09 2.77544e-09 -10.2786 0.731801 -0.0259123 -8.18883e-10 -1.8516e-09 2.77543e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.70532 -20.1954 -1.71944 -0.1019 23.1574 0.244009 2.29602 9.57818 -24.7481 2.03217e-16 0.0 3.88251e-19 12.5499 -43.1916 -11.1616 0.139353 29.8887 -0.75255 11.2026 -32.0741 18.0986
-32.5556 88.1133 71.0018 186.993 -22.8184 -171.552 8.80746 -10.5917 29.9707 -3.37515 -1.63996 7.99144 -5.45049 6.17272 -4.96565 8.57536 -1.40552 -9.81694 -0.0 0.0 0.0 -0.0 0.0 0.0 6.39245e-14 -2.894e-13 1.07247e-13 108.185 -28.4145 74.3535 -3.80371 -1.15413 6.59311 -9.07156 61.696 15.1277 -1.26563e-09 1.42425e-10 -1.05346e-09 -2.24793e-09 -4.89253e-12 -1.76646e-09 -1.26563e-09 1.42424e-10 -1.05346e-09 7.73091 5.47488 0.417314 -1.26563e-09 1.42431e-10 -1.05346e-09 2.90554 0.965183 0.102902 -1.26563e-09 1.4243e-10 -1.05346e-09 10.2786 0.731801 0.0259123 -1.26564e-09 1.42428e-10 -1.05345e-09 2.22167 -0.733487 -0.20892 6.38579e-14 -2.894e-13 1.07018e-13 10.0988 -40.5101 24.5585 8.29206 -3.16615 -14.6354 3.58523 46.1321 -8.40691 -1.29769e-09 7.11823e-10 2.39661e-09 -2.1489e-09 7.89844e-10 4.17588e-09 -1.29769e-09 7.11795e-10 2.39661e-09 -7.73091 5.47488 -0.417314 -1.29769e-09 7.11795e-10 2.39661e-09 -2.90554 0.965183 -0.102902 -1.2977e-09 7.11795e-10 2.39661e-09 -10.2786 0.731801 -0.0259123 -1.29769e-09 7.11824e-10 2.39659e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.57462 -20.3466 -1.75841 -0.10901 23.5592 0.242006 2.3806 10.2025 -23.3849 2.03217e-16 0.0 3.88251e-19 13.0334 -43.092 -10.5511 0.137921 29.998 -0.760401 12.1889 -29.9225 20.6226
-32.4709 87.9366 70.7574 187.282 -21.6059 -171.492 8.90811 -10.2528 31.2597 -4.22964 -2.91803 8.28937 -5.11031 6.86499 -5.05141 9.04211 -1.14472 -10.2237 -0.0 0.0 0.0 -0.0 0.0 0.0 7.95915e-14 -9.76461e-14 3.98621e-14 104.993 -27.9929 72.855 -4.01006 -1.22997 6.95621 -6.98955 57.4302 12.7103 -3.25357e-09 -3.81763e-09 -8.20362e-10 -5.64748e-09 -7.02341e-09 -1.27517e-09 -3.25356e-09 -3.81763e-09 -8.20373e-10 7.73091 5.47488 0.417314 -3.25357e-09 -3.81762e-09 -8.20363e-10 2.90554 0.965183 0.102902 -3.25356e-09 -3.81762e-09 -8.20361e-10 10.2786 0.731801 0.0259123 -3.25357e-09 -3.81763e-09 -8.20351e-10 2.22167 -0.733487 -0.20892 7.95661e-14 -9.76461e-14 3.95919e-14 10.4348 -38.9925 23.8901 8.33502 -3.1892 -14.7142 3.30313 44.7592 -8.01095 -1.71573e-09 3.08538e-09 2.01493e-09 -2.88554e-09 4.91847e-09 3.53217e-09 -1.71573e-09 3.08535e-09 2.01492e-09 -7.73091 5.47488 -0.417314 -1.71573e-09 3.08535e-09 2.01493e-09 -2.90554 0.965183 -0.102902 -1.71573e-09 3.08535e-09 2.01493e-09 -10.2786 0.731801 -0.0259123 -1.71573e-09 3.08538e-09 2.01491e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.42255 -20.5509 -1.78251 -0.116159 24.0554 0.246075 2.33713 10.5795 -22.0294 2.03217e-16 0.0 3.88251e-19 13.5373 -43.0283 -9.7595 0.14006 30.2107 -0.760527 12.7931 -27.2436 23.0507
-32.3078 87.7414 70.5666 187.363 -20.5419 -171.296 9.0274 -9.96786 32.3 -4.83101 -3.82044 8.53753 -4.85959 7.29417 -5.08677 9.32004 -0.958064 -10.4532 -0.0 0.0 0.0 -0.0 0.0 0.0 8.03149e-14 4.41302e-14 1.60519e-14 101.675 -27.2377 71.7464 -4.14573 -1.27987 7.19595 -5.37797 53.0221 10.7575 -4.44395e-09 -5.66487e-09 -8.84293e-10 -7.68663e-09 -1.03204e-08 -1.33464e-09 -4.44394e-09 -5.66487e-09 -8.84306e-10 7.73091 5.47488 0.417314 -4.44395e-09 -5.66486e-09 -8.84293e-10 2.90554 0.965183 0.102902 -4.44394e-09 -5.66486e-09 -8.8429e-10 10.2786 0.731801 0.0259123 -4.44395e-09 -5.66487e-09 -8.8428e-10 2.22167 -0.733487 -0.20892 8.03084e-14 4.41302e-14 1.57537e-14 10.784 -37.8475 23.6259 8.38511 -3.21624 -14.806 3.05012 43.4381 -7.64762 -1.93338e-09 4.27336e-09 1.87673e-09 -3.26863e-09 6.98437e-09 3.30134e-09 -1.93338e-09 4.27334e-09 1.87672e-09 -7.73091 5.47488 -0.417314 -1.93337e-09 4.27334e-09 1.87673e-09 -2.90554 0.965183 -0.102902 -1.93338e-09 4.27334e-09 1.87673e-09 -10.2786 0.731801 -0.0259123 -1.93338e-09 4.27337e-09 1.87672e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.29697 -20.8196 -1.79161 -0.123135 24.6795 0.257275 2.18548 10.6735 -20.7584 2.03217e-16 0.0 3.88251e-19 14.0971 -43.0543 -8.79205 0.149662 30.6066 -0.742199 12.5832 -23.7102 24.9659
-32.1291 87.4663 70.3913 187.325 -19.35 -171.154 9.16324 -9.76412 32.9953 -5.05294 -4.19744 8.71276 -4.74854 7.37459 -5.05057 9.3169 -0.88958 -10.4321 -0.0 0.0 0.0 -0.0 0.0 0.0 5.64706e-14 1.20587e-13 6.80399e-14 98.1695 -26.0219 71.2283 -4.17302 -1.28963 7.24455 -4.06341 48.3413 9.07734 -4.49305e-09 -4.00779e-09 -1.56181e-09 -7.78348e-09 -7.46621e-09 -2.50892e-09 -4.49305e-09 -4.00779e-09 -1.56182e-09 7.73091 5.47488 0.417314 -4.49305e-09 -4.00778e-09 -1.56181e-09 2.90554 0.965183 0.102902 -4.49305e-09 -4.00779e-09 -1.56181e-09 10.2786 0.731801 0.0259123 -4.49306e-09 -4.00779e-09 -1.5618e-09 2.22167 -0.733487 -0.20892 5.64475e-14 1.20587e-13 6.77335e-14 11.0741 -37.2014 23.893 8.44799 -3.25037 -14.9212 2.82245 42.1805 -7.31468 -1.84265e-09 3.4477e-09 2.23974e-09 -3.10415e-09 5.53536e-09 3.92423e-09 -1.84265e-09 3.44768e-09 2.23974e-09 -7.73091 5.47488 -0.417314 -1.84265e-09 3.44768e-09 2.23974e-09 -2.90554 0.965183 -0.102902 -1.84265e-09 3.44768e-09 2.23974e-09 -10.2786 0.731801 -0.0259123 -1.84265e-09 3.44771e-09 2.23973e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.20238 -21.1412 -1.75718 -0.130565 25.4304 0.276865 1.9328 10.4459 -19.5753 2.03217e-16 0.0 3.88251e-19 14.7257 -43.1781 -7.60365 0.167671 31.1765 -0.69017 11.3423 -18.6304 26.6834
-32.0061 87.1416 70.2035 187.508 -18.1659 -171.028 9.29989 -9.60016 33.4943 -5.07951 -4.32816 8.8434 -4.68981 7.29568 -4.97173 9.14149 -0.897333 -10.2742 -0.0 0.0 0.0 -0.0 0.0 0.0 1.63993e-14 1.66874e-13 1.69119e-13 94.5612 -24.6127 71.0639 -4.13 -1.27341 7.1688 -3.0165 43.4508 7.62805 -3.85931e-09 -1.40865e-10 -2.64975e-09 -6.71904e-09 -7.36712e-10 -4.42524e-09 -3.8593e-09 -1.40856e-10 -2.64976e-09 7.73091 5.47488 0.417314 -3.85931e-09 -1.40853e-10 -2.64975e-09 2.90554 0.965183 0.102902 -3.8593e-09 -1.40858e-10 -2.64975e-09 10.2786 0.731801 0.0259123 -3.85931e-09 -1.40859e-10 -2.64974e-09 2.22167 -0.733487 -0.20892 1.63391e-14 1.66873e-13 1.68818e-13 11.2669 -36.689 24.3842 8.52601 -3.29282 -15.0645 2.5919 40.8087 -6.96756 -1.54161e-09 1.32694e-09 2.90858e-09 -2.56779e-09 1.83046e-09 5.06725e-09 -1.54161e-09 1.32692e-09 2.90857e-09 -7.73091 5.47488 -0.417314 -1.54161e-09 1.32693e-09 2.90857e-09 -2.90554 0.965183 -0.102902 -1.54161e-09 1.32692e-09 2.90857e-09 -10.2786 0.731801 -0.0259123 -1.54161e-09 1.32695e-09 2.90856e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.11693 -21.5145 -1.6885 -0.139014 26.2937 0.304284 1.60068 9.91483 -18.4511 2.03217e-16 0.0 3.88251e-19 15.4136 -43.3635 -6.19931 0.190341 31.8878 -0.613479 9.19688 -12.51 28.4935
-31.8281 86.7264 69.986 187.727 -17.2884 -170.895 9.47086 -9.44631 33.9053 -5.07919 -4.34346 8.9521 -4.63916 7.10837 -4.87452 8.9131 -0.912585 -10.059 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.45002e-14 1.91148e-13 2.66818e-13 90.9096 -23.2364 71.0623 -4.0746 -1.25279 7.0711 -2.23591 38.6261 6.42861 -2.97227e-09 3.77589e-09 -3.58822e-09 -5.21683e-09 6.10804e-09 -6.0941e-09 -2.97227e-09 3.7759e-09 -3.58824e-09 7.73091 5.47488 0.417314 -2.97227e-09 3.77591e-09 -3.58823e-09 2.90554 0.965183 0.102902 -2.97227e-09 3.7759e-09 -3.58822e-09 10.2786 0.731801 0.0259123 -2.97227e-09 3.7759e-09 -3.58821e-09 2.22167 -0.733487 -0.20892 -2.45997e-14 1.91147e-13 2.66523e-13 11.4602 -36.316 24.9551 8.60446 -3.3356 -15.209 2.37818 39.4308 -6.63479 -1.19965e-09 -7.64623e-10 3.44989e-09 -1.96428e-09 -1.80713e-09 5.98868e-09 -1.19965e-09 -7.64648e-10 3.44988e-09 -7.73091 5.47488 -0.417314 -1.19966e-09 -7.64628e-10 3.44988e-09 -2.90554 0.965183 -0.102902 -1.19965e-09 -7.64647e-10 3.44988e-09 -10.2786 0.731801 -0.0259123 -1.19965e-09 -7.64617e-10 3.44987e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.04809 -21.9665 -1.6425 -0.148313 27.2825 0.337947 1.22666 9.13412 -17.4145 2.03217e-16 0.0 3.88251e-19 16.1671 -43.6001 -4.65624 0.214666 32.7861 -0.537932 6.5524 -6.70303 29.9245
-31.6107 86.3104 69.7922 187.76 -16.397 -170.818 9.70772 -9.27316 34.3363 -5.21888 -4.37392 9.06189 -4.55267 6.86364 -4.78316 8.75029 -0.866479 -9.86598 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.08292e-14 2.01567e-13 3.08663e-13 87.2835 -22.0978 71.0151 -4.06491 -1.24942 7.05386 -1.68107 34.1465 5.46973 -2.2615e-09 5.58245e-09 -3.81734e-09 -4.00034e-09 9.30803e-09 -6.52598e-09 -2.2615e-09 5.58247e-09 -3.81736e-09 7.73091 5.47488 0.417314 -2.26151e-09 5.58247e-09 -3.81735e-09 2.90554 0.965183 0.102902 -2.2615e-09 5.58246e-09 -3.81734e-09 10.2786 0.731801 0.0259123 -2.26151e-09 5.58246e-09 -3.81733e-09 2.22167 -0.733487 -0.20892 -5.09519e-14 2.01567e-13 3.08365e-13 11.7583 -36.0894 25.4656 8.66884 -3.37081 -15.3278 2.19441 38.1554 -6.33938 -9.86183e-10 -1.50272e-09 3.43031e-09 -1.59837e-09 -3.05426e-09 5.94681e-09 -9.86183e-10 -1.50275e-09 3.43031e-09 -7.73091 5.47488 -0.417314 -9.86192e-10 -1.50272e-09 3.4303e-09 -2.90554 0.965183 -0.102902 -9.86187e-10 -1.50275e-09 3.43031e-09 -10.2786 0.731801 -0.0259123 -9.86183e-10 -1.50272e-09 3.43029e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.00141 -22.5241 -1.67687 -0.1583 28.4101 0.376303 0.840529 8.16049 -16.4927 2.03217e-16 0.0 3.88251e-19 16.9917 -43.8812 -3.05253 0.239174 33.9167 -0.490162 4.16405 -2.34783 30.2821
-31.4499 85.7705 69.6336 188.132 -15.5162 -170.75 10.0889 -9.04208 34.8356 -5.61987 -4.44111 9.18139 -4.4097 6.54308 -4.70638 8.72271 -0.720752 -9.72075 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.64346e-14 2.03787e-13 2.63027e-13 83.3745 -21.1542 70.7463 -4.14389 -1.2795 7.1926 -1.23394 29.8474 4.63342 -1.87997e-09 3.55262e-09 -2.80598e-09 -3.32163e-09 5.88836e-09 -4.79797e-09 -1.87996e-09 3.55263e-09 -2.80599e-09 7.73091 5.47488 0.417314 -1.87997e-09 3.55263e-09 -2.80598e-09 2.90554 0.965183 0.102902 -1.87996e-09 3.55263e-09 -2.80598e-09 10.2786 0.731801 0.0259123 -1.87997e-09 3.55263e-09 -2.80597e-09 2.22167 -0.733487 -0.20892 -5.65595e-14 2.03789e-13 2.62709e-13 12.1652 -35.8886 25.8159 8.72602 -3.40225 -15.4333 2.01119 36.8176 -6.03892 -1.04017e-09 2.64612e-10 2.46488e-09 -1.72085e-09 1.13922e-10 4.28169e-09 -1.04017e-09 2.64596e-10 2.46488e-09 -7.73091 5.47488 -0.417314 -1.04018e-09 2.64614e-10 2.46487e-09 -2.90554 0.965183 -0.102902 -1.04018e-09 2.64596e-10 2.46487e-09 -10.2786 0.731801 -0.0259123 -1.04017e-09 2.64618e-10 2.46486e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.01284 -23.1795 -1.84036 -0.169648 29.7033 0.421721 0.4328 6.94814 -15.681 2.03217e-16 0.0 3.88251e-19 17.9859 -44.1978 -1.26994 0.267693 35.3536 -0.479411 2.4207 0.477377 28.7615
-31.3107 85.099 69.5122 188.444 -14.4971 -170.581 10.573 -8.77996 35.3393 -6.16788 -4.47985 9.29745 -4.23602 6.13011 -4.63075 8.75378 -0.518649 -9.57956 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.02114e-14 1.92296e-13 1.63774e-13 79.2544 -20.3161 70.3873 -4.27111 -1.32796 7.41666 -0.865334 25.6671 3.8727 -1.58576e-09 -7.78196e-10 -9.80013e-10 -2.77513e-09 -1.48822e-09 -1.65749e-09 -1.58575e-09 -7.78198e-10 -9.80025e-10 7.73091 5.47488 0.417314 -1.58576e-09 -7.78191e-10 -9.80018e-10 2.90554 0.965183 0.102902 -1.58575e-09 -7.78194e-10 -9.80014e-10 10.2786 0.731801 0.0259123 -1.58576e-09 -7.78194e-10 -9.80007e-10 2.22167 -0.733487 -0.20892 -5.03272e-14 1.92302e-13 1.63426e-13 12.6382 -35.7502 26.1038 8.78022 -3.43219 -15.5333 1.83251 35.4241 -5.7367 -1.24001e-09 3.56482e-09 8.7451e-10 -2.11267e-09 5.98995e-09 1.54294e-09 -1.24001e-09 3.56482e-09 8.74509e-10 -7.73091 5.47488 -0.417314 -1.24001e-09 3.56483e-09 8.74507e-10 -2.90554 0.965183 -0.102902 -1.24001e-09 3.56482e-09 8.74506e-10 -10.2786 0.731801 -0.0259123 -1.24001e-09 3.56483e-09 8.74498e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.06207 -23.9228 -2.09356 -0.183717 31.1472 0.475031 0.00229838 5.48723 -14.9756 2.03217e-16 0.0 3.88251e-19 19.1308 -44.5438 0.698129 0.301969 37.052 -0.492312 1.22244 2.50439 25.8011
-31.0907 84.3783 69.4168 188.471 -13.555 -170.288 11.0128 -8.55466 35.7867 -6.6756 -4.4905 9.40056 -4.05778 5.67854 -4.54713 8.74228 -0.313508 -9.41758 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.93327e-14 1.58505e-13 5.66684e-14 75.5582 -19.7155 70.1585 -4.38009 -1.3696 7.6091 -0.614385 22.0452 3.25654 -1.21614e-09 -4.67759e-09 7.8493e-10 -2.09787e-09 -8.12524e-09 1.3795e-09 -1.21614e-09 -4.6776e-09 7.84921e-10 7.73091 5.47488 0.417314 -1.21614e-09 -4.6776e-09 7.84926e-10 2.90554 0.965183 0.102902 -1.21614e-09 -4.6776e-09 7.84929e-10 10.2786 0.731801 0.0259123 -1.21615e-09 -4.6776e-09 7.84936e-10 2.22167 -0.733487 -0.20892 -3.94321e-14 1.58513e-13 5.6291e-14 13.2173 -35.9168 26.4895 8.81312 -3.45049 -15.5941 1.70354 34.3423 -5.51009 -1.36423e-09 6.53541e-09 -7.15276e-10 -2.37388e-09 1.12985e-08 -1.19676e-09 -1.36423e-09 6.53541e-09 -7.15277e-10 -7.73091 5.47488 -0.417314 -1.36423e-09 6.53541e-09 -7.15276e-10 -2.90554 0.965183 -0.102902 -1.36423e-09 6.53541e-09 -7.15278e-10 -10.2786 0.731801 -0.0259123 -1.36423e-09 6.53541e-09 -7.15285e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.07032 -24.7783 -2.36203 -0.200973 32.6925 0.53222 -0.422616 3.89239 -14.4005 2.03217e-16 0.0 3.88251e-19 20.2516 -44.9315 2.60229 0.339147 38.8792 -0.522557 0.569256 3.81794 22.4199
-30.8413 83.7234 69.3421 188.588 -12.8011 -170.026 11.2641 -8.43251 36.1169 -6.95571 -4.47342 9.48121 -3.90116 5.24216 -4.44623 8.58726 -0.158707 -9.20984 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.09716e-14 9.38217e-14 -1.25234e-14 72.9115 -19.4946 70.2642 -4.40499 -1.37935 7.65294 -0.486256 19.4237 2.84061 -6.08396e-10 -5.41317e-09 1.61323e-09 -1.02689e-09 -9.32624e-09 2.79703e-09 -6.0839e-10 -5.41318e-09 1.61322e-09 7.73091 5.47488 0.417314 -6.08397e-10 -5.41318e-09 1.61323e-09 2.90554 0.965183 0.102902 -6.0839e-10 -5.41317e-09 1.61323e-09 10.2786 0.731801 0.0259123 -6.08401e-10 -5.41317e-09 1.61324e-09 2.22167 -0.733487 -0.20892 -3.10513e-14 9.3831e-14 -1.2921e-14 13.9554 -36.6256 27.1434 8.80648 -3.44699 -15.5815 1.65737 33.9406 -5.42738 -1.19137e-09 7.31386e-09 -1.67896e-09 -2.1045e-09 1.27644e-08 -2.86475e-09 -1.19137e-09 7.31386e-09 -1.67896e-09 -7.73091 5.47488 -0.417314 -1.19137e-09 7.31386e-09 -1.67896e-09 -2.90554 0.965183 -0.102902 -1.19137e-09 7.31386e-09 -1.67896e-09 -10.2786 0.731801 -0.0259123 -1.19137e-09 7.31386e-09 -1.67897e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.9628 -25.771 -2.56991 -0.221198 34.29 0.588927 -0.822648 2.2802 -13.9758 2.03217e-16 0.0 3.88251e-19 21.1665 -45.3894 4.18898 0.375418 40.7025 -0.563233 0.324092 4.45048 19.6714
-30.617 83.0367 69.3029 188.608 -12.0209 -169.745 11.2511 -8.47066 36.2659 -6.88844 -4.36577 9.53024 -3.74605 4.79668 -4.30947 8.18185 -0.0778795 -8.91586 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.85449e-14 -2.22626e-14 -2.6707e-14 71.3029 -19.6004 70.8625 -4.28651 -1.33475 7.44302 -0.436375 17.5745 2.5699 4.83305e-10 -9.19639e-10 9.30353e-10 8.52776e-10 -1.53749e-09 1.6008e-09 4.83311e-10 -9.19651e-10 9.30346e-10 7.73091 5.47488 0.417314 4.83303e-10 -9.19646e-10 9.3035e-10 2.90554 0.965183 0.102902 4.8331e-10 -9.19643e-10 9.30351e-10 10.2786 0.731801 0.0259123 4.833e-10 -9.19644e-10 9.3036e-10 2.22167 -0.733487 -0.20892 -2.85952e-14 -2.22556e-14 -2.71139e-14 15.0891 -38.2419 28.3718 8.73875 -3.40981 -15.4561 1.73062 34.6073 -5.5626 -4.79645e-10 4.42411e-09 -1.70393e-09 -8.78363e-10 7.81478e-09 -2.92876e-09 -4.79646e-10 4.42411e-09 -1.70393e-09 -7.73091 5.47488 -0.417314 -4.79644e-10 4.42412e-09 -1.70392e-09 -2.90554 0.965183 -0.102902 -4.79646e-10 4.42411e-09 -1.70393e-09 -10.2786 0.731801 -0.0259123 -4.79642e-10 4.42412e-09 -1.70394e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.6971 -26.9555 -2.69403 -0.244826 35.9624 0.644904 -1.21548 0.648212 -13.7631 2.03217e-16 0.0 3.88251e-19 21.7767 -45.9642 5.33468 0.412004 42.5514 -0.619967 0.451073 4.10494 17.7338
-30.3811 82.2933 69.2958 188.471 -11.242 -169.401 11.0655 -8.61962 36.2822 -6.59716 -4.18839 9.55497 -3.58637 4.32617 -4.14729 7.60696 -0.0394945 -8.56016 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.77255e-14 -1.79093e-13 -1.19209e-14 70.465 -19.9564 71.8009 -4.073 -1.25431 7.06639 -0.417171 16.3817 2.40225 1.90469e-09 6.90016e-09 -6.83027e-10 3.28593e-09 1.19691e-08 -1.20399e-09 1.9047e-09 6.90016e-09 -6.83036e-10 7.73091 5.47488 0.417314 1.90469e-09 6.90016e-09 -6.83032e-10 2.90554 0.965183 0.102902 1.9047e-09 6.90016e-09 -6.83031e-10 10.2786 0.731801 0.0259123 1.90469e-09 6.90016e-09 -6.83021e-10 2.22167 -0.733487 -0.20892 -2.77373e-14 -1.79091e-13 -1.23309e-14 16.6487 -40.4958 30.1173 8.62487 -3.3473 -15.246 1.90305 36.0486 -5.86575 5.91927e-10 -8.14027e-10 -1.17239e-09 9.84704e-10 -1.237e-09 -2.04295e-09 5.91926e-10 -8.14039e-10 -1.17238e-09 -7.73091 5.47488 -0.417314 5.91924e-10 -8.14026e-10 -1.17238e-09 -2.90554 0.965183 -0.102902 5.91928e-10 -8.14041e-10 -1.17239e-09 -10.2786 0.731801 -0.0259123 5.91935e-10 -8.14027e-10 -1.17239e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.32268 -28.3028 -2.77589 -0.272592 37.724 0.702979 -1.62717 -1.04822 -13.733 2.03217e-16 0.0 3.88251e-19 22.1932 -46.6449 6.19251 0.454427 44.4751 -0.697086 0.835558 2.79298 16.0808
-30.1106 81.559 69.3034 188.32 -10.6344 -169.004 10.8147 -8.78514 36.2738 -6.25899 -4.06708 9.57057 -3.47066 3.89716 -3.99364 7.04349 -0.0142268 -8.21519 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.40711e-14 -3.38515e-13 1.29008e-14 70.6473 -20.6784 72.8475 -3.861 -1.17456 6.69444 -0.414579 16.4557 2.41152 3.21837e-09 1.48265e-08 -2.36971e-09 5.53031e-09 2.56516e-08 -4.13405e-09 3.21838e-09 1.48265e-08 -2.36972e-09 7.73091 5.47488 0.417314 3.21837e-09 1.48265e-08 -2.36971e-09 2.90554 0.965183 0.102902 3.21838e-09 1.48265e-08 -2.36971e-09 10.2786 0.731801 0.0259123 3.21837e-09 1.48265e-08 -2.3697e-09 2.22167 -0.733487 -0.20892 -2.40488e-14 -3.38517e-13 1.24939e-14 18.2943 -42.7002 31.9332 8.50158 -3.27973 -15.0195 2.11225 37.6107 -6.21192 1.61358e-09 -6.06927e-09 -5.01078e-10 2.76569e-09 -1.03373e-08 -9.14328e-10 1.61357e-09 -6.06929e-09 -5.01073e-10 -7.73091 5.47488 -0.417314 1.61357e-09 -6.06927e-09 -5.01075e-10 -2.90554 0.965183 -0.102902 1.61358e-09 -6.0693e-09 -5.0108e-10 -10.2786 0.731801 -0.0259123 1.61359e-09 -6.06927e-09 -5.0109e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.90636 -29.7127 -2.83481 -0.303863 39.5128 0.762884 -2.04668 -2.75724 -13.7663 2.03217e-16 0.0 3.88251e-19 22.5442 -47.3784 6.92018 0.502361 46.3701 -0.783707 1.26588 1.04866 14.7211
-29.8693 80.7709 69.5102 188.188 -9.4854 -168.08 10.6071 -8.87228 36.3479 -6.051 -4.12765 9.59205 -3.44917 3.5763 -3.88217 6.67181 0.0273253 -7.95341 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.31394e-14 -4.6237e-13 2.88238e-14 72.1041 -21.9223 73.8181 -3.74882 -1.13233 6.49847 -0.434378 18.4059 2.68058 3.98695e-09 1.96396e-08 -3.27248e-09 6.84367e-09 3.3968e-08 -5.70609e-09 3.98696e-09 1.96396e-08 -3.27249e-09 7.73091 5.47488 0.417314 3.98695e-09 1.96396e-08 -3.27249e-09 2.90554 0.965183 0.102902 3.98695e-09 1.96396e-08 -3.27249e-09 10.2786 0.731801 0.0259123 3.98695e-09 1.96396e-08 -3.27248e-09 2.22167 -0.733487 -0.20892 -1.31011e-14 -4.62375e-13 2.84262e-14 19.4838 -44.2358 33.1876 8.40614 -3.22761 -14.8447 2.26409 38.6425 -6.45155 2.17553e-09 -9.01033e-09 -1.06749e-10 3.74559e-09 -1.54325e-08 -2.49892e-10 2.17553e-09 -9.01036e-09 -1.06743e-10 -7.73091 5.47488 -0.417314 2.17552e-09 -9.01034e-09 -1.06746e-10 -2.90554 0.965183 -0.102902 2.17554e-09 -9.01037e-09 -1.06751e-10 -10.2786 0.731801 -0.0259123 2.17555e-09 -9.01034e-09 -1.06762e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.51369 -31.0848 -2.89021 -0.337616 41.2666 0.824034 -2.44899 -4.43041 -13.7421 2.03217e-16 0.0 3.88251e-19 22.963 -48.1065 7.67902 0.55242 48.1329 -0.866677 1.59981 -0.574671 13.6456
-29.5676 80.0651 69.3634 187.976 -9.4004 -168.09 10.4922 -8.8591 36.5485 -6.02281 -4.44742 9.62369 -3.57868 3.41542 -3.83323 6.59576 0.0944701 -7.8139 -0.0 0.0 0.0 -0.0 0.0 0.0 8.28863e-15 -5.45354e-13 3.49263e-14 75.329 -23.9489 74.7595 -3.80307 -1.1523 6.5936 -0.600019 22.9709 3.37849 4.02232e-09 2.04261e-08 -2.98831e-09 6.90599e-09 3.53516e-08 -5.22597e-09 4.02233e-09 2.04261e-08 -2.98832e-09 7.73091 5.47488 0.417314 4.02232e-09 2.04261e-08 -2.98831e-09 2.90554 0.965183 0.102902 4.02233e-09 2.04261e-08 -2.98831e-09 10.2786 0.731801 0.0259123 4.02232e-09 2.04261e-08 -2.9883e-09 2.22167 -0.733487 -0.20892 8.31357e-15 -5.45358e-13 3.45489e-14 19.9333 -45.0052 33.5577 8.35114 -3.19777 -14.744 2.32402 39.0269 -6.54348 2.05232e-09 -8.48472e-09 -1.54109e-10 3.53044e-09 -1.45248e-08 -3.27032e-10 2.05232e-09 -8.48474e-09 -1.54102e-10 -7.73091 5.47488 -0.417314 2.05231e-09 -8.48472e-09 -1.54105e-10 -2.90554 0.965183 -0.102902 2.05232e-09 -8.48475e-09 -1.54111e-10 -10.2786 0.731801 -0.0259123 2.05233e-09 -8.48472e-09 -1.54121e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.1844 -32.3914 -2.94746 -0.373257 42.9705 0.886263 -2.82275 -6.09161 -13.5986 2.03217e-16 0.0 3.88251e-19 23.4628 -48.8298 8.38169 0.601326 49.731 -0.941568 1.86331 -2.00048 12.945
-29.3394 79.2548 69.5019 188.011 -8.2622 -167.372 10.4048 -8.79525 36.8133 -6.07868 -4.94461 9.65799 -3.8195 3.36774 -3.82478 6.70082 0.170998 -7.75142 -0.0 0.0 0.0 -0.0 0.0 0.0 3.71655e-14 -6.06193e-13 3.99309e-14 80.1359 -26.618 76.0163 -3.95791 -1.20988 6.86533 -1.08682 29.618 4.53885 3.5816e-09 1.89214e-08 -2.03251e-09 6.15384e-09 3.27877e-08 -3.5843e-09 3.5816e-09 1.89214e-08 -2.03252e-09 7.73091 5.47488 0.417314 3.58159e-09 1.89214e-08 -2.03251e-09 2.90554 0.965183 0.102902 3.5816e-09 1.89214e-08 -2.03251e-09 10.2786 0.731801 0.0259123 3.58159e-09 1.89214e-08 -2.0325e-09 2.22167 -0.733487 -0.20892 3.71576e-14 -6.06194e-13 3.9583e-14 19.8685 -45.3517 33.3317 8.31607 -3.17891 -14.6796 2.33527 39.0932 -6.55993 1.50122e-09 -5.91271e-09 -4.03036e-10 2.5711e-09 -1.00819e-08 -7.3906e-10 1.50121e-09 -5.91273e-09 -4.03028e-10 -7.73091 5.47488 -0.417314 1.50121e-09 -5.91272e-09 -4.0303e-10 -2.90554 0.965183 -0.102902 1.50122e-09 -5.91274e-09 -4.03037e-10 -10.2786 0.731801 -0.0259123 1.50123e-09 -5.91272e-09 -4.03045e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.87759 -33.6864 -2.99549 -0.41159 44.657 0.950245 -3.17633 -7.75602 -13.4087 2.03217e-16 0.0 3.88251e-19 23.9735 -49.5773 8.98196 0.650363 51.2213 -1.01484 2.15011 -3.48808 12.5925
-29.0885 78.4788 69.6469 188.074 -7.4183 -166.664 10.2816 -8.69299 37.089 -6.17773 -5.50644 9.69207 -4.07754 3.35206 -3.82697 6.83945 0.248093 -7.712 -0.0 0.0 0.0 -0.0 0.0 0.0 6.85344e-14 -6.42781e-13 3.93695e-14 85.762 -29.4768 77.8114 -4.11419 -1.26822 7.14045 -1.97416 37.0477 6.07172 2.89515e-09 1.58791e-08 -9.2545e-10 4.97982e-09 2.75625e-08 -1.67495e-09 2.89516e-09 1.58791e-08 -9.25457e-10 7.73091 5.47488 0.417314 2.89515e-09 1.58791e-08 -9.25451e-10 2.90554 0.965183 0.102902 2.89516e-09 1.58791e-08 -9.25449e-10 10.2786 0.731801 0.0259123 2.89515e-09 1.58791e-08 -9.2544e-10 2.22167 -0.733487 -0.20892 6.84918e-14 -6.42778e-13 3.90511e-14 19.4086 -45.3505 32.6951 8.28888 -3.16444 -14.6295 2.29978 38.8615 -6.50484 8.36591e-10 -2.82222e-09 -6.63021e-10 1.41586e-09 -4.74774e-09 -1.16687e-09 8.36586e-10 -2.82223e-09 -6.63012e-10 -7.73091 5.47488 -0.417314 8.36588e-10 -2.82223e-09 -6.63014e-10 -2.90554 0.965183 -0.102902 8.36585e-10 -2.82223e-09 -6.63021e-10 -10.2786 0.731801 -0.0259123 8.36593e-10 -2.82223e-09 -6.63028e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.53692 -34.9921 -3.02923 -0.453435 46.3355 1.01644 -3.5111 -9.36296 -13.2529 2.03217e-16 0.0 3.88251e-19 24.5231 -50.3246 9.71581 0.700779 52.6343 -1.08793 2.44224 -4.98338 12.3896
-28.7868 77.7362 69.751 187.864 -6.6908 -166.144 10.0596 -8.56458 37.3228 -6.27945 -6.02017 9.72241 -4.25852 3.28714 -3.80998 6.86386 0.316973 -7.64164 -0.0 0.0 0.0 -0.0 0.0 0.0 9.74382e-14 -6.5301e-13 2.87741e-14 91.3985 -32.0264 80.1835 -4.17392 -1.29068 7.24575 -3.15087 43.9754 7.79344 2.19339e-09 1.20527e-08 -1.87487e-10 3.77656e-09 2.0962e-08 -3.91754e-10 2.1934e-09 1.20527e-08 -1.87494e-10 7.73091 5.47488 0.417314 2.19339e-09 1.20527e-08 -1.87487e-10 2.90554 0.965183 0.102902 2.1934e-09 1.20527e-08 -1.87485e-10 10.2786 0.731801 0.0259123 2.19338e-09 1.20527e-08 -1.87478e-10 2.22167 -0.733487 -0.20892 9.73771e-14 -6.53006e-13 2.84759e-14 18.6941 -45.0719 31.8541 8.25749 -3.14773 -14.5718 2.22229 38.3517 -6.38441 3.72805e-10 -7.41133e-10 -7.43556e-10 6.12997e-10 -1.16666e-09 -1.29136e-09 3.728e-10 -7.41135e-10 -7.43547e-10 -7.73091 5.47488 -0.417314 3.72805e-10 -7.41137e-10 -7.4355e-10 -2.90554 0.965183 -0.102902 3.72797e-10 -7.41137e-10 -7.43556e-10 -10.2786 0.731801 -0.0259123 3.72805e-10 -7.41135e-10 -7.43563e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.10652 -36.3307 -3.04338 -0.49974 48.0151 1.08541 -3.83812 -10.8496 -13.2112 2.03217e-16 0.0 3.88251e-19 25.157 -51.04 10.8322 0.754341 54.0005 -1.16273 2.70248 -6.43655 12.1363
-28.4855 76.9812 69.8332 187.626 -5.7396 -165.734 9.69331 -8.41169 37.5715 -6.40933 -6.51368 9.74254 -4.36137 3.14406 -3.78307 6.79869 0.46172 -7.56296 -0.0 0.0 0.0 -0.0 0.0 0.0 1.2781e-13 -6.27878e-13 3.59948e-15 96.924 -34.1241 83.069 -4.06606 -1.25076 7.05519 -4.54381 50.1108 9.67899 1.40521e-09 6.18163e-09 8.60752e-12 2.41907e-09 1.07694e-08 -2.51344e-11 1.40521e-09 6.18163e-09 8.59895e-12 7.73091 5.47488 0.417314 1.4052e-09 6.18163e-09 8.60509e-12 2.90554 0.965183 0.102902 1.40521e-09 6.18163e-09 8.60802e-12 10.2786 0.731801 0.0259123 1.4052e-09 6.18164e-09 8.61431e-12 2.22167 -0.733487 -0.20892 1.27758e-13 -6.27875e-13 3.30712e-15 17.6307 -44.2233 30.7061 8.22033 -3.12793 -14.5037 2.06778 37.2861 -6.13903 2.32416e-10 -2.31733e-10 -3.86458e-10 3.81799e-10 -3.2734e-10 -6.70788e-10 2.32411e-10 -2.31739e-10 -3.86445e-10 -7.73091 5.47488 -0.417314 2.32417e-10 -2.31742e-10 -3.86453e-10 -2.90554 0.965183 -0.102902 2.3241e-10 -2.3174e-10 -3.86458e-10 -10.2786 0.731801 -0.0259123 2.32416e-10 -2.31735e-10 -3.86464e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.54492 -37.7257 -3.06332 -0.550751 49.6964 1.15741 -4.18621 -12.2074 -13.355 2.03217e-16 0.0 3.88251e-19 25.9328 -51.6846 12.4996 0.809558 55.2885 -1.23747 2.91703 -7.84046 11.7926
-28.1574 76.2594 69.9188 187.31 -4.7845 -165.362 9.22511 -8.22892 37.8397 -6.57712 -7.02782 9.75628 -4.42826 2.96857 -3.75645 6.70118 0.658241 -7.4925 -0.0 0.0 0.0 -0.0 0.0 0.0 1.60541e-13 -5.71323e-13 -3.26535e-14 102.789 -35.9073 86.4915 -3.85728 -1.17346 6.68779 -6.4722 56.1011 12.0956 4.51899e-10 -1.64878e-09 -4.83043e-11 7.74515e-10 -2.84794e-09 -8.1015e-11 4.51902e-10 -1.64878e-09 -4.83168e-11 7.73091 5.47488 0.417314 4.51897e-10 -1.64878e-09 -4.8311e-11 2.90554 0.965183 0.102902 4.51905e-10 -1.64878e-09 -4.83076e-11 10.2786 0.731801 0.0259123 4.51891e-10 -1.64878e-09 -4.83019e-11 2.22167 -0.733487 -0.20892 1.60516e-13 -5.71322e-13 -3.29486e-14 16.2696 -42.8425 29.2655 8.1833 -3.10827 -14.4359 1.86428 35.7469 -5.80043 2.34855e-10 -4.27532e-10 2.37544e-10 4.05493e-10 -7.25019e-10 4.05776e-10 2.34851e-10 -4.27545e-10 2.37561e-10 -7.73091 5.47488 -0.417314 2.34856e-10 -4.27547e-10 2.37546e-10 -2.90554 0.965183 -0.102902 2.34852e-10 -4.27545e-10 2.37543e-10 -10.2786 0.731801 -0.0259123 2.34856e-10 -4.27533e-10 2.37536e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.89148 -39.1595 -3.08284 -0.60656 51.375 1.23286 -4.55556 -13.4636 -13.6244 2.03217e-16 0.0 3.88251e-19 26.8414 -52.2598 14.573 0.865168 56.4951 -1.31114 3.10924 -9.21891 11.4591
-27.832 75.5643 70.0421 187.062 -3.9824 -164.902 8.72524 -8.01736 37.997 -6.71878 -7.46932 9.77456 -4.42942 2.79136 -3.70168 6.47249 0.735478 -7.36686 -0.0 0.0 0.0 -0.0 0.0 0.0 1.86115e-13 -5.00647e-13 -7.23836e-14 108.939 -37.2925 90.4082 -3.6575 -1.09971 6.33786 -9.31937 62.0818 15.4195 -4.47522e-10 -8.66625e-09 -1.86134e-10 -7.76274e-10 -1.50277e-08 -2.76535e-10 -4.47519e-10 -8.66626e-09 -1.86151e-10 7.73091 5.47488 0.417314 -4.47523e-10 -8.66625e-09 -1.86145e-10 2.90554 0.965183 0.102902 -4.47514e-10 -8.66626e-09 -1.86141e-10 10.2786 0.731801 0.0259123 -4.47528e-10 -8.66626e-09 -1.86136e-10 2.22167 -0.733487 -0.20892 1.86113e-13 -5.00647e-13 -7.2683e-14 14.8985 -41.5194 27.8486 8.14545 -3.08824 -14.3666 1.69282 34.2952 -5.49714 2.39798e-10 -7.13247e-10 6.7558e-10 4.28241e-10 -1.26361e-09 1.16122e-09 2.39794e-10 -7.13268e-10 6.75602e-10 -7.73091 5.47488 -0.417314 2.39799e-10 -7.13269e-10 6.75579e-10 -2.90554 0.965183 -0.102902 2.39797e-10 -7.13268e-10 6.75578e-10 -10.2786 0.731801 -0.0259123 2.39801e-10 -7.13248e-10 6.7557e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.21737 -40.5926 -3.04563 -0.668149 53.0532 1.31283 -4.9115 -14.6097 -13.9017 2.03217e-16 0.0 3.88251e-19 27.8325 -52.7949 16.8342 0.924668 57.6936 -1.38801 3.28343 -10.5714 11.1448
-27.4661 74.8547 70.2314 186.676 -3.0033 -164.322 8.26601 -7.7768 37.9133 -6.77009 -7.74483 9.80786 -4.33482 2.64311 -3.59032 6.01543 0.522155 -7.12263 -0.0 0.0 0.0 -0.0 0.0 0.0 1.95014e-13 -4.3315e-13 -1.0799e-13 115.28 -38.2028 94.7358 -3.57841 -1.07067 6.19966 -13.9623 68.1533 20.5208 -1.07405e-09 -1.20985e-08 -2.32794e-10 -1.85247e-09 -2.09077e-08 -3.28831e-10 -1.07405e-09 -1.20985e-08 -2.32813e-10 7.73091 5.47488 0.417314 -1.07405e-09 -1.20985e-08 -2.32807e-10 2.90554 0.965183 0.102902 -1.07404e-09 -1.20985e-08 -2.32803e-10 10.2786 0.731801 0.0259123 -1.07405e-09 -1.20985e-08 -2.32798e-10 2.22167 -0.733487 -0.20892 1.95015e-13 -4.33152e-13 -1.08288e-13 13.6962 -40.873 26.6694 8.10582 -3.06733 -14.2941 1.60686 33.4947 -5.3364 1.06921e-10 -4.736e-10 4.74784e-10 1.94207e-10 -8.47045e-10 8.18434e-10 1.06917e-10 -4.73624e-10 4.74806e-10 -7.73091 5.47488 -0.417314 1.06922e-10 -4.73624e-10 4.7478e-10 -2.90554 0.965183 -0.102902 1.06921e-10 -4.73623e-10 4.7478e-10 -10.2786 0.731801 -0.0259123 1.06924e-10 -4.736e-10 4.74771e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.60123 -41.9855 -2.89023 -0.736728 54.7333 1.39858 -5.2089 -15.6398 -14.0664 2.03217e-16 0.0 3.88251e-19 28.8485 -53.3353 19.0615 0.993015 58.9569 -1.47368 3.44478 -11.8973 10.8587
-27.1164 74.1563 70.3755 186.411 -2.0389 -163.929 7.86421 -7.5163 37.4879 -6.6887 -7.74777 9.88477 -4.07882 2.54554 -3.41681 5.17305 -0.156657 -6.74577 -0.0 0.0 0.0 -0.0 0.0 0.0 1.81975e-13 -3.67461e-13 -1.44764e-13 121.926 -38.4412 99.5687 -3.64537 -1.09395 6.31798 -22.9939 74.397 30.0351 -1.3244e-09 -9.92363e-09 -9.89031e-11 -2.27007e-09 -1.69157e-08 -9.21611e-11 -1.32439e-09 -9.92362e-09 -9.89229e-11 7.73091 5.47488 0.417314 -1.3244e-09 -9.92362e-09 -9.89143e-11 2.90554 0.965183 0.102902 -1.32439e-09 -9.92362e-09 -9.89098e-11 10.2786 0.731801 0.0259123 -1.3244e-09 -9.92362e-09 -9.89038e-11 2.22167 -0.733487 -0.20892 1.81944e-13 -3.67463e-13 -1.45053e-13 12.669 -41.2115 25.8139 8.06487 -3.04576 -14.2192 1.62486 33.6479 -5.36804 -2.38297e-10 6.481e-10 -9.19275e-10 -4.41499e-10 1.18025e-09 -1.5771e-09 -2.383e-10 6.4808e-10 -9.19256e-10 -7.73091 5.47488 -0.417314 -2.38295e-10 6.4808e-10 -9.19279e-10 -2.90554 0.965183 -0.102902 -2.38298e-10 6.48081e-10 -9.1928e-10 -10.2786 0.731801 -0.0259123 -2.38292e-10 6.481e-10 -9.19291e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.01287 -43.3701 -2.67213 -0.816107 56.4731 1.49336 -5.39754 -16.5181 -14.0222 2.03217e-16 0.0 3.88251e-19 29.8971 -53.9153 21.2875 1.07352 60.3047 -1.57125 3.58849 -13.2398 10.5551
-26.7883 73.535 70.4215 186.273 -1.4747 -163.781 7.48866 -7.22697 36.8134 -6.51807 -7.55526 9.99066 -3.69649 2.47775 -3.19561 4.054 -1.16804 -6.2707 -0.0 0.0 0.0 -0.0 0.0 0.0 1.52983e-13 -2.96347e-13 -1.8432e-13 128.664 -37.9515 104.644 -3.8003 -1.14872 6.59155 -44.2361 79.9467 51.7976 -1.33033e-09 -4.04774e-09 1.09262e-10 -2.25968e-09 -6.40352e-09 2.59178e-10 -1.33033e-09 -4.04773e-09 1.09243e-10 7.73091 5.47488 0.417314 -1.33033e-09 -4.04774e-09 1.09254e-10 2.90554 0.965183 0.102902 -1.33032e-09 -4.04774e-09 1.09259e-10 10.2786 0.731801 0.0259123 -1.33034e-09 -4.04773e-09 1.09266e-10 2.22167 -0.733487 -0.20892 1.52897e-13 -2.96348e-13 -1.84596e-13 11.6626 -42.1785 25.106 8.02286 -3.02369 -14.1424 1.71023 34.4041 -5.52253 -7.08648e-10 2.2595e-09 -3.12051e-09 -1.31688e-09 4.1126e-09 -5.36183e-09 -7.0865e-10 2.25949e-09 -3.1205e-09 -7.73091 5.47488 -0.417314 -7.08645e-10 2.25949e-09 -3.12052e-09 -2.90554 0.965183 -0.102902 -7.08652e-10 2.25949e-09 -3.12052e-09 -10.2786 0.731801 -0.0259123 -7.08643e-10 2.2595e-09 -3.12053e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.439276 -44.7532 -2.39169 -0.906991 58.2521 1.59813 -5.50327 -17.2613 -13.849 2.03217e-16 0.0 3.88251e-19 31.0149 -54.4952 23.6112 1.16572 61.6979 -1.68 3.71393 -14.5845 10.2441
-26.4425 72.8277 70.6437 186.13 -0.1479 -163.238 7.14044 -6.88154 36.0499 -6.32185 -7.3494 10.0711 -3.30853 2.40641 -2.92841 2.95805 -2.22122 -5.70553 -0.0 0.0 0.0 -0.0 0.0 0.0 1.15389e-13 -2.28322e-13 -2.13541e-13 134.958 -37.0324 109.416 -4.03004 -1.23355 6.99554 -88.4616 82.0006 96.5314 -1.22542e-09 2.40952e-09 2.70301e-10 -2.06233e-09 5.10535e-09 5.27986e-10 -1.22542e-09 2.40954e-09 2.70283e-10 7.73091 5.47488 0.417314 -1.22542e-09 2.40953e-09 2.70298e-10 2.90554 0.965183 0.102902 -1.22542e-09 2.40954e-09 2.70303e-10 10.2786 0.731801 0.0259123 -1.22543e-09 2.40955e-09 2.70311e-10 2.22167 -0.733487 -0.20892 1.1525e-13 -2.28322e-13 -2.13803e-13 10.5702 -43.4042 24.3248 7.97857 -3.0005 -14.0614 1.8231 35.3477 -5.72029 -1.20187e-09 3.85231e-09 -5.17102e-09 -2.22742e-09 7.00425e-09 -8.88575e-09 -1.20187e-09 3.85231e-09 -5.17102e-09 -7.73091 5.47488 -0.417314 -1.20186e-09 3.8523e-09 -5.17103e-09 -2.90554 0.965183 -0.102902 -1.20187e-09 3.8523e-09 -5.17103e-09 -10.2786 0.731801 -0.0259123 -1.20186e-09 3.85231e-09 -5.17105e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.00382859 -46.0557 -1.89094 -1.00455 59.9558 1.70937 -5.59526 -17.9432 -13.6919 2.03217e-16 0.0 3.88251e-19 32.1685 -55.0323 25.8972 1.27032 63.1217 -1.80128 3.84118 -15.8433 10.0198
-26.0299 72.2414 70.6094 185.693 0.326 -163.39 6.81802 -6.45627 35.3578 -6.16205 -7.31205 10.0716 -3.03509 2.2982 -2.61691 2.17439 -3.02408 -5.05629 -0.0 0.0 0.0 -0.0 0.0 0.0 7.65414e-14 -1.719e-13 -2.19309e-13 140.452 -36.1505 113.554 -4.3212 -1.34697 7.50515 -124.308 79.1528 132.823 -1.14324e-09 6.32855e-09 2.62816e-10 -1.91909e-09 1.20873e-08 5.17064e-10 -1.14324e-09 6.32857e-09 2.628e-10 7.73091 5.47488 0.417314 -1.14324e-09 6.32856e-09 2.62816e-10 2.90554 0.965183 0.102902 -1.14323e-09 6.32856e-09 2.62819e-10 10.2786 0.731801 0.0259123 -1.14324e-09 6.32858e-09 2.62828e-10 2.22167 -0.733487 -0.20892 7.63788e-14 -1.71899e-13 -2.19558e-13 9.29008 -44.5081 23.2403 7.93076 -2.9756 -13.9741 1.91381 36.0637 -5.87438 -1.61569e-09 4.91824e-09 -6.11291e-09 -2.96863e-09 8.90945e-09 -1.04989e-08 -1.61569e-09 4.91825e-09 -6.11291e-09 -7.73091 5.47488 -0.417314 -1.61569e-09 4.91824e-09 -6.11291e-09 -2.90554 0.965183 -0.102902 -1.6157e-09 4.91825e-09 -6.11292e-09 -10.2786 0.731801 -0.0259123 -1.61569e-09 4.91825e-09 -6.11294e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.154971 -47.1951 -1.00038 -1.10111 61.4693 1.82079 -5.74959 -18.6365 -13.6991 2.03217e-16 0.0 3.88251e-19 33.3034 -55.4965 27.9935 1.38815 64.5613 -1.93656 3.99978 -16.927 9.97767
-25.6609 71.5422 70.6907 185.476 1.1643 -163.392 6.50263 -5.86314 34.7961 -6.05793 -7.56108 9.96523 -2.95786 2.15196 -2.26833 1.82514 -3.48585 -4.32664 -0.0 0.0 0.0 -0.0 0.0 0.0 3.71061e-14 -1.50102e-13 -1.87514e-13 145.202 -35.5323 117.088 -4.70445 -1.50174 8.17711 -140.264 74.6249 149.17 -1.09031e-09 6.48114e-09 1.11674e-11 -1.84745e-09 1.23593e-08 1.01035e-10 -1.0903e-09 6.48115e-09 1.11563e-11 7.73091 5.47488 0.417314 -1.09031e-09 6.48114e-09 1.11698e-11 2.90554 0.965183 0.102902 -1.0903e-09 6.48113e-09 1.11683e-11 10.2786 0.731801 0.0259123 -1.09031e-09 6.48116e-09 1.11808e-11 2.22167 -0.733487 -0.20892 3.69634e-14 -1.50101e-13 -1.87747e-13 7.80076 -45.4885 21.7766 7.87116 -2.94474 -13.8652 1.97764 36.5529 -5.98131 -1.91319e-09 5.25371e-09 -5.35502e-09 -3.45964e-09 9.43503e-09 -9.18179e-09 -1.91319e-09 5.25372e-09 -5.35502e-09 -7.73091 5.47488 -0.417314 -1.91319e-09 5.25372e-09 -5.35502e-09 -2.90554 0.965183 -0.102902 -1.9132e-09 5.25372e-09 -5.35503e-09 -10.2786 0.731801 -0.0259123 -1.91319e-09 5.25372e-09 -5.35504e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.0884944 -48.122 0.469213 -1.19472 62.8133 1.9325 -6.01066 -19.3965 -13.936 2.03217e-16 0.0 3.88251e-19 34.4398 -55.9166 29.8696 1.53021 66.0996 -2.09695 4.19596 -17.77 10.1332
-25.3053 70.8551 70.7623 185.331 2.1624 -163.405 6.20543 -5.14006 34.278 -5.97732 -7.97664 9.78537 -2.99505 1.98281 -1.87958 1.73498 -3.76542 -3.51172 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.40514e-15 -1.51471e-13 -1.28688e-13 149.441 -35.1051 120.251 -5.17177 -1.69349 9.00371 -148.194 69.8487 157.481 -1.0051e-09 4.66318e-09 -4.05476e-10 -1.73445e-09 9.10388e-09 -5.90664e-10 -1.00509e-09 4.66318e-09 -4.0548e-10 7.73091 5.47488 0.417314 -1.0051e-09 4.66318e-09 -4.05471e-10 2.90554 0.965183 0.102902 -1.00508e-09 4.66316e-09 -4.05479e-10 10.2786 0.731801 0.0259123 -1.0051e-09 4.66319e-09 -4.05463e-10 2.22167 -0.733487 -0.20892 -6.50076e-15 -1.51471e-13 -1.28906e-13 6.12016 -46.5024 20.0329 7.80301 -2.90958 -13.7409 2.03706 36.9997 -6.08002 -2.15212e-09 5.15249e-09 -3.52014e-09 -3.81829e-09 9.13239e-09 -6.00766e-09 -2.15213e-09 5.15249e-09 -3.52013e-09 -7.73091 5.47488 -0.417314 -2.15212e-09 5.15249e-09 -3.52014e-09 -2.90554 0.965183 -0.102902 -2.15213e-09 5.15249e-09 -3.52015e-09 -10.2786 0.731801 -0.0259123 -2.15212e-09 5.15249e-09 -3.52016e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.664651 -48.866 2.40595 -1.28708 64.0318 2.04501 -6.34021 -20.1696 -14.3185 2.03217e-16 0.0 3.88251e-19 35.5731 -56.3133 31.5875 1.70176 67.7153 -2.28735 4.42768 -18.4314 10.4396
-24.9489 70.288 70.7817 185.234 3.2783 -163.484 5.96405 -4.45674 33.741 -5.90357 -8.38374 9.56741 -3.02054 1.78179 -1.43686 1.73868 -3.94424 -2.60411 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.28734e-14 -1.32802e-13 -6.66822e-14 153.218 -34.9444 123.169 -5.6535 -1.89529 9.8634 -152.505 65.4299 162.147 -9.19066e-10 2.29121e-09 -8.76305e-10 -1.62544e-09 4.84607e-09 -1.37302e-09 -9.19052e-10 2.2912e-09 -8.76304e-10 7.73091 5.47488 0.417314 -9.19068e-10 2.29121e-09 -8.76299e-10 2.90554 0.965183 0.102902 -9.19048e-10 2.29117e-09 -8.76314e-10 10.2786 0.731801 0.0259123 -9.1907e-10 2.29122e-09 -8.76294e-10 2.22167 -0.733487 -0.20892 -5.29173e-14 -1.32802e-13 -6.68864e-14 4.23337 -47.3937 18.0489 7.74244 -2.87839 -13.6307 2.07261 37.2651 -6.139 -2.37226e-09 4.85232e-09 -1.47127e-09 -4.13816e-09 8.47259e-09 -2.46523e-09 -2.37227e-09 4.85232e-09 -1.47126e-09 -7.73091 5.47488 -0.417314 -2.37226e-09 4.85232e-09 -1.47127e-09 -2.90554 0.965183 -0.102902 -2.37227e-09 4.85232e-09 -1.47127e-09 -10.2786 0.731801 -0.0259123 -2.37226e-09 4.85232e-09 -1.47128e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.40556 -49.4683 4.51725 -1.37116 65.0456 2.14785 -6.69077 -20.8656 -14.7703 2.03217e-16 0.0 3.88251e-19 36.5926 -56.6552 33.1184 1.88889 69.238 -2.49391 4.71664 -19.0079 10.9012
-24.566 69.8286 70.8444 185.192 4.3507 -163.405 5.81269 -3.98458 33.1173 -5.81672 -8.60689 9.34645 -2.9076 1.5399 -0.926435 1.67511 -4.10399 -1.59634 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.0118e-13 -5.08889e-14 -2.5345e-14 156.572 -35.0984 125.961 -6.08307 -2.0809 10.6345 -154.915 61.7247 164.854 -8.63694e-10 7.81765e-10 -1.29051e-09 -1.56575e-09 2.1108e-09 -2.061e-09 -8.63676e-10 7.81743e-10 -1.29051e-09 7.73091 5.47488 0.417314 -8.63696e-10 7.81768e-10 -1.29051e-09 2.90554 0.965183 0.102902 -8.63673e-10 7.8172e-10 -1.29052e-09 10.2786 0.731801 0.0259123 -8.63697e-10 7.81769e-10 -1.2905e-09 2.22167 -0.733487 -0.20892 -1.0119e-13 -5.08891e-14 -2.55438e-14 2.16101 -48.0048 15.8889 7.70571 -2.85947 -13.5639 2.06402 37.2104 -6.12607 -2.61337e-09 4.59095e-09 -7.14066e-11 -4.51281e-09 7.92669e-09 -4.32468e-11 -2.61338e-09 4.59095e-09 -7.13875e-11 -7.73091 5.47488 -0.417314 -2.61337e-09 4.59095e-09 -7.14003e-11 -2.90554 0.965183 -0.102902 -2.61338e-09 4.59095e-09 -7.14035e-11 -10.2786 0.731801 -0.0259123 -2.61337e-09 4.59096e-09 -7.14098e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.12895 -49.9895 6.49964 -1.43707 65.7752 2.22773 -7.00742 -21.3962 -15.2114 2.03217e-16 0.0 3.88251e-19 37.3807 -56.9122 34.4274 2.06576 70.4972 -2.69099 5.08614 -19.5952 11.5234
-24.1149 69.403 70.8741 185.11 5.4951 -163.357 5.79371 -3.79844 32.3593 -5.72472 -8.52926 9.11897 -2.61873 1.17665 -0.341728 1.55712 -4.23187 -0.476175 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.66686e-13 1.56349e-13 -3.07204e-14 159.463 -35.6735 128.624 -6.49397 -2.26868 11.3708 -156.217 59.0868 166.363 -7.61904e-10 4.28946e-10 -1.6566e-09 -1.43235e-09 1.43261e-09 -2.68013e-09 -7.61885e-10 4.28921e-10 -1.6566e-09 7.73091 5.47488 0.417314 -7.61906e-10 4.28948e-10 -1.6566e-09 2.90554 0.965183 0.102902 -7.61884e-10 4.28906e-10 -1.65661e-09 10.2786 0.731801 0.0259123 -7.61908e-10 4.28948e-10 -1.65659e-09 2.22167 -0.733487 -0.20892 -1.66682e-13 1.56348e-13 -3.09223e-14 -0.0344097 -48.3037 13.5962 7.70003 -2.8565 -13.5537 1.99497 36.7047 -6.01306 -2.978e-09 4.42948e-09 1.08393e-10 -5.13417e-09 7.62157e-09 2.74937e-10 -2.97801e-09 4.42948e-09 1.08412e-10 -7.73091 5.47488 -0.417314 -2.978e-09 4.42948e-09 1.08399e-10 -2.90554 0.965183 -0.102902 -2.97801e-09 4.42948e-09 1.08397e-10 -10.2786 0.731801 -0.0259123 -2.978e-09 4.42948e-09 1.0839e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.77118 -50.4594 8.17947 -1.47857 66.2096 2.27881 -7.29834 -21.7364 -15.6786 2.03217e-16 0.0 3.88251e-19 37.9103 -57.142 35.4568 2.21813 71.4798 -2.86504 5.5671 -20.2032 12.3591
-23.6556 69.0606 70.8641 185.215 6.6817 -163.248 5.86858 -3.80266 31.5089 -5.63042 -8.26719 8.87093 -2.2169 0.72284 0.308868 1.44772 -4.29474 0.748747 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.44769e-13 4.49015e-13 -6.35272e-14 162.002 -36.7135 131.169 -6.90449 -2.46399 12.1086 -156.985 57.3683 167.265 -6.25401e-10 5.05148e-10 -2.02098e-09 -1.24609e-09 1.51111e-09 -3.30412e-09 -6.25381e-10 5.05124e-10 -2.021e-09 7.73091 5.47488 0.417314 -6.25403e-10 5.0515e-10 -2.02098e-09 2.90554 0.965183 0.102902 -6.25385e-10 5.05123e-10 -2.02099e-09 10.2786 0.731801 0.0259123 -6.25406e-10 5.0515e-10 -2.02098e-09 2.22167 -0.733487 -0.20892 -2.44761e-13 4.49014e-13 -6.37384e-14 -2.32693 -48.35 11.1659 7.71584 -2.86459 -13.5824 1.88474 35.8528 -5.82744 -3.41429e-09 4.24186e-09 -3.57965e-10 -5.89667e-09 7.30558e-09 -5.21225e-10 -3.4143e-09 4.24186e-09 -3.57947e-10 -7.73091 5.47488 -0.417314 -3.41429e-09 4.24186e-09 -3.5796e-10 -2.90554 0.965183 -0.102902 -3.4143e-09 4.24186e-09 -3.57961e-10 -10.2786 0.731801 -0.0259123 -3.41429e-09 4.24186e-09 -3.57969e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.40707 -50.85 9.72882 -1.49524 66.3879 2.30217 -7.58078 -21.9338 -16.1921 2.03217e-16 0.0 3.88251e-19 38.223 -57.3546 36.2267 2.34934 72.2661 -3.01929 6.1491 -20.7798 13.3914
-23.1377 68.9295 70.8307 185.209 7.9326 -162.995 5.94833 -3.9139 30.6298 -5.50568 -7.99493 8.62125 -1.73063 0.336555 1.01681 1.26752 -4.34413 2.05647 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.04332e-13 7.1735e-13 -7.96284e-14 164.437 -38.1336 133.732 -7.23082 -2.62255 12.6993 -157.535 56.0885 167.913 -6.18823e-10 8.94342e-10 -2.32972e-09 -1.26819e-09 2.11892e-09 -3.8203e-09 -6.18804e-10 8.94321e-10 -2.32974e-09 7.73091 5.47488 0.417314 -6.18825e-10 8.94343e-10 -2.32972e-09 2.90554 0.965183 0.102902 -6.18811e-10 8.94333e-10 -2.32973e-09 10.2786 0.731801 0.0259123 -6.18829e-10 8.94345e-10 -2.32972e-09 2.22167 -0.733487 -0.20892 -3.04331e-13 7.17348e-13 -7.98551e-14 -4.71204 -48.1243 8.62038 7.74429 -2.87919 -13.6342 1.76502 34.8699 -5.61936 -3.73041e-09 3.98519e-09 -6.1603e-10 -6.44768e-09 6.88197e-09 -9.61291e-10 -3.73042e-09 3.98519e-09 -6.16015e-10 -7.73091 5.47488 -0.417314 -3.73041e-09 3.98519e-09 -6.16028e-10 -2.90554 0.965183 -0.102902 -3.73042e-09 3.98519e-09 -6.16027e-10 -10.2786 0.731801 -0.0259123 -3.73041e-09 3.98519e-09 -6.16037e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.06477 -51.1411 11.3647 -1.48576 66.3058 2.29479 -7.80693 -22.0125 -16.6446 2.03217e-16 0.0 3.88251e-19 38.296 -57.4459 36.8095 2.44775 72.8258 -3.14118 6.79288 -21.3288 14.5222
-22.6022 68.9019 70.7992 185.186 9.2482 -162.598 5.94879 -4.04606 29.7867 -5.32567 -7.88726 8.38793 -1.19654 0.175816 1.77361 0.941516 -4.43162 3.42537 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.14277e-13 8.51595e-13 -3.48867e-14 167.006 -39.8211 136.447 -7.39229 -2.70111 12.994 -158.044 54.7561 168.527 -9.0681e-10 1.4805e-09 -2.52887e-09 -1.75983e-09 3.02864e-09 -4.11599e-09 -9.06792e-10 1.48048e-09 -2.5289e-09 7.73091 5.47488 0.417314 -9.06812e-10 1.4805e-09 -2.52888e-09 2.90554 0.965183 0.102902 -9.06802e-10 1.4805e-09 -2.52888e-09 10.2786 0.731801 0.0259123 -9.06817e-10 1.4805e-09 -2.52887e-09 2.22167 -0.733487 -0.20892 -3.14301e-13 8.51592e-13 -3.51352e-14 -7.17711 -47.6084 5.98829 7.77651 -2.89579 -13.6928 1.66095 33.9718 -5.4338 -3.73453e-09 3.61656e-09 1.88648e-10 -6.43456e-09 6.25398e-09 4.25181e-10 -3.73453e-09 3.61656e-09 1.88661e-10 -7.73091 5.47488 -0.417314 -3.73453e-09 3.61656e-09 1.88648e-10 -2.90554 0.965183 -0.102902 -3.73453e-09 3.61656e-09 1.88649e-10 -10.2786 0.731801 -0.0259123 -3.73453e-09 3.61656e-09 1.88639e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.77591 -51.2995 13.3053 -1.45083 65.9589 2.2556 -7.92919 -21.998 -16.9294 2.03217e-16 0.0 3.88251e-19 38.1034 -57.3091 37.2732 2.5014 73.1283 -3.21784 7.45478 -21.8571 15.6518
-22.0262 68.9795 70.7061 185.034 10.855 -162.332 5.76317 -4.19446 28.9835 -5.0568 -8.01652 8.17471 -0.587197 0.330902 2.60463 0.410493 -4.58832 4.88576 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.46194e-13 7.9507e-13 1.29223e-13 170.124 -41.6224 139.518 -7.31971 -2.66501 12.8623 -158.651 52.9159 169.28 -1.78678e-09 2.57807e-09 -2.65925e-09 -3.21063e-09 4.75023e-09 -4.2196e-09 -1.78677e-09 2.57806e-09 -2.65928e-09 7.73091 5.47488 0.417314 -1.78678e-09 2.57807e-09 -2.65926e-09 2.90554 0.965183 0.102902 -1.78678e-09 2.57808e-09 -2.65926e-09 10.2786 0.731801 0.0259123 -1.78679e-09 2.57808e-09 -2.65925e-09 2.22167 -0.733487 -0.20892 -2.46278e-13 7.95067e-13 1.28938e-13 -9.67491 -46.6652 3.2725 7.81638 -2.91639 -13.7654 1.56645 33.1358 -5.2636 -3.29031e-09 3.03563e-09 3.13123e-09 -5.59581e-09 5.2419e-09 5.49016e-09 -3.29031e-09 3.03563e-09 3.13124e-09 -7.73091 5.47488 -0.417314 -3.29031e-09 3.03563e-09 3.13123e-09 -2.90554 0.965183 -0.102902 -3.29032e-09 3.03563e-09 3.13123e-09 -10.2786 0.731801 -0.0259123 -3.29031e-09 3.03564e-09 3.13122e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.55882 -51.2804 15.6819 -1.39677 65.3609 2.19053 -7.96494 -21.9271 -17.0667 2.03217e-16 0.0 3.88251e-19 37.5502 -56.8931 37.5895 2.49994 73.1576 -3.23872 8.11298 -22.3506 16.7453
-21.4499 69.2084 70.5106 184.766 12.9358 -162.227 5.46031 -4.40126 28.1903 -4.72392 -8.28132 7.97202 0.0893817 0.700949 3.5054 -0.266947 -4.77928 6.43762 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.23375e-13 6.15451e-13 3.73575e-13 173.662 -43.6435 142.886 -7.07297 -2.5453 12.4137 -159.229 50.9379 170.017 -3.08643e-09 4.13381e-09 -2.73122e-09 -5.3413e-09 7.21476e-09 -4.17173e-09 -3.08642e-09 4.1338e-09 -2.73124e-09 7.73091 5.47488 0.417314 -3.08643e-09 4.13381e-09 -2.73123e-09 2.90554 0.965183 0.102902 -3.08643e-09 4.13382e-09 -2.73123e-09 10.2786 0.731801 0.0259123 -3.08644e-09 4.13382e-09 -2.73122e-09 2.22167 -0.733487 -0.20892 -1.23545e-13 6.15448e-13 3.73243e-13 -12.1022 -45.3369 0.552338 7.86649 -2.94233 -13.8568 1.47278 32.2735 -5.09128 -2.52846e-09 2.29493e-09 7.47357e-09 -4.17533e-09 3.94863e-09 1.29628e-08 -2.52846e-09 2.29493e-09 7.47358e-09 -7.73091 5.47488 -0.417314 -2.52846e-09 2.29493e-09 7.47357e-09 -2.90554 0.965183 -0.102902 -2.52847e-09 2.29493e-09 7.47357e-09 -10.2786 0.731801 -0.0259123 -2.52846e-09 2.29493e-09 7.47356e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.35747 -51.0874 18.3206 -1.32617 64.5091 2.10302 -7.92741 -21.7777 -17.0965 2.03217e-16 0.0 3.88251e-19 36.6729 -56.2668 37.7351 2.44505 72.9326 -3.20607 8.79275 -22.8096 17.858
-20.9063 69.458 70.3356 184.685 15.0508 -162.079 5.22469 -4.64784 27.4207 -4.39122 -8.59609 7.77753 0.742309 1.15712 4.42262 -0.989617 -4.95754 8.0138 -0.0 0.0 0.0 -0.0 0.0 0.0 7.72652e-15 3.89508e-13 5.95833e-13 177.09 -46.1841 146.309 -6.766 -2.39765 11.8596 -159.59 49.5711 170.49 -4.26578e-09 5.48014e-09 -2.6452e-09 -7.25968e-09 9.32654e-09 -3.87803e-09 -4.26578e-09 5.48013e-09 -2.64521e-09 7.73091 5.47488 0.417314 -4.26578e-09 5.48014e-09 -2.6452e-09 2.90554 0.965183 0.102902 -4.26578e-09 5.48014e-09 -2.6452e-09 10.2786 0.731801 0.0259123 -4.26579e-09 5.48014e-09 -2.64519e-09 2.22167 -0.733487 -0.20892 7.47752e-15 3.89506e-13 5.95458e-13 -14.4215 -43.885 -2.07433 7.91609 -2.96803 -13.9474 1.39327 31.503 -4.94056 -1.6577e-09 1.58079e-09 1.13502e-08 -2.57856e-09 2.70135e-09 1.96293e-08 -1.6577e-09 1.5808e-09 1.13502e-08 -7.73091 5.47488 -0.417314 -1.6577e-09 1.5808e-09 1.13502e-08 -2.90554 0.965183 -0.102902 -1.6577e-09 1.5808e-09 1.13502e-08 -10.2786 0.731801 -0.0259123 -1.65769e-09 1.5808e-09 1.13502e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.09489 -50.7619 20.9855 -1.23742 63.3747 1.99141 -7.76538 -21.4863 -16.9432 2.03217e-16 0.0 3.88251e-19 35.6432 -55.5017 37.7869 2.34719 72.4756 -3.1305 9.52113 -23.2635 19.0261
-20.2619 69.7643 70.1712 184.584 17.0745 -161.885 5.24211 -4.91488 26.6884 -4.12167 -8.87506 7.58883 1.29 1.57105 5.3028 -1.66223 -5.07743 9.54657 -0.0 0.0 0.0 -0.0 0.0 0.0 1.00656e-13 1.94015e-13 6.93659e-13 179.934 -49.5975 149.544 -6.51604 -2.27877 11.4113 -159.608 49.5695 170.505 -4.78488e-09 5.94946e-09 -2.30158e-09 -8.07359e-09 9.98988e-09 -3.24413e-09 -4.78488e-09 5.94946e-09 -2.30159e-09 7.73091 5.47488 0.417314 -4.78488e-09 5.94946e-09 -2.30158e-09 2.90554 0.965183 0.102902 -4.78488e-09 5.94947e-09 -2.30159e-09 10.2786 0.731801 0.0259123 -4.78489e-09 5.94947e-09 -2.30158e-09 2.22167 -0.733487 -0.20892 1.00372e-13 1.94012e-13 6.93262e-13 -16.6749 -42.5777 -4.56755 7.95452 -2.98797 -14.0176 1.33849 30.9428 -4.83317 -8.86734e-10 1.07959e-09 1.28955e-08 -1.21099e-09 1.82725e-09 2.22759e-08 -8.86734e-10 1.07959e-09 1.28955e-08 -7.73091 5.47488 -0.417314 -8.86733e-10 1.0796e-09 1.28955e-08 -2.90554 0.965183 -0.102902 -8.86743e-10 1.0796e-09 1.28955e-08 -10.2786 0.731801 -0.0259123 -8.8673e-10 1.0796e-09 1.28955e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.71106 -50.3652 23.4568 -1.13109 61.9292 1.85613 -7.43245 -20.9874 -16.5332 2.03217e-16 0.0 3.88251e-19 34.6298 -54.6686 37.8176 2.21912 71.809 -3.02493 10.3293 -23.7396 20.2874
-19.5699 70.2985 70.0079 184.686 19.2043 -161.574 5.61294 -5.20668 25.9887 -3.9413 -9.09477 7.40268 1.68455 1.94257 6.15167 -2.29102 -5.18857 11.0055 -0.0 0.0 0.0 -0.0 0.0 0.0 1.38686e-13 3.15754e-14 5.89697e-13 -178.086 -54.6775 152.415 -6.32735 -2.19138 11.0728 -159.07 51.7148 169.786 -4.25438e-09 5.07838e-09 -1.49652e-09 -7.12533e-09 8.42564e-09 -1.98282e-09 -4.25438e-09 5.07838e-09 -1.49653e-09 7.73091 5.47488 0.417314 -4.25438e-09 5.07838e-09 -1.49652e-09 2.90554 0.965183 0.102902 -4.25438e-09 5.07838e-09 -1.49653e-09 10.2786 0.731801 0.0259123 -4.25439e-09 5.07839e-09 -1.49652e-09 2.22167 -0.733487 -0.20892 1.38435e-13 3.15718e-14 5.89309e-13 -18.9728 -41.5688 -6.96815 7.97442 -2.99829 -14.054 1.31734 30.7153 -4.79026 -1.74944e-10 9.00065e-10 1.07543e-08 -3.56137e-11 1.51518e-09 1.8563e-08 -1.74943e-10 9.00068e-10 1.07543e-08 -7.73091 5.47488 -0.417314 -1.74943e-10 9.00069e-10 1.07543e-08 -2.90554 0.965183 -0.102902 -1.74952e-10 9.0007e-10 1.07543e-08 -10.2786 0.731801 -0.0259123 -1.74939e-10 9.00073e-10 1.07543e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.25419 -49.8509 25.8572 -1.01362 60.1054 1.70206 -6.99329 -20.2642 -16.0087 2.03217e-16 0.0 3.88251e-19 33.6878 -53.804 37.822 2.06829 70.9428 -2.89707 11.2468 -24.214 21.699
-18.8687 71.0021 69.8157 184.991 21.5056 -161.121 6.2198 -5.53103 25.3171 -3.81313 -9.30112 7.22124 1.97764 2.32829 6.99137 -2.91833 -5.29484 12.4306 -0.0 0.0 0.0 -0.0 0.0 0.0 1.48038e-13 -1.32799e-13 3.55216e-13 -176.195 -61.104 155.287 -6.14677 -2.1095 10.7488 -157.906 55.3947 168.324 -3.04404e-09 3.31807e-09 -3.42233e-10 -5.03066e-09 5.3805e-09 -2.31782e-10 -3.04404e-09 3.31807e-09 -3.42242e-10 7.73091 5.47488 0.417314 -3.04404e-09 3.31807e-09 -3.4223e-10 2.90554 0.965183 0.102902 -3.04404e-09 3.31807e-09 -3.42234e-10 10.2786 0.731801 0.0259123 -3.04405e-09 3.31807e-09 -3.42226e-10 2.22167 -0.733487 -0.20892 1.47865e-13 -1.32803e-13 3.54859e-13 -21.3151 -40.6961 -9.3201 7.98304 -3.00275 -14.0697 1.31862 30.7272 -4.7926 5.56894e-10 9.2314e-10 6.2074e-09 1.11543e-09 1.55678e-09 1.06989e-08 5.56895e-10 9.23143e-10 6.20741e-09 -7.73091 5.47488 -0.417314 5.56895e-10 9.23143e-10 6.2074e-09 -2.90554 0.965183 -0.102902 5.56886e-10 9.23145e-10 6.2074e-09 -10.2786 0.731801 -0.0259123 5.569e-10 9.23148e-10 6.2074e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.70529 -49.2132 28.2197 -0.89668 57.9382 1.54077 -6.46334 -19.3461 -15.3633 2.03217e-16 0.0 3.88251e-19 32.7306 -52.8648 37.7795 1.89885 69.8638 -2.75092 12.257 -24.674 23.2276
-18.1601 71.7069 69.5976 185.222 24.2522 -160.606 6.92364 -5.87303 24.6881 -3.70487 -9.51228 7.05013 2.24668 2.68596 7.79242 -3.51542 -5.28461 13.8588 -0.0 0.0 0.0 -0.0 0.0 0.0 1.46684e-13 -2.78729e-13 1.10814e-13 -173.139 -67.4936 159.051 -6.00874 -2.0477 10.5015 -156.259 59.2781 166.378 -1.75258e-09 1.37282e-09 7.86768e-10 -2.80761e-09 2.04752e-09 1.46602e-09 -1.75257e-09 1.37281e-09 7.86756e-10 7.73091 5.47488 0.417314 -1.75258e-09 1.37281e-09 7.86769e-10 2.90554 0.965183 0.102902 -1.75258e-09 1.37281e-09 7.86769e-10 10.2786 0.731801 0.0259123 -1.75258e-09 1.37281e-09 7.86775e-10 2.22167 -0.733487 -0.20892 1.46594e-13 -2.78735e-13 1.10492e-13 -23.5957 -39.7574 -11.6008 7.9916 -3.00724 -14.0853 1.32266 30.7739 -4.80124 1.15795e-09 9.93446e-10 1.34362e-09 2.03304e-09 1.68339e-09 2.2913e-09 1.15795e-09 9.93449e-10 1.34363e-09 -7.73091 5.47488 -0.417314 1.15795e-09 9.93449e-10 1.34362e-09 -2.90554 0.965183 -0.102902 1.15794e-09 9.93451e-10 1.34362e-09 -10.2786 0.731801 -0.0259123 1.15796e-09 9.93454e-10 1.34361e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.95685 -48.6047 30.2385 -0.786569 55.5521 1.38041 -5.74649 -18.2263 -14.31 2.03217e-16 0.0 3.88251e-19 31.7083 -51.8026 37.7338 1.71884 68.5588 -2.5942 13.3261 -25.163 24.7781
-17.4233 72.3907 69.3254 185.456 27.4055 -160.093 7.58648 -6.21736 24.1161 -3.58437 -9.74643 6.895 2.57214 2.97384 8.52507 -4.06468 -5.04879 15.3258 -0.0 0.0 0.0 -0.0 0.0 0.0 1.52594e-13 -3.85838e-13 -2.29099e-14 -167.411 -72.3371 165.107 -5.94813 -2.02068 10.3931 -154.714 62.0705 164.627 -9.78681e-10 -5.30723e-11 1.51596e-09 -1.47422e-09 -3.80232e-10 2.5676e-09 -9.78679e-10 -5.30747e-11 1.51594e-09 7.73091 5.47488 0.417314 -9.78682e-10 -5.30733e-11 1.51596e-09 2.90554 0.965183 0.102902 -9.78679e-10 -5.30756e-11 1.51596e-09 10.2786 0.731801 0.0259123 -9.78678e-10 -5.30763e-11 1.51596e-09 2.22167 -0.733487 -0.20892 1.5255e-13 -3.85844e-13 -2.32081e-14 -25.6694 -38.5566 -13.7645 8.01133 -3.01761 -14.1213 1.30993 30.6509 -4.77738 1.47739e-09 9.55612e-10 -1.74827e-09 2.5081e-09 1.62632e-09 -3.052e-09 1.47739e-09 9.55615e-10 -1.74825e-09 -7.73091 5.47488 -0.417314 1.47739e-09 9.55614e-10 -1.74826e-09 -2.90554 0.965183 -0.102902 1.47738e-09 9.55617e-10 -1.74826e-09 -10.2786 0.731801 -0.0259123 1.4774e-09 9.55619e-10 -1.74827e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.94349 -48.1949 31.645 -0.685261 53.0716 1.22474 -4.77941 -16.8832 -12.571 2.03217e-16 0.0 3.88251e-19 30.5673 -50.5701 37.7278 1.5357 67.0144 -2.43406 14.4206 -25.7291 26.2572
-16.7639 73.024 69.0063 185.919 30.6852 -159.569 8.21144 -6.57023 23.6763 -3.44851 -10.013 6.77768 3.03378 3.15683 9.18599 -4.66041 -4.46413 16.9336 -0.0 0.0 0.0 -0.0 0.0 0.0 1.89512e-13 -4.28781e-13 4.73325e-14 -158.248 -75.3104 174.423 -5.98164 -2.03512 10.4536 -153.644 63.7044 163.436 -1.23733e-09 -1.24798e-09 1.68791e-09 -1.89308e-09 -2.36381e-09 2.87026e-09 -1.23733e-09 -1.24798e-09 1.6879e-09 7.73091 5.47488 0.417314 -1.23733e-09 -1.24798e-09 1.68791e-09 2.90554 0.965183 0.102902 -1.23733e-09 -1.24798e-09 1.68791e-09 10.2786 0.731801 0.0259123 -1.23733e-09 -1.24799e-09 1.68791e-09 2.22167 -0.733487 -0.20892 1.8946e-13 -4.28786e-13 4.70436e-14 -27.4592 -36.8545 -15.7798 8.06449 -3.04552 -14.2184 1.2574 30.1055 -4.6739 1.35049e-09 1.31656e-10 -2.01923e-09 2.283e-09 2.49993e-10 -3.51717e-09 1.35049e-09 1.31661e-10 -2.01921e-09 -7.73091 5.47488 -0.417314 1.35049e-09 1.31659e-10 -2.01923e-09 -2.90554 0.965183 -0.102902 1.35048e-09 1.31662e-10 -2.01923e-09 -10.2786 0.731801 -0.0259123 1.35049e-09 1.31664e-10 -2.01923e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.65287 -47.9666 32.6472 -0.585944 50.3512 1.06113 -3.55332 -15.4457 -9.83431 2.03217e-16 0.0 3.88251e-19 29.2579 -49.1032 37.8133 1.34768 65.1398 -2.2716 15.6585 -26.4782 27.7786
-16.0433 74.1252 68.6484 186.357 34.0601 -158.935 8.86099 -6.93578 23.3375 -3.31229 -10.3009 6.68849 3.57506 3.26601 9.78909 -5.31674 -3.63118 18.6323 -0.0 0.0 0.0 -0.0 0.0 0.0 2.41537e-13 -4.25062e-13 2.36846e-13 -146.499 -76.8823 -173.68 -6.08839 -2.08231 10.6452 -152.859 64.7938 162.568 -2.09077e-09 -2.42881e-09 1.52155e-09 -3.32418e-09 -4.27978e-09 2.68289e-09 -2.09077e-09 -2.42881e-09 1.52154e-09 7.73091 5.47488 0.417314 -2.09078e-09 -2.42881e-09 1.52155e-09 2.90554 0.965183 0.102902 -2.09077e-09 -2.42881e-09 1.52155e-09 10.2786 0.731801 0.0259123 -2.09077e-09 -2.42881e-09 1.52156e-09 2.22167 -0.733487 -0.20892 2.41445e-13 -4.25066e-13 2.3656e-13 -29.0091 -34.8397 -17.6647 8.13853 -3.08443 -14.3541 1.18514 29.3124 -4.52633 8.99179e-10 -1.18337e-09 -7.47298e-10 1.53657e-09 -1.94766e-09 -1.31228e-09 8.99184e-10 -1.18337e-09 -7.47275e-10 -7.73091 5.47488 -0.417314 8.99182e-10 -1.18337e-09 -7.47295e-10 -2.90554 0.965183 -0.102902 8.99172e-10 -1.18337e-09 -7.47299e-10 -10.2786 0.731801 -0.0259123 8.99183e-10 -1.18337e-09 -7.47307e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.15346 -47.8732 33.328 -0.496442 47.3841 0.896636 -2.23059 -13.8242 -6.36075 2.03217e-16 0.0 3.88251e-19 27.8136 -47.4492 37.9626 1.16323 62.971 -2.11472 17.0364 -27.3435 29.3596
-15.2497 74.9059 68.5233 186.715 37.304 -157.885 9.48478 -7.29579 22.954 -3.17132 -10.5971 6.5857 4.07168 3.35899 10.3304 -5.87942 -2.77354 20.2305 -0.0 0.0 0.0 -0.0 0.0 0.0 2.6717e-13 -4.1858e-13 3.99253e-13 -135.843 -76.898 -162.85 -6.24672 -2.1538 10.9289 -152.636 65.1132 162.319 -2.70864e-09 -2.78401e-09 1.2069e-09 -4.38175e-09 -4.80837e-09 2.22992e-09 -2.70864e-09 -2.78401e-09 1.20689e-09 7.73091 5.47488 0.417314 -2.70864e-09 -2.78401e-09 1.2069e-09 2.90554 0.965183 0.102902 -2.70864e-09 -2.78401e-09 1.2069e-09 10.2786 0.731801 0.0259123 -2.70864e-09 -2.78401e-09 1.2069e-09 2.22167 -0.733487 -0.20892 2.67033e-13 -4.18581e-13 3.98964e-13 -30.3844 -32.9533 -19.4586 8.19266 -3.11298 -14.4535 1.13257 28.709 -4.41581 4.02666e-10 -1.68531e-09 6.65764e-10 7.1428e-10 -2.785e-09 1.13759e-09 4.02672e-10 -1.6853e-09 6.65789e-10 -7.73091 5.47488 -0.417314 4.02671e-10 -1.6853e-09 6.65763e-10 -2.90554 0.965183 -0.102902 4.0266e-10 -1.6853e-09 6.65758e-10 -10.2786 0.731801 -0.0259123 4.02669e-10 -1.6853e-09 6.65748e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.52138 -48.0515 33.2503 -0.427883 44.5024 0.753014 -1.04985 -11.6841 -2.74427 2.03217e-16 0.0 3.88251e-19 26.3106 -45.727 38.1011 0.997602 60.6855 -1.97307 18.3071 -28.1371 30.7474
-14.5455 76.0735 68.0079 187.207 41.1629 -157.315 10.0295 -7.63267 22.3797 -3.02196 -10.889 6.42745 4.39702 3.493 10.8063 -6.15937 -2.10433 21.5349 -0.0 0.0 0.0 -0.0 0.0 0.0 2.24916e-13 -4.53229e-13 3.88177e-13 -130.262 -75.6055 -157.038 -6.435 -2.24117 11.2656 -153.188 64.4306 162.918 -2.26056e-09 -1.50204e-09 9.33967e-10 -3.68001e-09 -2.62981e-09 1.73579e-09 -2.26056e-09 -1.50204e-09 9.33951e-10 7.73091 5.47488 0.417314 -2.26056e-09 -1.50204e-09 9.33964e-10 2.90554 0.965183 0.102902 -2.26056e-09 -1.50204e-09 9.33963e-10 10.2786 0.731801 0.0259123 -2.26056e-09 -1.50204e-09 9.3397e-10 2.22167 -0.733487 -0.20892 2.2475e-13 -4.53229e-13 3.87879e-13 -31.7086 -31.6203 -21.2157 8.18634 -3.10994 -14.4415 1.13236 28.7329 -4.41896 1.40143e-10 -6.99706e-11 8.18185e-10 2.61643e-10 -8.03631e-11 1.40736e-09 1.4015e-10 -6.99631e-11 8.1821e-10 -7.73091 5.47488 -0.417314 1.40149e-10 -6.99636e-11 8.18182e-10 -2.90554 0.965183 -0.102902 1.40139e-10 -6.99623e-11 8.18176e-10 -10.2786 0.731801 -0.0259123 1.40146e-10 -6.99619e-11 8.18166e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.8056 -48.6279 31.9531 -0.381212 42.0385 0.643877 -0.247056 -8.73557 0.427932 2.03217e-16 0.0 3.88251e-19 24.8369 -44.0512 38.1557 0.859577 58.4609 -1.84954 19.1857 -28.6969 31.6678
-13.8072 77.0629 67.7214 187.653 44.5461 -156.437 10.5241 -7.94117 21.5408 -2.86431 -11.1886 6.19154 4.48935 3.76344 11.2607 -6.04165 -1.72966 22.567 -0.0 0.0 0.0 -0.0 0.0 0.0 6.33453e-14 -5.62265e-13 6.98429e-14 -131.896 -72.4073 -158.295 -6.68453 -2.36008 11.7116 -154.988 61.7426 164.916 1.93695e-10 3.06093e-09 7.45205e-10 3.30854e-10 4.99665e-09 1.17292e-09 1.93701e-10 3.06093e-09 7.45186e-10 7.73091 5.47488 0.417314 1.93697e-10 3.06094e-09 7.452e-10 2.90554 0.965183 0.102902 1.93702e-10 3.06094e-09 7.452e-10 10.2786 0.731801 0.0259123 1.93694e-10 3.06093e-09 7.45206e-10 2.22167 -0.733487 -0.20892 6.31763e-14 -5.62264e-13 6.95211e-14 -33.1075 -31.0356 -22.9496 8.08966 -3.05957 -14.2636 1.21396 29.7105 -4.59635 3.16717e-10 5.07566e-09 -1.3095e-09 5.03917e-10 8.51748e-09 -2.26658e-09 3.16719e-10 5.07566e-09 -1.30947e-09 -7.73091 5.47488 -0.417314 3.16722e-10 5.07567e-09 -1.3095e-09 -2.90554 0.965183 -0.102902 3.16714e-10 5.07567e-09 -1.3095e-09 -10.2786 0.731801 -0.0259123 3.1672e-10 5.07567e-09 -1.30951e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.66481 -49.5584 28.8417 -0.342287 39.8808 0.560181 0.108852 -4.48497 3.3528 2.03217e-16 0.0 3.88251e-19 23.3897 -42.3732 38.1306 0.742977 56.2216 -1.73326 19.554 -29.113 31.9346
-13.1589 78.0059 67.3929 188.495 48.0513 -155.327 10.9795 -8.23012 20.526 -2.70148 -11.4977 5.90368 4.42347 4.11274 11.6811 -5.6235 -1.51246 23.4047 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.81955e-13 -7.15091e-13 -4.46101e-13 -136.66 -67.6167 -162.539 -6.9925 -2.50847 12.2656 -157.121 57.4313 167.38 3.97167e-09 9.99629e-09 5.42012e-10 6.51833e-09 1.65709e-08 4.50768e-10 3.97168e-09 9.99629e-09 5.41991e-10 7.73091 5.47488 0.417314 3.97167e-09 9.9963e-09 5.42005e-10 2.90554 0.965183 0.102902 3.97168e-09 9.9963e-09 5.42006e-10 10.2786 0.731801 0.0259123 3.97166e-09 9.99629e-09 5.42011e-10 2.22167 -0.733487 -0.20892 -1.82115e-13 -7.1509e-13 -4.46458e-13 -34.5791 -30.9276 -24.672 7.92998 -2.97633 -13.9713 1.36704 31.3372 -4.90339 7.39931e-10 1.2701e-08 -4.75445e-09 1.13468e-09 2.12552e-08 -8.21855e-09 7.39927e-10 1.27009e-08 -4.75444e-09 -7.73091 5.47488 -0.417314 7.39935e-10 1.2701e-08 -4.75446e-09 -2.90554 0.965183 -0.102902 7.3993e-10 1.2701e-08 -4.75446e-09 -10.2786 0.731801 -0.0259123 7.39935e-10 1.2701e-08 -4.75447e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.01485 -50.6571 24.1466 -0.306189 37.9191 0.490948 -0.0835089 0.717616 6.26112 2.03217e-16 0.0 3.88251e-19 21.9423 -40.6574 38.0701 0.643342 53.9139 -1.62363 19.5429 -29.4525 31.7143
-12.873 79.0658 66.6267 189.756 52.2816 -154.96 11.3148 -8.50301 19.4325 -2.53396 -11.7873 5.59384 4.2815 4.36957 11.9782 -5.02053 -1.29586 23.9383 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.21962e-13 -8.59836e-13 -9.40897e-13 -140.531 -63.0448 -165.893 -7.28805 -2.65187 12.802 -158.54 53.4125 169.123 7.46968e-09 1.62868e-08 3.02823e-10 1.22447e-08 2.70512e-08 -3.00708e-10 7.4697e-09 1.62868e-08 3.02799e-10 7.73091 5.47488 0.417314 7.4697e-09 1.62868e-08 3.02814e-10 2.90554 0.965183 0.102902 7.4697e-09 1.62868e-08 3.02817e-10 10.2786 0.731801 0.0259123 7.46968e-09 1.62868e-08 3.0282e-10 2.22167 -0.733487 -0.20892 -4.2211e-13 -8.59835e-13 -9.41285e-13 -36.0631 -31.0119 -26.4298 7.75302 -2.88441 -13.649 1.55661 33.1055 -5.25394 1.09264e-09 2.04146e-08 -7.94501e-09 1.65191e-09 3.41574e-08 -1.37297e-08 1.09263e-09 2.04145e-08 -7.945e-09 -7.73091 5.47488 -0.417314 1.09264e-09 2.04146e-08 -7.94502e-09 -2.90554 0.965183 -0.102902 1.09264e-09 2.04146e-08 -7.94501e-09 -10.2786 0.731801 -0.0259123 1.09264e-09 2.04146e-08 -7.94502e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.252 -51.8675 18.6293 -0.280937 36.4873 0.442166 -0.784006 5.88151 8.65982 2.03217e-16 0.0 3.88251e-19 20.5552 -39.0325 37.9534 0.564235 51.7482 -1.53108 19.2343 -29.5233 31.2531
-12.0988 79.8233 66.5547 190.514 55.7114 -153.185 11.4507 -8.76389 18.3579 -2.361 -12.0289 5.29218 4.15005 4.36368 12.0616 -4.35356 -0.924991 24.059 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.6765e-13 -9.44625e-13 -1.19579e-12 -142.474 -60.7214 -167.423 -7.50278 -2.75654 13.1947 -159.032 51.6701 169.76 9.08408e-09 1.89154e-08 6.07168e-12 1.48724e-08 3.13962e-08 -9.51533e-10 9.08409e-09 1.89154e-08 6.04623e-12 7.73091 5.47488 0.417314 9.08409e-09 1.89154e-08 6.06214e-12 2.90554 0.965183 0.102902 9.0841e-09 1.89154e-08 6.06532e-12 10.2786 0.731801 0.0259123 9.08407e-09 1.89154e-08 6.0685e-12 2.22167 -0.733487 -0.20892 -5.67795e-13 -9.44625e-13 -1.19619e-12 -37.4622 -31.0114 -28.251 7.60546 -2.80836 -13.3813 1.7235 34.51 -5.54497 1.0577e-09 2.58252e-08 -9.30951e-09 1.55359e-09 4.3249e-08 -1.60811e-08 1.05768e-09 2.58251e-08 -9.3095e-09 -7.73091 5.47488 -0.417314 1.0577e-09 2.58252e-08 -9.30951e-09 -2.90554 0.965183 -0.102902 1.0577e-09 2.58252e-08 -9.30951e-09 -10.2786 0.731801 -0.0259123 1.0577e-09 2.58252e-08 -9.30951e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.781586 -53.2731 13.094 -0.273434 35.9195 0.419183 -1.59948 10.0771 9.99461 2.03217e-16 0.0 3.88251e-19 19.2898 -37.6232 37.7502 0.504898 49.9352 -1.46189 18.7245 -29.1296 30.8062
-11.5221 80.4981 66.4099 192.132 59.4784 -151.112 11.2234 -9.01402 17.2769 -2.12982 -12.2165 4.99975 4.06238 3.94533 11.9036 -3.58372 -0.277419 23.7104 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.80871e-13 -9.47977e-13 -1.09019e-12 -142.804 -61.5735 -167.43 -7.62895 -2.81871 13.4261 -158.577 53.2622 169.173 7.79001e-09 1.59138e-08 -4.44577e-10 1.27093e-08 2.62985e-08 -1.55335e-09 7.79003e-09 1.59138e-08 -4.446e-10 7.73091 5.47488 0.417314 7.79002e-09 1.59138e-08 -4.44585e-10 2.90554 0.965183 0.102902 7.79003e-09 1.59138e-08 -4.44582e-10 10.2786 0.731801 0.0259123 7.79e-09 1.59138e-08 -4.44578e-10 2.22167 -0.733487 -0.20892 -5.8103e-13 -9.47979e-13 -1.09056e-12 -38.8004 -30.9901 -30.2171 7.48734 -2.74851 -13.1669 1.84987 35.5328 -5.76186 3.28128e-10 2.86765e-08 -7.81375e-09 3.40568e-10 4.81455e-08 -1.34808e-08 3.28115e-10 2.86765e-08 -7.81374e-09 -7.73091 5.47488 -0.417314 3.28129e-10 2.86765e-08 -7.81375e-09 -2.90554 0.965183 -0.102902 3.28128e-10 2.86765e-08 -7.81375e-09 -10.2786 0.731801 -0.0259123 3.28133e-10 2.86765e-08 -7.81375e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.643178 -55.0866 7.20994 -0.286186 36.4529 0.42821 -2.10291 13.096 9.85648 2.03217e-16 0.0 3.88251e-19 18.2371 -36.4425 37.6352 0.463523 48.6119 -1.41408 17.9286 -28.1081 30.3494
-11.0625 81.086 66.2379 194.373 63.5983 -148.71 10.7234 -9.24999 16.1544 -1.85733 -12.3645 4.70292 3.96408 3.23908 11.5552 -2.64906 0.546356 22.9634 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.13908e-13 -9.00107e-13 -7.61519e-13 -142.438 -64.4205 -166.788 -7.70112 -2.8551 13.5579 -157.285 56.955 167.584 4.64183e-09 9.27902e-09 -1.00743e-09 7.49191e-09 1.51011e-08 -2.14671e-09 4.64185e-09 9.27905e-09 -1.00745e-09 7.73091 5.47488 0.417314 4.64183e-09 9.27903e-09 -1.00743e-09 2.90554 0.965183 0.102902 4.64184e-09 9.27903e-09 -1.00743e-09 10.2786 0.731801 0.0259123 4.64182e-09 9.27902e-09 -1.00742e-09 2.22167 -0.733487 -0.20892 -5.14088e-13 -9.00112e-13 -7.61848e-13 -40.1304 -31.0326 -32.2948 7.37815 -2.69394 -12.9685 1.96029 36.4053 -5.94999 -8.52791e-10 3.01169e-08 -4.50098e-09 -1.59764e-09 5.07419e-08 -7.73436e-09 -8.528e-10 3.01168e-08 -4.50098e-09 -7.73091 5.47488 -0.417314 -8.5279e-10 3.01169e-08 -4.50098e-09 -2.90554 0.965183 -0.102902 -8.52791e-10 3.01169e-08 -4.50098e-09 -10.2786 0.731801 -0.0259123 -8.52785e-10 3.01169e-08 -4.50099e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.587 -57.0868 0.356386 -0.314268 37.8599 0.464092 -2.22082 15.47 8.56584 2.03217e-16 0.0 3.88251e-19 17.3365 -35.4269 37.5474 0.434166 47.6391 -1.37861 16.8597 -26.5919 29.8083
-10.6015 81.6661 66.0078 197.186 67.7232 -145.69 10.2544 -9.46998 15.0737 -1.64641 -12.4754 4.40996 3.8104 2.48622 11.0431 -1.63844 1.36522 21.8976 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.13382e-13 -8.26688e-13 -3.78034e-13 -141.679 -68.1918 -165.802 -7.71551 -2.86316 13.5833 -155.211 61.3005 165.174 1.15467e-09 1.94177e-09 -1.497e-09 1.72465e-09 2.73831e-09 -2.585e-09 1.15469e-09 1.94181e-09 -1.49701e-09 7.73091 5.47488 0.417314 1.15467e-09 1.94177e-09 -1.497e-09 2.90554 0.965183 0.102902 1.15468e-09 1.94177e-09 -1.497e-09 10.2786 0.731801 0.0259123 1.15466e-09 1.94177e-09 -1.49699e-09 2.22167 -0.733487 -0.20892 -4.13581e-13 -8.26695e-13 -3.78315e-13 -41.3407 -30.9189 -34.3099 7.29461 -2.65254 -12.8168 2.03672 36.9973 -6.07942 -1.97682e-09 2.98615e-08 -9.15706e-10 -3.43012e-09 5.04818e-08 -1.51985e-09 -1.97683e-09 2.98615e-08 -9.15701e-10 -7.73091 5.47488 -0.417314 -1.97682e-09 2.98615e-08 -9.15704e-10 -2.90554 0.965183 -0.102902 -1.97682e-09 2.98615e-08 -9.15705e-10 -10.2786 0.731801 -0.0259123 -1.97681e-09 2.98615e-08 -9.15716e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -4.85686 -58.908 -6.85966 -0.354594 39.7775 0.516137 -2.01107 17.4077 6.59728 2.03217e-16 0.0 3.88251e-19 16.4448 -34.5753 37.1117 0.409613 46.8129 -1.35112 15.7447 -24.8404 29.3544
-10.0909 82.2543 65.8103 201.235 71.7957 -141.392 10.1212 -9.673 14.1183 -1.59994 -12.5514 4.12919 3.56421 1.92965 10.3915 -0.656873 1.9904 20.5881 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.25917e-13 -7.5339e-13 -1.0799e-13 -141.123 -71.8285 -165.079 -7.66809 -2.84022 13.4954 -152.856 64.8883 162.551 -1.15635e-09 -3.16734e-09 -1.72781e-09 -2.08788e-09 -5.85601e-09 -2.72161e-09 -1.15633e-09 -3.16729e-09 -1.72782e-09 7.73091 5.47488 0.417314 -1.15635e-09 -3.16733e-09 -1.72781e-09 2.90554 0.965183 0.102902 -1.15634e-09 -3.16733e-09 -1.72781e-09 10.2786 0.731801 0.0259123 -1.15635e-09 -3.16733e-09 -1.7278e-09 2.22167 -0.733487 -0.20892 -3.26118e-13 -7.53399e-13 -1.08238e-13 -42.2852 -30.4566 -36.0739 7.25356 -2.63222 -12.7425 2.05975 37.1787 -6.11901 -2.53572e-09 2.7626e-08 1.39759e-09 -4.32597e-09 4.68085e-08 2.48479e-09 -2.53573e-09 2.7626e-08 1.39759e-09 -7.73091 5.47488 -0.417314 -2.53572e-09 2.7626e-08 1.39759e-09 -2.90554 0.965183 -0.102902 -2.53573e-09 2.7626e-08 1.39759e-09 -10.2786 0.731801 -0.0259123 -2.53572e-09 2.7626e-08 1.39758e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -6.8291 -60.3586 -13.4716 -0.402227 41.8425 0.57247 -1.61814 19.109 4.45334 2.03217e-16 0.0 3.88251e-19 15.4424 -33.8685 35.9664 0.383878 45.9293 -1.32854 14.7805 -23.1235 29.1305
-9.6134 82.8706 65.6333 208.213 75.6038 -134.299 10.6379 -9.84555 13.3506 -1.81423 -12.5835 3.86164 3.26354 1.66622 9.57579 0.194895 2.31043 18.9845 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.56928e-13 -6.60152e-13 -8.50697e-15 -141.385 -75.0423 -165.262 -7.54965 -2.78032 13.2795 -150.909 67.1771 160.429 -1.66293e-09 -2.09227e-09 -1.63191e-09 -2.8988e-09 -3.71845e-09 -2.50994e-09 -1.66291e-09 -2.09224e-09 -1.63192e-09 7.73091 5.47488 0.417314 -1.66293e-09 -2.09227e-09 -1.63191e-09 2.90554 0.965183 0.102902 -1.66292e-09 -2.09227e-09 -1.63191e-09 10.2786 0.731801 0.0259123 -1.66293e-09 -2.09228e-09 -1.6319e-09 2.22167 -0.733487 -0.20892 -2.57106e-13 -6.6016e-13 -8.74148e-15 -42.9642 -29.6908 -37.5855 7.24402 -2.62653 -12.7265 2.03055 36.937 -6.067 -2.13567e-09 2.19263e-08 1.88498e-09 -3.62276e-09 3.71802e-08 3.31366e-09 -2.13568e-09 2.19263e-08 1.88499e-09 -7.73091 5.47488 -0.417314 -2.13567e-09 2.19263e-08 1.88499e-09 -2.90554 0.965183 -0.102902 -2.13568e-09 2.19263e-08 1.88498e-09 -10.2786 0.731801 -0.0259123 -2.13566e-09 2.19263e-08 1.88498e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.67786 -61.5779 -18.8446 -0.455424 43.9975 0.631597 -1.02248 20.2519 2.04655 2.03217e-16 0.0 3.88251e-19 14.4425 -33.2564 33.8113 0.355321 44.9392 -1.3098 13.9815 -21.4049 29.2325
-9.15335 83.485 65.2405 217.909 79.4907 -124.345 11.5677 -9.99321 12.7132 -2.21036 -12.5736 3.60349 2.91595 1.55619 8.5924 0.986037 2.43957 17.0675 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.8389e-13 -5.42251e-13 1.42348e-14 -142.449 -78.402 -166.288 -7.3642 -2.68636 12.9437 -149.035 68.9842 158.413 -1.2479e-09 2.54577e-09 -1.31438e-09 -2.1702e-09 4.63697e-09 -2.03069e-09 -1.24789e-09 2.54578e-09 -1.31439e-09 7.73091 5.47488 0.417314 -1.2479e-09 2.54577e-09 -1.31438e-09 2.90554 0.965183 0.102902 -1.24789e-09 2.54577e-09 -1.31438e-09 10.2786 0.731801 0.0259123 -1.2479e-09 2.54576e-09 -1.31437e-09 2.22167 -0.733487 -0.20892 -1.84026e-13 -5.42256e-13 1.4005e-14 -43.411 -28.7226 -38.9233 7.26235 -2.63417 -12.7616 1.95692 36.3342 -5.9375 -1.13383e-09 1.33836e-08 1.41757e-09 -1.9106e-09 2.26915e-08 2.47893e-09 -1.13383e-09 1.33836e-08 1.41758e-09 -7.73091 5.47488 -0.417314 -1.13383e-09 1.33836e-08 1.41757e-09 -2.90554 0.965183 -0.102902 -1.13383e-09 1.33836e-08 1.41757e-09 -10.2786 0.731801 -0.0259123 -1.13382e-09 1.33836e-08 1.41756e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.74138 -62.7851 -23.4546 -0.521333 46.4229 0.703097 -0.213944 20.8169 -0.813999 2.03217e-16 0.0 3.88251e-19 13.5163 -32.6747 30.9164 0.326458 43.9497 -1.29607 13.2219 -19.5921 29.559
-8.83498 84.1313 65.1169 241.516 82.0549 -100.846 12.3884 -10.1439 12.1097 -2.62864 -12.5406 3.35573 2.4449 1.48899 7.49478 1.85806 2.52414 14.9574 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.1151e-13 -4.4837e-13 1.83919e-14 -144.776 -82.1428 -168.53 -7.12724 -2.56886 12.5152 -146.603 70.9727 155.822 -6.6278e-10 3.81166e-09 -8.49314e-10 -1.16102e-09 6.92821e-09 -1.32817e-09 -6.62776e-10 3.81165e-09 -8.49324e-10 7.73091 5.47488 0.417314 -6.62781e-10 3.81166e-09 -8.49313e-10 2.90554 0.965183 0.102902 -6.6277e-10 3.81167e-09 -8.4931e-10 10.2786 0.731801 0.0259123 -6.62785e-10 3.81164e-09 -8.49301e-10 2.22167 -0.733487 -0.20892 -1.11603e-13 -4.48372e-13 1.81573e-14 -43.5122 -27.468 -40.0229 7.33627 -2.67072 -12.8957 1.83385 35.3517 -5.72658 -1.4843e-10 4.87077e-09 5.88325e-10 -2.37339e-10 8.24084e-09 1.01974e-09 -1.48432e-10 4.87076e-09 5.88337e-10 -7.73091 5.47488 -0.417314 -1.48429e-10 4.87077e-09 5.88326e-10 -2.90554 0.965183 -0.102902 -1.48437e-10 4.87077e-09 5.88323e-10 -10.2786 0.731801 -0.0259123 -1.48416e-10 4.87077e-09 5.88319e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.92194 -64.002 -27.8163 -0.606424 49.1125 0.790556 0.687152 21.4838 -3.78749 2.03217e-16 0.0 3.88251e-19 12.4687 -32.104 27.7735 0.29803 42.991 -1.28828 12.487 -17.8674 29.9345
-8.22702 84.79 65.214 277.243 80.1086 -64.1459 12.5753 -10.3252 11.4432 -2.90974 -12.5035 3.11924 1.76685 1.35309 6.33677 2.97152 2.71706 12.7742 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.44957e-14 -4.27189e-13 6.21202e-14 -151.65 -86.4856 -175.177 -6.85452 -2.43844 12.021 -142.187 73.7437 151.185 -6.5911e-10 -5.22973e-09 -3.10782e-10 -1.13022e-09 -9.12675e-09 -4.46692e-10 -6.5911e-10 -5.22976e-09 -3.10791e-10 7.73091 5.47488 0.417314 -6.5911e-10 -5.22973e-09 -3.10782e-10 2.90554 0.965183 0.102902 -6.59099e-10 -5.22973e-09 -3.10778e-10 10.2786 0.731801 0.0259123 -6.59115e-10 -5.22975e-09 -3.10769e-10 2.22167 -0.733487 -0.20892 -4.45628e-14 -4.27188e-13 6.18717e-14 -43.159 -25.846 -40.8335 7.49304 -2.75164 -13.177 1.66081 33.9707 -5.43355 2.02278e-10 -7.39471e-10 -9.7484e-12 3.49178e-10 -1.2735e-09 -2.47908e-11 2.02276e-10 -7.39477e-10 -9.73568e-12 -7.73091 5.47488 -0.417314 2.02279e-10 -7.39471e-10 -9.7484e-12 -2.90554 0.965183 -0.102902 2.02271e-10 -7.39471e-10 -9.75158e-12 -10.2786 0.731801 -0.0259123 2.02293e-10 -7.39472e-10 -9.75476e-12 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -9.20514 -65.1712 -32.5092 -0.718813 52.0597 0.899177 1.69075 22.9493 -6.58133 2.03217e-16 0.0 3.88251e-19 11.0568 -31.5989 24.8614 0.270691 42.0936 -1.28725 11.7874 -16.4014 30.1809
-7.89187 85.0082 64.4282 308.632 80.4779 -32.6943 11.785 -10.5812 10.6474 -3.03048 -12.4561 2.88542 0.784192 1.07308 5.08784 4.50032 3.07094 10.4829 -0.0 0.0 0.0 -0.0 0.0 0.0 2.34337e-14 -5.427e-13 1.80019e-13 71.7745 -88.7315 48.6509 -6.46835 -2.26145 11.3204 -134.273 76.7831 142.972 -1.69958e-09 -3.51133e-08 4.1572e-10 -2.8523e-09 -6.22339e-08 8.46193e-10 -1.69958e-09 -3.51133e-08 4.15712e-10 7.73091 5.47488 0.417314 -1.69958e-09 -3.51133e-08 4.15721e-10 2.90554 0.965183 0.102902 -1.69957e-09 -3.51133e-08 4.15725e-10 10.2786 0.731801 0.0259123 -1.69958e-09 -3.51133e-08 4.15732e-10 2.22167 -0.733487 -0.20892 2.33692e-14 -5.42697e-13 1.79735e-13 -41.9363 -23.4383 -41.2572 7.80014 -2.91325 -13.729 1.39107 31.6738 -4.9638 -5.12083e-10 -2.1214e-09 -3.08211e-10 -8.90665e-10 -3.59247e-09 -5.26656e-10 -5.12087e-10 -2.1214e-09 -3.082e-10 -7.73091 5.47488 -0.417314 -5.12083e-10 -2.1214e-09 -3.08212e-10 -2.90554 0.965183 -0.102902 -5.1209e-10 -2.1214e-09 -3.08214e-10 -10.2786 0.731801 -0.0259123 -5.1207e-10 -2.1214e-09 -3.08219e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.3579 -66.3382 -38.0866 -0.867178 55.3562 1.03864 2.9401 25.6795 -9.11078 2.03217e-16 0.0 3.88251e-19 8.91373 -31.2603 22.1503 0.24298 41.2416 -1.29694 11.1255 -15.2318 30.2262
-7.57993 85.4431 64.2208 323.834 77.036 -17.2916 10.3609 -10.8848 9.78679 -3.06909 -12.3923 2.65681 -0.442155 0.723043 3.73446 6.33337 3.50065 8.0409 -0.0 0.0 0.0 -0.0 0.0 0.0 9.22769e-14 -7.51936e-13 3.34707e-13 45.2999 -84.188 22.7296 -5.98334 -2.04324 10.4485 -120.192 79.5991 128.546 -3.29594e-09 -7.92451e-08 1.32495e-09 -5.50958e-09 -1.40699e-07 2.4927e-09 -3.29594e-09 -7.92451e-08 1.32494e-09 7.73091 5.47488 0.417314 -3.29594e-09 -7.92451e-08 1.32495e-09 2.90554 0.965183 0.102902 -3.29593e-09 -7.92451e-08 1.32495e-09 10.2786 0.731801 0.0259123 -3.29594e-09 -7.92451e-08 1.32496e-09 2.22167 -0.733487 -0.20892 9.22013e-14 -7.51932e-13 3.34371e-13 -40.0556 -20.4466 -41.4579 8.21834 -3.13503 -14.4897 1.09411 28.6376 -4.38669 -1.87328e-09 -9.93713e-10 -5.9343e-10 -3.24462e-09 -1.64614e-09 -9.90363e-10 -1.87329e-09 -9.93717e-10 -5.9342e-10 -7.73091 5.47488 -0.417314 -1.87328e-09 -9.93718e-10 -5.93432e-10 -2.90554 0.965183 -0.102902 -1.87329e-09 -9.93717e-10 -5.93431e-10 -10.2786 0.731801 -0.0259123 -1.87327e-09 -9.93717e-10 -5.9344e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.8569 -67.4628 -44.2792 -1.0653 58.9741 1.22296 4.57228 29.1864 -11.6493 2.03217e-16 0.0 3.88251e-19 6.22801 -31.0496 19.4142 0.21422 40.4268 -1.315 10.5101 -14.2612 30.1642
-7.21249 85.8503 63.8076 332.436 72.5876 -7.9745 8.8122 -11.1566 8.96121 -3.01891 -12.3303 2.4509 -1.75566 0.415919 2.35589 8.2132 3.9558 5.55713 -0.0 0.0 0.0 -0.0 0.0 0.0 1.47903e-13 -9.43141e-13 4.76373e-13 40.6202 -78.2542 18.817 -5.55981 -1.85463 9.69609 -89.5936 81.7405 97.5709 -4.77332e-09 -1.18867e-07 2.16319e-09 -7.97265e-09 -2.11205e-07 4.01314e-09 -4.77332e-09 -1.18867e-07 2.16319e-09 7.73091 5.47488 0.417314 -4.77333e-09 -1.18867e-07 2.1632e-09 2.90554 0.965183 0.102902 -4.77332e-09 -1.18867e-07 2.1632e-09 10.2786 0.731801 0.0259123 -4.77332e-09 -1.18867e-07 2.1632e-09 2.22167 -0.733487 -0.20892 1.47811e-13 -9.43137e-13 4.75992e-13 -38.3343 -17.6997 -41.6857 8.61826 -3.34823 -15.2279 0.8826 25.8885 -3.90299 -3.22663e-09 9.49794e-10 -8.04626e-10 -5.58273e-09 1.68027e-09 -1.32552e-09 -3.22664e-09 9.49791e-10 -8.04618e-10 -7.73091 5.47488 -0.417314 -3.22663e-09 9.49787e-10 -8.04628e-10 -2.90554 0.965183 -0.102902 -3.22664e-09 9.49787e-10 -8.04626e-10 -10.2786 0.731801 -0.0259123 -3.22662e-09 9.49787e-10 -8.04638e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -21.5491 -68.4032 -50.2366 -1.33442 62.7277 1.46929 6.62155 32.7345 -14.4552 2.03217e-16 0.0 3.88251e-19 3.56058 -30.8739 16.8324 0.186769 39.6909 -1.33311 9.97274 -13.4525 30.0638
-6.94432 86.1135 63.051 339.313 67.8481 -0.3069 7.654 -11.3173 8.2715 -2.87364 -12.2887 2.28513 -2.98738 0.265457 1.03111 9.87087 4.38513 3.14078 -0.0 0.0 0.0 -0.0 0.0 0.0 1.76181e-13 -1.00456e-12 5.55206e-13 37.5481 -69.9895 16.9002 -5.36524 -1.76822 9.3536 -42.9018 79.6692 50.4427 -5.45685e-09 -1.35221e-07 2.67675e-09 -9.11212e-09 -2.40433e-07 4.92784e-09 -5.45685e-09 -1.35221e-07 2.67675e-09 7.73091 5.47488 0.417314 -5.45685e-09 -1.35221e-07 2.67675e-09 2.90554 0.965183 0.102902 -5.45685e-09 -1.35221e-07 2.67675e-09 10.2786 0.731801 0.0259123 -5.45685e-09 -1.35221e-07 2.67676e-09 2.22167 -0.733487 -0.20892 1.76077e-13 -1.00456e-12 5.54808e-13 -37.5669 -16.0046 -42.0491 8.87715 -3.48645 -15.7121 0.794665 24.4587 -3.66518 -3.91746e-09 2.01533e-09 -8.8102e-10 -6.77506e-09 3.5015e-09 -1.44174e-09 -3.91747e-09 2.01533e-09 -8.81014e-10 -7.73091 5.47488 -0.417314 -3.91746e-09 2.01532e-09 -8.81023e-10 -2.90554 0.965183 -0.102902 -3.91747e-09 2.01532e-09 -8.81019e-10 -10.2786 0.731801 -0.0259123 -3.91745e-09 2.01532e-09 -8.81033e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -25.0105 -69.1674 -54.8613 -1.70124 66.4311 1.80039 9.02565 35.5793 -17.7087 2.03217e-16 0.0 3.88251e-19 1.48608 -30.652 14.5942 0.163612 39.0759 -1.34332 9.53984 -12.7717 29.9945
-6.60209 86.4235 63.0839 340.514 62.1737 1.409 7.06554 -11.3435 7.73768 -2.58063 -12.2862 2.16696 -4.08027 0.303044 -0.21318 11.2143 4.7945 0.83945 -0.0 0.0 0.0 -0.0 0.0 0.0 1.70628e-13 -8.70355e-13 5.42322e-13 34.2974 -57.9569 15.7522 -5.43187 -1.78975 9.48134 -15.4776 70.5418 22.3344 -4.92503e-09 -1.15462e-07 2.74989e-09 -8.22438e-09 -2.0564e-07 5.01217e-09 -4.92502e-09 -1.15462e-07 2.74989e-09 7.73091 5.47488 0.417314 -4.92503e-09 -1.15462e-07 2.74989e-09 2.90554 0.965183 0.102902 -4.92503e-09 -1.15462e-07 2.7499e-09 10.2786 0.731801 0.0259123 -4.92503e-09 -1.15462e-07 2.7499e-09 2.22167 -0.733487 -0.20892 1.70515e-13 -8.70351e-13 5.41953e-13 -38.3544 -15.8225 -42.5492 8.93051 -3.51407 -15.8136 0.837427 25.0822 -3.77097 -3.56306e-09 1.78026e-09 -7.41519e-10 -6.15939e-09 3.09349e-09 -1.20683e-09 -3.56307e-09 1.78026e-09 -7.41513e-10 -7.73091 5.47488 -0.417314 -3.56306e-09 1.78026e-09 -7.41523e-10 -2.90554 0.965183 -0.102902 -3.56307e-09 1.78026e-09 -7.41518e-10 -10.2786 0.731801 -0.0259123 -3.56306e-09 1.78026e-09 -7.4153e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -26.3299 -69.9621 -57.3254 -2.22519 70.082 2.26133 11.9386 37.4123 -21.8858 2.03217e-16 0.0 3.88251e-19 0.24956 -30.404 12.8496 0.147139 38.6374 -1.34604 9.22755 -12.3078 29.8312
-6.38582 86.6495 62.8395 342.426 56.8338 3.8025 6.76399 -11.2785 7.3093 -2.16059 -12.3083 2.08607 -5.11341 0.468237 -1.42118 12.3921 5.20176 -1.41179 -0.0 0.0 0.0 -0.0 0.0 0.0 1.39686e-13 -6.12141e-13 4.69489e-13 30.7693 -43.1867 15.6294 -5.67646 -1.88554 9.93001 -5.7773 57.0454 11.606 -3.6183e-09 -7.22084e-08 2.53395e-09 -6.04592e-09 -1.29215e-07 4.55419e-09 -3.61829e-09 -7.22084e-08 2.53395e-09 7.73091 5.47488 0.417314 -3.6183e-09 -7.22084e-08 2.53395e-09 2.90554 0.965183 0.102902 -3.6183e-09 -7.22084e-08 2.53396e-09 10.2786 0.731801 0.0259123 -3.6183e-09 -7.22084e-08 2.53396e-09 2.22167 -0.733487 -0.20892 1.39563e-13 -6.12138e-13 4.69178e-13 -40.175 -16.6012 -43.0854 8.85746 -3.47357 -15.678 0.980097 27.0564 -4.11144 -2.58197e-09 1.13827e-09 -4.40167e-10 -4.45864e-09 1.97993e-09 -7.05025e-10 -2.58197e-09 1.13827e-09 -4.4016e-10 -7.73091 5.47488 -0.417314 -2.58197e-09 1.13827e-09 -4.40172e-10 -2.90554 0.965183 -0.102902 -2.58198e-09 1.13827e-09 -4.40166e-10 -10.2786 0.731801 -0.0259123 -2.58197e-09 1.13827e-09 -4.40175e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -26.1452 -70.8977 -58.1293 -2.99664 73.7625 2.94838 15.2817 38.5512 -26.6937 2.03217e-16 0.0 3.88251e-19 -0.507516 -30.1941 11.4574 0.13561 38.3383 -1.34476 9.01956 -12.045 29.5791
-6.33538 86.805 62.4 344.875 51.5345 6.6197 6.5739 -11.1433 6.98197 -1.71725 -12.3243 2.03322 -6.1151 0.73688 -2.62027 13.4853 5.57335 -3.67173 -0.0 0.0 0.0 -0.0 0.0 0.0 9.16092e-14 -3.24341e-13 3.77866e-13 27.1929 -28.3467 16.5308 -6.09326 -2.06895 10.6757 -2.45132 42.8239 7.05799 -2.15469e-09 -2.48986e-08 2.17581e-09 -3.6075e-09 -4.55386e-08 3.84327e-09 -2.15469e-09 -2.48986e-08 2.17581e-09 7.73091 5.47488 0.417314 -2.15469e-09 -2.48986e-08 2.17581e-09 2.90554 0.965183 0.102902 -2.15469e-09 -2.48986e-08 2.17581e-09 10.2786 0.731801 0.0259123 -2.15469e-09 -2.48986e-08 2.17582e-09 2.22167 -0.733487 -0.20892 9.14802e-14 -3.2434e-13 3.7762e-13 -42.1223 -17.6294 -43.5587 8.75349 -3.41687 -15.4846 1.17077 29.2616 -4.51212 -1.52137e-09 3.70011e-10 -1.18892e-10 -2.62062e-09 6.47199e-10 -1.70579e-10 -1.52137e-09 3.70014e-10 -1.18884e-10 -7.73091 5.47488 -0.417314 -1.52137e-09 3.70014e-10 -1.18898e-10 -2.90554 0.965183 -0.102902 -1.52138e-09 3.70015e-10 -1.18891e-10 -10.2786 0.731801 -0.0259123 -1.52137e-09 3.70014e-10 -1.18897e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -25.2818 -71.8696 -58.0915 -4.17538 77.4129 4.04787 18.4597 39.3351 -31.0436 2.03217e-16 0.0 3.88251e-19 -1.09899 -30.003 10.1791 0.126174 38.0809 -1.33643 8.88726 -11.7959 29.5054
-6.33638 86.9546 62.0797 346.772 45.9004 8.7004 6.31856 -10.9591 6.75103 -1.35424 -12.3036 1.9992 -7.11535 1.08456 -3.83789 14.5712 5.87522 -5.99867 -0.0 0.0 0.0 -0.0 0.0 0.0 3.4653e-14 -1.01381e-13 3.08613e-13 24.0756 -16.04 18.183 -6.67347 -2.35247 11.6946 -1.3254 30.8096 4.80766 -1.15223e-09 7.02873e-09 1.82234e-09 -1.93985e-09 1.1009e-08 3.16879e-09 -1.15223e-09 7.02873e-09 1.82234e-09 7.73091 5.47488 0.417314 -1.15223e-09 7.02873e-09 1.82234e-09 2.90554 0.965183 0.102902 -1.15223e-09 7.02873e-09 1.82235e-09 10.2786 0.731801 0.0259123 -1.15223e-09 7.02873e-09 1.82236e-09 2.22167 -0.733487 -0.20892 3.45264e-14 -1.01381e-13 3.08414e-13 -43.2576 -18.2154 -43.8308 8.71491 -3.39621 -15.4126 1.30327 30.5823 -4.7643 -9.28434e-10 -2.43844e-10 8.03758e-11 -1.5931e-09 -4.18313e-10 1.62264e-10 -9.28436e-10 -2.43839e-10 8.03853e-11 -7.73091 5.47488 -0.417314 -9.28432e-10 -2.43838e-10 8.03694e-11 -2.90554 0.965183 -0.102902 -9.28443e-10 -2.43837e-10 8.03766e-11 -10.2786 0.731801 -0.0259123 -9.28438e-10 -2.43838e-10 8.03726e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.7112 -72.7447 -58.1714 -6.18928 80.9707 6.01434 20.8972 40.2873 -33.9103 2.03217e-16 0.0 3.88251e-19 -1.82949 -29.7989 8.77989 0.116073 37.7675 -1.3181 8.79782 -11.3755 29.8791
-6.31592 87.0775 61.9228 347.825 40.155 9.9287 5.95572 -10.6869 6.63719 -1.08744 -12.2005 1.98898 -8.12918 1.45866 -5.10281 15.6515 6.13756 -8.43503 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.82764e-14 2.56865e-14 2.72839e-13 21.7344 -6.85289 20.345 -7.45041 -2.74797 13.0796 -0.753748 21.6865 3.37037 -6.78107e-10 1.60945e-08 1.44162e-09 -1.1486e-09 2.72886e-08 2.4876e-09 -6.78104e-10 1.60945e-08 1.44162e-09 7.73091 5.47488 0.417314 -6.78107e-10 1.60945e-08 1.44162e-09 2.90554 0.965183 0.102902 -6.78106e-10 1.60945e-08 1.44163e-09 10.2786 0.731801 0.0259123 -6.78111e-10 1.60945e-08 1.44163e-09 2.22167 -0.733487 -0.20892 -4.8387e-14 2.5684e-14 2.72666e-13 -43.2779 -18.2363 -43.82 8.76621 -3.42474 -15.507 1.3157 30.6748 -4.7836 -1.19846e-09 -8.47452e-10 5.99029e-11 -2.06083e-09 -1.46896e-09 1.32812e-10 -1.19847e-09 -8.47449e-10 5.99137e-11 -7.73091 5.47488 -0.417314 -1.19846e-09 -8.47446e-10 5.98968e-11 -2.90554 0.965183 -0.102902 -1.19847e-09 -8.47447e-10 5.99044e-11 -10.2786 0.731801 -0.0259123 -1.19847e-09 -8.47447e-10 5.99003e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.5235 -73.5089 -58.4148 -10.7482 84.4782 10.5688 22.1453 41.6998 -34.7073 2.03217e-16 0.0 3.88251e-19 -2.79993 -29.5777 7.14064 0.106325 37.3848 -1.28093 8.61021 -10.3715 31.0749
-6.24465 87.1732 61.7154 348.179 34.5072 10.7774 5.57694 -10.3308 6.63562 -0.865586 -12.0439 2.00499 -9.13025 1.88615 -6.39373 16.6856 6.36157 -10.9403 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.5515e-13 1.09179e-13 2.48546e-13 19.6959 0.544743 22.8777 -8.39549 -3.23887 14.8121 -0.32853 14.1438 2.16971 -4.35248e-10 1.34311e-08 9.79012e-10 -7.40423e-10 2.29601e-08 1.68547e-09 -4.35245e-10 1.34311e-08 9.79013e-10 7.73091 5.47488 0.417314 -4.35248e-10 1.34311e-08 9.79014e-10 2.90554 0.965183 0.102902 -4.35247e-10 1.34311e-08 9.79017e-10 10.2786 0.731801 0.0259123 -4.35252e-10 1.34311e-08 9.79024e-10 2.22167 -0.733487 -0.20892 -1.55235e-13 1.09173e-13 2.48391e-13 -42.6953 -18.0456 -43.6105 8.85623 -3.47479 -15.6733 1.26481 30.1504 -4.68386 -1.9565e-09 -1.5175e-09 -8.4653e-11 -3.37432e-09 -2.63681e-09 -1.01261e-10 -1.95651e-09 -1.5175e-09 -8.46409e-11 -7.73091 5.47488 -0.417314 -1.9565e-09 -1.5175e-09 -8.46584e-11 -2.90554 0.965183 -0.102902 -1.95651e-09 -1.5175e-09 -8.46507e-11 -10.2786 0.731801 -0.0259123 -1.95651e-09 -1.5175e-09 -8.4656e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.1753 -74.2272 -58.2952 -29.9969 87.8149 29.8393 22.3957 43.4285 -33.9864 2.03217e-16 0.0 3.88251e-19 -3.83981 -29.35 5.40606 0.0984491 36.9806 -1.22956 8.32422 -9.03009 32.8506
-6.22219 87.3163 61.4763 348.447 28.914 11.5426 5.20551 -9.97632 6.70306 -0.691397 -11.9147 2.03423 -10.0821 2.46131 -7.66357 17.6733 6.47244 -13.4467 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.49029e-13 1.79728e-13 2.2724e-13 17.8168 6.55726 25.5345 -9.40923 -3.79497 16.7014 -0.0634936 7.93911 1.16666 -4.9528e-10 7.51692e-09 5.47324e-10 -8.47693e-10 1.2842e-08 9.45152e-10 -4.95277e-10 7.51692e-09 5.47325e-10 7.73091 5.47488 0.417314 -4.9528e-10 7.51692e-09 5.47325e-10 2.90554 0.965183 0.102902 -4.95278e-10 7.51692e-09 5.47329e-10 10.2786 0.731801 0.0259123 -4.95283e-10 7.51692e-09 5.47333e-10 2.22167 -0.733487 -0.20892 -2.49087e-13 1.79719e-13 2.27092e-13 -41.7786 -17.672 -43.2849 8.96841 -3.53759 -15.8809 1.18692 29.3285 -4.52935 -2.59435e-09 -1.87213e-09 -2.05134e-10 -4.48002e-09 -3.255e-09 -2.96653e-10 -2.59436e-09 -1.87213e-09 -2.0512e-10 -7.73091 5.47488 -0.417314 -2.59435e-09 -1.87212e-09 -2.05138e-10 -2.90554 0.965183 -0.102902 -2.59436e-09 -1.87213e-09 -2.05131e-10 -10.2786 0.731801 -0.0259123 -2.59435e-09 -1.87212e-09 -2.05138e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -23.8794 -74.8816 -58.1047 -142.038 88.1196 141.915 22.1083 45.3765 -32.5041 2.03217e-16 0.0 3.88251e-19 -4.84166 -29.1046 3.73926 0.0901795 36.5491 -1.18121 8.19912 -8.11662 34.5412
-6.16942 87.4048 61.2597 348.643 22.8541 12.4205 4.8659 -9.70878 6.79624 -0.567343 -11.8939 2.06375 -10.942 3.27745 -8.86632 18.6004 6.40041 -15.8848 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.92974e-13 2.67966e-13 2.00425e-13 15.9818 11.6103 28.1083 -10.4014 -4.38889 18.5564 -0.00979797 2.82501 0.397355 -9.29829e-10 6.83045e-09 2.59365e-10 -1.60278e-09 1.17531e-08 4.49384e-10 -9.29826e-10 6.83046e-09 2.59365e-10 7.73091 5.47488 0.417314 -9.2983e-10 6.83046e-09 2.59365e-10 2.90554 0.965183 0.102902 -9.29826e-10 6.83046e-09 2.59369e-10 10.2786 0.731801 0.0259123 -9.29832e-10 6.83046e-09 2.59371e-10 2.22167 -0.733487 -0.20892 -2.93013e-13 2.67957e-13 2.00276e-13 -40.797 -17.1448 -42.927 9.08636 -3.60442 -16.0991 1.11447 28.5289 -4.38162 -2.50382e-09 -1.52945e-09 -1.53382e-10 -4.32439e-09 -2.6567e-09 -2.10061e-10 -2.50382e-09 -1.52945e-09 -1.53366e-10 -7.73091 5.47488 -0.417314 -2.50382e-09 -1.52945e-09 -1.53385e-10 -2.90554 0.965183 -0.102902 -2.50383e-09 -1.52945e-09 -1.53378e-10 -10.2786 0.731801 -0.0259123 -2.50382e-09 -1.52945e-09 -1.53385e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -23.9053 -75.4537 -58.1928 -165.097 85.2798 165.01 21.8517 47.4359 -31.0941 2.03217e-16 0.0 3.88251e-19 -5.70062 -28.8383 2.30229 0.0786405 36.0844 -1.15272 8.60874 -8.337 35.474
-6.08488 87.3815 60.9887 348.993 16.4974 13.314 4.54305 -9.55732 6.94413 -0.494045 -12.0715 2.10119 -11.6786 4.43839 -10.0103 19.3839 6.13954 -18.2836 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.58319e-13 4.08136e-13 1.43352e-13 14.5002 15.6848 30.4167 -11.3564 -5.01125 20.361 -0.0651907 -0.929748 -0.115469 -2.06562e-09 1.53648e-08 2.3678e-10 -3.57194e-09 2.66065e-08 4.06689e-10 -2.06561e-09 1.53648e-08 2.36776e-10 7.73091 5.47488 0.417314 -2.06562e-09 1.53648e-08 2.36777e-10 2.90554 0.965183 0.102902 -2.06561e-09 1.53648e-08 2.36781e-10 10.2786 0.731801 0.0259123 -2.06562e-09 1.53648e-08 2.36784e-10 2.22167 -0.733487 -0.20892 -2.58348e-13 4.08129e-13 1.43189e-13 -39.797 -16.4256 -42.5515 9.18792 -3.66137 -16.2888 1.05621 27.8428 -4.25732 -1.04289e-09 4.93214e-10 2.03554e-10 -1.79632e-09 8.67969e-10 3.74874e-10 -1.0429e-09 4.93214e-10 2.03573e-10 -7.73091 5.47488 -0.417314 -1.04289e-09 4.93217e-10 2.03552e-10 -2.90554 0.965183 -0.102902 -1.0429e-09 4.93212e-10 2.03558e-10 -10.2786 0.731801 -0.0259123 -1.04289e-09 4.93215e-10 2.03552e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.2226 -75.9463 -58.4998 -170.217 82.5722 170.168 21.7226 49.6963 -29.8419 2.03217e-16 0.0 3.88251e-19 -6.4168 -28.535 1.11951 0.0605442 35.5484 -1.15441 9.96225 -10.3954 35.2414
-6.18331 87.6287 61.1408 348.82 11.5886 13.9274 4.23074 -9.47424 7.15611 -0.469727 -12.3816 2.14992 -12.2971 5.86253 -11.1201 20.0245 5.73316 -20.6614 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.71036e-13 5.7521e-13 6.80465e-14 13.6502 18.7324 32.4224 -12.3087 -5.66967 22.2082 -0.071247 -3.29735 -0.450211 -3.7619e-09 2.80208e-08 3.88884e-10 -6.50758e-09 4.85119e-08 6.6634e-10 -3.7619e-09 2.80208e-08 3.88875e-10 7.73091 5.47488 0.417314 -3.7619e-09 2.80208e-08 3.88876e-10 2.90554 0.965183 0.102902 -3.7619e-09 2.80208e-08 3.88882e-10 10.2786 0.731801 0.0259123 -3.76191e-09 2.80208e-08 3.88886e-10 2.22167 -0.733487 -0.20892 -1.71059e-13 5.75207e-13 6.78601e-14 -38.6532 -15.5081 -42.1285 9.28773 -3.71695 -16.4767 0.996603 27.0976 -4.12467 1.30412e-09 3.69858e-09 7.55509e-10 2.26556e-09 6.45267e-09 1.2779e-09 1.30411e-09 3.69858e-09 7.55533e-10 -7.73091 5.47488 -0.417314 1.30412e-09 3.69859e-09 7.55509e-10 -2.90554 0.965183 -0.102902 1.30411e-09 3.69858e-09 7.55514e-10 -10.2786 0.731801 -0.0259123 1.30412e-09 3.69858e-09 7.5551e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.7368 -76.3657 -58.9038 -172.426 80.0863 172.425 21.3329 52.1713 -28.2745 2.03217e-16 0.0 3.88251e-19 -7.04028 -28.2111 0.109343 0.0372857 34.9566 -1.17483 11.9018 -13.7971 34.3704
-6.12246 87.6382 61.0215 348.553 5.7949 14.8437 3.96822 -9.4295 7.35965 -0.493609 -12.6709 2.19036 -12.8191 7.36667 -12.1736 20.6277 5.19143 -22.9325 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.61464e-14 7.10912e-13 2.11737e-14 13.1777 21.1079 34.2185 -13.2521 -6.36581 24.0703 -0.0483089 -4.89057 -0.68371 -5.38912e-09 3.96382e-08 5.09988e-10 -9.32133e-09 6.8582e-08 8.7221e-10 -5.38912e-09 3.96382e-08 5.09975e-10 7.73091 5.47488 0.417314 -5.38912e-09 3.96382e-08 5.09977e-10 2.90554 0.965183 0.102902 -5.38911e-09 3.96382e-08 5.09983e-10 10.2786 0.731801 0.0259123 -5.38913e-09 3.96382e-08 5.09988e-10 2.22167 -0.733487 -0.20892 -7.61696e-14 7.10914e-13 2.0957e-14 -37.3728 -14.473 -41.6716 9.42429 -3.7959 -16.7308 0.927406 26.2174 -3.9696 3.45593e-09 6.24857e-09 1.28597e-09 5.99026e-09 1.08999e-08 2.14739e-09 3.45592e-09 6.24857e-09 1.28599e-09 -7.73091 5.47488 -0.417314 3.45593e-09 6.24857e-09 1.28597e-09 -2.90554 0.965183 -0.102902 3.45592e-09 6.24857e-09 1.28597e-09 -10.2786 0.731801 -0.0259123 3.45593e-09 6.24857e-09 1.28597e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -25.6863 -76.6975 -59.7264 -173.639 77.8382 173.69 20.67 54.652 -26.4943 2.03217e-16 0.0 3.88251e-19 -7.54677 -27.9169 -0.727701 0.0130742 34.383 -1.19813 13.756 -17.3742 33.5253
-6.08786 88.0184 61.0946 348.181 0.5217 15.6047 3.79465 -9.39325 7.48228 -0.565691 -12.786 2.20267 -13.2829 8.77116 -13.1435 21.3035 4.52541 -25.0124 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.867e-14 7.5697e-13 4.9398e-14 12.7383 23.1198 35.9593 -14.1813 -7.10164 25.9195 -0.0492762 -6.32231 -0.892203 -6.3177e-09 4.50569e-08 3.94405e-10 -1.09248e-08 7.793e-08 6.6817e-10 -6.31769e-09 4.50569e-08 3.94389e-10 7.73091 5.47488 0.417314 -6.3177e-09 4.50569e-08 3.94392e-10 2.90554 0.965183 0.102902 -6.31769e-09 4.50569e-08 3.94398e-10 10.2786 0.731801 0.0259123 -6.31771e-09 4.50569e-08 3.94405e-10 2.22167 -0.733487 -0.20892 -1.87028e-14 7.56974e-13 4.91495e-14 -35.9605 -13.4016 -41.1887 9.63519 -3.92261 -17.1192 0.842507 25.1263 -3.77927 4.33124e-09 6.30509e-09 1.57841e-09 7.50676e-09 1.10123e-08 2.63174e-09 4.33124e-09 6.30509e-09 1.57844e-09 -7.73091 5.47488 -0.417314 4.33124e-09 6.30509e-09 1.57841e-09 -2.90554 0.965183 -0.102902 4.33123e-09 6.30509e-09 1.57842e-09 -10.2786 0.731801 -0.0259123 4.33124e-09 6.30509e-09 1.57841e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -27.3254 -76.9218 -61.3052 -174.395 75.8301 174.501 19.786 56.9275 -24.6422 2.03217e-16 0.0 3.88251e-19 -7.91474 -27.7019 -1.39244 -0.00700985 33.902 -1.20891 15.0412 -19.8248 33.2298
-6.09331 87.7263 61.1592 347.76 -4.8676 16.4398 3.7494 -9.36404 7.52377 -0.717161 -12.6389 2.18317 -13.7511 10.1036 -14.0326 22.1739 3.63745 -26.9129 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.28708e-14 6.61157e-13 2.29831e-13 12.4139 24.711 37.6153 -15.1088 -7.8915 27.7896 -0.0783436 -7.60762 -1.07593 -6.33741e-09 4.1235e-08 -2.18129e-10 -1.09517e-08 7.12858e-08 -3.98041e-10 -6.3374e-09 4.1235e-08 -2.18144e-10 7.73091 5.47488 0.417314 -6.3374e-09 4.1235e-08 -2.18139e-10 2.90554 0.965183 0.102902 -6.3374e-09 4.12349e-08 -2.18134e-10 10.2786 0.731801 0.0259123 -6.33741e-09 4.1235e-08 -2.18127e-10 2.22167 -0.733487 -0.20892 -2.29336e-14 6.61162e-13 2.29541e-13 -34.2171 -12.1768 -40.6371 9.976 -4.13242 -17.7478 0.7277 23.5856 -3.51514 3.06931e-09 1.34428e-09 1.54285e-09 5.32729e-09 2.39277e-09 2.59198e-09 3.0693e-09 1.34428e-09 1.54288e-09 -7.73091 5.47488 -0.417314 3.06931e-09 1.34428e-09 1.54285e-09 -2.90554 0.965183 -0.102902 3.0693e-09 1.34428e-09 1.54285e-09 -10.2786 0.731801 -0.0259123 3.06931e-09 1.34428e-09 1.54285e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -29.7484 -77.0328 -63.7457 -174.923 74.0839 175.108 18.1136 59.2157 -21.9551 2.03217e-16 0.0 3.88251e-19 -8.06466 -27.5936 -1.68056 -0.0211271 33.5215 -1.1976 15.5654 -20.4408 33.6167
-6.02839 88.1361 61.2428 347.305 -10.0283 17.3152 3.80229 -9.35567 7.51646 -0.937488 -12.3272 2.14195 -14.1958 11.4361 -14.8533 23.1259 2.5741 -28.6739 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.06517e-14 4.66781e-13 5.16029e-13 12.4476 25.8261 39.038 -16.0212 -8.71856 29.6865 -0.0949232 -8.46931 -1.19943 -5.79813e-09 3.14796e-08 -1.14944e-09 -1.00077e-08 5.43558e-08 -2.01739e-09 -5.79812e-09 3.14796e-08 -1.14945e-09 7.73091 5.47488 0.417314 -5.79813e-09 3.14796e-08 -1.14945e-09 2.90554 0.965183 0.102902 -5.79812e-09 3.14796e-08 -1.14944e-09 10.2786 0.731801 0.0259123 -5.79813e-09 3.14796e-08 -1.14944e-09 2.22167 -0.733487 -0.20892 -6.07601e-14 4.66786e-13 5.15688e-13 -32.2193 -10.7923 -40.0408 10.406 -4.40031 -18.5518 0.604253 21.7076 -3.20328 4.37617e-10 -6.97565e-09 1.30551e-09 7.79318e-10 -1.2072e-08 2.2307e-09 4.37612e-10 -6.97564e-09 1.30553e-09 -7.73091 5.47488 -0.417314 4.3762e-10 -6.97564e-09 1.30552e-09 -2.90554 0.965183 -0.102902 4.3761e-10 -6.97564e-09 1.30551e-09 -10.2786 0.731801 -0.0259123 4.3762e-10 -6.97564e-09 1.30551e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -32.774 -77.0143 -66.8226 -175.304 72.595 175.59 15.5921 61.4856 -18.4033 2.03217e-16 0.0 3.88251e-19 -8.0406 -27.5654 -1.66357 -0.0316559 33.2059 -1.17446 15.6396 -20.0026 34.3415
-6.08338 88.082 61.4085 346.661 -15.0524 18.2933 3.88797 -9.36114 7.43668 -1.16429 -11.9758 2.07975 -14.5373 12.6604 -15.5853 23.946 1.55003 -30.2507 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.84915e-14 2.5887e-13 7.69324e-13 12.6466 26.7272 40.2737 -16.8826 -9.54308 31.5397 -0.104146 -9.08158 -1.2873 -4.91048e-09 2.01551e-08 -1.94757e-09 -8.46298e-09 3.47178e-08 -3.40407e-09 -4.91047e-09 2.01551e-08 -1.94758e-09 7.73091 5.47488 0.417314 -4.91048e-09 2.01551e-08 -1.94757e-09 2.90554 0.965183 0.102902 -4.91047e-09 2.01551e-08 -1.94757e-09 10.2786 0.731801 0.0259123 -4.91048e-09 2.01551e-08 -1.94756e-09 2.22167 -0.733487 -0.20892 -9.86395e-14 2.58874e-13 7.68941e-13 -30.3694 -9.50701 -39.4863 10.8216 -4.66148 -19.3425 0.506778 19.944 -2.9205 -2.20274e-09 -1.42197e-08 9.74206e-10 -3.78524e-09 -2.46536e-08 1.70863e-09 -2.20275e-09 -1.42197e-08 9.74216e-10 -7.73091 5.47488 -0.417314 -2.20274e-09 -1.42197e-08 9.74208e-10 -2.90554 0.965183 -0.102902 -2.20275e-09 -1.42197e-08 9.74205e-10 -10.2786 0.731801 -0.0259123 -2.20274e-09 -1.42197e-08 9.74198e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -36.1875 -76.8241 -70.3186 -175.564 71.3237 175.924 13.5929 63.2461 -15.7098 2.03217e-16 0.0 3.88251e-19 -8.00451 -27.583 -1.75507 -0.03968 32.9639 -1.15386 15.6349 -19.3776 35.1545
-6.01535 88.1104 61.485 345.762 -19.8858 19.4429 3.94104 -9.37346 7.26076 -1.33558 -11.7097 1.99711 -14.7032 13.6703 -16.2039 24.4477 0.763993 -31.5915 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.02869e-13 1.2245e-13 8.51047e-13 12.7832 27.6585 41.3988 -17.6664 -10.3325 33.2761 -0.114831 -9.61856 -1.36477 -3.88505e-09 1.16255e-08 -2.16055e-09 -6.68755e-09 1.99495e-08 -3.77225e-09 -3.88505e-09 1.16255e-08 -2.16056e-09 7.73091 5.47488 0.417314 -3.88506e-09 1.16255e-08 -2.16055e-09 2.90554 0.965183 0.102902 -3.88505e-09 1.16255e-08 -2.16055e-09 10.2786 0.731801 0.0259123 -3.88506e-09 1.16255e-08 -2.16054e-09 2.22167 -0.733487 -0.20892 -1.03029e-13 1.22452e-13 8.50649e-13 -29.0523 -8.59114 -39.0381 11.126 -4.85424 -19.9307 0.451422 18.7476 -2.73408 -3.49068e-09 -1.59527e-08 6.56737e-10 -6.0145e-09 -2.76237e-08 1.18648e-09 -3.49068e-09 -1.59527e-08 6.56743e-10 -7.73091 5.47488 -0.417314 -3.49068e-09 -1.59527e-08 6.5674e-10 -2.90554 0.965183 -0.102902 -3.49069e-09 -1.59527e-08 6.56736e-10 -10.2786 0.731801 -0.0259123 -3.49068e-09 -1.59527e-08 6.56727e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -39.7201 -76.4265 -73.9624 -175.723 70.2306 176.078 14.087 64.115 -16.1413 2.03217e-16 0.0 3.88251e-19 -8.11818 -27.61 -2.36854 -0.0466031 32.8044 -1.15002 15.9668 -19.4125 35.812
-6.01612 88.0977 61.7668 345.149 -24.4373 20.6141 3.94019 -9.36451 6.9017 -1.44176 -11.5877 1.87159 -14.6409 14.4329 -16.6925 24.5424 0.230254 -32.6672 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.10384e-14 8.89228e-14 6.4639e-13 12.8673 28.6773 42.4016 -18.3827 -11.1003 34.8852 -0.126991 -10.0725 -1.43065 -2.49524e-09 6.9263e-09 -1.32982e-09 -4.29541e-09 1.18667e-08 -2.32395e-09 -2.49523e-09 6.9263e-09 -1.32983e-09 7.73091 5.47488 0.417314 -2.49524e-09 6.9263e-09 -1.32982e-09 2.90554 0.965183 0.102902 -2.49523e-09 6.92631e-09 -1.32982e-09 10.2786 0.731801 0.0259123 -2.49524e-09 6.92631e-09 -1.32981e-09 2.22167 -0.733487 -0.20892 -5.11624e-14 8.89212e-14 6.46023e-13 -28.4221 -8.20623 -38.689 11.2961 -4.96393 -20.2604 0.433728 18.3089 -2.66693 -2.51476e-09 -9.06947e-09 3.54562e-10 -4.33469e-09 -1.55444e-08 6.51084e-10 -2.51477e-09 -9.06946e-09 3.5457e-10 -7.73091 5.47488 -0.417314 -2.51476e-09 -9.06947e-09 3.54567e-10 -2.90554 0.965183 -0.102902 -2.51477e-09 -9.06946e-09 3.54564e-10 -10.2786 0.731801 -0.0259123 -2.51476e-09 -9.06946e-09 3.54555e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -43.5023 -75.6992 -77.873 -175.792 69.3242 176.009 18.3272 64.3655 -20.9021 2.03217e-16 0.0 3.88251e-19 -8.56886 -27.6371 -3.98172 -0.0540495 32.7785 -1.18064 17.1792 -20.891 36.3465
-5.9435 88.1062 61.8875 344.108 -28.9817 21.9993 3.92192 -9.34619 6.39907 -1.51369 -11.5345 1.71036 -14.4205 15.0126 -17.0597 24.3737 -0.159814 -33.5067 -0.0 0.0 0.0 -0.0 0.0 0.0 3.45205e-14 1.10031e-13 2.55252e-13 13.0185 29.6777 43.2444 -19.0475 -11.8596 36.4038 -0.134544 -10.3687 -1.47364 -7.22959e-10 3.77285e-09 1.90898e-10 -1.25076e-09 6.49632e-09 3.25587e-10 -7.22955e-10 3.77285e-09 1.90895e-10 7.73091 5.47488 0.417314 -7.2296e-10 3.77285e-09 1.90901e-10 2.90554 0.965183 0.102902 -7.22952e-10 3.77285e-09 1.90903e-10 10.2786 0.731801 0.0259123 -7.22965e-10 3.77285e-09 1.9091e-10 2.22167 -0.733487 -0.20892 3.44632e-14 1.10024e-13 2.54948e-13 -28.2393 -8.19008 -38.3932 11.3869 -5.02483 -20.4339 0.436211 18.3638 -2.67543 -1.83738e-10 3.4239e-09 1.92811e-11 -3.1567e-10 6.33668e-09 3.53939e-11 -1.83742e-10 3.42391e-09 1.92935e-11 -7.73091 5.47488 -0.417314 -1.83737e-10 3.4239e-09 1.92898e-11 -2.90554 0.965183 -0.102902 -1.83747e-10 3.4239e-09 1.92882e-11 -10.2786 0.731801 -0.0259123 -1.83736e-10 3.4239e-09 1.92793e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -47.2254 -74.6722 -81.7369 -175.811 68.6196 175.798 25.0814 63.7684 -28.5791 2.03217e-16 0.0 3.88251e-19 -9.22648 -27.6546 -6.25266 -0.0608319 32.8653 -1.23349 18.9434 -23.1677 36.9224
-5.78249 88.1924 61.9227 342.685 -33.6254 23.6719 3.90606 -9.37209 5.91879 -1.55043 -11.4746 1.5583 -14.1532 15.4489 -17.3168 24.1152 -0.400805 -34.1403 -0.0 0.0 0.0 -0.0 0.0 0.0 1.19489e-13 1.51316e-13 -1.38973e-13 13.1489 30.643 43.9835 -19.652 -12.585 37.8262 -0.139585 -10.5807 -1.50437 9.08311e-10 1.54854e-09 1.63512e-09 1.55102e-09 2.73259e-09 2.84231e-09 9.08315e-10 1.54854e-09 1.63512e-09 7.73091 5.47488 0.417314 9.08311e-10 1.54854e-09 1.63512e-09 2.90554 0.965183 0.102902 9.08318e-10 1.54854e-09 1.63512e-09 10.2786 0.731801 0.0259123 9.08304e-10 1.54855e-09 1.63513e-09 2.22167 -0.733487 -0.20892 1.19498e-13 1.51304e-13 -1.39212e-13 -28.2936 -8.33064 -38.1524 11.422 -5.05026 -20.4985 0.449901 18.684 -2.72472 2.13324e-09 1.67949e-08 -3.16081e-10 3.67896e-09 2.97201e-08 -5.8066e-10 2.13324e-09 1.67949e-08 -3.16064e-10 -7.73091 5.47488 -0.417314 2.13324e-09 1.67949e-08 -3.16069e-10 -2.90554 0.965183 -0.102902 2.13323e-09 1.67949e-08 -3.16069e-10 -10.2786 0.731801 -0.0259123 2.13324e-09 1.67949e-08 -3.16078e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -50.264 -73.58 -84.9439 -175.819 68.0868 175.573 31.6726 61.3073 -36.6799 2.03217e-16 0.0 3.88251e-19 -9.77305 -27.6509 -8.36412 -0.0644294 32.9651 -1.27774 20.3459 -24.9435 37.3996
-5.78427 88.2041 62.1373 341.932 -37.7328 24.8153 3.91092 -9.4968 5.62658 -1.55045 -11.3325 1.46042 -13.9475 15.7807 -17.4766 23.9369 -0.485547 -34.5989 -0.0 0.0 0.0 -0.0 0.0 0.0 1.69547e-13 1.78318e-13 -3.52892e-13 13.1669 31.551 44.675 -20.1908 -13.2537 39.1452 -0.144733 -10.7819 -1.53362 1.87511e-09 -3.6316e-10 2.23635e-09 3.21457e-09 -5.30249e-10 3.89218e-09 1.87511e-09 -3.63159e-10 2.23635e-09 7.73091 5.47488 0.417314 1.87511e-09 -3.63159e-10 2.23635e-09 2.90554 0.965183 0.102902 1.87512e-09 -3.63161e-10 2.23636e-09 10.2786 0.731801 0.0259123 1.8751e-09 -3.63156e-10 2.23637e-09 2.22167 -0.733487 -0.20892 1.69591e-13 1.78302e-13 -3.53091e-13 -28.3798 -8.41219 -37.9698 11.4246 -5.05319 -20.5016 0.46635 19.0409 -2.78018 3.06701e-09 2.63109e-08 -6.185e-10 5.28562e-09 4.63063e-08 -1.11715e-09 3.067e-09 2.63109e-08 -6.18481e-10 -7.73091 5.47488 -0.417314 3.06701e-09 2.63109e-08 -6.18487e-10 -2.90554 0.965183 -0.102902 3.067e-09 2.63109e-08 -6.18487e-10 -10.2786 0.731801 -0.0259123 3.06701e-09 2.63109e-08 -6.18494e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -52.3336 -72.6868 -87.2357 -175.84 67.6963 175.451 35.131 56.4668 -42.6251 2.03217e-16 0.0 3.88251e-19 -9.88678 -27.6609 -9.49931 -0.0628496 32.9781 -1.28226 20.408 -24.9291 37.5053
-5.69132 88.2859 62.2643 340.725 -42.6502 26.5266 3.98316 -9.78268 5.60779 -1.49743 -11.0488 1.43965 -13.8599 15.9894 -17.5413 23.9102 -0.360913 -34.8986 -0.0 0.0 0.0 -0.0 0.0 0.0 1.6836e-13 1.44789e-13 -3.13939e-13 13.0536 32.3942 45.3256 -20.6685 -13.8707 40.3425 -0.149421 -10.9449 -1.55742 1.90183e-09 -1.96086e-09 1.56011e-09 3.26867e-09 -3.31026e-09 2.71976e-09 1.90183e-09 -1.96086e-09 1.5601e-09 7.73091 5.47488 0.417314 1.90183e-09 -1.96086e-09 1.56011e-09 2.90554 0.965183 0.102902 1.90184e-09 -1.96086e-09 1.56011e-09 10.2786 0.731801 0.0259123 1.90182e-09 -1.96086e-09 1.56012e-09 2.22167 -0.733487 -0.20892 1.68397e-13 1.44773e-13 -3.14131e-13 -28.4801 -8.43298 -37.845 11.3943 -5.03258 -20.4439 0.489086 19.4951 -2.85157 1.86702e-09 3.09122e-08 -9.08763e-10 3.20758e-09 5.41958e-08 -1.59748e-09 1.86701e-09 3.09123e-08 -9.08747e-10 -7.73091 5.47488 -0.417314 1.86702e-09 3.09122e-08 -9.08752e-10 -2.90554 0.965183 -0.102902 1.86701e-09 3.09122e-08 -9.08752e-10 -10.2786 0.731801 -0.0259123 1.86702e-09 3.09123e-08 -9.08757e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -53.4818 -72.1582 -88.6858 -175.874 67.4686 175.471 34.4489 48.0913 -46.7297 2.03217e-16 0.0 3.88251e-19 -9.31326 -27.7483 -9.14635 -0.0532697 32.8552 -1.22617 18.5266 -22.2459 37.1861
-5.40006 88.4577 62.3967 337.863 -47.0381 29.7172 4.10108 -10.1848 5.76087 -1.39812 -10.677 1.46826 -13.828 16.0656 -17.5024 23.9427 -0.0524335 -35.0204 -0.0 0.0 0.0 -0.0 0.0 0.0 1.36625e-13 8.14595e-14 -1.27809e-13 12.8669 33.1931 45.9004 -21.0982 -14.4553 41.4248 -0.152397 -11.0462 -1.57224 1.31299e-09 -2.971e-09 9.18702e-11 2.26835e-09 -5.10998e-09 1.69791e-10 1.31299e-09 -2.971e-09 9.18545e-11 7.73091 5.47488 0.417314 1.31299e-09 -2.971e-09 9.18701e-11 2.90554 0.965183 0.102902 1.313e-09 -2.971e-09 9.1876e-11 10.2786 0.731801 0.0259123 1.31298e-09 -2.971e-09 9.18797e-11 2.22167 -0.733487 -0.20892 1.36632e-13 8.14448e-14 -1.28014e-13 -28.6915 -8.48999 -37.777 11.3209 -4.98299 -20.3042 0.522681 20.1279 -2.95199 -6.08033e-10 3.30554e-08 -1.19462e-09 -1.07243e-09 5.77106e-08 -2.04937e-09 -6.08039e-10 3.30555e-08 -1.19461e-09 -7.73091 5.47488 -0.417314 -6.08035e-10 3.30554e-08 -1.19461e-09 -2.90554 0.965183 -0.102902 -6.08044e-10 3.30554e-08 -1.19461e-09 -10.2786 0.731801 -0.0259123 -6.08028e-10 3.30555e-08 -1.19462e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.0813 -71.8528 -89.6559 -175.901 67.41 175.562 30.6322 37.4334 -50.6194 2.03217e-16 0.0 3.88251e-19 -8.27396 -27.8853 -7.83619 -0.0369593 32.657 -1.13057 15.3872 -17.775 36.783
-5.2325 88.587 62.6267 335.626 -51.6743 32.3734 4.17934 -10.5973 5.97092 -1.28522 -10.3106 1.51535 -13.779 16.0604 -17.3575 23.9525 0.33293 -34.9429 -0.0 0.0 0.0 -0.0 0.0 0.0 9.55747e-14 6.93421e-14 1.21492e-13 12.6267 33.9646 46.3939 -21.487 -15.0061 42.4213 -0.15569 -11.1652 -1.58961 4.85319e-10 -3.6019e-09 -1.55486e-09 8.57541e-10 -6.26184e-09 -2.69159e-09 4.85322e-10 -3.6019e-09 -1.55488e-09 7.73091 5.47488 0.417314 4.85318e-10 -3.6019e-09 -1.55486e-09 2.90554 0.965183 0.102902 4.85325e-10 -3.6019e-09 -1.55485e-09 10.2786 0.731801 0.0259123 4.85313e-10 -3.6019e-09 -1.55485e-09 2.22167 -0.733487 -0.20892 9.55368e-14 6.93287e-14 1.21265e-13 -28.9831 -8.51322 -37.7671 11.2123 -4.91058 -20.0967 0.557537 20.7416 -3.05054 -3.31343e-09 3.32827e-08 -1.42348e-09 -5.74882e-09 5.78827e-08 -2.39937e-09 -3.31344e-09 3.32827e-08 -1.42348e-09 -7.73091 5.47488 -0.417314 -3.31343e-09 3.32827e-08 -1.42348e-09 -2.90554 0.965183 -0.102902 -3.31344e-09 3.32827e-08 -1.42348e-09 -10.2786 0.731801 -0.0259123 -3.31342e-09 3.32827e-08 -1.42348e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.3989 -71.5764 -90.387 -175.919 67.4701 175.673 25.3004 27.6857 -54.5736 2.03217e-16 0.0 3.88251e-19 -7.16539 -27.9931 -6.32032 -0.0186048 32.4485 -1.02701 11.8964 -12.8542 36.474
-5.10412 88.71 62.7999 332.477 -56.097 35.9484 4.12843 -10.9149 6.12197 -1.19047 -10.0429 1.55013 -13.6393 16.0243 -17.1044 23.8559 0.689788 -34.643 -0.0 0.0 0.0 -0.0 0.0 0.0 6.64378e-14 1.89448e-13 3.4996e-13 12.3522 34.725 46.8016 -21.8408 -15.52 43.3614 -0.161552 -11.3812 -1.62112 -2.04452e-10 -4.06189e-09 -2.76658e-09 -3.19817e-10 -7.09829e-09 -4.79822e-09 -2.04449e-10 -4.06188e-09 -2.76661e-09 7.73091 5.47488 0.417314 -2.04453e-10 -4.06188e-09 -2.76658e-09 2.90554 0.965183 0.102902 -2.04445e-10 -4.06188e-09 -2.76658e-09 10.2786 0.731801 0.0259123 -2.04458e-10 -4.06188e-09 -2.76658e-09 2.22167 -0.733487 -0.20892 6.63548e-14 1.89435e-13 3.49712e-13 -29.3243 -8.43261 -37.8171 11.0761 -4.82151 -19.8357 0.581368 21.1388 -3.11497 -5.20445e-09 3.21362e-08 -1.54278e-09 -9.01603e-09 5.57445e-08 -2.57403e-09 -5.20446e-09 3.21362e-08 -1.54278e-09 -7.73091 5.47488 -0.417314 -5.20446e-09 3.21362e-08 -1.54278e-09 -2.90554 0.965183 -0.102902 -5.20446e-09 3.21362e-08 -1.54278e-09 -10.2786 0.731801 -0.0259123 -5.20445e-09 3.21362e-08 -1.54278e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.6429 -71.1293 -91.0586 -175.924 67.5987 175.753 20.6736 21.2814 -57.7404 2.03217e-16 0.0 3.88251e-19 -6.39383 -28.0186 -5.35631 -0.00386291 32.2946 -0.946471 8.92547 -8.77552 36.1313
-5.0306 88.7528 63.1777 329.626 -60.8014 39.2276 3.87465 -11.0854 6.16679 -1.11156 -9.92264 1.56325 -13.4238 15.9656 -16.7254 23.6663 1.02938 -34.0884 -0.0 0.0 0.0 -0.0 0.0 0.0 5.87202e-14 5.82756e-13 5.92069e-13 12.0289 35.5052 47.0733 -22.1721 -16.0162 44.2609 -0.17171 -11.7392 -1.67349 -7.74879e-10 -4.3652e-09 -3.4751e-09 -1.29627e-09 -7.63712e-09 -6.03251e-09 -7.74877e-10 -4.36519e-09 -3.47513e-09 7.73091 5.47488 0.417314 -7.7488e-10 -4.36519e-09 -3.4751e-09 2.90554 0.965183 0.102902 -7.74872e-10 -4.36519e-09 -3.4751e-09 10.2786 0.731801 0.0259123 -7.74885e-10 -4.36519e-09 -3.4751e-09 2.22167 -0.733487 -0.20892 5.85811e-14 5.82739e-13 5.91795e-13 -29.7777 -8.27213 -37.9741 10.8842 -4.69812 -19.4676 0.586334 21.2171 -3.12778 -6.11601e-09 2.89732e-08 -1.5485e-09 -1.05881e-08 5.0213e-08 -2.56936e-09 -6.11602e-09 2.89732e-08 -1.54849e-09 -7.73091 5.47488 -0.417314 -6.11601e-09 2.89732e-08 -1.5485e-09 -2.90554 0.965183 -0.102902 -6.11602e-09 2.89732e-08 -1.5485e-09 -10.2786 0.731801 -0.0259123 -6.11601e-09 2.89732e-08 -1.5485e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.8229 -70.3782 -91.7187 -175.911 67.8284 175.794 18.0694 18.5649 -58.9292 2.03217e-16 0.0 3.88251e-19 -6.12804 -27.9401 -5.19234 0.00494144 32.2141 -0.897661 6.66146 -5.74561 35.5559
-4.87767 88.7666 63.6234 325.75 -65.2433 43.2571 3.48117 -11.1731 6.17227 -1.03496 -9.89209 1.57151 -13.1582 15.8575 -16.2278 23.4084 1.4 -33.3002 -0.0 0.0 0.0 -0.0 0.0 0.0 5.98175e-14 1.16627e-12 8.73662e-13 11.6625 36.2946 47.222 -22.4797 -16.4952 45.1 -0.185312 -12.1889 -1.73953 -1.38721e-09 -4.4145e-09 -3.97582e-09 -2.34718e-09 -7.72464e-09 -6.90749e-09 -1.38721e-09 -4.4145e-09 -3.97583e-09 7.73091 5.47488 0.417314 -1.38721e-09 -4.41449e-09 -3.97582e-09 2.90554 0.965183 0.102902 -1.3872e-09 -4.4145e-09 -3.97582e-09 10.2786 0.731801 0.0259123 -1.38722e-09 -4.4145e-09 -3.97581e-09 2.22167 -0.733487 -0.20892 5.96095e-14 1.16625e-12 8.73357e-13 -30.3347 -8.05581 -38.222 10.6406 -4.54271 -19.0041 0.579305 21.0984 -3.10853 -6.56746e-09 2.37669e-08 -1.46534e-09 -1.13627e-08 4.11904e-08 -2.41932e-09 -6.56746e-09 2.37668e-08 -1.46533e-09 -7.73091 5.47488 -0.417314 -6.56746e-09 2.37669e-08 -1.46535e-09 -2.90554 0.965183 -0.102902 -6.56747e-09 2.37669e-08 -1.46535e-09 -10.2786 0.731801 -0.0259123 -6.56745e-09 2.37669e-08 -1.46535e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.8314 -69.4582 -92.2584 -175.883 68.1707 175.821 16.7707 17.8299 -58.5631 2.03217e-16 0.0 3.88251e-19 -6.13251 -27.794 -5.40992 0.0106877 32.1719 -0.863674 4.68863 -3.07148 34.7769
-4.72237 88.7669 63.7757 318.791 -68.6858 50.5038 3.06128 -11.2479 6.19313 -0.975003 -9.88499 1.58344 -12.7852 15.6985 -15.6477 23.0185 1.74939 -32.3345 -0.0 0.0 0.0 -0.0 0.0 0.0 5.77962e-14 1.68503e-12 1.09779e-12 11.299 37.0439 47.3395 -22.7492 -16.9273 45.8538 -0.200672 -12.6667 -1.81003 -1.87876e-09 -4.25073e-09 -4.20063e-09 -3.19277e-09 -7.43608e-09 -7.30299e-09 -1.87876e-09 -4.25073e-09 -4.20064e-09 7.73091 5.47488 0.417314 -1.87877e-09 -4.25073e-09 -4.20063e-09 2.90554 0.965183 0.102902 -1.87876e-09 -4.25073e-09 -4.20063e-09 10.2786 0.731801 0.0259123 -1.87877e-09 -4.25073e-09 -4.20062e-09 2.22167 -0.733487 -0.20892 5.75304e-14 1.685e-12 1.09746e-12 -30.8575 -7.71441 -38.468 10.4035 -4.39216 -18.5574 0.568883 20.922 -3.07996 -6.54073e-09 1.79837e-08 -1.2838e-09 -1.13101e-08 3.11867e-08 -2.10744e-09 -6.54074e-09 1.79836e-08 -1.28379e-09 -7.73091 5.47488 -0.417314 -6.54073e-09 1.79837e-08 -1.2838e-09 -2.90554 0.965183 -0.102902 -6.54074e-09 1.79837e-08 -1.2838e-09 -10.2786 0.731801 -0.0259123 -6.54073e-09 1.79837e-08 -1.28381e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.6997 -68.5712 -92.6207 -175.849 68.5437 175.835 16.1783 17.9375 -57.5618 2.03217e-16 0.0 3.88251e-19 -6.21045 -27.6305 -5.76887 0.0149752 32.1521 -0.836803 2.98202 -0.664974 33.8106
-4.56297 88.8187 63.92 308.499 -71.4623 61.1013 2.72874 -11.3795 6.28423 -0.946095 -9.83513 1.60757 -12.2475 15.4874 -15.0212 22.4377 2.02185 -31.2461 -0.0 0.0 0.0 -0.0 0.0 0.0 4.07225e-14 1.88409e-12 1.16751e-12 10.9793 37.7002 47.5183 -22.9689 -17.2849 46.4956 -0.215519 -13.1091 -1.87554 -2.08685e-09 -3.91483e-09 -4.08144e-09 -3.55332e-09 -6.84662e-09 -7.09884e-09 -2.08685e-09 -3.91483e-09 -4.08144e-09 7.73091 5.47488 0.417314 -2.08685e-09 -3.91483e-09 -4.08144e-09 2.90554 0.965183 0.102902 -2.08684e-09 -3.91483e-09 -4.08144e-09 10.2786 0.731801 0.0259123 -2.08685e-09 -3.91483e-09 -4.08143e-09 2.22167 -0.733487 -0.20892 4.04342e-14 1.88407e-12 1.16716e-12 -31.209 -7.17872 -38.6213 10.2332 -4.28438 -18.2396 0.563348 20.8271 -3.06465 -6.01778e-09 1.30899e-08 -9.94353e-10 -1.04005e-08 2.27119e-08 -1.61723e-09 -6.01778e-09 1.30899e-08 -9.94334e-10 -7.73091 5.47488 -0.417314 -6.01778e-09 1.30899e-08 -9.94353e-10 -2.90554 0.965183 -0.102902 -6.01779e-09 1.30899e-08 -9.94354e-10 -10.2786 0.731801 -0.0259123 -6.01778e-09 1.30899e-08 -9.94365e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.4834 -67.9193 -92.7755 -175.818 68.8658 175.838 15.6398 17.8602 -56.9442 2.03217e-16 0.0 3.88251e-19 -6.16834 -27.5006 -6.03052 0.0194878 32.139 -0.809385 1.5088 1.55215 32.6854
-4.41289 88.8412 64.1036 294.841 -73.7331 75.0474 2.496 -11.5977 6.45769 -0.93787 -9.71069 1.64759 -11.4301 15.19 -14.3597 21.5028 2.1916 -30.0359 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.75079e-14 1.62663e-12 9.95959e-13 10.7376 38.2245 47.7756 -23.1202 -17.5338 46.9557 -0.229503 -13.5187 -1.93635 -1.77843e-09 -3.34761e-09 -3.54503e-09 -3.02719e-09 -5.8512e-09 -6.16479e-09 -1.77843e-09 -3.3476e-09 -3.54503e-09 7.73091 5.47488 0.417314 -1.77843e-09 -3.3476e-09 -3.54503e-09 2.90554 0.965183 0.102902 -1.77842e-09 -3.3476e-09 -3.54503e-09 10.2786 0.731801 0.0259123 -1.77844e-09 -3.3476e-09 -3.54502e-09 2.22167 -0.733487 -0.20892 -1.77619e-14 1.62661e-12 9.95616e-13 -31.3567 -6.42397 -38.664 10.1444 -4.22847 -18.0745 0.567392 20.8965 -3.07584 -4.83802e-09 9.24127e-09 -5.87756e-10 -8.357e-09 1.60282e-08 -9.35551e-10 -4.83802e-09 9.24125e-09 -5.87738e-10 -7.73091 5.47488 -0.417314 -4.83802e-09 9.24127e-09 -5.87755e-10 -2.90554 0.965183 -0.102902 -4.83802e-09 9.24127e-09 -5.87757e-10 -10.2786 0.731801 -0.0259123 -4.83801e-09 9.24127e-09 -5.87769e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.2418 -67.5537 -92.7284 -175.782 69.1287 175.801 15.5602 17.7813 -56.9743 2.03217e-16 0.0 3.88251e-19 -5.91892 -27.4492 -5.9445 0.0252273 32.1447 -0.776329 0.142743 3.81686 31.1952
-4.23021 88.9176 64.2353 277.532 -74.8268 92.4394 2.30985 -11.8613 6.68547 -0.947578 -9.55169 1.69846 -10.3912 14.8163 -13.6453 20.2989 2.28802 -28.6782 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.0289e-13 1.07155e-12 6.55176e-13 10.5452 38.6516 48.0593 -23.2237 -17.7083 47.2654 -0.243666 -13.9228 -1.99653 -1.1035e-09 -2.55059e-09 -2.64608e-09 -1.87258e-09 -4.45141e-09 -4.59768e-09 -1.10349e-09 -2.55059e-09 -2.64609e-09 7.73091 5.47488 0.417314 -1.1035e-09 -2.55059e-09 -2.64608e-09 2.90554 0.965183 0.102902 -1.10349e-09 -2.55059e-09 -2.64608e-09 10.2786 0.731801 0.0259123 -1.1035e-09 -2.55059e-09 -2.64607e-09 2.22167 -0.733487 -0.20892 -1.0307e-13 1.07155e-12 6.54849e-13 -31.3745 -5.48847 -38.651 10.1068 -4.2052 -18.0042 0.57585 21.0405 -3.09915 -3.06299e-09 5.73419e-09 -7.13221e-11 -5.28528e-09 9.93274e-09 -7.41051e-11 -3.06299e-09 5.73417e-09 -7.13072e-11 -7.73091 5.47488 -0.417314 -3.06299e-09 5.73418e-09 -7.13203e-11 -2.90554 0.965183 -0.102902 -3.063e-09 5.73418e-09 -7.13231e-11 -10.2786 0.731801 -0.0259123 -3.06299e-09 5.73418e-09 -7.13337e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -53.9579 -67.3683 -92.5209 -175.739 69.3714 175.732 16.0843 18.1024 -57.1026 2.03217e-16 0.0 3.88251e-19 -5.57802 -27.4382 -5.70066 0.0310423 32.1723 -0.7427 -1.00823 6.03956 29.3653
-4.09484 88.9441 64.5384 258.774 -74.9411 111.557 2.18599 -12.1334 6.96229 -1.00104 -9.39973 1.75558 -9.33528 14.4317 -12.8688 19.1436 2.33599 -27.1889 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.67192e-13 4.07539e-13 2.86571e-13 10.3455 39.0378 48.3605 -23.3227 -17.88 47.5496 -0.25721 -14.2951 -2.0522 -4.7388e-10 -1.65581e-09 -1.5083e-09 -7.99512e-10 -2.88249e-09 -2.61791e-09 -4.73874e-10 -1.65581e-09 -1.50832e-09 7.73091 5.47488 0.417314 -4.73882e-10 -1.65581e-09 -1.50831e-09 2.90554 0.965183 0.102902 -4.73875e-10 -1.65581e-09 -1.50831e-09 10.2786 0.731801 0.0259123 -4.73884e-10 -1.65581e-09 -1.5083e-09 2.22167 -0.733487 -0.20892 -1.67296e-13 4.07552e-13 2.86264e-13 -31.2865 -4.39624 -38.6035 10.1146 -4.21052 -18.0179 0.581735 21.1406 -3.11536 -1.00787e-09 2.74601e-09 5.3964e-10 -1.72864e-09 4.73749e-09 9.46306e-10 -1.00786e-09 2.74601e-09 5.39651e-10 -7.73091 5.47488 -0.417314 -1.00787e-09 2.74601e-09 5.39643e-10 -2.90554 0.965183 -0.102902 -1.00787e-09 2.74601e-09 5.39639e-10 -10.2786 0.731801 -0.0259123 -1.00786e-09 2.74601e-09 5.3963e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -53.571 -67.3276 -92.1744 -175.704 69.5831 175.687 16.1888 18.1446 -57.1567 2.03217e-16 0.0 3.88251e-19 -5.25891 -27.3973 -5.72172 0.0354933 32.1919 -0.716129 -1.71458 7.75207 27.5541
-3.9815 88.9558 64.891 241.3 -73.6563 129.547 2.1394 -12.3773 7.28267 -1.12385 -9.29636 1.81436 -8.4702 14.1022 -12.0197 18.3523 2.36167 -25.5836 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.62185e-13 -1.76729e-13 3.15571e-14 10.0806 39.4398 48.6732 -23.457 -18.116 47.9353 -0.269136 -14.6093 -2.09935 -3.0142e-10 -7.95293e-10 -2.5544e-10 -5.17974e-10 -1.37965e-09 -4.45903e-10 -3.01414e-10 -7.95291e-10 -2.55459e-10 7.73091 5.47488 0.417314 -3.01422e-10 -7.95293e-10 -2.5544e-10 2.90554 0.965183 0.102902 -3.01415e-10 -7.95293e-10 -2.55441e-10 10.2786 0.731801 0.0259123 -3.01424e-10 -7.95292e-10 -2.55434e-10 2.22167 -0.733487 -0.20892 -1.62242e-13 -1.76711e-13 3.12589e-14 -31.1164 -3.17166 -38.542 10.1617 -4.24026 -18.105 0.577831 21.0781 -3.10515 1.01222e-09 4.54118e-10 1.22982e-09 1.76956e-09 7.54539e-10 2.10488e-09 1.01222e-09 4.54115e-10 1.22983e-09 -7.73091 5.47488 -0.417314 1.01222e-09 4.54112e-10 1.22983e-09 -2.90554 0.965183 -0.102902 1.01222e-09 4.5411e-10 1.22982e-09 -10.2786 0.731801 -0.0259123 1.01223e-09 4.54112e-10 1.22981e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -53.0161 -67.3963 -91.7059 -175.692 69.7531 175.723 14.8504 17.231 -56.9691 2.03217e-16 0.0 3.88251e-19 -5.07262 -27.255 -6.42935 0.0372133 32.1739 -0.704283 -1.84852 8.43795 26.1113
-3.89997 89.1065 64.9591 229.662 -70.4381 141.519 2.25658 -12.574 7.65621 -1.37624 -9.26815 1.86855 -7.88431 13.8668 -11.0749 18.0982 2.35347 -23.8352 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.65352e-14 -7.21083e-13 -6.06196e-14 9.73598 39.9127 49.0317 -23.6404 -18.4423 48.4791 -0.278061 -14.8376 -2.13373 -9.15023e-10 1.14039e-10 1.37518e-09 -1.59973e-09 1.98189e-10 2.36805e-09 -9.15016e-10 1.1404e-10 1.37516e-09 7.73091 5.47488 0.417314 -9.15024e-10 1.14039e-10 1.37518e-09 2.90554 0.965183 0.102902 -9.15017e-10 1.1404e-10 1.37518e-09 10.2786 0.731801 0.0259123 -9.15025e-10 1.1404e-10 1.37519e-09 2.22167 -0.733487 -0.20892 -3.65951e-14 -7.21078e-13 -6.09314e-14 -30.7444 -1.71322 -38.4484 10.2749 -4.31114 -18.3163 0.557043 20.7288 -3.04857 3.27994e-09 -1.00234e-09 2.18696e-09 5.70086e-09 -1.77347e-09 3.72181e-09 3.27994e-09 -1.00234e-09 2.18697e-09 -7.73091 5.47488 -0.417314 3.27994e-09 -1.00235e-09 2.18696e-09 -2.90554 0.965183 -0.102902 3.27994e-09 -1.00235e-09 2.18695e-09 -10.2786 0.731801 -0.0259123 3.27995e-09 -1.00235e-09 2.18695e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -52.0346 -67.5998 -90.9623 -175.726 69.8988 175.922 10.4952 14.2507 -56.5536 2.03217e-16 0.0 3.88251e-19 -5.05321 -26.9239 -8.24267 0.0353519 32.108 -0.718328 -1.17279 7.20459 25.5636
-3.8751 89.3008 64.9724 222.036 -66.4679 149.516 2.5024 -12.7457 8.08219 -1.72654 -9.28775 1.9223 -7.45765 13.6823 -10.0458 18.1895 2.29969 -21.946 -0.0 0.0 0.0 -0.0 0.0 0.0 1.7121e-13 -1.2961e-12 -6.92237e-14 9.33973 40.412 49.4303 -23.8456 -18.8142 49.1085 -0.28442 -15.001 -2.15835 -2.02201e-09 1.10317e-09 3.351e-09 -3.53863e-09 1.90855e-09 5.77201e-09 -2.02201e-09 1.10317e-09 3.35098e-09 7.73091 5.47488 0.417314 -2.02201e-09 1.10317e-09 3.351e-09 2.90554 0.965183 0.102902 -2.02201e-09 1.10317e-09 3.351e-09 10.2786 0.731801 0.0259123 -2.02202e-09 1.10317e-09 3.35101e-09 2.22167 -0.733487 -0.20892 1.71121e-13 -1.29612e-12 -6.95622e-14 -30.2055 -0.0395847 -38.3391 10.4469 -4.41899 -18.6396 0.526298 20.1868 -2.96154 5.84114e-09 -1.74858e-09 3.35527e-09 1.01429e-08 -3.06611e-09 5.6996e-09 5.84113e-09 -1.74858e-09 3.35528e-09 -7.73091 5.47488 -0.417314 5.84114e-09 -1.74858e-09 3.35527e-09 -2.90554 0.965183 -0.102902 5.84114e-09 -1.74859e-09 3.35527e-09 -10.2786 0.731801 -0.0259123 5.84115e-09 -1.74858e-09 3.35526e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -50.7143 -67.9403 -89.9576 -175.793 70.0188 176.234 4.15084 9.93299 -56.3773 2.03217e-16 0.0 3.88251e-19 -5.10778 -26.4312 -10.8182 0.0307058 32.0107 -0.751086 0.10476 4.54701 25.6129
-3.81082 89.129 65.4254 214.779 -62.6649 157.152 2.70892 -12.9176 8.53947 -2.06245 -9.31592 1.98663 -7.08613 13.4916 -8.97369 18.3903 2.22913 -19.9758 -0.0 0.0 0.0 -0.0 0.0 0.0 3.74463e-13 -1.75924e-12 -4.56137e-14 8.90093 40.8461 49.7983 -24.0496 -19.1916 49.757 -0.290003 -15.1461 -2.18021 -3.10186e-09 1.96196e-09 5.10543e-09 -5.42783e-09 3.39083e-09 8.79308e-09 -3.10185e-09 1.96196e-09 5.10542e-09 7.73091 5.47488 0.417314 -3.10186e-09 1.96196e-09 5.10543e-09 2.90554 0.965183 0.102902 -3.10185e-09 1.96196e-09 5.10543e-09 10.2786 0.731801 0.0259123 -3.10186e-09 1.96196e-09 5.10544e-09 2.22167 -0.733487 -0.20892 3.7434e-13 -1.75928e-12 -4.59713e-14 -29.7482 1.64015 -38.2723 10.6213 -4.52858 -18.9701 0.498177 19.6607 -2.87793 8.02541e-09 -2.00379e-09 4.35419e-09 1.39315e-08 -3.50464e-09 7.39096e-09 8.02539e-09 -2.00379e-09 4.35421e-09 -7.73091 5.47488 -0.417314 8.02541e-09 -2.0038e-09 4.35419e-09 -2.90554 0.965183 -0.102902 8.0254e-09 -2.0038e-09 4.35419e-09 -10.2786 0.731801 -0.0259123 8.02541e-09 -2.0038e-09 4.35418e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -49.5218 -68.3519 -88.9725 -175.86 70.0741 176.517 -1.36396 6.27975 -56.4788 2.03217e-16 0.0 3.88251e-19 -5.17386 -25.8962 -13.4421 0.0244622 31.8929 -0.782752 1.35605 1.99027 25.333
-3.68299 89.1568 65.8204 209.021 -58.6148 163.225 2.70873 -13.1151 9.00709 -2.27188 -9.31339 2.07252 -6.66212 13.238 -7.90073 18.4602 2.17284 -17.9844 -0.0 0.0 0.0 -0.0 0.0 0.0 4.86634e-13 -1.96794e-12 -4.11484e-14 8.43446 41.1256 50.0583 -24.2333 -19.5393 50.356 -0.296776 -15.3196 -2.20639 -3.63402e-09 2.48026e-09 6.0719e-09 -6.36049e-09 4.28441e-09 1.04584e-08 -3.63402e-09 2.48026e-09 6.07189e-09 7.73091 5.47488 0.417314 -3.63402e-09 2.48026e-09 6.07191e-09 2.90554 0.965183 0.102902 -3.63402e-09 2.48026e-09 6.0719e-09 10.2786 0.731801 0.0259123 -3.63403e-09 2.48026e-09 6.07191e-09 2.22167 -0.733487 -0.20892 4.86499e-13 -1.968e-12 -4.14963e-14 -29.6145 3.11164 -38.2875 10.7432 -4.60536 -19.2027 0.482875 19.3593 -2.83043 9.16233e-09 -1.98718e-09 4.80316e-09 1.59025e-08 -3.47031e-09 8.14859e-09 9.16231e-09 -1.98718e-09 4.80317e-09 -7.73091 5.47488 -0.417314 9.16233e-09 -1.98718e-09 4.80316e-09 -2.90554 0.965183 -0.102902 9.16233e-09 -1.98718e-09 4.80315e-09 -10.2786 0.731801 -0.0259123 9.16234e-09 -1.98718e-09 4.80314e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -48.955 -68.7767 -88.3218 -175.89 70.0266 176.623 -3.18825 5.08836 -56.2331 2.03217e-16 0.0 3.88251e-19 -5.23361 -25.4808 -15.4236 0.0180054 31.7652 -0.793624 1.84091 1.00117 23.6933
-3.41462 88.4236 66.3221 204.465 -54.4423 168.072 2.38963 -13.3413 9.55714 -2.31757 -9.25944 2.20934 -6.14832 12.9468 -6.86944 18.3189 2.05157 -16.0212 -0.0 0.0 0.0 -0.0 0.0 0.0 4.6247e-13 -1.79418e-12 -7.35006e-14 8.08145 41.1921 49.948 -24.3965 -19.8562 50.8915 -0.305482 -15.5371 -2.23929 -3.33963e-09 2.5458e-09 5.90268e-09 -5.85038e-09 4.39485e-09 1.01702e-08 -3.33963e-09 2.5458e-09 5.90267e-09 7.73091 5.47488 0.417314 -3.33963e-09 2.5458e-09 5.90268e-09 2.90554 0.965183 0.102902 -3.33963e-09 2.5458e-09 5.90268e-09 10.2786 0.731801 0.0259123 -3.33964e-09 2.5458e-09 5.90268e-09 2.22167 -0.733487 -0.20892 4.62352e-13 -1.79424e-12 -7.37879e-14 -29.8907 4.40141 -38.4758 10.805 -4.64447 -19.3209 0.483089 19.3585 -2.83039 8.79283e-09 -1.52839e-09 4.43479e-09 1.52587e-08 -2.66622e-09 7.51766e-09 8.79281e-09 -1.52839e-09 4.43481e-09 -7.73091 5.47488 -0.417314 8.79283e-09 -1.5284e-09 4.43479e-09 -2.90554 0.965183 -0.102902 8.79283e-09 -1.5284e-09 4.43479e-09 -10.2786 0.731801 -0.0259123 8.79284e-09 -1.5284e-09 4.43478e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -49.2327 -69.1812 -88.0742 -175.864 69.8266 176.461 0.397979 7.48388 -55.3262 2.03217e-16 0.0 3.88251e-19 -5.29365 -25.2959 -16.3253 0.0129428 31.622 -0.765891 1.22406 2.72202 19.7319
-3.14671 88.5805 66.699 201.218 -50.0844 171.635 1.86552 -13.5829 10.1754 -2.26217 -9.17838 2.38235 -5.60281 12.6352 -5.8474 18.1068 1.8765 -14.0433 -0.0 0.0 0.0 -0.0 0.0 0.0 3.55538e-13 -1.34399e-12 -1.13953e-13 7.79209 41.105 49.5838 -24.5495 -20.1606 51.398 -0.315104 -15.7726 -2.27502 -2.54299e-09 2.28941e-09 4.96548e-09 -4.46262e-09 3.94724e-09 8.56029e-09 -2.54299e-09 2.28941e-09 4.96547e-09 7.73091 5.47488 0.417314 -2.54299e-09 2.28941e-09 4.96548e-09 2.90554 0.965183 0.102902 -2.54299e-09 2.28941e-09 4.96547e-09 10.2786 0.731801 0.0259123 -2.543e-09 2.28941e-09 4.96548e-09 2.22167 -0.733487 -0.20892 3.55455e-13 -1.34405e-12 -1.14146e-13 -30.4289 5.58735 -38.7791 10.8343 -4.66319 -19.3769 0.492684 19.5403 -2.85916 7.3679e-09 -5.868e-10 3.50736e-09 1.27833e-08 -1.02189e-09 5.93745e-09 7.36788e-09 -5.86797e-10 3.50737e-09 -7.73091 5.47488 -0.417314 7.3679e-09 -5.868e-10 3.50736e-09 -2.90554 0.965183 -0.102902 7.36789e-09 -5.868e-10 3.50736e-09 -10.2786 0.731801 -0.0259123 7.3679e-09 -5.86802e-10 3.50735e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -50.0829 -69.6062 -88.0905 -175.812 69.5074 176.132 7.40045 12.5311 -54.3969 2.03217e-16 0.0 3.88251e-19 -5.38515 -25.2561 -16.6132 0.00846029 31.4605 -0.714424 0.490318 6.28199 14.2306
-3.08143 88.164 67.0161 199.107 -45.4076 174.063 1.30652 -13.8419 10.7114 -2.14314 -9.09859 2.53644 -5.05323 12.2326 -4.76638 17.8936 1.82035 -11.9716 -0.0 0.0 0.0 -0.0 0.0 0.0 2.27486e-13 -8.25905e-13 -1.4428e-13 7.29845 40.9565 49.4547 -24.6922 -20.4506 51.878 -0.32503 -16.0104 -2.31118 -1.62835e-09 1.86557e-09 3.76693e-09 -2.86738e-09 3.21027e-09 6.49948e-09 -1.62834e-09 1.86557e-09 3.76692e-09 7.73091 5.47488 0.417314 -1.62835e-09 1.86557e-09 3.76692e-09 2.90554 0.965183 0.102902 -1.62834e-09 1.86557e-09 3.76692e-09 10.2786 0.731801 0.0259123 -1.62835e-09 1.86558e-09 3.76692e-09 2.22167 -0.733487 -0.20892 2.27439e-13 -8.25949e-13 -1.44381e-13 -31.1329 6.54093 -38.9929 10.8299 -4.66058 -19.3681 0.50768 19.8225 -2.90393 5.58222e-09 4.23859e-10 2.42875e-09 9.68243e-09 7.4181e-10 4.10191e-09 5.58221e-09 4.23864e-10 2.42876e-09 -7.73091 5.47488 -0.417314 5.58222e-09 4.23861e-10 2.42875e-09 -2.90554 0.965183 -0.102902 5.58221e-09 4.23862e-10 2.42875e-09 -10.2786 0.731801 -0.0259123 5.58222e-09 4.23859e-10 2.42874e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -51.2967 -70.109 -88.4068 -175.765 69.1558 175.777 15.2775 18.7271 -53.9416 2.03217e-16 0.0 3.88251e-19 -5.54695 -25.2437 -16.9607 0.00220068 31.2953 -0.668493 0.462042 9.93387 8.65423
-2.9174 87.9895 67.2788 197.403 -40.4371 176.12 0.879791 -14.122 11.0137 -1.99733 -9.0485 2.61662 -4.51931 11.667 -3.55994 17.7235 2.06078 -9.72596 -0.0 0.0 0.0 -0.0 0.0 0.0 1.3996e-13 -4.4844e-13 -1.46256e-13 6.33919 40.8417 50.0439 -24.8244 -20.724 52.3339 -0.33457 -16.2348 -2.34539 -9.79936e-10 1.4288e-09 2.81365e-09 -1.73481e-09 2.45265e-09 4.85873e-09 -9.79928e-10 1.4288e-09 2.81364e-09 7.73091 5.47488 0.417314 -9.79937e-10 1.4288e-09 2.81364e-09 2.90554 0.965183 0.102902 -9.7993e-10 1.4288e-09 2.81364e-09 10.2786 0.731801 0.0259123 -9.79943e-10 1.42881e-09 2.81365e-09 2.22167 -0.733487 -0.20892 1.39938e-13 -4.48476e-13 -1.46306e-13 -31.9209 7.14484 -38.9057 10.7903 -4.6356 -19.292 0.523869 20.1233 -2.95179 4.13049e-09 1.08984e-09 1.60686e-09 7.16218e-09 1.904e-09 2.70494e-09 4.13049e-09 1.08985e-09 1.60687e-09 -7.73091 5.47488 -0.417314 4.13049e-09 1.08985e-09 1.60686e-09 -2.90554 0.965183 -0.102902 4.13048e-09 1.08985e-09 1.60686e-09 -10.2786 0.731801 -0.0259123 4.13049e-09 1.08984e-09 1.60685e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -52.6789 -70.7451 -89.0728 -175.74 68.8594 175.525 21.5765 24.2768 -53.6796 2.03217e-16 0.0 3.88251e-19 -5.81307 -25.1324 -18.0381 -0.00862707 31.1409 -0.657139 0.992252 11.7467 4.47304
-2.90758 87.7543 67.5586 196.264 -35.2179 177.881 0.606223 -14.4129 10.8822 -1.77119 -9.0254 2.51984 -4.0283 10.742 -2.10978 17.5499 2.84556 -7.10313 -0.0 0.0 0.0 -0.0 0.0 0.0 1.26585e-13 -2.72799e-13 -1.03641e-13 4.47194 40.7343 51.9293 -24.936 -20.9585 52.7329 -0.344666 -16.4702 -2.38135 -7.41389e-10 9.17415e-10 2.24548e-09 -1.31469e-09 1.56681e-09 3.87737e-09 -7.41381e-10 9.17416e-10 2.24547e-09 7.73091 5.47488 0.417314 -7.41389e-10 9.17415e-10 2.24547e-09 2.90554 0.965183 0.102902 -7.41381e-10 9.17415e-10 2.24548e-09 10.2786 0.731801 0.0259123 -7.41396e-10 9.1742e-10 2.24548e-09 2.22167 -0.733487 -0.20892 1.26572e-13 -2.72827e-13 -1.037e-13 -32.9407 7.06699 -38.2296 10.6905 -4.57249 -19.1017 0.547972 20.561 -3.02175 3.11839e-09 1.33434e-09 1.0641e-09 5.40538e-09 2.32755e-09 1.78372e-09 3.11838e-09 1.33434e-09 1.06411e-09 -7.73091 5.47488 -0.417314 3.11838e-09 1.33434e-09 1.0641e-09 -2.90554 0.965183 -0.102902 3.11837e-09 1.33434e-09 1.0641e-09 -10.2786 0.731801 -0.0259123 3.11839e-09 1.33434e-09 1.06409e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -54.4562 -71.6183 -90.2952 -175.739 68.5891 175.389 25.7082 28.6266 -53.1294 2.03217e-16 0.0 3.88251e-19 -6.27928 -24.8483 -20.3187 -0.0263963 31.0217 -0.691891 1.47763 10.9383 2.30498
-2.79468 87.3172 67.8548 195.244 -30.0263 179.592 0.397364 -14.7176 10.4491 -1.46586 -9.01748 2.30495 -3.52112 9.55117 -0.492572 17.275 4.02049 -4.20375 -0.0 0.0 0.0 -0.0 0.0 0.0 1.48753e-13 -1.85904e-13 -2.99482e-14 1.95917 40.5081 54.6702 -25.0329 -21.1655 53.0836 -0.35535 -16.7155 -2.4189 -6.94055e-10 2.83301e-10 1.79065e-09 -1.2259e-09 4.6917e-10 3.08855e-09 -6.94047e-10 2.83303e-10 1.79064e-09 7.73091 5.47488 0.417314 -6.94054e-10 2.83301e-10 1.79064e-09 2.90554 0.965183 0.102902 -6.94044e-10 2.83301e-10 1.79065e-09 10.2786 0.731801 0.0259123 -6.94062e-10 2.83305e-10 1.79065e-09 2.22167 -0.733487 -0.20892 1.48742e-13 -1.85923e-13 -3.00538e-14 -34.1644 6.45526 -37.1494 10.5388 -4.47659 -18.8139 0.581022 21.1325 -3.11394 2.20193e-09 1.36684e-09 6.11712e-10 3.81504e-09 2.37857e-09 1.01744e-09 2.20192e-09 1.36684e-09 6.1173e-10 -7.73091 5.47488 -0.417314 2.20192e-09 1.36684e-09 6.11718e-10 -2.90554 0.965183 -0.102902 2.20191e-09 1.36684e-09 6.1172e-10 -10.2786 0.731801 -0.0259123 2.20193e-09 1.36684e-09 6.11711e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -56.7922 -72.6554 -92.1431 -175.747 68.3159 175.305 28.9252 32.7062 -52.3494 2.03217e-16 0.0 3.88251e-19 -6.87992 -24.4265 -23.3322 -0.0494369 30.923 -0.755808 1.77267 8.59088 1.32585
-2.4897 86.8166 68.1628 194.116 -25.0794 181.198 0.258599 -15.0613 10.0626 -1.20046 -9.03977 2.15972 -2.92142 8.46189 1.07306 16.9192 5.15305 -1.40272 -0.0 0.0 0.0 -0.0 0.0 0.0 1.59766e-13 -1.34865e-13 4.84188e-14 -0.393404 40.1872 57.2411 -25.1364 -21.3908 53.4518 -0.364293 -16.9164 -2.44976 -6.78756e-10 -2.98674e-10 1.33835e-09 -1.19231e-09 -5.35544e-10 2.30389e-09 -6.78749e-10 -2.98672e-10 1.33833e-09 7.73091 5.47488 0.417314 -6.78756e-10 -2.98674e-10 1.33834e-09 2.90554 0.965183 0.102902 -6.78744e-10 -2.98674e-10 1.33835e-09 10.2786 0.731801 0.0259123 -6.78764e-10 -2.98671e-10 1.33835e-09 2.22167 -0.733487 -0.20892 1.5975e-13 -1.34873e-13 4.82573e-14 -35.2793 5.94124 -36.1539 10.3839 -4.37879 -18.5221 0.607638 21.5738 -3.18575 1.40134e-09 1.20305e-09 3.40821e-10 2.42756e-09 2.09101e-09 5.63089e-10 1.40133e-09 1.20304e-09 3.40844e-10 -7.73091 5.47488 -0.417314 1.40133e-09 1.20304e-09 3.4083e-10 -2.90554 0.965183 -0.102902 1.40132e-09 1.20304e-09 3.40832e-10 -10.2786 0.731801 -0.0259123 1.40134e-09 1.20306e-09 3.40823e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -59.3466 -73.6483 -94.4063 -175.756 68.1282 175.269 31.3652 36.8415 -51.1462 2.03217e-16 0.0 3.88251e-19 -7.40908 -23.9273 -26.3381 -0.0747861 30.8012 -0.835072 1.95645 5.59386 0.93182
-2.25 86.2344 68.4399 193.251 -20.1103 182.547 0.202903 -15.4699 10.073 -1.09388 -9.1075 2.27196 -2.20828 7.84503 2.37736 16.6127 5.80912 0.919147 -0.0 0.0 0.0 -0.0 0.0 0.0 1.12927e-13 -6.67913e-14 1.05058e-13 -1.79218 39.9486 58.6856 -25.2651 -21.6769 53.9052 -0.368946 -17.0189 -2.46553 -5.36315e-10 -6.53647e-10 7.77779e-10 -9.37772e-10 -1.14262e-09 1.33501e-09 -5.36309e-10 -6.53645e-10 7.77766e-10 7.73091 5.47488 0.417314 -5.36315e-10 -6.53647e-10 7.77773e-10 2.90554 0.965183 0.102902 -5.36302e-10 -6.53647e-10 7.77782e-10 10.2786 0.731801 0.0259123 -5.36323e-10 -6.53644e-10 7.77789e-10 2.22167 -0.733487 -0.20892 1.129e-13 -6.67918e-14 1.04859e-13 -36.0296 6.20241 -35.712 10.2755 -4.31056 -18.3193 0.60991 21.6211 -3.19326 7.36839e-10 8.58686e-10 3.42539e-10 1.27938e-09 1.49883e-09 5.77629e-10 7.3682e-10 8.58675e-10 3.42565e-10 -7.73091 5.47488 -0.417314 7.3682e-10 8.58677e-10 3.42549e-10 -2.90554 0.965183 -0.102902 7.36815e-10 8.58677e-10 3.42551e-10 -10.2786 0.731801 -0.0259123 7.36839e-10 8.58691e-10 3.42543e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -61.6158 -74.4013 -96.7042 -175.757 68.1143 175.281 33.1078 41.3861 -49.3681 2.03217e-16 0.0 3.88251e-19 -7.68348 -23.4678 -28.6142 -0.0996293 30.6128 -0.915794 2.09532 2.82571 0.517449
-2.09338 85.8972 68.7038 192.94 -14.9682 183.694 0.262066 -15.9988 10.6649 -1.24477 -9.25664 2.79619 -1.36017 7.87429 3.3187 16.5486 5.86051 2.5145 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.84222e-14 4.03998e-14 1.25733e-13 -1.77098 39.9812 58.5208 -25.4224 -22.0344 54.4775 -0.365981 -16.9531 -2.45541 -1.25698e-10 -6.09928e-10 -1.14261e-10 -2.15609e-10 -1.04767e-09 -2.0122e-10 -1.25692e-10 -6.09927e-10 -1.14272e-10 7.73091 5.47488 0.417314 -1.25698e-10 -6.09929e-10 -1.14266e-10 2.90554 0.965183 0.102902 -1.25685e-10 -6.09929e-10 -1.14258e-10 10.2786 0.731801 0.0259123 -1.25705e-10 -6.09926e-10 -1.14251e-10 2.22167 -0.733487 -0.20892 -4.84691e-14 4.04063e-14 1.25525e-13 -36.0803 7.839 -36.1455 10.2657 -4.30326 -18.3026 0.565076 20.8986 -3.07533 2.5321e-10 2.89367e-10 9.00396e-10 4.52223e-10 5.3637e-10 1.5502e-09 2.53194e-10 2.89357e-10 9.0042e-10 -7.73091 5.47488 -0.417314 2.53194e-10 2.89358e-10 9.00402e-10 -2.90554 0.965183 -0.102902 2.53188e-10 2.89358e-10 9.00404e-10 -10.2786 0.731801 -0.0259123 2.53211e-10 2.8937e-10 9.00395e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -63.3566 -74.8456 -98.8905 -175.751 68.3326 175.373 33.6236 46.8838 -46.1857 2.03217e-16 0.0 3.88251e-19 -7.64219 -23.1172 -30.0459 -0.125681 30.3175 -0.997958 2.19319 0.412735 -0.00300156
-1.93762 85.3745 68.935 192.741 -9.874 184.714 0.438978 -16.6114 11.6268 -1.56267 -9.46683 3.59823 -0.441028 8.32984 4.03168 16.6808 5.54596 3.62963 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.8464e-13 1.55841e-13 1.26924e-13 -0.839771 40.1836 57.3496 -25.5934 -22.434 55.1313 -0.357631 -16.7664 -2.42673 4.35339e-10 -3.02466e-10 -1.21413e-09 7.69221e-10 -4.87594e-10 -2.09338e-09 4.35344e-10 -3.02466e-10 -1.21414e-09 7.73091 5.47488 0.417314 4.35338e-10 -3.02466e-10 -1.21413e-09 2.90554 0.965183 0.102902 4.35349e-10 -3.02466e-10 -1.21413e-09 10.2786 0.731801 0.0259123 4.35332e-10 -3.02464e-10 -1.21412e-09 2.22167 -0.733487 -0.20892 -2.84717e-13 1.55854e-13 1.26719e-13 -35.5918 10.3091 -37.2091 10.3154 -4.33269 -18.3982 0.495419 19.6484 -2.87527 -7.34594e-11 -4.97095e-10 1.87938e-09 -9.73387e-11 -7.8958e-10 3.248e-09 -7.347e-11 -4.97104e-10 1.8794e-09 -7.73091 5.47488 -0.417314 -7.34698e-11 -4.97103e-10 1.87939e-09 -2.90554 0.965183 -0.102902 -7.34764e-11 -4.97103e-10 1.87939e-09 -10.2786 0.731801 -0.0259123 -7.34581e-11 -4.97094e-10 1.87938e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -64.7584 -75.0914 -101.063 -175.746 68.7244 175.538 32.2165 52.9114 -41.2151 2.03217e-16 0.0 3.88251e-19 -7.40106 -22.8319 -31.0034 -0.154391 29.9482 -1.08738 2.26203 -2.07528 -0.340216
-1.75015 85.0597 69.2161 192.404 -5.0168 185.714 0.70053 -17.1982 12.7143 -1.88565 -9.66971 4.43232 0.423471 8.99173 4.6626 16.8303 4.98597 4.61837 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.97981e-13 2.52994e-13 1.28302e-13 0.306744 40.3667 55.8956 -25.769 -22.8566 55.8275 -0.349477 -16.5802 -2.39819 9.17785e-10 -1.63486e-11 -2.11234e-09 1.61542e-09 3.04158e-11 -3.63794e-09 9.1779e-10 -1.63496e-11 -2.11234e-09 7.73091 5.47488 0.417314 9.17784e-10 -1.63491e-11 -2.11234e-09 2.90554 0.965183 0.102902 9.17794e-10 -1.63488e-11 -2.11234e-09 10.2786 0.731801 0.0259123 9.17779e-10 -1.63469e-11 -2.11233e-09 2.22167 -0.733487 -0.20892 -4.98085e-13 2.53012e-13 1.28103e-13 -35.1241 12.6249 -38.4577 10.339 -4.34724 -18.4429 0.440723 18.5343 -2.70069 -3.26015e-10 -1.40671e-09 2.74282e-09 -5.20632e-10 -2.33638e-09 4.74506e-09 -3.2602e-10 -1.40672e-09 2.74284e-09 -7.73091 5.47488 -0.417314 -3.26019e-10 -1.40672e-09 2.74282e-09 -2.90554 0.965183 -0.102902 -3.26027e-10 -1.40672e-09 2.74281e-09 -10.2786 0.731801 -0.0259123 -3.26013e-10 -1.40672e-09 2.7428e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -65.8429 -75.229 -103.079 -175.74 69.202 175.715 29.0638 58.3444 -35.1764 2.03217e-16 0.0 3.88251e-19 -7.05911 -22.5901 -31.5057 -0.182236 29.5706 -1.17909 2.31038 -4.5984 -0.529776
-1.53682 84.5817 69.5227 192.123 -0.0579 186.739 0.994869 -17.6571 13.6765 -2.05883 -9.79949 5.05148 1.11524 9.63932 5.35644 16.8157 4.29858 5.83516 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.90698e-13 3.05324e-13 1.49536e-13 0.959176 40.3919 54.9167 -25.9419 -23.2865 56.5262 -0.346672 -16.5157 -2.38832 1.09263e-09 -3.66676e-11 -2.39939e-09 1.92168e-09 -8.46028e-13 -4.13141e-09 1.09264e-09 -3.6669e-11 -2.39939e-09 7.73091 5.47488 0.417314 1.09263e-09 -3.66679e-11 -2.39939e-09 2.90554 0.965183 0.102902 1.09264e-09 -3.66676e-11 -2.39939e-09 10.2786 0.731801 0.0259123 1.09263e-09 -3.66658e-11 -2.39938e-09 2.22167 -0.733487 -0.20892 -5.90818e-13 3.05342e-13 1.49337e-13 -35.3874 13.9 -39.3138 10.2511 -4.29538 -18.2732 0.425329 18.2214 -2.65178 -5.87302e-10 -2.3455e-09 2.95402e-09 -9.68982e-10 -3.96139e-09 5.11543e-09 -5.87304e-10 -2.3455e-09 2.95403e-09 -7.73091 5.47488 -0.417314 -5.87301e-10 -2.3455e-09 2.95401e-09 -2.90554 0.965183 -0.102902 -5.87311e-10 -2.3455e-09 2.95401e-09 -10.2786 0.731801 -0.0259123 -5.873e-10 -2.3455e-09 2.954e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -66.681 -75.3522 -104.847 -175.721 69.6779 175.834 25.6078 62.2042 -29.8367 2.03217e-16 0.0 3.88251e-19 -6.7134 -22.3652 -31.5702 -0.205081 29.2507 -1.26838 2.34206 -7.11693 -0.60582
-1.37062 84.0736 69.8522 191.923 5.178 187.699 1.31413 -17.9438 14.4902 -2.01547 -9.81588 5.37469 1.61012 10.3514 6.2368 16.4689 3.25783 7.36935 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.99147e-13 2.92976e-13 1.93209e-13 0.872916 40.1981 54.5557 -26.1192 -23.7437 57.2503 -0.352443 -16.6508 -2.40896 7.70794e-10 -6.67943e-10 -1.7197e-09 1.35629e-09 -1.11812e-09 -2.96205e-09 7.70799e-10 -6.67944e-10 -1.7197e-09 7.73091 5.47488 0.417314 7.70793e-10 -6.67943e-10 -1.7197e-09 2.90554 0.965183 0.102902 7.708e-10 -6.67943e-10 -1.7197e-09 10.2786 0.731801 0.0259123 7.70788e-10 -6.67941e-10 -1.71969e-09 2.22167 -0.733487 -0.20892 -4.99262e-13 2.92991e-13 1.93e-13 -36.7611 13.8427 -39.5505 9.98978 -4.13987 -17.7754 0.461314 18.9978 -2.77259 -8.31078e-10 -2.5793e-09 2.10054e-09 -1.4037e-09 -4.43816e-09 3.64543e-09 -8.31082e-10 -2.5793e-09 2.10056e-09 -7.73091 5.47488 -0.417314 -8.31076e-10 -2.5793e-09 2.10054e-09 -2.90554 0.965183 -0.102902 -8.31087e-10 -2.5793e-09 2.10054e-09 -10.2786 0.731801 -0.0259123 -8.31075e-10 -2.5793e-09 2.10053e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -67.4004 -75.482 -106.467 -175.688 70.0783 175.888 23.5267 64.2342 -26.8515 2.03217e-16 0.0 3.88251e-19 -6.32025 -22.0482 -31.0858 -0.223447 28.9163 -1.36252 2.33307 -9.80242 -0.766994
-1.1634 83.5512 70.1517 191.712 10.394 188.492 1.67411 -18.1206 15.2708 -1.85024 -9.7628 5.5381 1.95532 11.197 7.2016 15.9751 1.89345 9.03476 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.87985e-13 2.34363e-13 2.49717e-13 0.441754 39.8779 54.4363 -26.2983 -24.2243 58.0134 -0.363635 -16.9056 -2.44804 1.1708e-10 -1.68196e-09 -3.73776e-10 2.08188e-10 -2.91707e-09 -6.46441e-10 1.17086e-10 -1.68196e-09 -3.73775e-10 7.73091 5.47488 0.417314 1.1708e-10 -1.68196e-09 -3.73777e-10 2.90554 0.965183 0.102902 1.17087e-10 -1.68196e-09 -3.73776e-10 10.2786 0.731801 0.0259123 1.17073e-10 -1.68196e-09 -3.73773e-10 2.22167 -0.733487 -0.20892 -2.88084e-13 2.34371e-13 2.49493e-13 -38.8504 12.9774 -39.4612 9.60918 -3.91407 -17.0605 0.540136 20.4714 -3.00686 -1.02927e-09 -2.3946e-09 5.584e-10 -1.77043e-09 -4.2389e-09 9.84492e-10 -1.02928e-09 -2.3946e-09 5.58418e-10 -7.73091 5.47488 -0.417314 -1.02927e-09 -2.3946e-09 5.58405e-10 -2.90554 0.965183 -0.102902 -1.02928e-09 -2.3946e-09 5.58404e-10 -10.2786 0.731801 -0.0259123 -1.02927e-09 -2.3946e-09 5.58397e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -67.8953 -75.5782 -107.914 -175.644 70.4669 175.906 22.7898 65.0331 -25.8048 2.03217e-16 0.0 3.88251e-19 -5.86814 -21.6763 -30.0884 -0.23917 28.5623 -1.46113 2.29475 -12.6153 -0.933958
-0.997541 83.0128 70.4717 191.719 15.5977 189.316 2.04779 -18.2525 15.9733 -1.65321 -9.70215 5.62006 2.16199 11.9437 8.05197 15.6443 0.701876 10.7717 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.19206e-14 1.60345e-13 3.20454e-13 -0.0866629 39.5623 54.5522 -26.4628 -24.6846 58.7576 -0.375405 -17.1648 -2.48795 -5.66672e-10 -2.56471e-09 1.06366e-09 -9.9298e-10 -4.49329e-09 1.82647e-09 -5.66665e-10 -2.56471e-09 1.06366e-09 7.73091 5.47488 0.417314 -5.66671e-10 -2.56471e-09 1.06366e-09 2.90554 0.965183 0.102902 -5.66665e-10 -2.56471e-09 1.06366e-09 10.2786 0.731801 0.0259123 -5.6668e-10 -2.56471e-09 1.06366e-09 2.22167 -0.733487 -0.20892 -5.20003e-14 1.60344e-13 3.20216e-13 -41.2806 11.6976 -39.1903 9.19955 -3.67322 -16.3023 0.650193 22.2875 -3.30262 -1.26198e-09 -3.22839e-09 -1.02644e-09 -2.19699e-09 -5.76896e-09 -1.74869e-09 -1.26199e-09 -3.22839e-09 -1.02642e-09 -7.73091 5.47488 -0.417314 -1.26198e-09 -3.22839e-09 -1.02643e-09 -2.90554 0.965183 -0.102902 -1.26199e-09 -3.22839e-09 -1.02643e-09 -10.2786 0.731801 -0.0259123 -1.26197e-09 -3.22839e-09 -1.02643e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -67.9194 -75.6472 -108.94 -175.573 70.9623 175.869 23.1787 65.0957 -26.2267 2.03217e-16 0.0 3.88251e-19 -5.48942 -21.4447 -28.8084 -0.248389 28.3547 -1.54871 2.33913 -15.2002 -0.711054
-0.869267 82.609 70.8847 191.894 20.7953 190.226 2.41122 -18.4039 16.5538 -1.51399 -9.69558 5.699 2.26502 12.3645 8.58283 15.7228 0.169173 12.5158 -0.0 0.0 0.0 -0.0 0.0 0.0 1.14341e-13 1.01782e-13 4.06813e-13 -0.464864 39.3785 54.8937 -26.6011 -25.0867 59.4213 -0.382323 -17.313 -2.51085 -9.78626e-10 -2.80218e-09 2.0179e-09 -1.71755e-09 -4.94234e-09 3.46776e-09 -9.78619e-10 -2.80218e-09 2.0179e-09 7.73091 5.47488 0.417314 -9.78624e-10 -2.80218e-09 2.0179e-09 2.90554 0.965183 0.102902 -9.78619e-10 -2.80218e-09 2.0179e-09 10.2786 0.731801 0.0259123 -9.78633e-10 -2.80218e-09 2.0179e-09 2.22167 -0.733487 -0.20892 1.14269e-13 1.01773e-13 4.06564e-13 -43.6815 10.3972 -38.8653 8.85666 -3.47488 -15.6741 0.769133 24.0923 -3.60308 -1.60931e-09 -6.51766e-09 -2.00801e-09 -2.81119e-09 -1.14337e-08 -3.4354e-09 -1.60932e-09 -6.51765e-09 -2.00799e-09 -7.73091 5.47488 -0.417314 -1.60931e-09 -6.51766e-09 -2.008e-09 -2.90554 0.965183 -0.102902 -1.60932e-09 -6.51766e-09 -2.00799e-09 -10.2786 0.731801 -0.0259123 -1.6093e-09 -6.51765e-09 -2.008e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -67.2271 -75.6982 -109.296 -175.455 71.6832 175.75 24.1515 64.8771 -27.3579 2.03217e-16 0.0 3.88251e-19 -5.2892 -21.5666 -27.4655 -0.245965 28.4596 -1.61036 2.64069 -17.1996 0.315841
-0.65686 82.6034 71.457 192.0 25.8519 191.236 2.86143 -18.5618 16.9874 -1.45246 -9.78226 5.77974 2.16143 12.3806 8.6389 16.4019 0.50219 14.4705 -0.0 0.0 0.0 -0.0 0.0 0.0 1.84487e-13 5.80427e-14 5.42602e-13 -0.675783 39.3402 55.5829 -26.7083 -25.4097 59.9565 -0.37921 -17.2421 -2.49995 -9.94003e-10 -2.13298e-09 2.30329e-09 -1.74709e-09 -3.80986e-09 3.95777e-09 -9.93998e-10 -2.13297e-09 2.30329e-09 7.73091 5.47488 0.417314 -9.94001e-10 -2.13297e-09 2.30329e-09 2.90554 0.965183 0.102902 -9.93997e-10 -2.13298e-09 2.30329e-09 10.2786 0.731801 0.0259123 -9.94009e-10 -2.13297e-09 2.30329e-09 2.22167 -0.733487 -0.20892 1.84402e-13 5.80225e-14 5.42347e-13 -46.2426 8.91837 -38.4298 8.59193 -3.32709 -15.1883 0.907401 26.1027 -3.9442 -2.19554e-09 -1.49075e-08 -2.04279e-09 -3.82084e-09 -2.57283e-08 -3.47796e-09 -2.19555e-09 -1.49075e-08 -2.04277e-09 -7.73091 5.47488 -0.417314 -2.19554e-09 -1.49075e-08 -2.04278e-09 -2.90554 0.965183 -0.102902 -2.19555e-09 -1.49075e-08 -2.04277e-09 -10.2786 0.731801 -0.0259123 -2.19553e-09 -1.49075e-08 -2.04278e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -65.54 -75.7252 -108.81 -175.247 72.7421 175.483 26.1638 64.22 -29.7442 2.03217e-16 0.0 3.88251e-19 -5.22983 -22.2486 -25.9922 -0.22435 29.0682 -1.63817 3.36406 -18.4187 2.54643
-0.390758 82.3404 71.9874 192.205 31.0116 192.317 3.3739 -18.7042 17.3012 -1.42185 -9.92175 5.8259 1.88324 12.122 8.35987 17.4107 1.39421 16.5988 -0.0 0.0 0.0 -0.0 0.0 0.0 2.09381e-13 1.5621e-14 7.15932e-13 -0.838065 39.3718 56.5806 -26.7976 -25.6862 60.4025 -0.370215 -17.0393 -2.46878 -7.88546e-10 -8.72679e-10 2.23714e-09 -1.38981e-09 -1.64927e-09 3.84257e-09 -7.88545e-10 -8.72673e-10 2.23714e-09 7.73091 5.47488 0.417314 -7.88544e-10 -8.72674e-10 2.23714e-09 2.90554 0.965183 0.102902 -7.88541e-10 -8.72674e-10 2.23714e-09 10.2786 0.731801 0.0259123 -7.88551e-10 -8.72671e-10 2.23714e-09 2.22167 -0.733487 -0.20892 2.0927e-13 1.55879e-14 7.15674e-13 -49.0382 7.12003 -37.8769 8.36122 -3.20253 -14.7635 1.08939 28.4025 -4.35135 -2.94364e-09 -2.68776e-08 -1.53238e-09 -5.09988e-09 -4.60854e-08 -2.5728e-09 -2.94365e-09 -2.68776e-08 -1.53237e-09 -7.73091 5.47488 -0.417314 -2.94364e-09 -2.68776e-08 -1.53237e-09 -2.90554 0.965183 -0.102902 -2.94365e-09 -2.68776e-08 -1.53237e-09 -10.2786 0.731801 -0.0259123 -2.94363e-09 -2.68776e-08 -1.53238e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -63.0505 -75.7255 -107.641 -174.924 74.0479 175.054 29.0255 62.9036 -33.2746 2.03217e-16 0.0 3.88251e-19 -5.22192 -23.3386 -24.2975 -0.187727 30.0429 -1.64206 4.41831 -19.0392 5.67698
-0.113004 82.1232 72.5759 192.578 36.3929 193.613 3.74559 -18.8818 17.5304 -1.41194 -10.0562 5.85401 1.67422 11.6778 7.98106 18.2965 2.55864 18.4734 -0.0 0.0 0.0 -0.0 0.0 0.0 2.10076e-13 -1.39308e-14 8.59652e-13 -0.911495 39.4723 57.6394 -26.8836 -25.9586 60.8277 -0.363286 -16.8827 -2.44473 -5.11199e-10 6.27256e-10 1.9992e-09 -9.06034e-10 9.32153e-10 3.43183e-09 -5.112e-10 6.27263e-10 1.99919e-09 7.73091 5.47488 0.417314 -5.11197e-10 6.27261e-10 1.9992e-09 2.90554 0.965183 0.102902 -5.11194e-10 6.27263e-10 1.9992e-09 10.2786 0.731801 0.0259123 -5.11201e-10 6.27266e-10 1.9992e-09 2.22167 -0.733487 -0.20892 2.09945e-13 -1.39739e-14 8.59395e-13 -51.5621 5.44284 -37.3531 8.18115 -3.10732 -14.4319 1.2796 30.4393 -4.73208 -3.63175e-09 -3.76167e-08 -9.48504e-10 -6.27527e-09 -6.43163e-08 -1.54241e-09 -3.63175e-09 -3.76167e-08 -9.485e-10 -7.73091 5.47488 -0.417314 -3.63175e-09 -3.76167e-08 -9.48503e-10 -2.90554 0.965183 -0.102902 -3.63175e-09 -3.76167e-08 -9.48503e-10 -10.2786 0.731801 -0.0259123 -3.63174e-09 -3.76167e-08 -9.48511e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -60.2224 -75.7113 -106.039 -174.501 75.4149 174.524 31.446 61.3645 -36.4216 2.03217e-16 0.0 3.88251e-19 -5.30121 -24.519 -22.5663 -0.148537 31.057 -1.6336 5.57891 -19.2809 9.06269
--0.263884 81.912 73.0994 192.757 41.5108 194.936 3.77471 -19.145 17.7113 -1.41254 -10.1279 5.88052 1.78347 11.1382 7.73659 18.6793 3.73187 19.6621 -0.0 0.0 0.0 -0.0 0.0 0.0 2.07626e-13 -1.90608e-14 9.06607e-13 -0.853293 39.6577 58.5165 -26.9781 -26.2652 61.3033 -0.365866 -16.9503 -2.45498 -3.10904e-10 2.01537e-09 1.76922e-09 -5.56106e-10 3.32711e-09 3.03522e-09 -3.10907e-10 2.01537e-09 1.76921e-09 7.73091 5.47488 0.417314 -3.10902e-10 2.01537e-09 1.76921e-09 2.90554 0.965183 0.102902 -3.109e-10 2.01538e-09 1.76921e-09 10.2786 0.731801 0.0259123 -3.10905e-10 2.01538e-09 1.76921e-09 2.22167 -0.733487 -0.20892 2.075e-13 -1.9106e-14 9.06359e-13 -53.3386 4.34819 -36.9622 8.06844 -3.04762 -14.2257 1.41087 31.6638 -4.97247 -4.03798e-09 -4.23135e-08 -7.62891e-10 -6.97401e-09 -7.22323e-08 -1.20929e-09 -4.03798e-09 -4.23135e-08 -7.62891e-10 -7.73091 5.47488 -0.417314 -4.03799e-09 -4.23135e-08 -7.62894e-10 -2.90554 0.965183 -0.102902 -4.03798e-09 -4.23135e-08 -7.62894e-10 -10.2786 0.731801 -0.0259123 -4.03797e-09 -4.23135e-08 -7.62904e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -57.5159 -75.6978 -104.249 -174.044 76.6579 174.001 32.5886 60.1429 -38.0895 2.03217e-16 0.0 3.88251e-19 -5.55443 -25.463 -20.9952 -0.118456 31.7837 -1.62413 6.64142 -19.406 12.0657
--0.676674 81.6956 73.5651 192.216 46.9617 195.684 3.22787 -19.5769 17.7936 -1.4425 -10.0959 5.89961 2.45136 10.4507 7.73701 18.4459 4.99738 19.9742 -0.0 0.0 0.0 -0.0 0.0 0.0 2.11824e-13 3.48142e-14 8.00938e-13 -0.572288 40.0023 59.1906 -27.0848 -26.6233 61.8641 -0.385053 -17.3971 -2.52347 -2.10486e-10 3.48811e-09 1.55822e-09 -3.80018e-10 5.87853e-09 2.67218e-09 -2.10489e-10 3.48811e-09 1.55822e-09 7.73091 5.47488 0.417314 -2.10483e-10 3.48812e-09 1.55822e-09 2.90554 0.965183 0.102902 -2.10482e-10 3.48812e-09 1.55822e-09 10.2786 0.731801 0.0259123 -2.10488e-10 3.48812e-09 1.55822e-09 2.22167 -0.733487 -0.20892 2.11747e-13 3.47792e-14 8.00711e-13 -54.1096 4.03614 -36.6831 8.04113 -3.03242 -14.1769 1.42624 31.7654 -4.99473 -4.11624e-09 -3.80124e-08 -1.40524e-09 -7.12686e-09 -6.4766e-08 -2.31795e-09 -4.11624e-09 -3.80124e-08 -1.40524e-09 -7.73091 5.47488 -0.417314 -4.11625e-09 -3.80124e-08 -1.40524e-09 -2.90554 0.965183 -0.102902 -4.11624e-09 -3.80124e-08 -1.40524e-09 -10.2786 0.731801 -0.0259123 -4.11623e-09 -3.80124e-08 -1.40525e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -55.1015 -75.6481 -102.288 -173.613 77.7169 173.56 32.3852 59.3998 -38.1257 2.03217e-16 0.0 3.88251e-19 -6.1239 -26.051 -19.4547 -0.101618 32.0712 -1.61321 7.59203 -19.3655 14.7243
--1.04685 81.6359 73.8195 192.282 51.8355 196.697 2.27065 -20.1286 17.7788 -1.50022 -9.9995 5.90588 3.491 9.59337 7.84189 17.8587 6.46452 19.6699 -0.0 0.0 0.0 -0.0 0.0 0.0 2.10049e-13 1.31032e-13 5.91111e-13 -0.124829 40.4801 59.7893 -27.1942 -27.0067 62.47 -0.417252 -18.0922 -2.63106 -1.36139e-10 5.1362e-09 1.28266e-09 -2.48734e-10 8.74199e-09 2.19859e-09 -1.36142e-10 5.1362e-09 1.28265e-09 7.73091 5.47488 0.417314 -1.36136e-10 5.13621e-09 1.28266e-09 2.90554 0.965183 0.102902 -1.36136e-10 5.13621e-09 1.28266e-09 10.2786 0.731801 0.0259123 -1.36143e-10 5.13621e-09 1.28266e-09 2.22167 -0.733487 -0.20892 2.10049e-13 1.31016e-13 5.90915e-13 -54.1927 4.24847 -36.4507 8.08676 -3.05632 -14.2605 1.35688 31.0934 -4.86375 -3.9805e-09 -2.7837e-08 -2.52266e-09 -6.92267e-09 -4.72458e-08 -4.25467e-09 -3.98051e-09 -2.7837e-08 -2.52266e-09 -7.73091 5.47488 -0.417314 -3.98051e-09 -2.7837e-08 -2.52266e-09 -2.90554 0.965183 -0.102902 -3.98051e-09 -2.7837e-08 -2.52266e-09 -10.2786 0.731801 -0.0259123 -3.98049e-09 -2.7837e-08 -2.52267e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -52.7385 -75.5557 -100.061 -173.174 78.6948 173.143 31.4191 58.8695 -37.2455 2.03217e-16 0.0 3.88251e-19 -6.94907 -26.4599 -17.9067 -0.0915908 32.1154 -1.59559 8.46316 -19.0748 17.2874
--1.37203 81.6314 73.9147 192.15 56.9057 197.375 1.3027 -20.6503 17.7798 -1.54476 -9.90122 5.91639 4.51318 8.70325 7.90737 17.1422 7.92341 18.98 -0.0 0.0 0.0 -0.0 0.0 0.0 1.89731e-13 2.04278e-13 3.66462e-13 0.320327 40.9706 60.2866 -27.2979 -27.3871 63.0799 -0.452151 -18.7847 -2.73953 -9.18624e-11 6.44959e-09 9.80363e-10 -1.69041e-10 1.10293e-08 1.67881e-09 -9.18644e-11 6.44958e-09 9.80358e-10 7.73091 5.47488 0.417314 -9.18604e-11 6.44959e-09 9.80365e-10 2.90554 0.965183 0.102902 -9.18612e-11 6.44959e-09 9.80363e-10 10.2786 0.731801 0.0259123 -9.18689e-11 6.44959e-09 9.80372e-10 2.22167 -0.733487 -0.20892 1.89807e-13 2.04282e-13 3.66296e-13 -53.9869 4.76699 -36.2912 8.17588 -3.1038 -14.4231 1.25704 30.0883 -4.67124 -3.64902e-09 -1.60947e-08 -3.41299e-09 -6.37559e-09 -2.70773e-08 -5.80459e-09 -3.64902e-09 -1.60947e-08 -3.41299e-09 -7.73091 5.47488 -0.417314 -3.64902e-09 -1.60947e-08 -3.41299e-09 -2.90554 0.965183 -0.102902 -3.64902e-09 -1.60947e-08 -3.41299e-09 -10.2786 0.731801 -0.0259123 -3.64901e-09 -1.60947e-08 -3.413e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -50.2329 -75.4871 -97.6168 -172.683 79.6507 172.688 30.0206 58.4769 -35.8253 2.03217e-16 0.0 3.88251e-19 -7.84612 -26.8156 -16.6971 -0.0833986 32.1108 -1.5756 9.1924 -18.7806 19.4609
--1.73228 81.5754 74.0531 191.422 62.3032 197.337 0.727532 -20.9912 17.9094 -1.53525 -9.86343 5.94815 5.11958 7.91631 7.78999 16.4907 9.15245 18.1297 -0.0 0.0 0.0 -0.0 0.0 0.0 1.383e-13 1.89234e-13 2.16327e-13 0.602059 41.3536 60.6449 -27.3899 -27.7397 63.6502 -0.47582 -19.2241 -2.80907 -8.1656e-11 6.91819e-09 6.89188e-10 -1.47727e-10 1.18521e-08 1.17718e-09 -8.16568e-11 6.91818e-09 6.89185e-10 7.73091 5.47488 0.417314 -8.16545e-11 6.91819e-09 6.89191e-10 2.90554 0.965183 0.102902 -8.16553e-11 6.91819e-09 6.89189e-10 10.2786 0.731801 0.0259123 -8.16635e-11 6.91819e-09 6.89201e-10 2.22167 -0.733487 -0.20892 1.38418e-13 1.89253e-13 2.16178e-13 -53.8853 5.36929 -36.2309 8.27911 -3.15935 -14.6115 1.17325 29.1914 -4.50339 -3.14004e-09 -7.09281e-09 -3.37408e-09 -5.49975e-09 -1.16658e-08 -5.75288e-09 -3.14004e-09 -7.09282e-09 -3.37408e-09 -7.73091 5.47488 -0.417314 -3.14004e-09 -7.09281e-09 -3.37409e-09 -2.90554 0.965183 -0.102902 -3.14004e-09 -7.09281e-09 -3.37408e-09 -10.2786 0.731801 -0.0259123 -3.14003e-09 -7.0928e-09 -3.37409e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -47.3421 -75.5095 -94.9522 -172.057 80.6436 172.094 28.4911 58.1541 -34.2176 2.03217e-16 0.0 3.88251e-19 -8.62508 -27.257 -16.1717 -0.0723118 32.2516 -1.55745 9.75839 -18.7319 20.9646
--2.02686 81.3115 74.2348 191.916 67.4682 198.264 0.719825 -21.0914 18.3079 -1.40998 -9.90832 6.03778 5.0736 7.26238 7.42254 15.9465 10.0823 17.0704 -0.0 0.0 0.0 -0.0 0.0 0.0 3.01128e-14 8.11677e-14 1.90116e-13 0.741439 41.6233 60.6347 -27.4796 -28.0954 64.2132 -0.480351 -19.3026 -2.8216 -1.32848e-10 6.209e-09 4.60518e-10 -2.32212e-10 1.06332e-08 7.8143e-10 -1.32847e-10 6.20899e-09 4.60516e-10 7.73091 5.47488 0.417314 -1.32848e-10 6.209e-09 4.60522e-10 2.90554 0.965183 0.102902 -1.32847e-10 6.209e-09 4.6052e-10 10.2786 0.731801 0.0259123 -1.32855e-10 6.209e-09 4.60532e-10 2.22167 -0.733487 -0.20892 3.0226e-14 8.11931e-14 1.89962e-13 -54.112 6.10188 -36.3399 8.38417 -3.21547 -14.8047 1.11614 28.536 -4.38337 -2.33596e-09 -1.50835e-09 -1.75354e-09 -4.07669e-09 -2.21228e-09 -2.97577e-09 -2.33596e-09 -1.50836e-09 -1.75354e-09 -7.73091 5.47488 -0.417314 -2.33596e-09 -1.50836e-09 -1.75354e-09 -2.90554 0.965183 -0.102902 -2.33596e-09 -1.50835e-09 -1.75354e-09 -10.2786 0.731801 -0.0259123 -2.33595e-09 -1.50835e-09 -1.75355e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -43.56 -75.6343 -91.683 -171.204 81.7024 171.282 26.3227 58.2151 -31.7215 2.03217e-16 0.0 3.88251e-19 -9.19647 -27.8484 -16.4126 -0.057073 32.6227 -1.54371 10.2203 -19.1704 21.6795
--2.26197 81.3822 74.6446 194.881 72.3497 201.34 1.04095 -21.0365 18.877 -1.20733 -10.0007 6.16558 4.62223 6.66946 6.89173 15.4217 10.8327 15.7089 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.20695e-13 -8.93147e-14 2.31652e-13 0.812875 41.8388 60.3382 -27.5668 -28.4559 64.7778 -0.473213 -19.1675 -2.80024 -2.34552e-10 4.65971e-09 2.60402e-10 -4.03673e-10 7.95989e-09 4.33728e-10 -2.34548e-10 4.65971e-09 2.60404e-10 7.73091 5.47488 0.417314 -2.34553e-10 4.65971e-09 2.60408e-10 2.90554 0.965183 0.102902 -2.3455e-10 4.65971e-09 2.60408e-10 10.2786 0.731801 0.0259123 -2.34556e-10 4.65971e-09 2.60418e-10 2.22167 -0.733487 -0.20892 -1.20616e-13 -8.92859e-14 2.31482e-13 -54.4096 7.04293 -36.5928 8.50786 -3.28144 -15.0335 1.062 27.8816 -4.26542 -1.26787e-09 2.79872e-09 9.191e-10 -2.17293e-09 4.97492e-09 1.61222e-09 -1.26787e-09 2.79872e-09 9.19108e-10 -7.73091 5.47488 -0.417314 -1.26787e-09 2.79871e-09 9.191e-10 -2.90554 0.965183 -0.102902 -1.26787e-09 2.79872e-09 9.19103e-10 -10.2786 0.731801 -0.0259123 -1.26786e-09 2.79872e-09 9.19091e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -39.0705 -75.7962 -87.8425 -170.072 82.7902 170.203 23.4803 58.5152 -28.3329 2.03217e-16 0.0 3.88251e-19 -9.7053 -28.5048 -17.2547 -0.0403244 33.1092 -1.53167 10.5761 -19.9254 21.7778
--2.57044 81.3306 74.9805 198.524 77.2187 205.339 1.47535 -20.8954 19.3713 -1.0368 -10.1169 6.26404 4.09013 6.12062 6.28461 14.882 11.4563 14.2044 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.6703e-13 -3.34516e-13 2.719e-13 0.73232 41.9777 60.186 -27.6365 -28.7592 65.2603 -0.461846 -18.9511 -2.76609 -3.33442e-10 2.76635e-09 -1.31288e-12 -5.69532e-10 4.69045e-09 -1.99506e-11 -3.33437e-10 2.76636e-09 -1.30915e-12 7.73091 5.47488 0.417314 -3.33445e-10 2.76635e-09 -1.3064e-12 2.90554 0.965183 0.102902 -3.3344e-10 2.76635e-09 -1.30458e-12 10.2786 0.731801 0.0259123 -3.33445e-10 2.76635e-09 -1.29706e-12 2.22167 -0.733487 -0.20892 -2.66996e-13 -3.34486e-13 2.7171e-13 -54.4518 8.01917 -36.8635 8.66437 -3.36683 -15.3219 0.99832 27.1091 -4.12713 -1.77053e-10 5.74666e-09 3.57311e-09 -2.30143e-10 9.82904e-09 6.16853e-09 -1.77058e-10 5.74667e-09 3.57312e-09 -7.73091 5.47488 -0.417314 -1.77051e-10 5.74667e-09 3.57311e-09 -2.90554 0.965183 -0.102902 -1.77056e-10 5.74667e-09 3.57311e-09 -10.2786 0.731801 -0.0259123 -1.77044e-10 5.74667e-09 3.5731e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -34.6537 -75.9743 -84.041 -168.558 83.8664 168.726 21.1384 58.4134 -25.624 2.03217e-16 0.0 3.88251e-19 -10.3169 -29.1351 -18.6741 -0.0233983 33.6069 -1.51745 10.7178 -20.6238 21.4129
--3.01889 81.0946 75.1864 205.679 81.9963 213.229 1.81127 -20.7388 19.5469 -1.0086 -10.2335 6.26549 3.80527 5.59967 5.68793 14.2895 12.0078 12.7183 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.61798e-13 -6.66738e-13 2.41822e-13 0.411077 42.0193 60.6151 -27.6775 -28.948 65.5725 -0.45336 -18.786 -2.7401 -3.76196e-10 1.02496e-09 -4.14782e-10 -6.3721e-10 1.68329e-09 -7.33624e-10 -3.76188e-10 1.02497e-09 -4.14779e-10 7.73091 5.47488 0.417314 -3.76199e-10 1.02497e-09 -4.14776e-10 2.90554 0.965183 0.102902 -3.76193e-10 1.02497e-09 -4.14773e-10 10.2786 0.731801 0.0259123 -3.76198e-10 1.02497e-09 -4.14767e-10 2.22167 -0.733487 -0.20892 -3.61802e-13 -6.6671e-13 2.41623e-13 -53.924 8.86508 -37.0167 8.86743 -3.48104 -15.6941 0.915385 26.0994 -3.94785 6.95212e-10 7.25376e-09 5.13775e-09 1.31003e-09 1.22833e-08 8.8506e-09 6.95207e-10 7.25378e-09 5.13777e-09 -7.73091 5.47488 -0.417314 6.95214e-10 7.25377e-09 5.13776e-09 -2.90554 0.965183 -0.102902 6.95209e-10 7.25377e-09 5.13776e-09 -10.2786 0.731801 -0.0259123 6.9522e-10 7.25377e-09 5.13774e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -31.123 -76.1892 -80.9236 -166.495 84.8893 166.659 20.5893 57.3966 -25.3021 2.03217e-16 0.0 3.88251e-19 -11.188 -29.6424 -20.6408 -0.0076601 34.0114 -1.49708 10.5514 -20.8835 20.7361
--3.34479 81.2166 75.5872 241.898 85.2411 249.729 2.00086 -20.5842 19.2473 -1.22522 -10.3292 6.11759 3.95361 5.11219 5.12609 13.4681 12.4852 11.2894 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.94293e-13 -1.21641e-12 7.59392e-14 -0.237055 41.9265 61.8541 -27.6876 -28.9981 65.6637 -0.446475 -18.6477 -2.71844 -3.50452e-10 -7.84636e-10 -1.28199e-09 -5.81526e-10 -1.4457e-09 -2.22766e-09 -3.50442e-10 -7.84629e-10 -1.28199e-09 7.73091 5.47488 0.417314 -3.50455e-10 -7.84632e-10 -1.28199e-09 2.90554 0.965183 0.102902 -3.50449e-10 -7.84631e-10 -1.28198e-09 10.2786 0.731801 0.0259123 -3.50455e-10 -7.84628e-10 -1.28198e-09 2.22167 -0.733487 -0.20892 -3.94327e-13 -1.21638e-12 7.57482e-14 -52.4593 9.79862 -37.0073 9.17869 -3.66105 -16.2643 0.789747 24.4969 -3.66862 1.41305e-09 6.541e-09 5.15552e-09 2.54684e-09 1.10316e-08 8.86847e-09 1.41304e-09 6.54101e-09 5.15554e-09 -7.73091 5.47488 -0.417314 1.41305e-09 6.541e-09 5.15553e-09 -2.90554 0.965183 -0.102902 1.41304e-09 6.541e-09 5.15553e-09 -10.2786 0.731801 -0.0259123 1.41305e-09 6.541e-09 5.15552e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -29.1413 -76.4805 -78.9982 -163.885 85.7478 163.968 22.8088 54.6192 -28.9654 2.03217e-16 0.0 3.88251e-19 -12.5195 -29.9306 -23.4264 0.00669374 34.2671 -1.46423 9.92076 -20.4513 19.5476
--3.72744 81.122 75.7455 311.822 86.0118 319.99 2.15862 -20.392 18.6347 -1.60433 -10.4214 5.86773 4.32874 4.6638 4.55184 12.4817 12.8598 9.83371 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.89014e-13 -1.93458e-12 -1.73238e-13 -1.13575 41.6801 63.6085 -27.6767 -28.9484 65.5859 -0.438544 -18.4856 -2.69311 -2.84031e-10 -2.80951e-09 -2.46221e-09 -4.52021e-10 -4.94997e-09 -4.26016e-09 -2.84018e-10 -2.80951e-09 -2.46222e-09 7.73091 5.47488 0.417314 -2.84034e-10 -2.80951e-09 -2.46221e-09 2.90554 0.965183 0.102902 -2.84027e-10 -2.80951e-09 -2.4622e-09 10.2786 0.731801 0.0259123 -2.84035e-10 -2.8095e-09 -2.4622e-09 2.22167 -0.733487 -0.20892 -3.8908e-13 -1.93457e-12 -1.73412e-13 -50.3275 10.8268 -36.9129 9.56747 -3.88874 -16.9841 0.651302 22.4718 -3.32835 2.06232e-09 3.90437e-09 4.25481e-09 3.64348e-09 6.539e-09 7.30436e-09 2.06232e-09 3.90437e-09 4.25483e-09 -7.73091 5.47488 -0.417314 2.06232e-09 3.90437e-09 4.25481e-09 -2.90554 0.965183 -0.102902 2.06231e-09 3.90437e-09 4.25481e-09 -10.2786 0.731801 -0.0259123 2.06232e-09 3.90437e-09 4.2548e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -28.128 -76.8641 -77.8118 -160.396 86.4922 160.346 25.8798 50.4755 -34.5025 2.03217e-16 0.0 3.88251e-19 -14.1888 -29.9918 -26.9455 0.0203175 34.4389 -1.42271 8.96755 -19.5535 17.8642
--4.02897 81.2271 76.8643 325.212 81.1426 333.196 2.3184 -20.1491 17.9443 -1.97942 -10.5451 5.59769 4.67123 4.23886 3.94447 11.6534 13.1492 8.32895 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.51676e-13 -2.56451e-12 -3.97767e-13 -2.12755 41.2935 65.5305 -27.6524 -28.837 65.4034 -0.433982 -18.3923 -2.67854 -1.83878e-10 -4.44395e-09 -3.38152e-09 -2.68196e-10 -7.77521e-09 -5.84171e-09 -1.83863e-10 -4.44396e-09 -3.38154e-09 7.73091 5.47488 0.417314 -1.8388e-10 -4.44395e-09 -3.38152e-09 2.90554 0.965183 0.102902 -1.83874e-10 -4.44395e-09 -3.38152e-09 10.2786 0.731801 0.0259123 -1.83883e-10 -4.44395e-09 -3.38151e-09 2.22167 -0.733487 -0.20892 -3.51769e-13 -2.5645e-12 -3.97924e-13 -48.1729 11.4684 -36.7574 9.91319 -4.0925 -17.6335 0.549995 20.6953 -3.04117 2.43435e-09 8.74653e-10 2.99371e-09 4.25426e-09 1.39555e-09 5.12406e-09 2.43435e-09 8.74652e-10 2.99373e-09 -7.73091 5.47488 -0.417314 2.43435e-09 8.74657e-10 2.99371e-09 -2.90554 0.965183 -0.102902 2.43434e-09 8.74657e-10 2.99371e-09 -10.2786 0.731801 -0.0259123 2.43435e-09 8.74657e-10 2.9937e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -27.006 -77.3331 -76.5435 -154.09 87.3094 153.914 27.8941 46.5599 -39.024 2.03217e-16 0.0 3.88251e-19 -15.8466 -29.8978 -30.6253 0.0331612 34.6031 -1.38371 8.03116 -18.5413 16.1528
--4.30005 80.8716 75.6585 354.547 77.9115 363.488 2.51022 -19.8465 17.4105 -2.18396 -10.7355 5.38932 4.72043 3.82153 3.28341 11.3084 13.3707 6.7527 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.87992e-13 -2.84944e-12 -4.89706e-13 -3.06212 40.8178 67.2939 -27.6226 -28.7017 65.1806 -0.437067 -18.4603 -2.68908 -5.69383e-11 -5.08224e-09 -3.466e-09 -4.95522e-11 -8.86705e-09 -5.98291e-09 -5.69236e-11 -5.08226e-09 -3.46602e-09 7.73091 5.47488 0.417314 -5.69401e-11 -5.08224e-09 -3.466e-09 2.90554 0.965183 0.102902 -5.69342e-11 -5.08224e-09 -3.466e-09 10.2786 0.731801 0.0259123 -5.69452e-11 -5.08224e-09 -3.46599e-09 2.22167 -0.733487 -0.20892 -2.88105e-13 -2.84944e-12 -4.89855e-13 -46.6322 11.2352 -36.5546 10.1015 -4.2033 -17.9919 0.508468 19.8405 -2.90672 2.32046e-09 -1.01736e-09 1.93033e-09 4.03348e-09 -1.80855e-09 3.29331e-09 2.32046e-09 -1.01737e-09 1.93036e-09 -7.73091 5.47488 -0.417314 2.32046e-09 -1.01736e-09 1.93034e-09 -2.90554 0.965183 -0.102902 2.32045e-09 -1.01736e-09 1.93033e-09 -10.2786 0.731801 -0.0259123 2.32046e-09 -1.01736e-09 1.93032e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -24.5874 -77.8604 -74.2584 -136.388 88.3085 136.151 28.3922 44.6697 -40.7488 2.03217e-16 0.0 3.88251e-19 -17.1493 -29.7884 -33.9099 0.0451081 34.8359 -1.35842 7.37507 -17.8035 14.8488
--4.67015 80.7428 76.019 357.693 72.7959 367.181 2.76247 -19.4682 17.0489 -2.13948 -11.034 5.25427 4.38584 3.37579 2.5708 11.5869 13.5338 5.1123 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.72941e-13 -2.62025e-12 -3.75827e-13 -4.0283 40.2653 68.923 -27.5899 -28.5616 64.9673 -0.453482 -18.802 -2.74238 1.21419e-10 -4.13087e-09 -2.15083e-09 2.38438e-10 -7.19004e-09 -3.70867e-09 1.21431e-10 -4.13088e-09 -2.15085e-09 7.73091 5.47488 0.417314 1.21418e-10 -4.13087e-09 -2.15083e-09 2.90554 0.965183 0.102902 1.21424e-10 -4.13087e-09 -2.15082e-09 10.2786 0.731801 0.0259123 1.21412e-10 -4.13087e-09 -2.15081e-09 2.22167 -0.733487 -0.20892 -1.73065e-13 -2.62026e-12 -3.75982e-13 -46.1691 9.61408 -36.2719 10.0643 -4.17995 -17.923 0.540963 20.4849 -3.00851 1.44833e-09 -1.18953e-09 1.12969e-09 2.51405e-09 -2.07743e-09 1.92959e-09 1.44833e-09 -1.18954e-09 1.12972e-09 -7.73091 5.47488 -0.417314 1.44833e-09 -1.18953e-09 1.1297e-09 -2.90554 0.965183 -0.102902 1.44832e-09 -1.18953e-09 1.12969e-09 -10.2786 0.731801 -0.0259123 1.44833e-09 -1.18953e-09 1.12968e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -20.1492 -78.4953 -70.3087 -71.7625 88.7998 71.5594 27.4808 45.8208 -38.926 2.03217e-16 0.0 3.88251e-19 -17.9751 -29.7533 -36.7948 0.0566459 35.2 -1.35287 7.02221 -17.4836 14.0225
--5.06952 80.6854 76.5872 357.284 67.7291 367.189 3.05255 -19.0245 16.751 -1.94647 -11.4112 5.15238 3.81143 2.92069 1.81499 12.2886 13.6239 3.41713 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.23247e-14 -2.04745e-12 -1.28514e-13 -5.04777 39.6085 70.5364 -27.549 -28.3921 64.7194 -0.480701 -19.3386 -2.82678 3.46072e-10 -2.05687e-09 1.20654e-10 5.92932e-10 -3.55793e-09 2.16245e-10 3.46079e-10 -2.05688e-09 1.20637e-10 7.73091 5.47488 0.417314 3.46071e-10 -2.05687e-09 1.20651e-10 2.90554 0.965183 0.102902 3.46077e-10 -2.05688e-09 1.20656e-10 10.2786 0.731801 0.0259123 3.46064e-10 -2.05687e-09 1.20665e-10 2.22167 -0.733487 -0.20892 -1.24527e-14 -2.04744e-12 -1.28682e-13 -46.3208 6.98276 -35.9834 9.87697 -4.06759 -17.57 0.633643 22.1367 -3.27456 1.47504e-12 -5.16248e-10 3.22074e-10 5.31608e-12 -8.94229e-10 5.64527e-10 1.47238e-12 -5.16252e-10 3.22092e-10 -7.73091 5.47488 -0.417314 1.47615e-12 -5.16248e-10 3.22077e-10 -2.90554 0.965183 -0.102902 1.47093e-12 -5.16249e-10 3.22071e-10 -10.2786 0.731801 -0.0259123 1.47982e-12 -5.16247e-10 3.22062e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -14.0541 -79.1708 -64.9116 -25.9014 87.4907 25.7887 25.361 48.852 -34.6173 2.03217e-16 0.0 3.88251e-19 -18.5166 -29.7159 -39.5291 0.0680037 35.6406 -1.36032 6.81508 -17.3776 13.4444
--5.48291 80.6018 77.0615 357.32 62.7017 367.564 3.32771 -18.5504 16.5624 -1.70586 -11.7964 5.08786 3.0896 2.52311 1.00464 13.227 13.6224 1.64812 -0.0 0.0 0.0 -0.0 0.0 0.0 1.4191e-13 -1.38365e-12 1.41758e-13 -5.88969 38.8818 71.9878 -27.4942 -28.1648 64.3617 -0.509717 -19.8765 -2.9122 5.65439e-10 1.54612e-10 2.41009e-09 9.38374e-10 3.09797e-10 4.17144e-09 5.65441e-10 1.54608e-10 2.41008e-09 7.73091 5.47488 0.417314 5.65438e-10 1.5461e-10 2.41009e-09 2.90554 0.965183 0.102902 5.65444e-10 1.54609e-10 2.41009e-09 10.2786 0.731801 0.0259123 5.65431e-10 1.5461e-10 2.4101e-09 2.22167 -0.733487 -0.20892 1.41783e-13 -1.38365e-12 1.41574e-13 -46.354 4.19599 -35.8184 9.64256 -3.92788 -17.1315 0.748704 23.8665 -3.56303 -1.545e-09 3.48445e-10 -4.36508e-10 -2.67379e-09 6.12707e-10 -7.14922e-10 -1.54501e-09 3.48443e-10 -4.36496e-10 -7.73091 5.47488 -0.417314 -1.545e-09 3.48443e-10 -4.36505e-10 -2.90554 0.965183 -0.102902 -1.545e-09 3.48442e-10 -4.36512e-10 -10.2786 0.731801 -0.0259123 -1.54499e-09 3.48445e-10 -4.36522e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -6.93289 -79.6816 -58.6206 -13.6175 85.5739 13.6141 22.0966 52.2755 -28.9476 2.03217e-16 0.0 3.88251e-19 -18.9029 -29.6379 -41.9548 0.0785489 36.0578 -1.3727 6.70463 -17.3704 13.0843
--5.83566 80.4591 77.2689 358.595 57.7203 369.106 3.53273 -18.0817 16.5277 -1.518 -12.1188 5.06493 2.31647 2.24999 0.128199 14.2132 13.5105 -0.213092 -0.0 0.0 0.0 -0.0 0.0 0.0 2.37816e-13 -8.81516e-13 3.24516e-13 -6.3353 38.1347 73.1511 -27.4172 -27.8473 63.8214 -0.529304 -20.222 -2.96755 7.2794e-10 1.51846e-09 3.77914e-09 1.19921e-09 2.69363e-09 6.53649e-09 7.27939e-10 1.51846e-09 3.77913e-09 7.73091 5.47488 0.417314 7.27939e-10 1.51846e-09 3.77914e-09 2.90554 0.965183 0.102902 7.27945e-10 1.51845e-09 3.77914e-09 10.2786 0.731801 0.0259123 7.27932e-10 1.51845e-09 3.77915e-09 2.22167 -0.733487 -0.20892 2.37692e-13 -8.81506e-13 3.24317e-13 -45.5614 2.1171 -35.7958 9.46706 -3.82375 -16.8057 0.81511 24.747 -3.71429 -2.71599e-09 7.50506e-10 -1.09003e-09 -4.70433e-09 1.31502e-09 -1.82178e-09 -2.716e-09 7.50506e-10 -1.09002e-09 -7.73091 5.47488 -0.417314 -2.716e-09 7.50503e-10 -1.09003e-09 -2.90554 0.965183 -0.102902 -2.716e-09 7.50502e-10 -1.09004e-09 -10.2786 0.731801 -0.0259123 -2.71599e-09 7.50505e-10 -1.09005e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.0204273 -79.8797 -52.5596 -8.80536 83.533 8.89285 18.615 54.7176 -23.6843 2.03217e-16 0.0 3.88251e-19 -19.2518 -29.5051 -43.9136 0.0872829 36.352 -1.38164 6.64866 -17.3442 12.9145
--6.14273 80.3388 77.4585 359.48 52.6974 370.328 3.74057 -17.6143 16.736 -1.45379 -12.3605 5.09851 1.45313 2.17309 -0.847323 15.3171 13.2286 -2.21407 -0.0 0.0 0.0 -0.0 0.0 0.0 2.52362e-13 -6.03655e-13 3.85917e-13 -6.30842 37.427 73.9899 -27.2969 -27.3742 63.0146 -0.536855 -20.3486 -2.98797 8.31558e-10 1.63848e-09 3.8077e-09 1.37814e-09 2.89993e-09 6.58577e-09 8.31556e-10 1.63848e-09 3.80769e-09 7.73091 5.47488 0.417314 8.31558e-10 1.63848e-09 3.8077e-09 2.90554 0.965183 0.102902 8.31564e-10 1.63848e-09 3.8077e-09 10.2786 0.731801 0.0259123 8.3155e-10 1.63848e-09 3.80771e-09 2.22167 -0.733487 -0.20892 2.52247e-13 -6.03643e-13 3.85702e-13 -43.7064 1.01374 -35.9475 9.34401 -3.75116 -16.5784 0.806274 24.5669 -3.6849 -3.45516e-09 4.45695e-10 -1.70385e-09 -5.99076e-09 7.88322e-10 -2.87101e-09 -3.45517e-09 4.45695e-10 -1.70384e-09 -7.73091 5.47488 -0.417314 -3.45516e-09 4.45692e-10 -1.70385e-09 -2.90554 0.965183 -0.102902 -3.45516e-09 4.4569e-10 -1.70385e-09 -10.2786 0.731801 -0.0259123 -3.45515e-09 4.45694e-10 -1.70386e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.16152 -79.7349 -47.4202 -6.3252 81.4246 6.48134 15.6151 55.9409 -19.5881 2.03217e-16 0.0 3.88251e-19 -19.5531 -29.324 -45.4203 0.0938961 36.5042 -1.38546 6.65711 -17.2827 12.9795
--6.55695 80.4201 77.7009 359.942 47.6481 371.261 3.94343 -17.1353 17.1356 -1.44375 -12.5587 5.18194 0.480149 2.23867 -1.90631 16.5746 12.802 -4.32502 -0.0 0.0 0.0 -0.0 0.0 0.0 2.16312e-13 -4.16912e-13 3.86341e-13 -5.94805 36.7409 74.6018 -27.1272 -26.759 62.0166 -0.537343 -20.351 -2.98849 8.9989e-10 1.08458e-09 3.05285e-09 1.50786e-09 1.92412e-09 5.28134e-09 8.99888e-10 1.08458e-09 3.05284e-09 7.73091 5.47488 0.417314 8.99891e-10 1.08457e-09 3.05284e-09 2.90554 0.965183 0.102902 8.99897e-10 1.08458e-09 3.05285e-09 10.2786 0.731801 0.0259123 8.99882e-10 1.08458e-09 3.05286e-09 2.22167 -0.733487 -0.20892 2.16211e-13 -4.16896e-13 3.86108e-13 -41.1964 0.419497 -36.206 9.22879 -3.68365 -16.3661 0.758085 23.8092 -3.55794 -3.99244e-09 -1.9389e-10 -2.28107e-09 -6.92889e-09 -3.2444e-10 -3.86295e-09 -3.99245e-09 -1.9389e-10 -2.28106e-09 -7.73091 5.47488 -0.417314 -3.99244e-09 -1.93893e-10 -2.28107e-09 -2.90554 0.965183 -0.102902 -3.99244e-09 -1.93895e-10 -2.28107e-09 -10.2786 0.731801 -0.0259123 -3.99243e-09 -1.9389e-10 -2.28107e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.6534 -79.357 -43.06 -4.78309 79.2103 5.00372 12.7194 56.6478 -15.8259 2.03217e-16 0.0 3.88251e-19 -19.747 -29.1483 -46.5476 0.0988659 36.5652 -1.38836 6.7438 -17.2446 13.2765
--6.89549 80.4142 77.8795 360.432 42.5918 372.079 3.96802 -16.6666 17.5598 -1.37804 -12.7257 5.28678 -0.479845 2.3255 -2.98726 17.7553 12.3407 -6.45078 -0.0 0.0 0.0 -0.0 0.0 0.0 1.58414e-13 -2.80261e-13 3.56648e-13 -5.36209 36.0125 75.0676 -26.9284 -26.0947 60.9874 -0.529863 -20.2185 -2.96724 9.19776e-10 3.20735e-10 2.042e-09 1.55775e-09 5.80358e-10 3.53433e-09 9.19774e-10 3.20737e-10 2.04198e-09 7.73091 5.47488 0.417314 9.19778e-10 3.20733e-10 2.04199e-09 2.90554 0.965183 0.102902 9.19784e-10 3.20735e-10 2.042e-09 10.2786 0.731801 0.0259123 9.19768e-10 3.20735e-10 2.04201e-09 2.22167 -0.733487 -0.20892 1.58325e-13 -2.80243e-13 3.56402e-13 -38.2836 0.0905239 -36.3837 9.17324 -3.65176 -16.2632 0.677953 22.5885 -3.35444 -4.28215e-09 -8.97782e-10 -2.67233e-09 -7.43686e-09 -1.55059e-09 -4.53869e-09 -4.28216e-09 -8.97782e-10 -2.67231e-09 -7.73091 5.47488 -0.417314 -4.28215e-09 -8.97784e-10 -2.67232e-09 -2.90554 0.965183 -0.102902 -4.28216e-09 -8.97786e-10 -2.67232e-09 -10.2786 0.731801 -0.0259123 -4.28214e-09 -8.97781e-10 -2.67232e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.3723 -78.8665 -39.4985 -3.74718 76.9317 4.0246 10.1134 57.0945 -12.5052 2.03217e-16 0.0 3.88251e-19 -19.8763 -29.0453 -47.228 0.102137 36.5392 -1.39061 6.87524 -17.223 13.7069
--7.33297 80.3602 78.0298 360.689 37.6418 372.654 3.64693 -16.2297 17.8437 -1.14718 -12.8736 5.38455 -1.31327 2.31278 -4.02829 18.648 11.9565 -8.50035 -0.0 0.0 0.0 -0.0 0.0 0.0 1.07415e-13 -1.52676e-13 3.27697e-13 -4.65318 35.1742 75.4623 -26.7362 -25.4938 60.0725 -0.513855 -19.94 -2.92255 8.78057e-10 -1.89059e-10 1.30256e-09 1.49719e-09 -3.17229e-10 2.2559e-09 8.78055e-10 -1.89056e-10 1.30254e-09 7.73091 5.47488 0.417314 8.78059e-10 -1.89059e-10 1.30255e-09 2.90554 0.965183 0.102902 8.78065e-10 -1.89058e-10 1.30255e-09 10.2786 0.731801 0.0259123 8.78048e-10 -1.89058e-10 1.30256e-09 2.22167 -0.733487 -0.20892 1.0733e-13 -1.52657e-13 3.27448e-13 -35.2188 -0.217977 -36.3022 9.22937 -3.68608 -16.3641 0.574434 21.0196 -3.09569 -4.27863e-09 -1.39551e-09 -2.72825e-09 -7.43278e-09 -2.41745e-09 -4.63931e-09 -4.27864e-09 -1.39551e-09 -2.72823e-09 -7.73091 5.47488 -0.417314 -4.27863e-09 -1.39552e-09 -2.72824e-09 -2.90554 0.965183 -0.102902 -4.27863e-09 -1.39552e-09 -2.72824e-09 -10.2786 0.731801 -0.0259123 -4.27862e-09 -1.39551e-09 -2.72824e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 20.3848 -78.3753 -36.5627 -3.01307 74.6279 3.33592 7.86618 57.54 -9.63639 2.03217e-16 0.0 3.88251e-19 -19.986 -29.0765 -47.394 0.103661 36.4306 -1.39249 7.01815 -17.2112 14.1723
--7.6487 80.2923 78.0887 361.187 32.8923 373.499 2.89658 -15.8053 17.9769 -0.685035 -13.0009 5.48305 -1.97378 2.14388 -5.02914 19.0954 11.7324 -10.4878 -0.0 0.0 0.0 -0.0 0.0 0.0 5.57493e-14 -7.35274e-15 3.07382e-13 -3.85414 34.2001 75.8122 -26.5696 -24.9967 59.2932 -0.48245 -19.3787 -2.83301 6.95692e-10 -4.22709e-10 9.53055e-10 1.18809e-09 -7.27573e-10 1.64978e-09 6.9569e-10 -4.22706e-10 9.53041e-10 7.73091 5.47488 0.417314 6.95693e-10 -4.22709e-10 9.53053e-10 2.90554 0.965183 0.102902 6.95697e-10 -4.22708e-10 9.53055e-10 10.2786 0.731801 0.0259123 6.95683e-10 -4.22708e-10 9.53063e-10 2.22167 -0.733487 -0.20892 5.56541e-14 -7.33743e-15 3.07156e-13 -31.8932 -0.407047 -35.9239 9.44833 -3.81643 -16.7658 0.433563 18.7485 -2.72897 -3.80363e-09 -1.59814e-09 -2.21092e-09 -6.60517e-09 -2.76997e-09 -3.75676e-09 -3.80363e-09 -1.59814e-09 -2.2109e-09 -7.73091 5.47488 -0.417314 -3.80363e-09 -1.59814e-09 -2.21092e-09 -2.90554 0.965183 -0.102902 -3.80363e-09 -1.59814e-09 -2.21091e-09 -10.2786 0.731801 -0.0259123 -3.80362e-09 -1.59813e-09 -2.21091e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 23.769 -77.8773 -34.1783 -2.47923 72.3259 2.83403 6.03568 58.0954 -7.28464 2.03217e-16 0.0 3.88251e-19 -20.1095 -29.251 -47.009 0.103547 36.2533 -1.39454 7.17967 -17.2183 14.6773
--8.01812 80.44 78.1486 361.975 28.0892 374.581 1.82261 -15.3898 18.0371 -0.0624194 -13.1027 5.59229 -2.5344 1.89208 -6.01722 19.26 11.5913 -12.4523 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.83682e-15 1.2854e-13 2.79358e-13 -2.91463 33.1344 76.0916 -26.4138 -24.548 58.5697 -0.441082 -18.5851 -2.70788 4.04876e-10 -5.93798e-10 7.19577e-10 6.90079e-10 -1.0262e-09 1.24311e-09 4.04875e-10 -5.93794e-10 7.19565e-10 7.73091 5.47488 0.417314 4.04877e-10 -5.93797e-10 7.1958e-10 2.90554 0.965183 0.102902 4.04879e-10 -5.93797e-10 7.19581e-10 10.2786 0.731801 0.0259123 4.04868e-10 -5.93797e-10 7.19588e-10 2.22167 -0.733487 -0.20892 -6.95127e-15 1.2855e-13 2.79171e-13 -28.2301 -0.401915 -35.3376 9.7865 -4.01783 -17.3944 0.290736 15.8403 -2.27775 -2.93685e-09 -1.65551e-09 -1.26603e-09 -5.09425e-09 -2.86991e-09 -2.14213e-09 -2.93686e-09 -1.65551e-09 -1.26602e-09 -7.73091 5.47488 -0.417314 -2.93685e-09 -1.65551e-09 -1.26603e-09 -2.90554 0.965183 -0.102902 -2.93686e-09 -1.65551e-09 -1.26603e-09 -10.2786 0.731801 -0.0259123 -2.93685e-09 -1.6555e-09 -1.26603e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 26.5695 -77.3515 -32.3494 -2.07675 70.0012 2.45259 4.61673 58.6683 -5.46848 2.03217e-16 0.0 3.88251e-19 -20.2117 -29.5393 -46.1131 0.101762 36.0008 -1.39646 7.3732 -17.2431 15.2643
--8.33295 80.4859 78.2312 362.864 23.0789 375.635 0.546343 -15.0274 17.9925 0.624385 -13.1863 5.68704 -3.06317 1.63167 -6.972 19.411 11.409 -14.3402 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.56322e-14 2.15069e-13 2.38119e-13 -1.81051 32.0127 76.2944 -26.2632 -24.1297 57.8864 -0.405072 -17.8286 -2.59022 1.59305e-10 -5.91851e-10 5.40867e-10 2.69164e-10 -1.02386e-09 9.32119e-10 1.59303e-10 -5.91848e-10 5.40858e-10 7.73091 5.47488 0.417314 1.59304e-10 -5.91849e-10 5.40876e-10 2.90554 0.965183 0.102902 1.59304e-10 -5.91851e-10 5.40875e-10 10.2786 0.731801 0.0259123 1.59296e-10 -5.91851e-10 5.40881e-10 2.22167 -0.733487 -0.20892 -5.57666e-14 2.15073e-13 2.37966e-13 -24.522 -0.488467 -34.5599 10.1549 -4.23922 -18.0879 0.195291 13.0399 -1.86056 -2.01958e-09 -1.65537e-09 -3.1963e-10 -3.49568e-09 -2.86983e-09 -5.25235e-10 -2.01959e-09 -1.65537e-09 -3.19621e-10 -7.73091 5.47488 -0.417314 -2.01958e-09 -1.65537e-09 -3.19626e-10 -2.90554 0.965183 -0.102902 -2.01959e-09 -1.65537e-09 -3.19625e-10 -10.2786 0.731801 -0.0259123 -2.01957e-09 -1.65536e-09 -3.1963e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 28.8953 -76.8762 -30.925 -1.75625 67.6146 2.14524 3.51834 59.1975 -4.07131 2.03217e-16 0.0 3.88251e-19 -20.2316 -29.9345 -44.748 0.0980663 35.6464 -1.39732 7.57414 -17.2642 15.8917
--8.60385 80.4184 78.3642 363.766 18.0684 376.263 -0.810623 -14.7623 17.8108 1.279 -13.2589 5.74206 -3.62279 1.43644 -7.87299 19.8018 11.0658 -16.0954 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.59255e-14 2.12301e-13 1.78161e-13 -0.518809 30.87 76.415 -26.1106 -23.7219 57.2293 -0.385374 -17.3793 -2.52108 1.1267e-10 -3.06396e-10 3.55669e-10 1.91341e-10 -5.31293e-10 6.13023e-10 1.12668e-10 -3.06392e-10 3.55662e-10 7.73091 5.47488 0.417314 1.12668e-10 -3.06393e-10 3.55681e-10 2.90554 0.965183 0.102902 1.12668e-10 -3.06395e-10 3.55679e-10 10.2786 0.731801 0.0259123 1.12662e-10 -3.06396e-10 3.55685e-10 2.22167 -0.733487 -0.20892 -6.60719e-14 2.12301e-13 1.78012e-13 -21.0457 -0.963234 -33.6087 10.469 -4.43137 -18.684 0.15339 11.0947 -1.57924 -1.39308e-09 -1.68546e-09 2.02248e-10 -2.40515e-09 -2.92226e-09 3.64098e-10 -1.39308e-09 -1.68546e-09 2.02255e-10 -7.73091 5.47488 -0.417314 -1.39308e-09 -1.68546e-09 2.02251e-10 -2.90554 0.965183 -0.102902 -1.39309e-09 -1.68546e-09 2.02252e-10 -10.2786 0.731801 -0.0259123 -1.39307e-09 -1.68545e-09 2.02245e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 30.8608 -76.5252 -29.748 -1.48727 65.1266 1.88436 2.65499 59.6109 -2.98028 2.03217e-16 0.0 3.88251e-19 -20.1053 -30.4259 -42.9532 0.0922566 35.1637 -1.39623 7.7568 -17.2611 16.5179
--8.89152 80.5323 78.4656 364.621 13.749 376.943 -2.23966 -14.654 17.5322 1.89245 -13.3069 5.76829 -4.24175 1.2815 -8.7268 20.4772 10.5581 -17.7237 -0.0 0.0 0.0 -0.0 0.0 0.0 1.21267e-15 3.26805e-14 7.05107e-14 1.04273 29.7167 76.3854 -25.9656 -23.3467 56.6457 -0.385364 -17.3698 -2.51976 5.02993e-10 7.4852e-10 1.97718e-10 8.66536e-10 1.28932e-09 3.4806e-10 5.02992e-10 7.48525e-10 1.97714e-10 7.73091 5.47488 0.417314 5.02992e-10 7.48523e-10 1.97732e-10 2.90554 0.965183 0.102902 5.02991e-10 7.48522e-10 1.97729e-10 10.2786 0.731801 0.0259123 5.02987e-10 7.48521e-10 1.97736e-10 2.22167 -0.733487 -0.20892 1.06759e-15 3.2681e-14 7.03146e-14 -17.9828 -2.20228 -32.5241 10.6601 -4.54672 -19.0551 0.148303 10.5199 -1.49804 -1.30697e-09 -2.1293e-09 1.15461e-10 -2.25708e-09 -3.69148e-09 2.11424e-10 -1.30697e-09 -2.1293e-09 1.15468e-10 -7.73091 5.47488 -0.417314 -1.30697e-09 -2.1293e-09 1.15463e-10 -2.90554 0.965183 -0.102902 -1.30697e-09 -2.1293e-09 1.15464e-10 -10.2786 0.731801 -0.0259123 -1.30696e-09 -2.12929e-09 1.15456e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 32.6235 -76.3046 -28.6998 -1.25981 62.5443 1.65586 2.23359 59.9005 -2.43686 2.03217e-16 0.0 3.88251e-19 -19.7054 -31.0768 -40.425 0.0840258 34.532 -1.39499 7.91236 -17.2864 17.0912
--9.14944 80.4056 78.2085 365.394 9.077 378.324 -3.79781 -14.6626 17.1568 2.51032 -13.3316 5.77322 -4.88017 1.14236 -9.54039 21.2958 9.94866 -19.2473 -0.0 0.0 0.0 -0.0 0.0 0.0 1.21823e-13 -2.76859e-13 -7.27272e-14 2.82311 28.535 76.2578 -25.8327 -23.0114 56.122 -0.397531 -17.6361 -2.56088 1.18263e-09 2.36181e-09 8.29952e-11 2.03989e-09 4.0746e-09 1.62607e-10 1.18263e-09 2.36182e-09 8.2994e-11 7.73091 5.47488 0.417314 1.18263e-09 2.36182e-09 8.30083e-11 2.90554 0.965183 0.102902 1.18263e-09 2.36182e-09 8.30053e-11 10.2786 0.731801 0.0259123 1.18262e-09 2.36182e-09 8.30141e-11 2.22167 -0.733487 -0.20892 1.21687e-13 -2.76856e-13 -7.30037e-14 -15.0953 -3.98226 -31.3085 10.7913 -4.62404 -19.3155 0.157527 10.8129 -1.5408 -1.52637e-09 -2.82005e-09 -3.2926e-10 -2.64193e-09 -4.88826e-09 -5.54076e-10 -1.52637e-09 -2.82005e-09 -3.29252e-10 -7.73091 5.47488 -0.417314 -1.52637e-09 -2.82005e-09 -3.29258e-10 -2.90554 0.965183 -0.102902 -1.52637e-09 -2.82005e-09 -3.29257e-10 -10.2786 0.731801 -0.0259123 -1.52636e-09 -2.82004e-09 -3.29265e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 34.1577 -76.1846 -27.8125 -1.07198 59.883 1.45756 2.26649 60.1171 -2.44824 2.03217e-16 0.0 3.88251e-19 -19.0706 -31.8002 -37.2063 0.0736118 33.77 -1.39356 8.05577 -17.3317 17.6476
--9.3768 80.4828 78.3047 366.12 5.4627 378.709 -5.46097 -14.6816 16.5932 3.11806 -13.3629 5.72649 -5.4913 1.09237 -10.2938 22.2223 9.22286 -20.634 -0.0 0.0 0.0 -0.0 0.0 0.0 2.26284e-13 -5.54519e-13 -1.95442e-13 4.6547 27.3186 76.1926 -25.6922 -22.6671 55.5574 -0.414737 -18.003 -2.61775 1.72676e-09 3.5984e-09 -7.63916e-11 2.9802e-09 6.21199e-09 -1.02396e-10 1.72676e-09 3.59841e-09 -7.63911e-11 7.73091 5.47488 0.417314 1.72676e-09 3.59841e-09 -7.63801e-11 2.90554 0.965183 0.102902 1.72676e-09 3.59841e-09 -7.63829e-11 10.2786 0.731801 0.0259123 1.72676e-09 3.59841e-09 -7.63721e-11 2.22167 -0.733487 -0.20892 2.26157e-13 -5.54513e-13 -1.95797e-13 -12.0427 -5.69073 -29.901 10.9758 -4.744 -19.6659 0.163773 11.1947 -1.59532 -1.66578e-09 -3.01992e-09 -9.05648e-10 -2.88937e-09 -5.23493e-09 -1.54678e-09 -1.66578e-09 -3.01992e-09 -9.05637e-10 -7.73091 5.47488 -0.417314 -1.66578e-09 -3.01993e-09 -9.05647e-10 -2.90554 0.965183 -0.102902 -1.66578e-09 -3.01993e-09 -9.05646e-10 -10.2786 0.731801 -0.0259123 -1.66578e-09 -3.01992e-09 -9.05654e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 35.2988 -76.1836 -27.1574 -0.91466 57.1157 1.2889 2.3599 60.2648 -2.53559 2.03217e-16 0.0 3.88251e-19 -18.4152 -32.4022 -33.8879 0.0618384 32.9099 -1.38849 8.19304 -17.2855 18.2753
--9.72672 80.6808 78.3824 366.774 1.6495 379.028 -7.20105 -14.6023 15.7508 3.70092 -13.4307 5.5977 -6.02486 1.2042 -10.9672 23.2227 8.36604 -21.853 -0.0 0.0 0.0 -0.0 0.0 0.0 2.44975e-13 -6.38501e-13 -2.41523e-13 6.38227 26.0643 76.3295 -25.5189 -22.2574 54.8546 -0.428936 -18.2952 -2.66329 1.71058e-09 3.52322e-09 -3.68334e-10 2.95629e-09 6.08894e-09 -6.06012e-10 1.71058e-09 3.52322e-09 -3.68334e-10 7.73091 5.47488 0.417314 1.71058e-09 3.52322e-09 -3.68324e-10 2.90554 0.965183 0.102902 1.71058e-09 3.52322e-09 -3.68327e-10 10.2786 0.731801 0.0259123 1.71058e-09 3.52322e-09 -3.68315e-10 2.22167 -0.733487 -0.20892 2.44847e-13 -6.38492e-13 -2.41921e-13 -8.53689 -6.6796 -28.2018 11.3232 -4.98526 -20.3075 0.147586 10.886 -1.54879 -1.33971e-09 -1.99113e-09 -1.38744e-09 -2.32908e-09 -3.45382e-09 -2.38108e-09 -1.33971e-09 -1.99113e-09 -1.38742e-09 -7.73091 5.47488 -0.417314 -1.33971e-09 -1.99114e-09 -1.38744e-09 -2.90554 0.965183 -0.102902 -1.33971e-09 -1.99114e-09 -1.38744e-09 -10.2786 0.731801 -0.0259123 -1.33971e-09 -1.99113e-09 -1.38744e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 35.8751 -76.3202 -26.8134 -0.778779 54.2152 1.14972 2.10656 60.3466 -2.20836 2.03217e-16 0.0 3.88251e-19 -17.9903 -32.7626 -31.1048 0.0497972 31.9838 -1.37641 8.3247 -17.0367 19.0611
--10.0489 80.9378 78.2199 367.746 -2.0412 379.444 -9.18072 -14.4181 14.4613 4.27994 -13.5484 5.34733 -6.44187 1.59018 -11.5332 24.3974 7.23715 -22.8405 -0.0 0.0 0.0 -0.0 0.0 0.0 1.05586e-13 -3.80665e-13 -1.60853e-13 7.96711 24.7835 76.7702 -25.3045 -21.7617 54.0649 -0.441884 -18.5542 -2.70382 6.35042e-10 7.63439e-10 -1.02184e-09 1.11105e-09 1.34256e-09 -1.75183e-09 6.35045e-10 7.63439e-10 -1.02185e-09 7.73091 5.47488 0.417314 6.35043e-10 7.63441e-10 -1.02183e-09 2.90554 0.965183 0.102902 6.35047e-10 7.63444e-10 -1.02184e-09 10.2786 0.731801 0.0259123 6.35043e-10 7.63444e-10 -1.02182e-09 2.22167 -0.733487 -0.20892 1.05443e-13 -3.80655e-13 -1.61236e-13 -4.15845 -6.26448 -25.8858 11.9662 -5.44826 -21.502 0.101411 9.4599 -1.34043 -1.14587e-10 1.634e-09 -1.95378e-09 -2.102e-10 2.82311e-09 -3.37115e-09 -1.14593e-10 1.634e-09 -1.95376e-09 -7.73091 5.47488 -0.417314 -1.14587e-10 1.634e-09 -1.95378e-09 -2.90554 0.965183 -0.102902 -1.14587e-10 1.634e-09 -1.95378e-09 -10.2786 0.731801 -0.0259123 -1.14585e-10 1.634e-09 -1.95378e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 35.77 -76.6706 -26.8021 -0.65591 51.1335 1.03706 1.36905 60.409 -1.29841 2.03217e-16 0.0 3.88251e-19 -18.065 -32.8814 -29.2293 0.0379976 30.9575 -1.35877 8.52729 -16.5289 20.2883
--10.1274 81.007 78.2145 368.947 -4.8912 379.714 -11.3461 -14.1684 12.8239 4.85331 -13.698 5.00179 -6.76895 2.17891 -12.0112 25.7244 5.89685 -23.6404 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.36837e-13 9.76971e-14 4.92613e-15 9.50961 23.4706 77.3891 -25.0555 -21.2025 53.2192 -0.456757 -18.844 -2.74937 -1.14469e-09 -3.80773e-09 -1.92151e-09 -1.94486e-09 -6.52284e-09 -3.33463e-09 -1.14469e-09 -3.80774e-09 -1.92153e-09 7.73091 5.47488 0.417314 -1.14469e-09 -3.80773e-09 -1.92151e-09 2.90554 0.965183 0.102902 -1.14468e-09 -3.80773e-09 -1.92151e-09 10.2786 0.731801 0.0259123 -1.14469e-09 -3.80773e-09 -1.9215e-09 2.22167 -0.733487 -0.20892 -1.37004e-13 9.77077e-14 4.59067e-15 0.664015 -4.87045 -23.1167 12.7861 -6.05094 -23.077 0.0530865 7.40445 -1.04455 1.69373e-09 7.07168e-09 -2.64551e-09 2.91906e-09 1.22387e-08 -4.58365e-09 1.69372e-09 7.07168e-09 -2.6455e-09 -7.73091 5.47488 -0.417314 1.69373e-09 7.07168e-09 -2.64551e-09 -2.90554 0.965183 -0.102902 1.69372e-09 7.07168e-09 -2.64551e-09 -10.2786 0.731801 -0.0259123 1.69373e-09 7.07168e-09 -2.64552e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 35.0839 -77.2026 -27.0976 -0.544636 47.8987 0.944175 0.37415 60.4268 -0.0797027 2.03217e-16 0.0 3.88251e-19 -18.4636 -32.8654 -27.886 0.0264388 29.8282 -1.33711 8.7488 -15.831 21.818
--10.3455 81.134 78.0324 369.86 -7.4675 379.888 -13.3391 -13.8166 11.1504 5.37223 -13.8623 4.62952 -7.05748 2.76804 -12.4498 26.9943 4.62809 -24.3776 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.60882e-13 5.54243e-13 1.7428e-13 11.0601 22.1036 77.9969 -24.7583 -20.5714 52.194 -0.466049 -19.0237 -2.77766 -2.77215e-09 -7.75638e-09 -2.63863e-09 -4.74093e-09 -1.3319e-08 -4.60025e-09 -2.77215e-09 -7.75639e-09 -2.63865e-09 7.73091 5.47488 0.417314 -2.77215e-09 -7.75637e-09 -2.63863e-09 2.90554 0.965183 0.102902 -2.77214e-09 -7.75637e-09 -2.63863e-09 10.2786 0.731801 0.0259123 -2.77215e-09 -7.75637e-09 -2.63862e-09 2.22167 -0.733487 -0.20892 -3.61075e-13 5.54254e-13 1.73999e-13 5.04435 -3.56876 -20.4821 13.5342 -6.60746 -24.5796 0.0252496 5.31361 -0.747788 3.34661e-09 1.18325e-08 -3.02893e-09 5.78041e-09 2.04826e-08 -5.26167e-09 3.3466e-09 1.18325e-08 -3.02891e-09 -7.73091 5.47488 -0.417314 3.34661e-09 1.18325e-08 -3.02893e-09 -2.90554 0.965183 -0.102902 3.3466e-09 1.18325e-08 -3.02892e-09 -10.2786 0.731801 -0.0259123 3.34661e-09 1.18325e-08 -3.02894e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 33.9466 -77.771 -27.7296 -0.446673 44.5981 0.865572 -0.7275 60.2961 1.26498 2.03217e-16 0.0 3.88251e-19 -18.7808 -32.7805 -26.6014 0.015809 28.6746 -1.30825 8.80875 -15.0265 23.1086
--10.4622 81.2858 77.8949 370.731 -9.8418 379.818 -14.8065 -13.336 9.75234 5.78903 -14.0245 4.29923 -7.36367 3.1562 -12.896 28.003 3.70987 -25.167 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.45136e-13 7.4663e-13 2.65676e-13 12.6543 20.6735 78.4409 -24.39 -19.844 50.8676 -0.461815 -18.9523 -2.76625 -3.39088e-09 -8.64856e-09 -2.74447e-09 -5.80665e-09 -1.48575e-08 -4.79451e-09 -3.39088e-09 -8.64858e-09 -2.74449e-09 7.73091 5.47488 0.417314 -3.39088e-09 -8.64856e-09 -2.74447e-09 2.90554 0.965183 0.102902 -3.39087e-09 -8.64856e-09 -2.74447e-09 10.2786 0.731801 0.0259123 -3.39088e-09 -8.64856e-09 -2.74446e-09 2.22167 -0.733487 -0.20892 -4.45349e-13 7.46639e-13 2.65427e-13 8.34066 -3.53986 -18.5147 13.9981 -6.95299 -25.5504 0.0175746 3.78198 -0.532303 4.10542e-09 1.3427e-08 -2.6703e-09 7.09559e-09 2.32448e-08 -4.64828e-09 4.10542e-09 1.3427e-08 -2.67028e-09 -7.73091 5.47488 -0.417314 4.10542e-09 1.3427e-08 -2.6703e-09 -2.90554 0.965183 -0.102902 4.10541e-09 1.3427e-08 -2.67029e-09 -10.2786 0.731801 -0.0259123 4.10543e-09 1.3427e-08 -2.6703e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 32.5002 -78.2292 -28.7133 -0.364516 41.319 0.796208 -1.76652 59.9199 2.53656 2.03217e-16 0.0 3.88251e-19 -18.6152 -32.6644 -24.898 0.00694333 27.5756 -1.26894 8.56059 -14.2006 23.628
--10.592 81.5595 77.8616 371.301 -12.002 379.454 -15.668 -12.6231 8.71128 6.08133 -14.2021 4.02233 -7.70589 3.20892 -13.379 28.7381 3.2834 -26.0779 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.007e-13 5.18663e-13 2.60984e-13 14.2034 19.1441 78.7508 -23.9045 -18.9247 49.2394 -0.442311 -18.5716 -2.70637 -2.53957e-09 -5.07311e-09 -1.85396e-09 -4.35303e-09 -8.72074e-09 -3.24443e-09 -2.53957e-09 -5.07313e-09 -1.85398e-09 7.73091 5.47488 0.417314 -2.53957e-09 -5.07311e-09 -1.85396e-09 2.90554 0.965183 0.102902 -2.53956e-09 -5.07311e-09 -1.85396e-09 10.2786 0.731801 0.0259123 -2.53957e-09 -5.07311e-09 -1.85395e-09 2.22167 -0.733487 -0.20892 -3.00924e-13 5.18669e-13 2.60734e-13 10.4331 -5.44365 -17.36 14.094 -7.02041 -25.762 0.0165915 3.07825 -0.433556 3.56892e-09 9.8564e-09 -8.92373e-10 6.17104e-09 1.70654e-08 -1.56787e-09 3.56891e-09 9.8564e-09 -8.92356e-10 -7.73091 5.47488 -0.417314 3.56892e-09 9.8564e-09 -8.92373e-10 -2.90554 0.965183 -0.102902 3.56891e-09 9.8564e-09 -8.92371e-10 -10.2786 0.731801 -0.0259123 3.56893e-09 9.8564e-09 -8.92382e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 30.9633 -78.432 -30.054 -0.293204 37.8105 0.727772 -2.86937 59.3239 3.89498 2.03217e-16 0.0 3.88251e-19 -17.7798 -32.5535 -22.4161 0.00258454 26.6175 -1.21271 7.91692 -13.3762 22.9948
--10.7631 81.7912 77.8721 371.508 -13.9886 379.164 -16.1007 -11.729 7.86441 6.2777 -14.3968 3.76446 -8.0613 3.06231 -13.8673 29.3171 3.16743 -27.0304 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.11659e-14 3.0115e-14 2.02484e-13 15.7099 17.5464 79.0348 -23.2821 -17.8002 47.3852 -0.413163 -17.9635 -2.61163 -7.52652e-10 1.41784e-09 -2.86005e-10 -1.29664e-09 2.42402e-09 -5.09527e-10 -7.5265e-10 1.41784e-09 -2.86023e-10 7.73091 5.47488 0.417314 -7.52651e-10 1.41784e-09 -2.86008e-10 2.90554 0.965183 0.102902 -7.52644e-10 1.41784e-09 -2.86004e-10 10.2786 0.731801 0.0259123 -7.52654e-10 1.41784e-09 -2.86e-10 2.22167 -0.733487 -0.20892 -1.14e-14 3.01155e-14 2.02217e-13 11.7552 -8.58308 -16.7593 13.9617 -6.91561 -25.4913 0.0149747 2.84887 -0.401197 2.19913e-09 2.89344e-09 1.88633e-09 3.80607e-09 5.01328e-09 3.25128e-09 2.19913e-09 2.89344e-09 1.88634e-09 -7.73091 5.47488 -0.417314 2.19913e-09 2.89343e-09 1.88633e-09 -2.90554 0.965183 -0.102902 2.19912e-09 2.89343e-09 1.88633e-09 -10.2786 0.731801 -0.0259123 2.19914e-09 2.89343e-09 1.88632e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 29.2172 -78.4861 -31.7241 -0.232173 34.1175 0.663727 -4.01661 58.5387 5.33046 2.03217e-16 0.0 3.88251e-19 -16.5371 -32.3722 -19.4934 0.00240986 25.7363 -1.14342 7.02927 -12.4847 21.588
--10.9486 82.0923 77.8233 371.44 -15.8577 378.981 -16.1549 -10.8669 7.15119 6.40832 -14.5684 3.52602 -8.42243 2.92048 -14.3156 29.7281 3.15808 -27.911 -0.0 0.0 0.0 -0.0 0.0 0.0 2.86132e-13 -4.87406e-13 9.92592e-14 17.3364 15.9757 79.2767 -22.5342 -16.5566 45.2928 -0.377855 -17.1975 -2.49321 1.33279e-09 8.81324e-09 1.33217e-09 2.27473e-09 1.51372e-08 2.31562e-09 1.33279e-09 8.81324e-09 1.33216e-09 7.73091 5.47488 0.417314 1.33279e-09 8.81324e-09 1.33217e-09 2.90554 0.965183 0.102902 1.33279e-09 8.81324e-09 1.33217e-09 10.2786 0.731801 0.0259123 1.33279e-09 8.81323e-09 1.33218e-09 2.22167 -0.733487 -0.20892 2.85893e-13 -4.87411e-13 9.89711e-14 12.5526 -12.1235 -16.617 13.738 -6.74254 -25.0326 0.0116419 2.75521 -0.387714 5.52345e-10 -4.29423e-09 4.45588e-09 9.61686e-10 -7.42859e-09 7.71025e-09 5.52341e-10 -4.29423e-09 4.45589e-09 -7.73091 5.47488 -0.417314 5.52347e-10 -4.29423e-09 4.45588e-09 -2.90554 0.965183 -0.102902 5.52339e-10 -4.29423e-09 4.45588e-09 -10.2786 0.731801 -0.0259123 5.52359e-10 -4.29423e-09 4.45588e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 26.8539 -78.6215 -33.7332 -0.186386 30.7707 0.612978 -4.83562 57.4927 6.40426 2.03217e-16 0.0 3.88251e-19 -15.1712 -32.0066 -16.7075 0.00253273 24.786 -1.0732 6.11341 -11.4807 20.0174
--11.0592 82.4675 77.7133 371.438 -17.8608 378.717 -15.8885 -10.2496 6.50805 6.50406 -14.6764 3.30754 -8.77504 2.98595 -14.6787 29.9468 3.05805 -28.6062 -0.0 0.0 0.0 -0.0 0.0 0.0 4.5386e-13 -8.02291e-13 -3.96078e-14 19.2448 14.5208 79.4461 -21.681 -15.2856 42.936 -0.339215 -16.3432 -2.36195 3.07965e-09 1.5102e-08 2.37335e-09 5.27328e-09 2.59794e-08 4.13642e-09 3.07966e-09 1.5102e-08 2.37334e-09 7.73091 5.47488 0.417314 3.07966e-09 1.5102e-08 2.37335e-09 2.90554 0.965183 0.102902 3.07966e-09 1.5102e-08 2.37336e-09 10.2786 0.731801 0.0259123 3.07965e-09 1.5102e-08 2.37336e-09 2.22167 -0.733487 -0.20892 4.53622e-13 -8.023e-13 -3.9906e-14 13.056 -15.2242 -16.7919 13.5633 -6.60736 -24.6795 0.00741947 2.45862 -0.345751 -8.15154e-10 -8.5389e-09 5.60638e-09 -1.40112e-09 -1.47773e-08 9.71012e-09 -8.15158e-10 -8.53889e-09 5.60639e-09 -7.73091 5.47488 -0.417314 -8.15152e-10 -8.5389e-09 5.60638e-09 -2.90554 0.965183 -0.102902 -8.15159e-10 -8.5389e-09 5.60638e-09 -10.2786 0.731801 -0.0259123 -8.15139e-10 -8.5389e-09 5.60638e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 23.2932 -79.0651 -36.2628 -0.156643 28.3006 0.581139 -5.01172 56.1263 6.72876 2.03217e-16 0.0 3.88251e-19 -13.9565 -31.399 -14.6393 -0.00107068 23.6202 -1.01434 5.34394 -10.3481 18.8846
--11.2064 83.08 77.8647 370.755 -19.1639 378.831 -15.2231 -10.0207 5.87485 6.55844 -14.7029 3.09679 -9.14886 3.4145 -14.9283 29.9408 2.77389 -29.0439 -0.0 0.0 0.0 -0.0 0.0 0.0 4.30818e-13 -8.21689e-13 -2.67248e-13 21.3616 13.2035 79.6011 -20.6757 -13.9256 40.217 -0.311994 -15.575 -2.24571 4.58948e-09 2.09199e-08 2.60377e-09 7.87964e-09 3.6076e-08 4.54796e-09 4.58948e-09 2.09199e-08 2.60376e-09 7.73091 5.47488 0.417314 4.58948e-09 2.09199e-08 2.60377e-09 2.90554 0.965183 0.102902 4.58948e-09 2.09199e-08 2.60377e-09 10.2786 0.731801 0.0259123 4.58947e-09 2.09199e-08 2.60378e-09 2.22167 -0.733487 -0.20892 4.3059e-13 -8.21702e-13 -2.6754e-13 13.0826 -17.9504 -17.3471 13.4545 -6.52264 -24.4627 0.00243289 1.75651 -0.246913 -1.92516e-09 -8.40026e-09 4.52716e-09 -3.32067e-09 -1.45407e-08 7.84705e-09 -1.92516e-09 -8.40025e-09 4.52716e-09 -7.73091 5.47488 -0.417314 -1.92516e-09 -8.40026e-09 4.52716e-09 -2.90554 0.965183 -0.102902 -1.92516e-09 -8.40026e-09 4.52716e-09 -10.2786 0.731801 -0.0259123 -1.92515e-09 -8.40026e-09 4.52715e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.9448 -80.0215 -40.98 -0.14144 27.0624 0.58199 -4.8183 54.2445 6.64295 2.03217e-16 0.0 3.88251e-19 -12.8838 -30.4904 -13.529 -0.0126069 21.9886 -0.971157 4.69876 -9.04318 18.2645
--11.2148 83.7006 77.984 370.458 -20.4798 378.921 -14.1766 -10.0406 5.29543 6.56118 -14.6719 2.89788 -9.53687 4.06345 -15.0957 29.7327 2.42469 -29.2995 -0.0 0.0 0.0 -0.0 0.0 0.0 2.98444e-13 -6.79488e-13 -5.69987e-13 23.6357 11.9756 79.7396 -19.4579 -12.3917 37.1932 -0.290608 -14.8038 -2.13055 6.11156e-09 2.69487e-08 2.38011e-09 1.05171e-08 4.65806e-08 4.1717e-09 6.11157e-09 2.69487e-08 2.38011e-09 7.73091 5.47488 0.417314 6.11157e-09 2.69487e-08 2.38011e-09 2.90554 0.965183 0.102902 6.11157e-09 2.69487e-08 2.38012e-09 10.2786 0.731801 0.0259123 6.11156e-09 2.69487e-08 2.38012e-09 2.22167 -0.733487 -0.20892 2.98231e-13 -6.79505e-13 -5.70267e-13 12.4802 -20.6205 -18.3501 13.3434 -6.43687 -24.2415 -0.0010669 0.866894 -0.121814 -3.01765e-09 -5.76628e-09 2.02618e-09 -5.21131e-09 -9.98641e-09 3.52183e-09 -3.01765e-09 -5.76628e-09 2.02618e-09 -7.73091 5.47488 -0.417314 -3.01764e-09 -5.76629e-09 2.02617e-09 -2.90554 0.965183 -0.102902 -3.01765e-09 -5.76628e-09 2.02617e-09 -10.2786 0.731801 -0.0259123 -3.01764e-09 -5.76628e-09 2.02617e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.25586 -81.2173 -48.5889 -0.135575 26.702 0.603989 -4.38835 51.9433 6.28323 2.03217e-16 0.0 3.88251e-19 -11.8133 -29.3727 -13.0362 -0.0287501 20.0397 -0.937343 4.09174 -7.59774 17.8652
--11.2138 84.2956 78.1049 370.052 -21.8128 378.961 -12.9481 -10.0971 4.86248 6.53754 -14.6057 2.736 -9.86848 4.6873 -15.2237 29.3739 2.13539 -29.4796 -0.0 0.0 0.0 -0.0 0.0 0.0 1.3336e-13 -4.84187e-13 -8.38537e-13 26.2557 10.8104 79.7467 -18.0678 -10.7845 34.0475 -0.25108 -13.7038 -1.96593 7.23049e-09 3.12467e-08 1.96084e-09 1.24617e-08 5.40956e-08 3.4526e-09 7.2305e-09 3.12467e-08 1.96084e-09 7.73091 5.47488 0.417314 7.2305e-09 3.12468e-08 1.96084e-09 2.90554 0.965183 0.102902 7.2305e-09 3.12468e-08 1.96084e-09 10.2786 0.731801 0.0259123 7.23049e-09 3.12467e-08 1.96084e-09 2.22167 -0.733487 -0.20892 1.33166e-13 -4.84206e-13 -8.388e-13 11.6094 -22.7922 -19.5897 13.2474 -6.3632 -24.0514 -0.0010946 0.0820881 -0.011524 -3.8636e-09 -2.46168e-09 -6.78544e-10 -6.67603e-09 -4.27096e-09 -1.15747e-09 -3.8636e-09 -2.46168e-09 -6.78549e-10 -7.73091 5.47488 -0.417314 -3.86359e-09 -2.46169e-09 -6.78552e-10 -2.90554 0.965183 -0.102902 -3.8636e-09 -2.46169e-09 -6.78548e-10 -10.2786 0.731801 -0.0259123 -3.86359e-09 -2.46169e-09 -6.7855e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -3.84597 -82.2696 -56.8831 -0.134972 26.6859 0.615259 -3.37851 49.5868 5.10038 2.03217e-16 0.0 3.88251e-19 -10.8036 -28.2345 -12.8599 -0.0432143 18.2256 -0.908267 3.55552 -6.13183 17.7295
--11.1662 84.8779 78.3558 369.734 -23.1541 378.812 -11.7291 -9.97742 4.67009 6.51231 -14.5268 2.63617 -10.074 5.04069 -15.3523 28.9153 2.03098 -29.6894 -0.0 0.0 0.0 -0.0 0.0 0.0 1.2188e-14 -3.44287e-13 -9.63609e-13 29.403 9.66917 79.5266 -16.5967 -9.25354 30.9426 -0.178369 -11.9486 -1.70429 7.53085e-09 3.18723e-08 1.6044e-09 1.29897e-08 5.52237e-08 2.83561e-09 7.53085e-09 3.18723e-08 1.6044e-09 7.73091 5.47488 0.417314 7.53085e-09 3.18723e-08 1.6044e-09 2.90554 0.965183 0.102902 7.53086e-09 3.18723e-08 1.6044e-09 10.2786 0.731801 0.0259123 7.53084e-09 3.18723e-08 1.6044e-09 2.22167 -0.733487 -0.20892 1.20149e-14 -3.44304e-13 -9.63857e-13 10.9168 -24.0483 -20.8044 13.1847 -6.31501 -23.9277 0.000114535 -0.305597 0.0429492 -4.23399e-09 -3.11186e-10 -2.36899e-09 -7.31785e-09 -5.5092e-10 -4.08282e-09 -4.23399e-09 -3.11183e-10 -2.36899e-09 -7.73091 5.47488 -0.417314 -4.23399e-09 -3.11196e-10 -2.36899e-09 -2.90554 0.965183 -0.102902 -4.234e-09 -3.11188e-10 -2.36899e-09 -10.2786 0.731801 -0.0259123 -4.23399e-09 -3.11191e-10 -2.36899e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.91 -83.0546 -61.1371 -0.135558 26.4808 0.584106 -1.54968 47.5016 2.61291 2.03217e-16 0.0 3.88251e-19 -9.93308 -27.255 -12.7063 -0.0500882 16.9988 -0.878324 3.11617 -4.7668 17.8959
--11.0915 85.433 78.9546 369.668 -24.5805 378.253 -10.5588 -9.65196 4.80879 6.44579 -14.3852 2.61413 -10.0567 4.97212 -15.5102 28.3301 2.17942 -30.0076 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.95802e-14 -2.86853e-13 -8.44205e-13 32.4572 8.50343 79.1892 -15.0887 -7.87413 27.8047 -0.214474 -10.2948 -1.43027 6.47046e-09 2.63036e-08 1.05917e-09 1.11522e-08 4.56192e-08 1.888e-09 6.47046e-09 2.63036e-08 1.05918e-09 7.73091 5.47488 0.417314 6.47046e-09 2.63036e-08 1.05918e-09 2.90554 0.965183 0.102902 6.47047e-09 2.63036e-08 1.05918e-09 10.2786 0.731801 0.0259123 6.47045e-09 2.63036e-08 1.05918e-09 2.22167 -0.733487 -0.20892 -5.97275e-14 -2.86865e-13 -8.44438e-13 10.6585 -24.2568 -21.97 13.1472 -6.28572 -23.8551 -0.000382668 -0.0272105 0.00382498 -3.80017e-09 8.47489e-12 -2.55129e-09 -6.56807e-09 4.81312e-12 -4.40076e-09 -3.80017e-09 8.47675e-12 -2.5513e-09 -7.73091 5.47488 -0.417314 -3.80016e-09 8.46397e-12 -2.5513e-09 -2.90554 0.965183 -0.102902 -3.80017e-09 8.4743e-12 -2.5513e-09 -10.2786 0.731801 -0.0259123 -3.80016e-09 8.4719e-12 -2.5513e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -13.6993 -83.5477 -57.912 -0.141329 25.9487 0.467924 1.53058 47.3684 -1.8987 2.03217e-16 0.0 3.88251e-19 -9.24998 -26.3766 -12.6365 -0.0520714 16.3957 -0.847381 2.80772 -3.61642 18.5082
--11.2314 85.6717 79.3865 368.908 -26.671 378.089 -9.34431 -9.2257 5.20591 6.33978 -14.1877 2.65345 -9.88355 4.64214 -15.6691 27.6094 2.49967 -30.3616 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.17829e-13 -2.54642e-13 -5.62564e-13 35.5314 7.30706 78.7683 -13.5145 -6.59414 24.5625 -0.325918 -8.63506 -1.13798 4.41468e-09 1.62442e-08 2.94171e-10 7.58718e-09 2.82408e-08 5.56251e-10 4.41468e-09 1.62442e-08 2.94174e-10 7.73091 5.47488 0.417314 4.41468e-09 1.62442e-08 2.94172e-10 2.90554 0.965183 0.102902 4.41469e-09 1.62442e-08 2.94172e-10 10.2786 0.731801 0.0259123 4.41467e-09 1.62442e-08 2.94176e-10 2.22167 -0.733487 -0.20892 -1.17947e-13 -2.54645e-13 -5.62781e-13 10.6357 -23.666 -23.1578 13.1301 -6.27181 -23.823 -0.000405493 0.697684 -0.0980458 -2.77346e-09 -4.66137e-10 -1.93143e-09 -4.7927e-09 -8.11213e-10 -3.3327e-09 -2.77347e-09 -4.66137e-10 -1.93143e-09 -7.73091 5.47488 -0.417314 -2.77346e-09 -4.66147e-10 -1.93144e-09 -2.90554 0.965183 -0.102902 -2.77347e-09 -4.66136e-10 -1.93143e-09 -10.2786 0.731801 -0.0259123 -2.77346e-09 -4.66136e-10 -1.93144e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.3882 -83.781 -48.5625 -0.155699 25.3724 0.296297 5.97127 48.2188 -8.24566 2.03217e-16 0.0 3.88251e-19 -8.68525 -25.5424 -12.751 -0.0522569 16.2033 -0.816935 2.57153 -2.59964 19.4947
--11.4011 86.31 79.8908 368.016 -28.4023 378.094 -8.07632 -8.68751 5.71137 6.28114 -14.0419 2.73074 -9.72856 4.27295 -15.7825 26.8286 2.89497 -30.6294 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.48003e-13 -2.29686e-13 -2.84251e-13 39.8899 6.03075 78.0718 -11.9059 -5.41141 21.3688 -0.290952 -5.34529 -0.65794 2.30937e-09 6.09045e-09 -1.01219e-10 3.95112e-09 1.06468e-08 -1.45833e-10 2.30937e-09 6.09045e-09 -1.01216e-10 7.73091 5.47488 0.417314 2.30937e-09 6.09045e-09 -1.01217e-10 2.90554 0.965183 0.102902 2.30937e-09 6.09045e-09 -1.01218e-10 10.2786 0.731801 0.0259123 2.30936e-09 6.09045e-09 -1.01212e-10 2.22167 -0.733487 -0.20892 -1.4809e-13 -2.29681e-13 -2.84455e-13 10.6569 -22.4525 -24.233 13.1557 -6.29128 -23.8736 0.00205093 1.42862 -0.200812 -1.73488e-09 -9.89781e-10 -1.09109e-09 -2.99679e-09 -1.71338e-09 -1.88282e-09 -1.73488e-09 -9.89782e-10 -1.09109e-09 -7.73091 5.47488 -0.417314 -1.73487e-09 -9.8979e-10 -1.0911e-09 -2.90554 0.965183 -0.102902 -1.73488e-09 -9.89778e-10 -1.09109e-09 -10.2786 0.731801 -0.0259123 -1.73487e-09 -9.89777e-10 -1.09111e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.90336 -83.7664 -34.3079 -0.171265 24.85 0.144757 10.0674 46.5615 -14.4711 2.03217e-16 0.0 3.88251e-19 -8.17115 -24.926 -12.8249 -0.045671 16.4991 -0.783432 2.30389 -1.54338 20.5733
--11.5403 86.876 80.3412 367.238 -29.8896 378.002 -6.74197 -8.02664 6.17588 6.35758 -14.0553 2.82281 -9.76272 4.08588 -15.8029 26.0574 3.27185 -30.6878 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.35547e-13 -1.9402e-13 -1.74831e-13 46.7724 4.51256 76.927 -10.3068 -4.32996 18.3781 -0.00176554 1.19971 0.168633 1.1004e-09 2.38749e-10 4.62399e-10 1.90047e-09 3.95861e-10 7.95547e-10 1.10039e-09 2.38755e-10 4.62402e-10 7.73091 5.47488 0.417314 1.10039e-09 2.38743e-10 4.62402e-10 2.90554 0.965183 0.102902 1.10039e-09 2.38746e-10 4.62401e-10 10.2786 0.731801 0.0259123 1.10038e-09 2.38748e-10 4.62408e-10 2.22167 -0.733487 -0.20892 -1.35605e-13 -1.94008e-13 -1.7503e-13 10.5023 -20.7903 -25.0793 13.2461 -6.36193 -24.0493 0.00365144 1.72514 -0.242527 -1.2654e-09 -8.17217e-10 -6.11964e-10 -2.18541e-09 -1.41608e-09 -1.05532e-09 -1.26541e-09 -8.1722e-10 -6.11964e-10 -7.73091 5.47488 -0.417314 -1.2654e-09 -8.17227e-10 -6.11974e-10 -2.90554 0.965183 -0.102902 -1.26541e-09 -8.17213e-10 -6.1197e-10 -10.2786 0.731801 -0.0259123 -1.26539e-09 -8.17211e-10 -6.11983e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.60942 -83.4705 -16.5858 -0.176633 24.4797 0.0871259 10.6272 39.4782 -17.713 2.03217e-16 0.0 3.88251e-19 -7.65106 -24.6995 -12.6368 -0.0277063 17.3607 -0.743391 1.90971 -0.272961 21.4672
--11.6963 87.3793 80.7813 366.498 -31.4161 377.842 -5.32154 -7.24826 6.54309 6.71149 -14.3459 2.93473 -10.1306 4.15189 -15.6811 25.2761 3.73122 -30.4364 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.30998e-14 -1.38907e-13 -4.01966e-13 56.3677 2.5108 75.1813 -8.67585 -3.37215 15.3939 0.162322 11.7199 1.70979 1.17677e-09 1.45452e-09 3.01788e-09 2.17639e-09 2.12266e-09 5.15374e-09 1.17676e-09 1.45453e-09 3.01788e-09 7.73091 5.47488 0.417314 1.17676e-09 1.45451e-09 3.01789e-09 2.90554 0.965183 0.102902 1.17676e-09 1.45451e-09 3.01789e-09 10.2786 0.731801 0.0259123 1.17676e-09 1.45452e-09 3.01789e-09 2.22167 -0.733487 -0.20892 -4.31283e-14 -1.38895e-13 -4.02174e-13 10.2898 -18.1435 -25.4709 13.4756 -6.54248 -24.4982 0.00167427 1.13752 -0.159959 -1.87888e-09 9.14176e-10 -8.14164e-10 -3.24811e-09 1.56444e-09 -1.40085e-09 -1.87889e-09 9.14171e-10 -8.14161e-10 -7.73091 5.47488 -0.417314 -1.87888e-09 9.14161e-10 -8.14172e-10 -2.90554 0.965183 -0.102902 -1.87889e-09 9.14179e-10 -8.14169e-10 -10.2786 0.731801 -0.0259123 -1.87887e-09 9.14181e-10 -8.14182e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 20.9967 -82.5672 5.2648 -0.160771 24.2586 0.180641 6.40238 23.6087 -18.2794 2.03217e-16 0.0 3.88251e-19 -7.11398 -24.9606 -12.1092 0.000904364 18.9261 -0.691059 1.40996 1.19556 22.2195
--11.861 87.8404 81.1213 365.767 -33.2262 377.774 -3.83102 -6.35602 6.89873 7.2585 -14.8265 3.07579 -10.7084 4.34903 -15.4545 24.4511 4.2862 -29.9647 -0.0 0.0 0.0 -0.0 0.0 0.0 1.10415e-13 -7.52452e-14 -8.36185e-13 67.9248 -0.346464 73.1908 -7.05538 -2.56446 12.399 -0.512334 25.2107 4.06632 1.98843e-09 6.86201e-09 6.95899e-09 3.79561e-09 1.0923e-08 1.18871e-08 1.98843e-09 6.86202e-09 6.95899e-09 7.73091 5.47488 0.417314 1.98842e-09 6.862e-09 6.959e-09 2.90554 0.965183 0.102902 1.98843e-09 6.862e-09 6.959e-09 10.2786 0.731801 0.0259123 1.98842e-09 6.86201e-09 6.95901e-09 2.22167 -0.733487 -0.20892 1.10417e-13 -7.52346e-14 -8.36411e-13 10.0644 -14.6261 -25.6195 13.8046 -6.8024 -25.1529 0.00240642 0.011415 -0.00182587 -3.14582e-09 3.58564e-09 -1.33245e-09 -5.44167e-09 6.1622e-09 -2.28955e-09 -3.14582e-09 3.58563e-09 -1.33245e-09 -7.73091 5.47488 -0.417314 -3.14582e-09 3.58562e-09 -1.33246e-09 -2.90554 0.965183 -0.102902 -3.14582e-09 3.58564e-09 -1.33246e-09 -10.2786 0.731801 -0.0259123 -3.14581e-09 3.58564e-09 -1.33247e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 30.406 -80.4552 24.2978 -0.129909 24.1437 0.372338 -0.772279 1.80037 -19.6282 2.03217e-16 0.0 3.88251e-19 -6.57513 -25.5995 -11.3603 0.0346057 21.1149 -0.62944 0.835322 2.78656 22.9481
--12.0763 88.2234 81.606 365.022 -35.1005 377.602 -2.31001 -5.33724 7.30727 7.74548 -15.2968 3.2288 -11.2635 4.60895 -15.2047 23.6357 4.70895 -29.4295 -0.0 0.0 0.0 -0.0 0.0 0.0 2.5513e-13 -1.45148e-14 -1.19735e-12 81.3048 -4.29822 71.722 -5.64143 -1.92509 9.81868 -2.55791 40.679 7.36703 3.07263e-09 1.23958e-08 1.04165e-08 5.82799e-09 2.00467e-08 1.77867e-08 3.07264e-09 1.23958e-08 1.04165e-08 7.73091 5.47488 0.417314 3.07263e-09 1.23958e-08 1.04165e-08 2.90554 0.965183 0.102902 3.07263e-09 1.23958e-08 1.04165e-08 10.2786 0.731801 0.0259123 3.07263e-09 1.23958e-08 1.04165e-08 2.22167 -0.733487 -0.20892 2.55157e-13 -1.45073e-14 -1.1976e-12 9.52309 -11.3858 -25.9782 14.0901 -7.029 -25.7321 0.00596375 -0.900511 0.126309 -4.23219e-09 5.72035e-09 -1.72052e-09 -7.32201e-09 9.83827e-09 -2.95487e-09 -4.23219e-09 5.72034e-09 -1.72051e-09 -7.73091 5.47488 -0.417314 -4.23219e-09 5.72032e-09 -1.72052e-09 -2.90554 0.965183 -0.102902 -4.23219e-09 5.72034e-09 -1.72052e-09 -10.2786 0.731801 -0.0259123 -4.23218e-09 5.72035e-09 -1.72053e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 32.1981 -77.6109 35.195 -0.0987077 24.1741 0.570819 -9.67454 -19.3692 -23.0873 2.03217e-16 0.0 3.88251e-19 -6.01752 -26.4757 -10.4622 0.0717491 23.6767 -0.568339 0.124946 4.59328 23.4969
--12.3353 88.579 82.1529 364.275 -36.8385 377.163 -0.803463 -4.1798 7.83308 7.9167 -15.5568 3.37563 -11.5611 4.86281 -15.0134 22.8962 4.76462 -28.9853 -0.0 0.0 0.0 -0.0 0.0 0.0 3.21179e-13 3.18038e-14 -1.20533e-12 96.5594 -9.13768 71.6296 -4.64624 -1.47387 8.07894 -6.85761 57.1283 12.561 3.96662e-09 1.39906e-08 1.15211e-08 7.34338e-09 2.27438e-08 1.9644e-08 3.96663e-09 1.39906e-08 1.15211e-08 7.73091 5.47488 0.417314 3.96662e-09 1.39906e-08 1.15211e-08 2.90554 0.965183 0.102902 3.96663e-09 1.39906e-08 1.15211e-08 10.2786 0.731801 0.0259123 3.96662e-09 1.39906e-08 1.15211e-08 2.22167 -0.733487 -0.20892 3.21215e-13 3.18079e-14 -1.20558e-12 8.41513 -9.57726 -26.8698 14.1977 -7.1151 -25.9528 0.000876999 -0.845589 0.118849 -4.30397e-09 5.84147e-09 -1.53205e-09 -7.44503e-09 1.00537e-08 -2.63022e-09 -4.30398e-09 5.84146e-09 -1.53204e-09 -7.73091 5.47488 -0.417314 -4.30397e-09 5.84144e-09 -1.53205e-09 -2.90554 0.965183 -0.102902 -4.30397e-09 5.84146e-09 -1.53205e-09 -10.2786 0.731801 -0.0259123 -4.30397e-09 5.84147e-09 -1.53206e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 29.5407 -74.8995 39.4078 -0.0826842 24.3889 0.68504 -17.7688 -33.9157 -27.2926 2.03217e-16 0.0 3.88251e-19 -5.43255 -27.4482 -9.48907 0.113533 26.3613 -0.518063 -0.762612 6.71836 23.7146
--12.5782 88.8862 82.7498 363.698 -38.6615 376.612 0.673398 -2.78582 8.58516 7.63076 -15.4938 3.52439 -11.4779 5.16432 -14.9291 22.2592 4.16862 -28.6984 -0.0 0.0 0.0 -0.0 0.0 0.0 2.65974e-13 5.12311e-14 -5.96813e-13 117.013 -14.9094 74.0554 -4.32891 -1.31045 7.56804 -24.6366 76.672 31.4626 4.83935e-09 9.00339e-09 8.83829e-09 8.4831e-09 1.47118e-08 1.49756e-08 4.83936e-09 9.0034e-09 8.83828e-09 7.73091 5.47488 0.417314 4.83935e-09 9.00339e-09 8.8383e-09 2.90554 0.965183 0.102902 4.83936e-09 9.00339e-09 8.8383e-09 10.2786 0.731801 0.0259123 4.83935e-09 9.0034e-09 8.83831e-09 2.22167 -0.733487 -0.20892 2.65999e-13 5.12305e-14 -5.97042e-13 6.36958 -9.94286 -28.5622 14.0295 -6.98252 -25.6052 -0.0139362 0.717582 -0.100201 -2.78344e-09 2.63055e-09 -2.82223e-10 -4.80898e-09 4.54089e-09 -4.81303e-10 -2.78344e-09 2.63054e-09 -2.8221e-10 -7.73091 5.47488 -0.417314 -2.78344e-09 2.63052e-09 -2.82221e-10 -2.90554 0.965183 -0.102902 -2.78344e-09 2.63054e-09 -2.82223e-10 -10.2786 0.731801 -0.0259123 -2.78344e-09 2.63055e-09 -2.82232e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 25.505 -72.7463 39.0567 -0.0891422 24.8974 0.672128 -20.5409 -40.3921 -27.9175 2.03217e-16 0.0 3.88251e-19 -4.79046 -28.5546 -8.22094 0.171482 29.433 -0.478302 -2.02872 9.67214 23.7428
--12.8534 89.2009 83.356 362.996 -40.6523 376.167 2.11704 -1.19769 9.50145 7.04589 -15.2345 3.67972 -11.1587 5.52602 -14.8997 21.6969 3.11485 -28.4861 -0.0 0.0 0.0 -0.0 0.0 0.0 1.34763e-13 5.30294e-14 4.15929e-13 142.365 -20.3354 79.5699 -4.55784 -1.4063 7.96387 -144.85 75.688 153.36 5.84018e-09 1.22102e-10 3.67704e-09 9.61343e-09 3.84726e-10 6.03534e-09 5.84018e-09 1.221e-10 3.67702e-09 7.73091 5.47488 0.417314 5.84018e-09 1.22097e-10 3.67704e-09 2.90554 0.965183 0.102902 5.84018e-09 1.22097e-10 3.67704e-09 10.2786 0.731801 0.0259123 5.84017e-09 1.22101e-10 3.67705e-09 2.22167 -0.733487 -0.20892 1.34763e-13 5.30227e-14 4.15733e-13 3.47604 -11.6299 -30.8191 13.6746 -6.70285 -24.8859 -0.00990442 3.27392 -0.45928 -2.33842e-10 -2.81656e-09 1.66899e-09 -3.89592e-10 -4.81584e-09 2.87309e-09 -2.33847e-10 -2.81657e-09 1.66901e-09 -7.73091 5.47488 -0.417314 -2.33841e-10 -2.81658e-09 1.669e-09 -2.90554 0.965183 -0.102902 -2.33846e-10 -2.81656e-09 1.66899e-09 -10.2786 0.731801 -0.0259123 -2.33845e-10 -2.81656e-09 1.66898e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 21.7011 -70.8787 36.7929 -0.106987 25.6458 0.586178 -18.4347 -42.5109 -24.489 2.03217e-16 0.0 3.88251e-19 -4.06107 -29.8384 -6.67784 0.241353 32.9149 -0.444936 -3.54989 13.2604 23.6569
--13.1663 89.4696 83.9588 362.141 -42.4636 375.825 3.51733 0.388268 10.3894 6.35529 -14.9376 3.81792 -10.7693 5.81707 -14.8552 21.196 2.08489 -28.2705 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.05681e-14 5.83308e-14 1.39965e-12 166.669 -23.5979 86.5499 -4.94875 -1.584 8.62876 -159.756 54.8878 170.118 6.47693e-09 -8.72276e-09 -1.71667e-09 1.01417e-08 -1.38822e-08 -3.27974e-09 6.47693e-09 -8.72276e-09 -1.71669e-09 7.73091 5.47488 0.417314 6.47693e-09 -8.72276e-09 -1.71667e-09 2.90554 0.965183 0.102902 6.47694e-09 -8.72276e-09 -1.71667e-09 10.2786 0.731801 0.0259123 6.47693e-09 -8.72276e-09 -1.71666e-09 2.22167 -0.733487 -0.20892 -1.06004e-14 5.83189e-14 1.39949e-12 0.262754 -13.4438 -33.1347 13.2867 -6.39842 -24.1189 0.0290881 5.99117 -0.843995 2.46736e-09 -8.35522e-09 3.50073e-09 4.29098e-09 -1.43277e-08 6.01983e-09 2.46736e-09 -8.35523e-09 3.50074e-09 -7.73091 5.47488 -0.417314 2.46736e-09 -8.35523e-09 3.50074e-09 -2.90554 0.965183 -0.102902 2.46736e-09 -8.35522e-09 3.50073e-09 -10.2786 0.731801 -0.0259123 2.46736e-09 -8.35522e-09 3.50072e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 18.6983 -69.0197 34.4436 -0.124649 26.4292 0.481743 -14.5158 -42.5964 -19.5214 2.03217e-16 0.0 3.88251e-19 -3.28369 -31.1765 -5.31515 0.305721 36.1948 -0.42367 -4.80452 16.5555 23.1295
--13.5033 89.6186 84.5174 361.161 -44.2279 375.658 4.89656 1.78101 11.0534 5.75426 -14.7616 3.91568 -10.4766 5.9068 -14.725 20.7407 1.56104 -27.9571 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.08134e-13 8.82674e-14 1.9211e-12 -177.035 -25.0852 91.9763 -5.12379 -1.66736 8.92475 -161.296 41.4685 172.865 6.25745e-09 -1.36006e-08 -5.09683e-09 9.47524e-09 -2.17339e-08 -9.07272e-09 6.25745e-09 -1.36006e-08 -5.09685e-09 7.73091 5.47488 0.417314 6.25746e-09 -1.36006e-08 -5.09683e-09 2.90554 0.965183 0.102902 6.25746e-09 -1.36006e-08 -5.09682e-09 10.2786 0.731801 0.0259123 6.25745e-09 -1.36006e-08 -5.09681e-09 2.22167 -0.733487 -0.20892 -1.082e-13 8.82536e-14 1.92096e-12 -2.50596 -14.3339 -34.8913 13.0321 -6.19926 -23.6261 0.0798927 8.03748 -1.13714 4.44272e-09 -1.18408e-08 4.39212e-09 7.71059e-09 -2.03059e-08 7.54578e-09 4.44272e-09 -1.18408e-08 4.39213e-09 -7.73091 5.47488 -0.417314 4.44272e-09 -1.18408e-08 4.39213e-09 -2.90554 0.965183 -0.102902 4.44272e-09 -1.18408e-08 4.39212e-09 -10.2786 0.731801 -0.0259123 4.44272e-09 -1.18408e-08 4.39211e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.525 -66.9665 33.3298 -0.134845 27.0424 0.415112 -11.7679 -43.3649 -15.7872 2.03217e-16 0.0 3.88251e-19 -2.55838 -32.4602 -4.61835 0.349829 38.6608 -0.420852 -5.23074 18.6262 21.7274
--13.8607 89.7236 85.1059 360.082 -46.0696 375.693 6.34003 3.04355 11.3853 5.30343 -14.7963 3.95974 -10.3368 5.65542 -14.472 20.3125 1.8074 -27.4858 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.33546e-13 1.8803e-13 1.72934e-12 -172.696 -26.4911 93.893 -4.99229 -1.61445 8.69032 -161.099 39.4285 172.779 4.59015e-09 -1.24723e-08 -5.53062e-09 6.74302e-09 -1.98608e-08 -9.69723e-09 4.59014e-09 -1.24723e-08 -5.53063e-09 7.73091 5.47488 0.417314 4.59015e-09 -1.24723e-08 -5.53062e-09 2.90554 0.965183 0.102902 4.59016e-09 -1.24723e-08 -5.53062e-09 10.2786 0.731801 0.0259123 4.59015e-09 -1.24723e-08 -5.53061e-09 2.22167 -0.733487 -0.20892 -1.33654e-13 1.8802e-13 1.72917e-12 -4.48161 -14.0787 -35.8329 12.9638 -6.14538 -23.4964 0.112023 9.21322 -1.30683 5.56703e-09 -1.24607e-08 3.82505e-09 9.64907e-09 -2.13456e-08 6.55548e-09 5.56703e-09 -1.24607e-08 3.82506e-09 -7.73091 5.47488 -0.417314 5.56703e-09 -1.24607e-08 3.82505e-09 -2.90554 0.965183 -0.102902 5.56702e-09 -1.24607e-08 3.82505e-09 -10.2786 0.731801 -0.0259123 5.56703e-09 -1.24607e-08 3.82504e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.0647 -64.6519 33.6562 -0.138362 27.4761 0.402424 -10.5181 -45.4344 -13.7483 2.03217e-16 0.0 3.88251e-19 -2.00671 -33.6781 -4.74566 0.373952 40.228 -0.451901 -4.44584 19.0266 18.5439
--14.2542 89.8614 85.7537 358.615 -47.8105 376.133 7.83781 4.24469 11.5072 4.89659 -14.9413 3.96508 -10.252 5.16623 -14.1408 19.908 2.52997 -26.9168 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.22438e-13 3.33164e-13 1.10055e-12 -176.494 -28.3723 93.017 -4.7512 -1.5173 8.26291 -160.195 45.1501 171.383 1.89096e-09 -7.76448e-09 -4.32721e-09 2.49879e-09 -1.21907e-08 -7.43405e-09 1.89095e-09 -7.76448e-09 -4.32722e-09 7.73091 5.47488 0.417314 1.89095e-09 -7.76448e-09 -4.3272e-09 2.90554 0.965183 0.102902 1.89096e-09 -7.76448e-09 -4.3272e-09 10.2786 0.731801 0.0259123 1.89095e-09 -7.76448e-09 -4.32719e-09 2.22167 -0.733487 -0.20892 -1.22597e-13 3.33162e-13 1.10035e-12 -6.04055 -13.2792 -36.2991 12.9941 -6.16796 -23.5564 0.129283 9.95491 -1.41402 6.272e-09 -1.14391e-08 2.33704e-09 1.08563e-08 -1.95547e-08 3.97547e-09 6.272e-09 -1.14391e-08 2.33705e-09 -7.73091 5.47488 -0.417314 6.272e-09 -1.14391e-08 2.33704e-09 -2.90554 0.965183 -0.102902 6.27199e-09 -1.14391e-08 2.33704e-09 -10.2786 0.731801 -0.0259123 6.27201e-09 -1.14391e-08 2.33703e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0228 -62.2027 34.4722 -0.13963 27.8246 0.413879 -9.52264 -47.4009 -12.1565 2.03217e-16 0.0 3.88251e-19 -1.6189 -34.8837 -5.46815 0.389021 41.1968 -0.510653 -2.99218 18.1747 14.0696
--14.6144 89.9233 86.4729 357.48 -49.561 376.623 9.28192 5.20481 11.5631 4.47952 -15.0698 3.95079 -10.1611 4.67393 -13.7828 19.5389 3.37148 -26.3271 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.0296e-13 4.40329e-13 3.92244e-13 176.25 -30.4537 90.534 -4.46193 -1.40221 7.7526 -158.166 53.9783 168.674 -8.20986e-10 -2.24529e-09 -2.60355e-09 -1.71297e-09 -3.22422e-09 -4.27689e-09 -8.20996e-10 -2.24529e-09 -2.60355e-09 7.73091 5.47488 0.417314 -8.2099e-10 -2.24529e-09 -2.60354e-09 2.90554 0.965183 0.102902 -8.20983e-10 -2.24529e-09 -2.60355e-09 10.2786 0.731801 0.0259123 -8.20995e-10 -2.24529e-09 -2.60354e-09 2.22167 -0.733487 -0.20892 -1.03162e-13 4.40335e-13 3.92011e-13 -7.3835 -12.2031 -36.4989 13.0849 -6.23768 -23.7331 0.136256 10.3855 -1.47612 6.51556e-09 -9.68601e-09 6.9072e-10 1.12653e-08 -1.6513e-08 1.12564e-09 6.51556e-09 -9.68603e-09 6.90731e-10 -7.73091 5.47488 -0.417314 6.51556e-09 -9.68602e-09 6.9072e-10 -2.90554 0.965183 -0.102902 6.51555e-09 -9.68601e-09 6.90719e-10 -10.2786 0.731801 -0.0259123 6.51557e-09 -9.68601e-09 6.90718e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.0123 -59.7486 35.2313 -0.139442 28.0384 0.43798 -8.60087 -49.3487 -10.7368 2.03217e-16 0.0 3.88251e-19 -1.33687 -36.065 -6.71199 0.393388 41.5323 -0.568944 -1.67504 16.5331 9.93487
--15.0381 89.8375 87.0819 356.079 -51.5036 377.65 10.5538 5.74209 11.6955 3.99818 -15.0552 3.93594 -10.01 4.41507 -13.4466 19.2342 3.96577 -25.7857 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.03264e-13 4.26189e-13 -3.80673e-14 170.431 -32.5317 88.1184 -4.18735 -1.29576 7.26938 -155.151 61.3038 165.123 -2.52653e-09 1.31706e-09 -1.47661e-09 -4.34779e-09 2.53804e-09 -2.2195e-09 -2.52654e-09 1.31706e-09 -1.47661e-09 7.73091 5.47488 0.417314 -2.52654e-09 1.31706e-09 -1.4766e-09 2.90554 0.965183 0.102902 -2.52653e-09 1.31705e-09 -1.47661e-09 10.2786 0.731801 0.0259123 -2.52654e-09 1.31706e-09 -1.4766e-09 2.22167 -0.733487 -0.20892 -1.03479e-13 4.26198e-13 -3.83157e-14 -8.71523 -11.1102 -36.6332 13.198 -6.32513 -23.9539 0.140569 10.6279 -1.5112 6.25562e-09 -8.11176e-09 -3.51292e-10 1.08089e-08 -1.38002e-08 -6.7411e-10 6.25562e-09 -8.11179e-09 -3.5128e-10 -7.73091 5.47488 -0.417314 6.25562e-09 -8.11178e-09 -3.51292e-10 -2.90554 0.965183 -0.102902 6.25561e-09 -8.11177e-09 -3.51292e-10 -10.2786 0.731801 -0.0259123 6.25563e-09 -8.11176e-09 -3.51292e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.8174 -57.4207 35.5397 -0.138087 28.0683 0.462992 -7.50217 -51.3495 -9.16396 2.03217e-16 0.0 3.88251e-19 -1.09319 -37.2059 -8.39884 0.383609 41.2 -0.597534 -0.959367 14.7766 7.66143
--15.4641 89.8809 87.8999 355.055 -53.6535 378.531 11.6037 5.75946 11.9399 3.3895 -14.87 3.92226 -9.71816 4.47735 -13.1434 19.0502 4.20717 -25.3265 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.43461e-13 1.84028e-13 -3.38283e-14 166.997 -34.804 86.1534 -3.92124 -1.19672 6.80057 -151.669 66.4107 161.249 -2.82299e-09 2.03508e-09 -1.26764e-09 -4.78329e-09 3.63916e-09 -1.84213e-09 -2.82299e-09 2.03509e-09 -1.26764e-09 7.73091 5.47488 0.417314 -2.82299e-09 2.03509e-09 -1.26763e-09 2.90554 0.965183 0.102902 -2.82298e-09 2.03509e-09 -1.26764e-09 10.2786 0.731801 0.0259123 -2.823e-09 2.03509e-09 -1.26763e-09 2.22167 -0.733487 -0.20892 -1.4364e-13 1.84033e-13 -3.40578e-14 -10.0864 -10.0198 -36.7852 13.334 -6.4301 -24.2222 0.144586 10.72 -1.52485 5.13974e-09 -6.68802e-09 -4.78084e-10 8.88083e-09 -1.13812e-08 -8.82943e-10 5.13974e-09 -6.68804e-09 -4.78071e-10 -7.73091 5.47488 -0.417314 5.13974e-09 -6.68804e-09 -4.78083e-10 -2.90554 0.965183 -0.102902 5.13973e-09 -6.68802e-09 -4.78084e-10 -10.2786 0.731801 -0.0259123 5.13975e-09 -6.68802e-09 -4.78084e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.5427 -55.2545 35.3226 -0.134948 27.8961 0.489864 -5.95893 -53.4117 -7.12252 2.03217e-16 0.0 3.88251e-19 -0.940943 -38.2329 -10.8386 0.351538 39.836 -0.584131 -0.781062 12.8297 8.06919
--15.9198 89.8275 88.4801 353.142 -55.832 380.493 12.5078 5.37141 12.2182 2.69869 -14.5798 3.90082 -9.34157 4.72766 -12.8471 18.963 4.28975 -24.9057 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.04335e-13 -2.13543e-13 1.93883e-13 163.326 -37.1742 83.5674 -3.63735 -1.09364 6.3015 -146.044 71.4755 155.219 -2.29754e-09 1.43493e-09 -1.37313e-09 -3.91336e-09 2.56505e-09 -2.06525e-09 -2.29754e-09 1.43493e-09 -1.37314e-09 7.73091 5.47488 0.417314 -2.29754e-09 1.43493e-09 -1.37313e-09 2.90554 0.965183 0.102902 -2.29753e-09 1.43493e-09 -1.37313e-09 10.2786 0.731801 0.0259123 -2.29755e-09 1.43493e-09 -1.37312e-09 2.22167 -0.733487 -0.20892 -2.04445e-13 -2.13547e-13 1.93694e-13 -11.3974 -8.80579 -36.8488 13.5084 -6.56492 -24.5695 0.142748 10.5946 -1.50681 3.3041e-09 -5.01968e-09 -1.32236e-10 5.71291e-09 -8.56546e-09 -2.67759e-10 3.3041e-09 -5.01969e-09 -1.32222e-10 -7.73091 5.47488 -0.417314 3.3041e-09 -5.01969e-09 -1.32233e-10 -2.90554 0.965183 -0.102902 3.30409e-09 -5.01968e-09 -1.32234e-10 -10.2786 0.731801 -0.0259123 3.30411e-09 -5.01968e-09 -1.32235e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.36009 -53.1727 34.8744 -0.129631 27.5497 0.523281 -4.09994 -55.4856 -4.79486 2.03217e-16 0.0 3.88251e-19 -0.96056 -39.1088 -14.0008 0.303346 37.577 -0.547706 -0.710746 10.4948 10.1596
--16.4257 89.6581 89.0879 351.209 -58.0322 382.592 13.3312 4.71231 12.5037 2.03433 -14.1968 3.87474 -9.035 5.07228 -12.5494 18.892 4.2917 -24.4703 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.55049e-13 -5.80874e-13 4.51118e-13 159.235 -39.3781 80.3836 -3.37046 -0.998174 5.83418 -136.049 76.2879 144.822 -1.41585e-09 3.68806e-10 -1.52289e-09 -2.46793e-09 7.29305e-10 -2.39293e-09 -1.41585e-09 3.68811e-10 -1.5229e-09 7.73091 5.47488 0.417314 -1.41585e-09 3.68816e-10 -1.52289e-09 2.90554 0.965183 0.102902 -1.41585e-09 3.68815e-10 -1.52289e-09 10.2786 0.731801 0.0259123 -1.41586e-09 3.68815e-10 -1.52288e-09 2.22167 -0.733487 -0.20892 -2.55088e-13 -5.80886e-13 4.50964e-13 -12.628 -7.50772 -36.7287 13.7058 -6.71935 -24.9647 0.132692 10.2169 -1.45189 1.43956e-09 -3.46678e-09 3.18635e-10 2.49566e-09 -5.95025e-09 5.2973e-10 1.43956e-09 -3.46679e-09 3.18649e-10 -7.73091 5.47488 -0.417314 1.43956e-09 -3.46678e-09 3.1864e-10 -2.90554 0.965183 -0.102902 1.43955e-09 -3.46678e-09 3.18638e-10 -10.2786 0.731801 -0.0259123 1.43957e-09 -3.46678e-09 3.18636e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.20207 -51.1374 34.3923 -0.122595 27.0491 0.557059 -2.28372 -57.567 -2.61607 2.03217e-16 0.0 3.88251e-19 -1.08457 -39.9103 -17.2747 0.256325 35.139 -0.504972 -0.539981 8.33161 12.6717
--16.9465 89.5312 89.7915 349.179 -60.1666 384.834 14.1358 3.91595 12.7702 1.50496 -13.7329 3.84714 -8.95136 5.41703 -12.2419 18.754 4.29228 -23.9676 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.64767e-13 -7.32313e-13 5.43925e-13 154.617 -41.172 76.7394 -3.15613 -0.922109 5.46059 -116.367 80.2933 124.752 -6.43598e-10 -3.11052e-10 -1.44672e-09 -1.17696e-09 -4.54476e-10 -2.32924e-09 -6.43591e-10 -3.11049e-10 -1.44674e-09 7.73091 5.47488 0.417314 -6.43599e-10 -3.11041e-10 -1.44673e-09 2.90554 0.965183 0.102902 -6.43589e-10 -3.11042e-10 -1.44673e-09 10.2786 0.731801 0.0259123 -6.43603e-10 -3.11044e-10 -1.44672e-09 2.22167 -0.733487 -0.20892 -2.64763e-13 -7.32332e-13 5.43775e-13 -13.7683 -6.15657 -36.3279 13.9117 -6.88344 -25.3766 0.113232 9.55213 -1.35517 2.36967e-10 -2.38938e-09 5.0691e-10 4.19554e-10 -4.13275e-09 8.67813e-10 2.36966e-10 -2.38938e-09 5.06923e-10 -7.73091 5.47488 -0.417314 2.36968e-10 -2.38938e-09 5.06917e-10 -2.90554 0.965183 -0.102902 2.36961e-10 -2.38938e-09 5.06914e-10 -10.2786 0.731801 -0.0259123 2.36972e-10 -2.38938e-09 5.0691e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.96103 -49.1177 34.0414 -0.114547 26.4142 0.585137 -0.991845 -59.6832 -1.12465 2.03217e-16 0.0 3.88251e-19 -1.21767 -40.7844 -20.0411 0.222889 33.2384 -0.468561 -0.326951 6.88789 14.3808
--17.4135 89.4619 90.4685 346.983 -62.2335 387.526 14.9576 2.91349 12.9673 1.15505 -13.1626 3.80377 -9.20722 5.79122 -11.9227 18.5115 4.28451 -23.372 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.19796e-13 -5.67259e-13 3.65369e-13 149.411 -42.4887 72.6556 -2.99236 -0.865022 5.17559 -79.8265 82.0092 87.8148 2.35109e-10 -4.42306e-10 -9.1239e-10 3.52027e-10 -7.21609e-10 -1.48842e-09 2.35116e-10 -4.42304e-10 -9.12403e-10 7.73091 5.47488 0.417314 2.35109e-10 -4.42296e-10 -9.12398e-10 2.90554 0.965183 0.102902 2.35117e-10 -4.42298e-10 -9.12397e-10 10.2786 0.731801 0.0259123 2.35104e-10 -4.42301e-10 -9.12389e-10 2.22167 -0.733487 -0.20892 -2.19784e-13 -5.67279e-13 3.65174e-13 -14.8246 -4.63202 -35.5545 14.1254 -7.05668 -25.8058 0.0807003 8.35872 -1.18248 1.61613e-10 -2.17165e-09 2.46538e-10 2.87191e-10 -3.76443e-09 4.21564e-10 1.61611e-10 -2.17165e-09 2.46548e-10 -7.73091 5.47488 -0.417314 1.61614e-10 -2.17165e-09 2.46544e-10 -2.90554 0.965183 -0.102902 1.61606e-10 -2.17165e-09 2.46542e-10 -10.2786 0.731801 -0.0259123 1.61616e-10 -2.17165e-09 2.46537e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.58952 -47.0079 34.0346 -0.105646 25.5949 0.611864 -1.01649 -62.0773 -1.15494 2.03217e-16 0.0 3.88251e-19 -1.35829 -41.8545 -22.4543 0.202068 31.9346 -0.433886 -0.256268 6.38759 15.1198
--17.9752 89.1183 91.0683 343.985 -64.2989 391.1 15.759 1.66903 13.1277 0.922379 -12.4888 3.74848 -9.69758 6.22724 -11.5963 18.2159 4.23435 -22.7156 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.38405e-13 -2.01757e-13 3.7297e-14 143.748 -43.3479 68.1297 -2.8649 -0.821956 4.95332 -44.0638 79.8696 51.629 1.35527e-09 -4.57835e-10 -1.17391e-10 2.31262e-09 -7.88586e-10 -2.1947e-10 1.35528e-09 -4.57835e-10 -1.17402e-10 7.73091 5.47488 0.417314 1.35527e-09 -4.5783e-10 -1.17398e-10 2.90554 0.965183 0.102902 1.35528e-09 -4.57833e-10 -1.17397e-10 10.2786 0.731801 0.0259123 1.35526e-09 -4.57835e-10 -1.17392e-10 2.22167 -0.733487 -0.20892 -1.38405e-13 -2.01776e-13 3.70237e-14 -15.8468 -2.92514 -34.4978 14.3527 -7.24296 -26.2661 0.0471015 6.73237 -0.949527 7.51356e-10 -2.5255e-09 -2.3708e-10 1.30194e-09 -4.36273e-09 -4.15502e-10 7.51352e-10 -2.5255e-09 -2.37074e-10 -7.73091 5.47488 -0.417314 7.51356e-10 -2.5255e-09 -2.37073e-10 -2.90554 0.965183 -0.102902 7.51347e-10 -2.5255e-09 -2.37075e-10 -10.2786 0.731801 -0.0259123 7.51356e-10 -2.52551e-09 -2.37082e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.1115 -44.8633 34.1975 -0.0950986 24.5989 0.638431 -2.30621 -64.6718 -2.55748 2.03217e-16 0.0 3.88251e-19 -1.55855 -43.0337 -24.7552 0.18792 30.8894 -0.395963 -0.332177 6.50105 15.4939
--18.5937 88.6614 91.8277 341.715 -66.7135 393.877 16.492 0.365804 13.3472 0.754307 -11.7673 3.7112 -10.2401 6.63494 -11.2634 17.9146 4.18186 -22.0319 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.77011e-14 2.24872e-13 -2.91074e-13 137.921 -43.7084 63.4194 -2.79138 -0.797938 4.82467 -25.6126 75.4751 32.7539 2.1299e-09 -3.98251e-10 5.63859e-10 3.67659e-09 -7.13582e-10 8.71391e-10 2.1299e-09 -3.98252e-10 5.6385e-10 7.73091 5.47488 0.417314 2.1299e-09 -3.9825e-10 5.63852e-10 2.90554 0.965183 0.102902 2.1299e-09 -3.98254e-10 5.63853e-10 10.2786 0.731801 0.0259123 2.12989e-09 -3.98255e-10 5.63856e-10 2.22167 -0.733487 -0.20892 -3.77276e-14 2.24854e-13 -2.91425e-13 -16.8767 -1.24428 -33.3168 14.5886 -7.43926 -26.7466 0.0268429 5.14428 -0.724308 1.30589e-09 -2.80262e-09 -6.94377e-10 2.25542e-09 -4.8237e-09 -1.20744e-09 1.30589e-09 -2.80262e-09 -6.94374e-10 -7.73091 5.47488 -0.417314 1.30589e-09 -2.80262e-09 -6.94371e-10 -2.90554 0.965183 -0.102902 1.30588e-09 -2.80262e-09 -6.94372e-10 -10.2786 0.731801 -0.0259123 1.30589e-09 -2.80263e-09 -6.94379e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.56262 -42.8883 34.1318 -0.0832153 23.5334 0.654463 -3.8954 -67.0317 -4.23871 2.03217e-16 0.0 3.88251e-19 -1.72161 -44.2509 -26.4131 0.181125 30.2226 -0.363813 -0.469206 6.93083 15.4459
--19.2402 88.0798 92.6945 339.59 -69.3505 396.428 17.114 -0.811626 13.7178 0.596487 -11.0538 3.72133 -10.6504 6.92369 -10.9242 17.6529 4.16804 -21.3538 -0.0 0.0 0.0 -0.0 0.0 0.0 6.52102e-14 5.73304e-13 -4.70523e-13 132.241 -43.5936 58.8173 -2.78937 -0.797986 4.82054 -16.6596 70.5146 23.403 1.972e-09 -3.04163e-10 7.56943e-10 3.4157e-09 -5.54768e-10 1.17794e-09 1.972e-09 -3.04165e-10 7.56934e-10 7.73091 5.47488 0.417314 1.972e-09 -3.04165e-10 7.56937e-10 2.90554 0.965183 0.102902 1.972e-09 -3.04169e-10 7.56939e-10 10.2786 0.731801 0.0259123 1.97199e-09 -3.0417e-10 7.5694e-10 2.22167 -0.733487 -0.20892 6.51473e-14 5.73286e-13 -4.70921e-13 -17.9203 0.17669 -32.151 14.8284 -7.64272 -27.2363 0.020319 4.06597 -0.572406 1.12493e-09 -2.35467e-09 -8.75788e-10 1.93928e-09 -4.04342e-09 -1.51831e-09 1.12492e-09 -2.35467e-09 -8.75785e-10 -7.73091 5.47488 -0.417314 1.12493e-09 -2.35468e-09 -8.75782e-10 -2.90554 0.965183 -0.102902 1.12492e-09 -2.35468e-09 -8.75782e-10 -10.2786 0.731801 -0.0259123 1.12492e-09 -2.35468e-09 -8.75791e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.04075 -41.2681 33.47 -0.0713337 22.5052 0.649917 -4.19975 -68.7681 -4.54324 2.03217e-16 0.0 3.88251e-19 -1.66685 -45.4759 -26.8393 0.181707 30.0542 -0.346163 -0.564148 7.38311 14.917
--19.8422 87.3817 93.3982 335.269 -71.9337 401.337 17.6646 -1.91255 14.3642 0.448856 -10.3066 3.80754 -10.8954 7.01185 -10.5689 17.431 4.29109 -20.6755 -0.0 0.0 0.0 -0.0 0.0 0.0 1.91545e-13 8.60193e-13 -4.25272e-13 126.833 -43.0885 54.5017 -2.8841 -0.830163 4.98529 -11.6599 65.5437 18.0257 1.41628e-10 -1.35889e-10 1.03737e-10 2.42383e-10 -2.24865e-10 1.21888e-10 1.41632e-10 -1.35892e-10 1.03724e-10 7.73091 5.47488 0.417314 1.41629e-10 -1.35891e-10 1.03731e-10 2.90554 0.965183 0.102902 1.41631e-10 -1.35895e-10 1.03734e-10 10.2786 0.731801 0.0259123 1.41619e-10 -1.35895e-10 1.03737e-10 2.22167 -0.733487 -0.20892 1.91419e-13 8.6017e-13 -4.25671e-13 -18.9466 1.26636 -31.0026 15.0818 -7.86245 -27.7547 0.0195004 3.59675 -0.506536 -3.82625e-10 -5.72177e-10 -6.05065e-10 -6.6756e-10 -9.76234e-10 -1.03986e-09 -3.82634e-10 -5.72176e-10 -6.05058e-10 -7.73091 5.47488 -0.417314 -3.82627e-10 -5.72179e-10 -6.05059e-10 -2.90554 0.965183 -0.102902 -3.82636e-10 -5.7218e-10 -6.0506e-10 -10.2786 0.731801 -0.0259123 -3.82629e-10 -5.72184e-10 -6.05069e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.47929 -40.1731 31.5471 -0.0588825 21.4124 0.621469 -2.45442 -69.3629 -2.71692 2.03217e-16 0.0 3.88251e-19 -1.1478 -46.9028 -25.4636 0.192376 30.5104 -0.343912 -0.66365 8.23662 13.5878
--20.4381 86.6003 93.974 328.531 -74.3915 408.731 18.1667 -2.99763 15.2045 0.331985 -9.51508 3.94672 -11.0642 6.96609 -10.2006 17.2243 4.50171 -19.9841 -0.0 0.0 0.0 -0.0 0.0 0.0 3.41834e-13 1.14191e-12 -2.469e-13 121.67 -42.223 50.4717 -3.05898 -0.889503 5.29041 -8.48162 60.6293 14.4654 -2.85369e-09 1.11392e-10 -1.10998e-09 -4.95719e-09 2.72889e-10 -1.83456e-09 -2.85368e-09 1.11389e-10 -1.11e-09 7.73091 5.47488 0.417314 -2.85369e-09 1.11391e-10 -1.10998e-09 2.90554 0.965183 0.102902 -2.85368e-09 1.11387e-10 -1.10998e-09 10.2786 0.731801 0.0259123 -2.8537e-09 1.11388e-10 -1.10997e-09 2.22167 -0.733487 -0.20892 3.41623e-13 1.14188e-12 -2.47273e-13 -19.9467 2.13908 -29.7898 15.3465 -8.09579 -28.3006 0.0196765 3.49411 -0.492162 -2.70849e-09 2.05356e-09 -5.18746e-11 -4.68768e-09 3.53868e-09 -6.85841e-11 -2.7085e-09 2.05357e-09 -5.18625e-11 -7.73091 5.47488 -0.417314 -2.70849e-09 2.05356e-09 -5.18695e-11 -2.90554 0.965183 -0.102902 -2.7085e-09 2.05356e-09 -5.18722e-11 -10.2786 0.731801 -0.0259123 -2.70849e-09 2.05356e-09 -5.1881e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -1.95322 -39.3718 28.76 -0.0474966 20.2414 0.575507 0.456546 -69.1245 0.323479 2.03217e-16 0.0 3.88251e-19 -0.0911529 -48.4726 -22.5574 0.211745 31.4959 -0.352662 -0.727246 9.50373 11.5857
--21.1837 85.8577 94.6484 319.918 -76.6611 417.686 18.536 -3.90381 16.0156 0.223816 -8.78123 4.09045 -11.1565 6.91851 -9.83912 17.0455 4.61796 -19.3021 -0.0 0.0 0.0 -0.0 0.0 0.0 4.67943e-13 1.3387e-12 -3.72267e-14 116.82 -40.9787 46.746 -3.26883 -0.961477 5.65749 -6.33191 55.8269 11.9343 -5.7297e-09 3.44781e-10 -2.29275e-09 -9.95059e-09 7.44541e-10 -3.73694e-09 -5.72969e-09 3.44778e-10 -2.29278e-09 7.73091 5.47488 0.417314 -5.7297e-09 3.44781e-10 -2.29276e-09 2.90554 0.965183 0.102902 -5.7297e-09 3.44777e-10 -2.29275e-09 10.2786 0.731801 0.0259123 -5.72971e-09 3.44778e-10 -2.29275e-09 2.22167 -0.733487 -0.20892 4.67657e-13 1.33867e-12 -3.75614e-14 -20.9344 2.82255 -28.5173 15.6009 -8.32313 -28.8314 0.0201975 3.71694 -0.523458 -4.90395e-09 4.51968e-09 5.14476e-10 -8.48176e-09 7.77798e-09 9.24323e-10 -4.90396e-09 4.51968e-09 5.14494e-10 -7.73091 5.47488 -0.417314 -4.90395e-09 4.51968e-09 5.1448e-10 -2.90554 0.965183 -0.102902 -4.90395e-09 4.51968e-09 5.14476e-10 -10.2786 0.731801 -0.0259123 -4.90395e-09 4.51968e-09 5.14468e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -3.21087 -38.5306 26.3347 -0.0416679 19.2319 0.516263 4.25763 -68.9165 4.30039 2.03217e-16 0.0 3.88251e-19 1.35689 -49.768 -18.8336 0.234248 32.7978 -0.37356 -0.619017 10.3211 9.52319
--21.9479 85.0893 95.596 311.036 -79.4252 426.664 18.6647 -4.47511 16.5701 0.105769 -8.20702 4.19053 -11.175 7.00185 -9.50383 16.9163 4.45489 -18.6523 -0.0 0.0 0.0 -0.0 0.0 0.0 5.21736e-13 1.37084e-12 1.01927e-13 112.348 -39.326 43.3415 -3.46905 -1.03163 6.00809 -4.82235 51.163 10.0534 -7.20218e-09 4.71377e-10 -2.85315e-09 -1.25054e-08 9.96137e-10 -4.63075e-09 -7.20217e-09 4.71374e-10 -2.85318e-09 7.73091 5.47488 0.417314 -7.20218e-09 4.71378e-10 -2.85315e-09 2.90554 0.965183 0.102902 -7.20217e-09 4.71374e-10 -2.85315e-09 10.2786 0.731801 0.0259123 -7.20219e-09 4.71376e-10 -2.85314e-09 2.22167 -0.733487 -0.20892 5.21421e-13 1.3708e-12 1.01629e-13 -21.9247 3.34567 -27.1926 15.8253 -8.5259 -29.3046 0.0219339 4.22411 -0.594749 -6.02027e-09 5.8233e-09 8.2468e-10 -1.04105e-08 1.00184e-08 1.46768e-09 -6.02028e-09 5.82331e-09 8.24702e-10 -7.73091 5.47488 -0.417314 -6.02027e-09 5.82331e-09 8.24683e-10 -2.90554 0.965183 -0.102902 -6.02027e-09 5.8233e-09 8.24678e-10 -10.2786 0.731801 -0.0259123 -6.02027e-09 5.8233e-09 8.2467e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -4.15095 -37.4474 25.4874 -0.044422 18.6235 0.447305 9.29568 -69.5832 9.51541 2.03217e-16 0.0 3.88251e-19 2.81704 -50.4304 -15.1947 0.254635 34.2034 -0.407893 -0.354275 9.81148 8.03092
--22.6989 84.2236 96.4722 296.753 -81.6869 440.868 18.5454 -4.61294 16.7949 -0.0604346 -7.79622 4.23374 -11.127 7.32991 -9.21434 16.936 3.78365 -18.053 -0.0 0.0 0.0 -0.0 0.0 0.0 4.6667e-13 1.15601e-12 1.39652e-13 108.387 -37.2412 40.3492 -3.66397 -1.10202 6.34919 -3.7043 46.6454 8.57371 -6.57396e-09 4.72202e-10 -2.50211e-09 -1.14103e-08 9.7591e-10 -4.05029e-09 -6.57395e-09 4.722e-10 -2.50214e-09 7.73091 5.47488 0.417314 -6.57396e-09 4.72202e-10 -2.50212e-09 2.90554 0.965183 0.102902 -6.57395e-09 4.722e-10 -2.50211e-09 10.2786 0.731801 0.0259123 -6.57397e-09 4.72202e-10 -2.5021e-09 2.22167 -0.733487 -0.20892 4.66397e-13 1.15598e-12 1.39396e-13 -22.8539 3.69612 -25.8334 16.0116 -8.69696 -29.6995 0.0290321 5.15389 -0.725941 -5.4736e-09 5.33521e-09 7.63337e-10 -9.46436e-09 9.17719e-09 1.35821e-09 -5.47361e-09 5.33521e-09 7.6336e-10 -7.73091 5.47488 -0.417314 -5.4736e-09 5.33521e-09 7.63338e-10 -2.90554 0.965183 -0.102902 -5.47361e-09 5.33521e-09 7.63333e-10 -10.2786 0.731801 -0.0259123 -5.4736e-09 5.33521e-09 7.63326e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -4.65142 -36.0403 27.1302 -0.0579946 18.5541 0.353269 18.2986 -71.5556 18.634 2.03217e-16 0.0 3.88251e-19 4.13332 -50.2674 -11.8189 0.274811 35.8439 -0.464897 0.0438908 7.32841 7.3068
--23.5197 83.3384 97.0557 275.723 -82.366 461.46 18.2106 -4.42478 16.8115 -0.251595 -7.50218 4.24587 -11.012 7.80638 -8.95562 17.0786 2.75758 -17.4936 -0.0 0.0 0.0 -0.0 0.0 0.0 3.36319e-13 7.57108e-13 1.31505e-13 104.892 -34.8239 37.7951 -3.87167 -1.17832 6.71335 -2.8414 42.2898 7.34851 -4.64821e-09 3.94871e-10 -1.59886e-09 -8.06116e-09 7.87317e-10 -2.57501e-09 -4.64819e-09 3.94871e-10 -1.59889e-09 7.73091 5.47488 0.417314 -4.64821e-09 3.94871e-10 -1.59886e-09 2.90554 0.965183 0.102902 -4.6482e-09 3.94869e-10 -1.59886e-09 10.2786 0.731801 0.0259123 -4.64821e-09 3.9487e-10 -1.59885e-09 2.22167 -0.733487 -0.20892 3.36136e-13 7.57088e-13 1.313e-13 -23.7154 3.85216 -24.427 16.1733 -8.84821 -30.0415 0.0466499 6.47834 -0.913883 -3.88022e-09 3.71086e-09 4.88605e-10 -6.7085e-09 6.38127e-09 8.73074e-10 -3.88023e-09 3.71086e-09 4.88629e-10 -7.73091 5.47488 -0.417314 -3.88022e-09 3.71086e-09 4.88604e-10 -2.90554 0.965183 -0.102902 -3.88023e-09 3.71086e-09 4.88599e-10 -10.2786 0.731801 -0.0259123 -3.88022e-09 3.71086e-09 4.88593e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.00422 -34.4286 30.2864 -0.0778324 18.8712 0.236769 33.0057 -73.6046 33.2827 2.03217e-16 0.0 3.88251e-19 5.27566 -49.4662 -8.43715 0.301009 37.7699 -0.543943 0.53156 3.47444 7.03684
--24.3709 82.5612 97.5631 253.205 -82.0599 483.254 17.6075 -4.06598 16.6838 -0.392506 -7.35098 4.23723 -10.8213 8.24879 -8.69444 17.1724 1.76683 -16.9492 -0.0 0.0 0.0 -0.0 0.0 0.0 1.87727e-13 3.1212e-13 1.05364e-13 101.646 -32.2068 35.5758 -4.06902 -1.25165 7.06043 -2.18043 38.1235 6.32614 -2.39115e-09 2.46374e-10 -5.24334e-10 -4.13663e-09 4.69243e-10 -8.18173e-10 -2.39114e-09 2.46376e-10 -5.24368e-10 7.73091 5.47488 0.417314 -2.39115e-09 2.46374e-10 -5.24343e-10 2.90554 0.965183 0.102902 -2.39114e-09 2.46373e-10 -5.24335e-10 10.2786 0.731801 0.0259123 -2.39115e-09 2.46374e-10 -5.24332e-10 2.22167 -0.733487 -0.20892 1.8764e-13 3.12112e-13 1.05201e-13 -24.6117 3.83051 -22.9369 16.3224 -8.98992 -30.3571 0.0742201 7.90703 -1.11812 -2.09159e-09 1.87441e-09 1.41518e-10 -3.61539e-09 3.22139e-09 2.618e-10 -2.09159e-09 1.87441e-09 1.41541e-10 -7.73091 5.47488 -0.417314 -2.09159e-09 1.87441e-09 1.41515e-10 -2.90554 0.965183 -0.102902 -2.0916e-09 1.87441e-09 1.41511e-10 -10.2786 0.731801 -0.0259123 -2.09159e-09 1.87441e-09 1.41505e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.66729 -32.8054 33.3994 -0.0964469 19.3789 0.128201 49.8854 -74.4784 49.9002 2.03217e-16 0.0 3.88251e-19 5.99825 -48.3498 -5.34115 0.331577 39.6483 -0.629662 1.04737 -0.747222 7.08282
--25.14 81.8776 98.2804 233.039 -80.9359 502.724 16.6846 -3.69145 16.4758 -0.408421 -7.36877 4.21813 -10.5438 8.47422 -8.39713 17.0323 1.20555 -16.3867 -0.0 0.0 0.0 -0.0 0.0 0.0 7.79385e-14 -4.09496e-14 8.91052e-14 98.4319 -29.5034 33.5689 -4.23331 -1.31319 7.35028 -1.68416 34.1732 5.47524 -7.69025e-10 3.37027e-11 3.40507e-10 -1.31522e-09 6.05705e-11 6.06985e-10 -7.69014e-10 3.37059e-11 3.40475e-10 7.73091 5.47488 0.417314 -7.69024e-10 3.37017e-11 3.40497e-10 2.90554 0.965183 0.102902 -7.69012e-10 3.37016e-11 3.40505e-10 10.2786 0.731801 0.0259123 -7.6903e-10 3.3702e-11 3.40507e-10 2.22167 -0.733487 -0.20892 7.79138e-14 -4.09496e-14 8.89561e-14 -25.646 3.64869 -21.3278 16.4706 -9.13192 -30.6727 0.10379 9.1497 -1.29706 -9.59164e-10 7.50024e-10 -1.36891e-10 -1.65751e-09 1.28831e-09 -2.26098e-10 -9.59168e-10 7.50027e-10 -1.36869e-10 -7.73091 5.47488 -0.417314 -9.59163e-10 7.50023e-10 -1.36894e-10 -2.90554 0.965183 -0.102902 -9.59172e-10 7.50023e-10 -1.36898e-10 -10.2786 0.731801 -0.0259123 -9.59162e-10 7.50025e-10 -1.36904e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -6.91293 -31.4794 35.0534 -0.108863 19.8814 0.0587482 61.5944 -74.3579 61.3225 2.03217e-16 0.0 3.88251e-19 6.20163 -47.2701 -2.7068 0.359772 41.1459 -0.703174 1.51136 -4.33697 7.28122
--25.8611 81.2167 99.2175 216.915 -79.2282 518.221 15.1815 -3.14902 16.1676 -0.206273 -7.69784 4.19895 -10.1284 8.38428 -8.03939 16.4914 1.31507 -15.7827 -0.0 0.0 0.0 -0.0 0.0 0.0 1.63895e-14 -2.95055e-13 9.44802e-14 95.0584 -26.6257 31.7031 -4.31859 -1.344 7.50246 -1.28712 30.3734 4.73183 -1.63639e-11 -4.08046e-10 1.01623e-09 -3.01242e-12 -7.15005e-10 1.74846e-09 -1.63536e-11 -4.08043e-10 1.0162e-09 7.73091 5.47488 0.417314 -1.6363e-11 -4.08048e-10 1.01622e-09 2.90554 0.965183 0.102902 -1.63496e-11 -4.08047e-10 1.01623e-09 10.2786 0.731801 0.0259123 -1.63661e-11 -4.08047e-10 1.01623e-09 2.22167 -0.733487 -0.20892 1.63796e-14 -2.95053e-13 9.42989e-14 -26.9497 3.18204 -19.5547 16.6098 -9.26564 -30.9726 0.133564 10.3412 -1.46948 -8.37375e-10 7.485e-10 -3.33892e-10 -1.44814e-09 1.29041e-09 -5.6568e-10 -8.37378e-10 7.48502e-10 -3.33871e-10 -7.73091 5.47488 -0.417314 -8.37374e-10 7.48499e-10 -3.33893e-10 -2.90554 0.965183 -0.102902 -8.37384e-10 7.48499e-10 -3.33897e-10 -10.2786 0.731801 -0.0259123 -8.37373e-10 7.48501e-10 -3.33903e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -8.97769 -30.5916 34.5441 -0.114012 20.3879 0.0496363 64.2785 -74.3758 63.9128 2.03217e-16 0.0 3.88251e-19 5.75135 -46.147 -0.523503 0.377404 42.0718 -0.754534 1.92388 -7.13114 7.6294
--26.5718 80.5537 100.066 205.006 -77.1766 529.396 13.2169 -2.4179 15.7399 0.149272 -8.27918 4.1719 -9.59115 8.09207 -7.64499 15.6663 1.84609 -15.1574 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.54182e-14 -5.1388e-13 1.05182e-13 91.6563 -23.578 30.0369 -4.3509 -1.35442 7.56162 -0.958951 26.7401 4.06237 3.74449e-10 -1.02701e-09 1.66529e-09 6.81384e-10 -1.78266e-09 2.86281e-09 3.74459e-10 -1.02701e-09 1.66527e-09 7.73091 5.47488 0.417314 3.7445e-10 -1.02701e-09 1.66529e-09 2.90554 0.965183 0.102902 3.74464e-10 -1.02701e-09 1.66529e-09 10.2786 0.731801 0.0259123 3.74449e-10 -1.02701e-09 1.6653e-09 2.22167 -0.733487 -0.20892 -2.54382e-14 -5.13879e-13 1.04937e-13 -28.3926 2.4493 -17.653 16.738 -9.38993 -31.2503 0.16789 11.5655 -1.64813 -1.22965e-09 1.32217e-09 -5.16409e-10 -2.12841e-09 2.28457e-09 -8.76155e-10 -1.22966e-09 1.32217e-09 -5.16391e-10 -7.73091 5.47488 -0.417314 -1.22965e-09 1.32217e-09 -5.16408e-10 -2.90554 0.965183 -0.102902 -1.22966e-09 1.32217e-09 -5.16411e-10 -10.2786 0.731801 -0.0259123 -1.22965e-09 1.32217e-09 -5.16419e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.5288 -29.9318 32.8048 -0.115883 20.9823 0.0804128 61.4388 -74.7725 61.125 2.03217e-16 0.0 3.88251e-19 4.75798 -44.8937 1.3 0.386384 42.6376 -0.792717 2.37601 -9.62098 8.1954
--27.3022 79.9307 100.775 195.622 -74.9837 537.972 11.2969 -1.85309 15.2529 0.495907 -8.83699 4.11961 -9.02197 7.73197 -7.25199 14.7976 2.45649 -14.5384 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.73434e-14 -6.65513e-13 1.07001e-13 88.4656 -20.6077 28.6006 -4.41532 -1.37951 7.6752 -0.712112 23.4237 3.48716 5.50395e-10 -1.49106e-09 2.11958e-09 9.90595e-10 -2.57683e-09 3.64961e-09 5.50404e-10 -1.49106e-09 2.11957e-09 7.73091 5.47488 0.417314 5.50397e-10 -1.49106e-09 2.11958e-09 2.90554 0.965183 0.102902 5.50411e-10 -1.49106e-09 2.11958e-09 10.2786 0.731801 0.0259123 5.50398e-10 -1.49106e-09 2.11959e-09 2.22167 -0.733487 -0.20892 -4.73849e-14 -6.65514e-13 1.0669e-13 -29.7099 1.69385 -15.7045 16.875 -9.52497 -31.5459 0.195729 12.4565 -1.77927 -1.71096e-09 1.95748e-09 -6.62893e-10 -2.96263e-09 3.38426e-09 -1.12423e-09 -1.71096e-09 1.95748e-09 -6.62878e-10 -7.73091 5.47488 -0.417314 -1.71096e-09 1.95748e-09 -6.62888e-10 -2.90554 0.965183 -0.102902 -1.71097e-09 1.95748e-09 -6.62892e-10 -10.2786 0.731801 -0.0259123 -1.71096e-09 1.95748e-09 -6.62901e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -13.9361 -29.3638 30.9242 -0.118192 21.5813 0.120093 57.3717 -75.2323 57.1232 2.03217e-16 0.0 3.88251e-19 3.63005 -43.8589 2.81503 0.392862 43.1145 -0.825581 2.8645 -11.7962 8.89967
--27.8985 79.4456 101.331 190.066 -73.0418 543.375 9.9137 -1.81368 14.7627 0.671628 -9.09545 4.02405 -8.51521 7.43908 -6.89743 14.1412 2.79986 -13.9511 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.92451e-14 -7.18047e-13 8.57259e-14 85.6957 -17.9714 27.3882 -4.59626 -1.45418 7.99067 -0.549028 20.5753 3.02414 6.58458e-10 -1.46805e-09 2.21098e-09 1.17725e-09 -2.53194e-09 3.80844e-09 6.58465e-10 -1.46805e-09 2.21098e-09 7.73091 5.47488 0.417314 6.58458e-10 -1.46806e-09 2.21098e-09 2.90554 0.965183 0.102902 6.58473e-10 -1.46805e-09 2.21099e-09 10.2786 0.731801 0.0259123 6.58461e-10 -1.46805e-09 2.21099e-09 2.22167 -0.733487 -0.20892 -4.93056e-14 -7.18047e-13 8.5378e-14 -30.6739 1.17146 -13.7853 17.0398 -9.69023 -31.8999 0.200318 12.6482 -1.80734 -1.85627e-09 2.14088e-09 -7.51794e-10 -3.21512e-09 3.70298e-09 -1.27662e-09 -1.85627e-09 2.14088e-09 -7.51781e-10 -7.73091 5.47488 -0.417314 -1.85627e-09 2.14088e-09 -7.51788e-10 -2.90554 0.965183 -0.102902 -1.85628e-09 2.14088e-09 -7.51791e-10 -10.2786 0.731801 -0.0259123 -1.85627e-09 2.14088e-09 -7.518e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -15.6361 -28.8452 29.9751 -0.123146 22.1016 0.137149 56.8897 -75.6148 56.6149 2.03217e-16 0.0 3.88251e-19 2.81564 -43.3849 4.09883 0.404495 43.7734 -0.862149 3.36808 -13.6489 9.65998
--28.4106 79.1382 101.774 188.097 -71.1205 545.886 9.25561 -2.55186 14.2455 0.602799 -8.90435 3.86001 -8.06844 7.21883 -6.57607 13.8021 2.7562 -13.3679 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.90973e-14 -5.73671e-13 4.5305e-15 83.4963 -15.8451 26.4078 -4.93216 -1.59254 8.58139 -0.450013 18.4044 2.68727 8.08071e-10 -4.72807e-10 1.69722e-09 1.42691e-09 -8.08809e-10 2.91908e-09 8.08078e-10 -4.7281e-10 1.69722e-09 7.73091 5.47488 0.417314 8.08072e-10 -4.72808e-10 1.69722e-09 2.90554 0.965183 0.102902 8.08085e-10 -4.72807e-10 1.69723e-09 10.2786 0.731801 0.0259123 8.08073e-10 -4.72807e-10 1.69723e-09 2.22167 -0.733487 -0.20892 -1.91766e-14 -5.73667e-13 4.18884e-15 -31.1817 0.997163 -11.817 17.2884 -9.94429 -32.4351 0.166094 11.7428 -1.67295 -1.49335e-09 1.62952e-09 -8.59363e-10 -2.58838e-09 2.82257e-09 -1.46749e-09 -1.49335e-09 1.62952e-09 -8.59351e-10 -7.73091 5.47488 -0.417314 -1.49334e-09 1.62952e-09 -8.59356e-10 -2.90554 0.965183 -0.102902 -1.49335e-09 1.62952e-09 -8.59359e-10 -10.2786 0.731801 -0.0259123 -1.49334e-09 1.62952e-09 -8.59368e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.3635 -28.4202 30.6228 -0.131795 22.4895 0.113632 63.3549 -75.9247 62.8895 2.03217e-16 0.0 3.88251e-19 2.60067 -43.7602 5.19177 0.426173 44.7772 -0.907369 3.85769 -15.0894 10.4599
--28.8281 78.8401 102.165 187.552 -69.106 547.249 9.01644 -3.83027 13.6877 0.389288 -8.43605 3.64442 -7.64146 7.00959 -6.273 13.6417 2.51684 -12.787 -0.0 0.0 0.0 -0.0 0.0 0.0 3.90286e-14 -2.7917e-13 -1.17994e-13 81.6436 -14.0902 25.5816 -5.36905 -1.77359 9.35753 -0.37481 16.7775 2.43513 8.97433e-10 1.18534e-09 7.33772e-10 1.56543e-09 2.06148e-09 1.25513e-09 8.97439e-10 1.18533e-09 7.33759e-10 7.73091 5.47488 0.417314 8.97433e-10 1.18534e-09 7.33769e-10 2.90554 0.965183 0.102902 8.97445e-10 1.18534e-09 7.33773e-10 10.2786 0.731801 0.0259123 8.97431e-10 1.18533e-09 7.33779e-10 2.22167 -0.733487 -0.20892 3.89254e-14 -2.7916e-13 -1.18305e-13 -31.4026 1.02939 -9.7892 17.5887 -10.2549 -33.0942 0.114618 10.0352 -1.42323 -8.68505e-10 7.32586e-10 -9.69761e-10 -1.50855e-09 1.27642e-09 -1.66691e-09 -8.68517e-10 7.32583e-10 -9.69748e-10 -7.73091 5.47488 -0.417314 -8.68503e-10 7.32587e-10 -9.69754e-10 -2.90554 0.965183 -0.102902 -8.68511e-10 7.32588e-10 -9.69757e-10 -10.2786 0.731801 -0.0259123 -8.68499e-10 7.32589e-10 -9.69765e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.4941 -28.1006 32.1455 -0.142092 22.7998 0.0692645 73.673 -75.8846 72.8934 2.03217e-16 0.0 3.88251e-19 2.78541 -44.7471 6.1133 0.454066 45.9512 -0.956668 4.33896 -16.1506 11.3322
--29.2599 78.5076 102.367 188.222 -67.8269 547.261 8.94863 -5.27307 13.1581 0.128503 -7.89863 3.42193 -7.27591 6.84655 -6.00996 13.5583 2.20072 -12.2698 -0.0 0.0 0.0 -0.0 0.0 0.0 1.01128e-13 -1.95289e-14 -2.1293e-13 79.8006 -12.4824 24.7797 -5.85243 -1.97947 10.2218 -0.305011 15.3304 2.21066 7.56664e-10 2.64671e-09 -2.5084e-10 1.30593e-09 4.58907e-09 -4.43127e-10 7.56668e-10 2.6467e-09 -2.50861e-10 7.73091 5.47488 0.417314 7.56663e-10 2.64671e-09 -2.50845e-10 2.90554 0.965183 0.102902 7.56674e-10 2.64671e-09 -2.5084e-10 10.2786 0.731801 0.0259123 7.56659e-10 2.64671e-09 -2.50835e-10 2.22167 -0.733487 -0.20892 1.01004e-13 -1.9513e-14 -2.13203e-13 -31.5336 1.14327 -7.87808 17.8339 -10.5105 -33.6451 0.0761429 8.19893 -1.15912 -1.84526e-10 -2.35378e-10 -9.23304e-10 -3.25407e-10 -3.94672e-10 -1.59545e-09 -1.84544e-10 -2.35384e-10 -9.23288e-10 -7.73091 5.47488 -0.417314 -1.84524e-10 -2.35377e-10 -9.23296e-10 -2.90554 0.965183 -0.102902 -1.84532e-10 -2.35375e-10 -9.23299e-10 -10.2786 0.731801 -0.0259123 -1.84519e-10 -2.35375e-10 -9.23306e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.4474 -27.8602 33.538 -0.150949 23.1123 0.0287887 82.8587 -75.4253 81.7562 2.03217e-16 0.0 3.88251e-19 3.06723 -45.8937 6.89218 0.482638 47.0598 -1.00463 4.83727 -17.0101 12.27
--29.7577 78.2125 102.712 186.239 -65.703 549.845 8.82471 -6.49954 12.7184 -0.0865592 -7.50057 3.23613 -7.01424 6.76501 -5.80858 13.4439 1.92826 -11.877 -0.0 0.0 0.0 -0.0 0.0 0.0 1.43195e-13 2.02661e-14 -2.11358e-13 77.6594 -10.7848 23.8944 -6.32985 -2.19278 11.0769 -0.235816 13.6983 1.9631 2.15886e-10 3.05166e-09 -8.28083e-10 3.61527e-10 5.28412e-09 -1.43537e-09 2.15889e-10 3.05164e-09 -8.28108e-10 7.73091 5.47488 0.417314 2.15885e-10 3.05166e-09 -8.28089e-10 2.90554 0.965183 0.102902 2.15894e-10 3.05166e-09 -8.28084e-10 10.2786 0.731801 0.0259123 2.15878e-10 3.05165e-09 -8.2808e-10 2.22167 -0.733487 -0.20892 1.43064e-13 2.02846e-14 -2.11606e-13 -31.7533 1.21059 -6.26019 17.9256 -10.6069 -33.8535 0.0588924 6.90827 -0.975674 3.55809e-10 -9.59837e-10 -5.60306e-10 6.11257e-10 -1.64988e-09 -9.73685e-10 3.55788e-10 -9.59847e-10 -5.6029e-10 -7.73091 5.47488 -0.417314 3.55811e-10 -9.59836e-10 -5.60299e-10 -2.90554 0.965183 -0.102902 3.55804e-10 -9.59837e-10 -5.60302e-10 -10.2786 0.731801 -0.0259123 3.55816e-10 -9.59834e-10 -5.60309e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.64 -27.7187 33.8086 -0.155685 23.5069 0.0171083 86.7519 -75.107 85.4931 2.03217e-16 0.0 3.88251e-19 3.10311 -46.7488 7.52583 0.504584 47.8676 -1.04427 5.38794 -17.8441 13.2712
--30.2923 77.9284 103.439 183.475 -64.2897 553.316 8.56721 -7.4771 12.383 -0.258738 -7.27962 3.09622 -6.88139 6.84804 -5.69614 13.2892 1.65532 -11.6656 -0.0 0.0 0.0 -0.0 0.0 0.0 1.61544e-13 -3.54818e-13 -3.02712e-14 75.0499 -8.74543 22.8686 -6.8284 -2.42977 11.9685 -0.163184 11.6368 1.65791 -1.16671e-09 1.52542e-09 -7.24838e-10 -2.02779e-09 2.62822e-09 -1.24701e-09 -1.1667e-09 1.52542e-09 -7.24865e-10 7.73091 5.47488 0.417314 -1.16671e-09 1.52543e-09 -7.24844e-10 2.90554 0.965183 0.102902 -1.1667e-09 1.52543e-09 -7.24841e-10 10.2786 0.731801 0.0259123 -1.16671e-09 1.52542e-09 -7.24837e-10 2.22167 -0.733487 -0.20892 1.61426e-13 -3.54802e-13 -3.05103e-14 -32.0643 1.30417 -5.0223 17.8088 -10.4842 -33.5878 0.0522901 6.19021 -0.874217 6.93172e-10 -1.38374e-09 4.56077e-10 1.20108e-09 -2.39568e-09 7.82775e-10 6.93155e-10 -1.38376e-09 4.56092e-10 -7.73091 5.47488 -0.417314 6.93174e-10 -1.38374e-09 4.56081e-10 -2.90554 0.965183 -0.102902 6.93169e-10 -1.38375e-09 4.56077e-10 -10.2786 0.731801 -0.0259123 6.93179e-10 -1.38374e-09 4.56069e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -17.2474 -27.8143 32.4261 -0.15639 24.1247 0.0473907 83.9604 -75.3199 82.813 2.03217e-16 0.0 3.88251e-19 2.64467 -47.256 7.90306 0.516337 48.3189 -1.07257 6.02739 -18.6907 14.3956
--30.6895 77.7938 103.65 183.048 -62.3754 554.149 8.31262 -8.38358 12.1183 -0.430064 -7.1307 2.97942 -6.85165 7.05252 -5.65377 13.1428 1.34381 -11.5896 -0.0 0.0 0.0 -0.0 0.0 0.0 1.68074e-13 -9.97554e-13 2.72031e-13 72.1904 -6.54383 21.7764 -7.35927 -2.69169 12.9249 -0.098775 9.38936 1.33032 -3.16834e-09 -1.25833e-09 -2.22601e-10 -5.48118e-09 -2.21034e-09 -3.65255e-10 -3.16834e-09 -1.25833e-09 -2.22629e-10 7.73091 5.47488 0.417314 -3.16834e-09 -1.25833e-09 -2.22606e-10 2.90554 0.965183 0.102902 -3.16833e-09 -1.25833e-09 -2.22607e-10 10.2786 0.731801 0.0259123 -3.16835e-09 -1.25833e-09 -2.22604e-10 2.22167 -0.733487 -0.20892 1.6798e-13 -9.97545e-13 2.71795e-13 -32.3901 1.45762 -4.05699 17.5439 -10.2075 -32.9966 0.0489492 5.73631 -0.810249 9.37464e-10 -1.66591e-09 1.94259e-09 1.63299e-09 -2.9036e-09 3.35494e-09 9.37454e-10 -1.66593e-09 1.94261e-09 -7.73091 5.47488 -0.417314 9.37466e-10 -1.66591e-09 1.94259e-09 -2.90554 0.965183 -0.102902 9.37463e-10 -1.66592e-09 1.94259e-09 -10.2786 0.731801 -0.0259123 9.37471e-10 -1.66591e-09 1.94258e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.0239 -28.0546 30.0005 -0.15582 24.8832 0.104834 76.617 -75.7025 75.7372 2.03217e-16 0.0 3.88251e-19 1.90035 -47.6405 8.04253 0.520638 48.5369 -1.09218 6.72855 -19.4546 15.6239
--31.0957 77.724 104.306 181.657 -60.7623 555.926 8.16751 -9.15101 11.9089 -0.569247 -7.04821 2.88066 -6.8911 7.22444 -5.63384 12.9804 1.1239 -11.5547 -0.0 0.0 0.0 -0.0 0.0 0.0 1.62153e-13 -1.57954e-12 5.52506e-13 69.3427 -4.59501 20.6972 -7.85148 -2.94002 13.8224 -0.0580203 7.32285 1.03375 -4.96204e-09 -3.83667e-09 2.75232e-10 -8.57425e-09 -6.69136e-09 5.07447e-10 -4.96204e-09 -3.83666e-09 2.75204e-10 7.73091 5.47488 0.417314 -4.96204e-09 -3.83666e-09 2.75228e-10 2.90554 0.965183 0.102902 -4.96203e-09 -3.83666e-09 2.75225e-10 10.2786 0.731801 0.0259123 -4.96204e-09 -3.83666e-09 2.75226e-10 2.22167 -0.733487 -0.20892 1.62087e-13 -1.57954e-12 5.52267e-13 -32.7673 1.48149 -3.24978 17.209 -9.86222 -32.2644 0.0475773 5.71814 -0.807501 1.13975e-09 -1.81558e-09 3.27878e-09 1.99109e-09 -3.18046e-09 5.66719e-09 1.13974e-09 -1.81561e-09 3.27879e-09 -7.73091 5.47488 -0.417314 1.13975e-09 -1.81558e-09 3.27878e-09 -2.90554 0.965183 -0.102902 1.13975e-09 -1.8156e-09 3.27877e-09 -10.2786 0.731801 -0.0259123 1.13975e-09 -1.81558e-09 3.27876e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.7315 -28.1404 27.2722 -0.154612 25.5266 0.172112 67.0104 -75.8744 66.4375 2.03217e-16 0.0 3.88251e-19 1.19842 -47.8717 8.12317 0.518795 48.5545 -1.10384 7.43284 -20.1138 16.8376
--31.3841 77.9275 104.383 183.292 -59.3575 554.689 8.23794 -9.71154 11.739 -0.644782 -7.02655 2.79493 -6.96593 7.20973 -5.58853 12.7791 1.12551 -11.4663 -0.0 0.0 0.0 -0.0 0.0 0.0 1.43151e-13 -1.77236e-12 6.68115e-13 66.7272 -3.33006 19.6857 -8.23855 -3.13766 14.5372 -0.0415023 5.80456 0.818607 -5.72081e-09 -4.74665e-09 3.65268e-10 -9.8826e-09 -8.27466e-09 6.68666e-10 -5.72081e-09 -4.74664e-09 3.65242e-10 7.73091 5.47488 0.417314 -5.72082e-09 -4.74665e-09 3.65264e-10 2.90554 0.965183 0.102902 -5.72081e-09 -4.74665e-09 3.6526e-10 10.2786 0.731801 0.0259123 -5.72082e-09 -4.74665e-09 3.65261e-10 2.22167 -0.733487 -0.20892 1.43108e-13 -1.77236e-12 6.67867e-13 -33.2228 1.18565 -2.48648 16.8893 -9.54046 -31.5734 0.0490406 6.30726 -0.890061 1.35108e-09 -1.84202e-09 3.84418e-09 2.3595e-09 -3.23306e-09 6.64389e-09 1.35109e-09 -1.84204e-09 3.84419e-09 -7.73091 5.47488 -0.417314 1.35109e-09 -1.84202e-09 3.84417e-09 -2.90554 0.965183 -0.102902 1.35109e-09 -1.84204e-09 3.84417e-09 -10.2786 0.731801 -0.0259123 1.35109e-09 -1.84202e-09 3.84416e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -19.0979 -27.8278 25.0134 -0.151262 25.7991 0.230975 58.0281 -75.7365 57.7099 2.03217e-16 0.0 3.88251e-19 0.873675 -47.9171 8.32875 0.512432 48.4043 -1.1086 8.07313 -20.6518 17.9148
--31.74 78.2454 104.449 183.856 -57.8639 554.187 8.63172 -9.97669 11.5933 -0.616227 -7.09094 2.71954 -7.13762 6.91204 -5.50209 12.5307 1.47864 -11.2868 -0.0 0.0 0.0 -0.0 0.0 0.0 1.05337e-13 -1.33724e-12 4.95613e-13 64.2651 -2.78614 18.7219 -8.53759 -3.29433 15.0916 -0.0373753 4.76345 0.672457 -4.75718e-09 -2.57823e-09 -4.17323e-10 -8.22291e-09 -4.50861e-09 -6.89937e-10 -4.75717e-09 -2.57822e-09 -4.17343e-10 7.73091 5.47488 0.417314 -4.75718e-09 -2.57823e-09 -4.17326e-10 2.90554 0.965183 0.102902 -4.75717e-09 -2.57823e-09 -4.1733e-10 10.2786 0.731801 0.0259123 -4.75718e-09 -2.57823e-09 -4.17327e-10 2.22167 -0.733487 -0.20892 1.05306e-13 -1.33724e-12 4.9534e-13 -33.852 0.385789 -1.77842 16.5906 -9.24943 -30.926 0.0640942 7.90596 -1.11602 1.73305e-09 -1.75479e-09 3.07779e-09 3.01269e-09 -3.06855e-09 5.31131e-09 1.73306e-09 -1.75481e-09 3.0778e-09 -7.73091 5.47488 -0.417314 1.73306e-09 -1.75479e-09 3.07778e-09 -2.90554 0.965183 -0.102902 1.73305e-09 -1.75481e-09 3.07778e-09 -10.2786 0.731801 -0.0259123 1.73306e-09 -1.75479e-09 3.07777e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.9713 -26.9656 23.4325 -0.142142 25.5026 0.276474 50.3997 -75.4287 50.2759 2.03217e-16 0.0 3.88251e-19 1.07958 -47.6752 8.72491 0.499463 48.0072 -1.10253 8.59222 -21.0162 18.7877
--32.0756 78.6384 104.31 184.634 -56.4208 553.331 9.27087 -10.0051 11.4829 -0.511643 -7.23551 2.65754 -7.39925 6.4318 -5.40149 12.2442 2.08299 -11.0716 -0.0 0.0 0.0 -0.0 0.0 0.0 5.08994e-14 -4.99726e-13 1.39656e-13 61.8326 -2.77915 17.7646 -8.77639 -3.42453 15.5329 -0.036144 4.06038 0.573988 -2.66784e-09 1.54838e-09 -1.73831e-09 -4.62267e-09 2.6606e-09 -2.98672e-09 -2.66784e-09 1.54839e-09 -1.73832e-09 7.73091 5.47488 0.417314 -2.66784e-09 1.54838e-09 -1.73831e-09 2.90554 0.965183 0.102902 -2.66783e-09 1.54838e-09 -1.73832e-09 10.2786 0.731801 0.0259123 -2.66784e-09 1.54838e-09 -1.73831e-09 2.22167 -0.733487 -0.20892 5.08785e-14 -4.99712e-13 1.39345e-13 -34.5927 -0.772475 -1.17316 16.2712 -8.94464 -30.2407 0.111439 10.3032 -1.46019 2.2091e-09 -1.5466e-09 1.44237e-09 3.8218e-09 -2.68153e-09 2.47209e-09 2.2091e-09 -1.54661e-09 1.44238e-09 -7.73091 5.47488 -0.417314 2.2091e-09 -1.5466e-09 1.44237e-09 -2.90554 0.965183 -0.102902 2.2091e-09 -1.54662e-09 1.44236e-09 -10.2786 0.731801 -0.0259123 2.20911e-09 -1.5466e-09 1.44235e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -18.4838 -25.7254 22.1487 -0.127353 24.817 0.317636 42.9656 -74.9152 43.0129 2.03217e-16 0.0 3.88251e-19 1.60511 -47.1936 9.20012 0.480213 47.3748 -1.08687 9.02006 -21.2397 19.5253
--32.3636 78.7966 104.865 185.619 -55.5226 553.121 9.9808 -9.94998 11.4317 -0.40189 -7.40798 2.61259 -7.61504 5.91026 -5.30268 11.9249 2.72253 -10.8649 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.90422e-15 3.72067e-13 -2.00951e-13 59.5509 -3.41882 16.8328 -8.90813 -3.49971 15.7742 -0.0331947 3.9606 0.559607 -5.52119e-10 5.30073e-09 -2.8025e-09 -9.7377e-10 9.17646e-09 -4.83916e-09 -5.52115e-10 5.30074e-09 -2.80251e-09 7.73091 5.47488 0.417314 -5.52121e-10 5.30073e-09 -2.8025e-09 2.90554 0.965183 0.102902 -5.52111e-10 5.30073e-09 -2.8025e-09 10.2786 0.731801 0.0259123 -5.52121e-10 5.30073e-09 -2.8025e-09 2.22167 -0.733487 -0.20892 -8.91606e-15 3.72091e-13 -2.01292e-13 -35.2377 -1.9844 -0.61043 15.9546 -8.64747 -29.5715 0.190156 12.7509 -1.81981 2.47309e-09 -1.20137e-09 -1.46898e-10 4.2659e-09 -2.05997e-09 -2.84863e-10 2.47309e-09 -1.20138e-09 -1.4688e-10 -7.73091 5.47488 -0.417314 2.47309e-09 -1.20137e-09 -1.46893e-10 -2.90554 0.965183 -0.102902 2.47308e-09 -1.20138e-09 -1.46897e-10 -10.2786 0.731801 -0.0259123 2.47309e-09 -1.20137e-09 -1.46903e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -17.8051 -24.3969 21.0479 -0.110475 24.0528 0.356917 35.8445 -74.1371 36.0402 2.03217e-16 0.0 3.88251e-19 2.24594 -46.6629 9.67787 0.459768 46.677 -1.07012 9.42306 -21.4341 20.2125
--32.6065 79.0266 105.109 186.406 -54.3812 552.841 10.5856 -9.96473 11.4634 -0.357548 -7.55607 2.58836 -7.65073 5.48877 -5.221 11.5832 3.18028 -10.7096 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.28184e-14 9.10023e-13 -3.27398e-13 57.5366 -4.81547 15.9522 -8.88606 -3.49136 15.7284 -0.0275103 4.72931 0.666191 4.90667e-10 6.34637e-09 -2.8147e-09 8.3193e-10 1.09824e-08 -4.86471e-09 4.90671e-10 6.34637e-09 -2.8147e-09 7.73091 5.47488 0.417314 4.90666e-10 6.34637e-09 -2.8147e-09 2.90554 0.965183 0.102902 4.90676e-10 6.34637e-09 -2.8147e-09 10.2786 0.731801 0.0259123 4.90666e-10 6.34637e-09 -2.8147e-09 2.22167 -0.733487 -0.20892 -6.28178e-14 9.10051e-13 -3.27746e-13 -35.5878 -2.94511 -0.0295221 15.6666 -8.38112 -28.972 0.265089 14.502 -2.08325 2.21888e-09 -7.0303e-10 -7.74818e-10 3.82411e-09 -1.19186e-09 -1.37066e-09 2.21888e-09 -7.03027e-10 -7.74799e-10 -7.73091 5.47488 -0.417314 2.21889e-09 -7.03029e-10 -7.74812e-10 -2.90554 0.965183 -0.102902 2.21887e-09 -7.03029e-10 -7.74815e-10 -10.2786 0.731801 -0.0259123 2.21889e-09 -7.03028e-10 -7.74818e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -17.1202 -23.266 19.9985 -0.0959523 23.5208 0.397065 29.2144 -73.0388 29.5365 2.03217e-16 0.0 3.88251e-19 2.80991 -46.2746 10.0898 0.442456 46.0834 -1.06012 9.87575 -21.7076 20.9379
--32.8519 79.2686 105.372 186.699 -52.9944 552.875 11.0886 -10.0681 11.6255 -0.431559 -7.67803 2.59409 -7.39829 5.18644 -5.16751 11.1503 3.43123 -10.6452 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.15259e-13 9.48344e-13 -1.05922e-13 55.6678 -6.70564 15.1504 -8.66611 -3.37153 15.319 -0.0857884 5.99698 0.871328 -2.00375e-10 2.75045e-09 -9.64881e-10 -3.38091e-10 4.70991e-09 -1.65781e-09 -2.00372e-10 2.75046e-09 -9.64884e-10 7.73091 5.47488 0.417314 -2.00376e-10 2.75046e-09 -9.64886e-10 2.90554 0.965183 0.102902 -2.00367e-10 2.75045e-09 -9.64882e-10 10.2786 0.731801 0.0259123 -2.00376e-10 2.75045e-09 -9.64877e-10 2.22167 -0.733487 -0.20892 -1.15236e-13 9.48367e-13 -1.06235e-13 -35.5791 -3.50876 0.586281 15.4275 -8.16384 -28.4784 0.301183 15.2655 -2.19963 1.0062e-09 9.74163e-11 1.14744e-10 1.74153e-09 1.68897e-10 1.83366e-10 1.0062e-09 9.74196e-11 1.14762e-10 -7.73091 5.47488 -0.417314 1.0062e-09 9.74169e-11 1.1475e-10 -2.90554 0.965183 -0.102902 1.00619e-09 9.74185e-11 1.14747e-10 -10.2786 0.731801 -0.0259123 1.0062e-09 9.74176e-11 1.14745e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -16.4441 -22.4168 19.0102 -0.0858866 23.2935 0.436753 23.4283 -71.4944 23.8694 2.03217e-16 0.0 3.88251e-19 3.27465 -46.0815 10.3877 0.428788 45.6368 -1.05948 10.4204 -22.1087 21.7448
--33.0503 79.4753 105.613 187.0 -51.7433 553.147 11.5677 -10.1854 11.8917 -0.574611 -7.79766 2.6251 -6.95421 4.93415 -5.13145 10.6474 3.57965 -10.6392 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.69755e-13 7.05903e-13 3.30532e-13 53.8956 -9.13834 14.4221 -8.28025 -3.16091 14.6106 -0.199972 7.76857 1.16828 -1.91636e-09 -3.80542e-09 2.12353e-09 -3.26549e-09 -6.71527e-09 3.69855e-09 -1.91636e-09 -3.80541e-09 2.12353e-09 7.73091 5.47488 0.417314 -1.91636e-09 -3.8054e-09 2.12352e-09 2.90554 0.965183 0.102902 -1.91636e-09 -3.80542e-09 2.12353e-09 10.2786 0.731801 0.0259123 -1.91636e-09 -3.80542e-09 2.12353e-09 2.22167 -0.733487 -0.20892 -1.69706e-13 7.05917e-13 3.30281e-13 -35.3326 -3.859 1.20453 15.2226 -7.9818 -28.0541 0.308963 15.471 -2.23063 -8.82134e-10 1.14316e-09 1.92966e-09 -1.4987e-09 1.93493e-09 3.34816e-09 -8.82136e-10 1.14316e-09 1.92968e-09 -7.73091 5.47488 -0.417314 -8.82133e-10 1.14316e-09 1.92966e-09 -2.90554 0.965183 -0.102902 -8.82143e-10 1.14316e-09 1.92966e-09 -10.2786 0.731801 -0.0259123 -8.82132e-10 1.14316e-09 1.92966e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -15.7147 -21.7053 18.1225 -0.0781989 23.2086 0.475427 18.5346 -69.6147 19.0787 2.03217e-16 0.0 3.88251e-19 3.73902 -45.9814 10.622 0.416341 45.2477 -1.06355 11.0156 -22.5707 22.5825
--33.2054 79.6707 105.697 187.779 -50.4675 552.853 11.9588 -10.3298 12.1754 -0.703924 -7.90103 2.66417 -6.49175 4.74105 -5.09513 10.2205 3.60218 -10.6247 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.13726e-13 3.91588e-13 7.80701e-13 52.4234 -12.6984 13.7691 -7.79539 -2.9039 13.7275 -0.28852 10.8701 1.62415 -3.70194e-09 -1.02291e-08 5.09554e-09 -6.31587e-09 -1.79083e-08 8.8541e-09 -3.70195e-09 -1.02291e-08 5.09553e-09 7.73091 5.47488 0.417314 -3.70194e-09 -1.0229e-08 5.09553e-09 2.90554 0.965183 0.102902 -3.70194e-09 -1.02291e-08 5.09553e-09 10.2786 0.731801 0.0259123 -3.70194e-09 -1.02291e-08 5.09553e-09 2.22167 -0.733487 -0.20892 -2.13654e-13 3.91593e-13 7.80513e-13 -34.9269 -4.18521 1.81219 15.0247 -7.81011 -27.6427 0.304496 15.4535 -2.22717 -2.66761e-09 2.14158e-09 3.86271e-09 -4.56042e-09 3.61806e-09 6.716e-09 -2.66761e-09 2.14158e-09 3.86273e-09 -7.73091 5.47488 -0.417314 -2.66761e-09 2.14158e-09 3.86271e-09 -2.90554 0.965183 -0.102902 -2.66762e-09 2.14158e-09 3.86271e-09 -10.2786 0.731801 -0.0259123 -2.66761e-09 2.14158e-09 3.86271e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -14.999 -21.0693 17.2441 -0.071547 23.2247 0.517127 14.1115 -67.6722 14.6988 2.03217e-16 0.0 3.88251e-19 4.19883 -45.9333 10.8768 0.404642 44.8866 -1.06893 11.6119 -23.0271 23.3986
--33.2598 79.8294 105.719 188.746 -48.9991 552.427 12.1973 -10.5147 12.3901 -0.736892 -7.97419 2.69403 -6.18386 4.61625 -5.04089 10.0157 3.47545 -10.5355 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.34588e-13 2.1429e-13 1.04332e-12 51.4361 -17.9774 13.2324 -7.28205 -2.64627 12.794 -0.329908 16.125 2.32866 -4.60177e-09 -1.34283e-08 6.59614e-09 -7.85481e-09 -2.34842e-08 1.14586e-08 -4.60177e-09 -1.34283e-08 6.59613e-09 7.73091 5.47488 0.417314 -4.60177e-09 -1.34283e-08 6.59613e-09 2.90554 0.965183 0.102902 -4.60176e-09 -1.34283e-08 6.59614e-09 10.2786 0.731801 0.0259123 -4.60177e-09 -1.34283e-08 6.59614e-09 2.22167 -0.733487 -0.20892 -2.34509e-13 2.1429e-13 1.04317e-12 -34.4326 -4.67665 2.3968 14.8051 -7.62273 -27.1884 0.305983 15.5482 -2.24099 -3.57171e-09 2.80006e-09 5.10669e-09 -6.1075e-09 4.73008e-09 8.87916e-09 -3.57172e-09 2.80006e-09 5.1067e-09 -7.73091 5.47488 -0.417314 -3.57171e-09 2.80006e-09 5.10669e-09 -2.90554 0.965183 -0.102902 -3.57172e-09 2.80006e-09 5.10669e-09 -10.2786 0.731801 -0.0259123 -3.57171e-09 2.80006e-09 5.10669e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -14.3543 -20.4421 16.288 -0.0644792 23.3001 0.565857 9.68529 -65.8924 10.2016 2.03217e-16 0.0 3.88251e-19 4.64832 -45.8951 11.2347 0.393341 44.5242 -1.07232 12.1538 -23.4146 24.1378
--33.3181 79.955 105.798 189.349 -47.667 552.42 12.2642 -10.7384 12.5145 -0.636469 -8.01712 2.71119 -6.11998 4.61844 -4.96521 10.1472 3.10795 -10.3439 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.18081e-13 2.29788e-13 1.05183e-12 50.8561 -25.1895 12.7554 -6.66114 -2.35784 11.6608 -0.612953 23.8306 3.57329 -4.31208e-09 -1.12917e-08 5.82155e-09 -7.35961e-09 -1.9819e-08 1.01368e-08 -4.31209e-09 -1.12917e-08 5.82154e-09 7.73091 5.47488 0.417314 -4.31208e-09 -1.12917e-08 5.82155e-09 2.90554 0.965183 0.102902 -4.31208e-09 -1.12917e-08 5.82155e-09 10.2786 0.731801 0.0259123 -4.31209e-09 -1.12917e-08 5.82155e-09 2.22167 -0.733487 -0.20892 -2.18018e-13 2.2979e-13 1.05168e-12 -33.8634 -5.49303 2.93079 14.5343 -7.3958 -26.6313 0.320456 15.8995 -2.29432 -3.1606e-09 2.94829e-09 5.61089e-09 -5.39083e-09 4.97937e-09 9.74322e-09 -3.1606e-09 2.94828e-09 5.6109e-09 -7.73091 5.47488 -0.417314 -3.1606e-09 2.94828e-09 5.61089e-09 -2.90554 0.965183 -0.102902 -3.16061e-09 2.94828e-09 5.61089e-09 -10.2786 0.731801 -0.0259123 -3.1606e-09 2.94829e-09 5.61089e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -13.7849 -19.8328 15.1779 -0.0568521 23.4891 0.627132 4.80973 -64.3098 5.09146 2.03217e-16 0.0 3.88251e-19 5.11467 -45.8741 11.7438 0.383503 44.1987 -1.07436 12.6139 -23.7253 24.7648
--33.4193 80.0725 105.961 189.425 -46.4192 552.82 12.1943 -10.9956 12.5941 -0.451786 -8.03601 2.72447 -6.19393 4.72403 -4.87701 10.5161 2.5398 -10.0896 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.74549e-13 3.26648e-13 9.1786e-13 50.5996 -34.0206 12.5135 -5.91962 -2.02622 10.3229 -1.53922 33.4827 5.51963 -3.35874e-09 -5.89751e-09 3.64192e-09 -5.73089e-09 -1.0514e-08 6.3917e-09 -3.35874e-09 -5.8975e-09 3.64191e-09 7.73091 5.47488 0.417314 -3.35874e-09 -5.8975e-09 3.64192e-09 2.90554 0.965183 0.102902 -3.35874e-09 -5.89751e-09 3.64192e-09 10.2786 0.731801 0.0259123 -3.35875e-09 -5.89751e-09 3.64193e-09 2.22167 -0.733487 -0.20892 -1.74519e-13 3.26657e-13 9.17699e-13 -33.1767 -6.49656 3.43034 14.2328 -7.1476 -26.0163 0.338065 16.3104 -2.357 -1.92489e-09 2.77307e-09 5.75099e-09 -3.25396e-09 4.68011e-09 9.9653e-09 -1.92489e-09 2.77307e-09 5.751e-09 -7.73091 5.47488 -0.417314 -1.92489e-09 2.77307e-09 5.75099e-09 -2.90554 0.965183 -0.102902 -1.9249e-09 2.77307e-09 5.75099e-09 -10.2786 0.731801 -0.0259123 -1.92488e-09 2.77307e-09 5.75099e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -13.2628 -19.2658 13.9765 -0.0500608 23.792 0.697628 -0.214194 -62.7297 -0.313868 2.03217e-16 0.0 3.88251e-19 5.59298 -45.8846 12.3522 0.374952 43.9104 -1.0763 13.0203 -23.9937 25.3133
--33.4633 80.221 106.098 189.651 -45.3168 553.092 12.0027 -11.2953 12.6429 -0.2296 -8.02631 2.73507 -6.28481 4.81874 -4.77741 10.9471 1.9454 -9.80672 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.28322e-13 4.62943e-13 7.07461e-13 51.1134 -44.2415 13.0949 -5.24114 -1.72834 9.11984 -3.40485 44.6888 8.29422 -2.0308e-09 -4.37565e-10 1.21316e-09 -3.46929e-09 -1.02231e-09 2.19028e-09 -2.03079e-09 -4.37568e-10 1.21315e-09 7.73091 5.47488 0.417314 -2.03079e-09 -4.37576e-10 1.21317e-09 2.90554 0.965183 0.102902 -2.03079e-09 -4.3757e-10 1.21317e-09 10.2786 0.731801 0.0259123 -2.0308e-09 -4.37569e-10 1.21318e-09 2.22167 -0.733487 -0.20892 -1.28328e-13 4.62958e-13 7.07277e-13 -32.3586 -7.43011 3.94829 13.9489 -6.91622 -25.4456 0.350977 16.6032 -2.40186 -4.72764e-10 2.51754e-09 5.35929e-09 -7.49701e-10 4.25284e-09 9.26504e-09 -4.72766e-10 2.51754e-09 5.3593e-09 -7.73091 5.47488 -0.417314 -4.72764e-10 2.51754e-09 5.35929e-09 -2.90554 0.965183 -0.102902 -4.7277e-10 2.51754e-09 5.35929e-09 -10.2786 0.731801 -0.0259123 -4.72757e-10 2.51754e-09 5.35928e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.7928 -18.6971 12.8087 -0.0443545 24.0865 0.767842 -4.80827 -61.0665 -5.38306 2.03217e-16 0.0 3.88251e-19 6.02728 -45.8948 12.9915 0.365601 43.573 -1.07588 13.3968 -24.2209 25.8299
--33.526 80.4257 106.185 189.532 -44.2129 553.516 11.7047 -11.6464 12.6747 -0.0166621 -7.98345 2.74421 -6.27093 4.78824 -4.66753 11.2606 1.49995 -9.52785 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.03727e-13 5.96742e-13 4.86675e-13 53.6438 -55.5467 15.7177 -4.82245 -1.54427 8.39054 -6.8261 57.0514 12.5235 -6.17295e-10 1.89612e-09 -3.08816e-10 -1.07543e-09 3.20319e-09 -5.0051e-10 -6.1729e-10 1.89611e-09 -3.08822e-10 7.73091 5.47488 0.417314 -6.17282e-10 1.89609e-09 -3.088e-10 2.90554 0.965183 0.102902 -6.17291e-10 1.89611e-09 -3.08809e-10 10.2786 0.731801 0.0259123 -6.173e-10 1.89611e-09 -3.08794e-10 2.22167 -0.733487 -0.20892 -1.03761e-13 5.96761e-13 4.86476e-13 -31.4013 -8.03671 4.53576 13.7341 -6.74188 -25.0205 0.350371 16.6005 -2.4013 5.87601e-10 2.4248e-09 4.2681e-09 1.06915e-09 4.11814e-09 7.36206e-09 5.876e-10 2.4248e-09 4.26811e-09 -7.73091 5.47488 -0.417314 5.87601e-10 2.4248e-09 4.2681e-09 -2.90554 0.965183 -0.102902 5.87595e-10 2.4248e-09 4.2681e-09 -10.2786 0.731801 -0.0259123 5.8761e-10 2.4248e-09 4.26809e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.3819 -18.0864 11.7994 -0.0391505 24.2503 0.827906 -8.50538 -59.3236 -9.58215 2.03217e-16 0.0 3.88251e-19 6.3595 -45.8747 13.5919 0.353449 43.1003 -1.07093 13.7691 -24.407 26.3615
--33.5095 80.6577 106.273 189.569 -42.9361 554.011 11.2448 -12.0761 12.6723 0.194882 -7.85144 2.7506 -6.11595 4.55585 -4.54919 11.4162 1.26141 -9.25741 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.07187e-13 7.36522e-13 2.04039e-13 64.3181 -69.0584 26.0108 -4.77405 -1.51872 8.31177 -16.8927 71.9662 23.6014 1.26366e-09 -1.22541e-09 -3.8329e-10 2.09329e-09 -1.71032e-09 -8.17689e-10 1.26366e-09 -1.22542e-09 -3.83295e-10 7.73091 5.47488 0.417314 1.26367e-09 -1.22544e-09 -3.83275e-10 2.90554 0.965183 0.102902 1.26366e-09 -1.22542e-09 -3.83283e-10 10.2786 0.731801 0.0259123 1.26365e-09 -1.22542e-09 -3.83269e-10 2.22167 -0.733487 -0.20892 -1.07239e-13 7.36538e-13 2.03834e-13 -30.3034 -8.10755 5.21349 13.6411 -6.66578 -24.8401 0.324961 16.0474 -2.31637 1.22843e-09 2.48632e-09 1.63502e-09 2.14422e-09 4.27692e-09 2.80075e-09 1.22843e-09 2.48632e-09 1.63503e-09 -7.73091 5.47488 -0.417314 1.22843e-09 2.48632e-09 1.63502e-09 -2.90554 0.965183 -0.102902 1.22842e-09 2.48632e-09 1.63502e-09 -10.2786 0.731801 -0.0259123 1.22844e-09 2.48632e-09 1.63501e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -12.0794 -17.4167 10.9707 -0.0335736 24.2468 0.875372 -11.4203 -57.5624 -13.0099 2.03217e-16 0.0 3.88251e-19 6.52346 -45.799 14.1131 0.337442 42.433 -1.0596 14.1351 -24.5347 26.9194
--33.481 80.8889 106.537 189.585 -41.5746 554.757 10.6335 -12.5716 12.6356 0.423174 -7.65097 2.75416 -5.88474 4.19784 -4.42154 11.5048 1.13301 -8.97878 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.25748e-13 8.98091e-13 -1.52645e-13 117.294 -80.0504 77.9891 -4.97912 -1.60305 8.67356 -95.3518 82.6708 103.359 3.61323e-09 -7.60718e-09 2.95761e-10 6.04517e-09 -1.20483e-08 7.68744e-11 3.61323e-09 -7.60719e-09 2.95756e-10 7.73091 5.47488 0.417314 3.61324e-09 -7.60721e-09 2.95772e-10 2.90554 0.965183 0.102902 3.61323e-09 -7.60719e-09 2.95765e-10 10.2786 0.731801 0.0259123 3.61322e-09 -7.60718e-09 2.95776e-10 2.22167 -0.733487 -0.20892 -1.25816e-13 8.98102e-13 -1.52853e-13 -29.0866 -7.82721 5.94905 13.633 -6.6585 -24.8257 0.285967 15.1078 -2.17375 1.72928e-09 2.59689e-09 -2.18462e-09 2.96287e-09 4.54196e-09 -3.80907e-09 1.72928e-09 2.59689e-09 -2.18461e-09 -7.73091 5.47488 -0.417314 1.72928e-09 2.59689e-09 -2.18462e-09 -2.90554 0.965183 -0.102902 1.72927e-09 2.59689e-09 -2.18462e-09 -10.2786 0.731801 -0.0259123 1.72928e-09 2.5969e-09 -2.18463e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.8714 -16.7162 10.2581 -0.0275946 24.1426 0.915201 -13.9047 -55.821 -16.0408 2.03217e-16 0.0 3.88251e-19 6.56511 -45.6903 14.5982 0.31928 41.6293 -1.04391 14.4817 -24.6105 27.4775
--33.6033 81.1497 106.586 189.378 -40.6521 555.187 9.98673 -13.0817 12.604 0.636904 -7.4925 2.75785 -5.60731 3.82926 -4.28154 11.5411 1.05836 -8.69241 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.54677e-13 1.05052e-12 -4.58438e-13 -177.559 -72.6751 142.039 -5.29715 -1.73781 9.23459 -150.167 69.7448 159.485 5.57128e-09 -1.36553e-08 1.0322e-09 9.32816e-09 -2.1883e-08 1.11289e-09 5.57128e-09 -1.36553e-08 1.03219e-09 7.73091 5.47488 0.417314 5.57129e-09 -1.36553e-08 1.0322e-09 2.90554 0.965183 0.102902 5.57128e-09 -1.36553e-08 1.0322e-09 10.2786 0.731801 0.0259123 5.57127e-09 -1.36553e-08 1.03221e-09 2.22167 -0.733487 -0.20892 -1.54751e-13 1.05053e-12 -4.58645e-13 -27.7727 -7.52837 6.71392 13.6269 -6.65466 -24.8114 0.253986 14.2315 -2.04244 1.94297e-09 2.85463e-09 -5.56191e-09 3.29092e-09 5.05159e-09 -9.64964e-09 1.94298e-09 2.85462e-09 -5.5619e-09 -7.73091 5.47488 -0.417314 1.94298e-09 2.85462e-09 -5.56191e-09 -2.90554 0.965183 -0.102902 1.94297e-09 2.85462e-09 -5.56191e-09 -10.2786 0.731801 -0.0259123 1.94298e-09 2.85463e-09 -5.56192e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.6728 -16.0155 9.65535 -0.0215106 23.9699 0.948457 -15.9459 -54.1233 -18.6424 2.03217e-16 0.0 3.88251e-19 6.59451 -45.5913 15.1027 0.300992 40.7788 -1.02741 14.8188 -24.6689 28.0273
--33.6774 81.3577 106.755 189.011 -39.5284 556.031 9.42194 -13.5551 12.6166 0.804764 -7.4865 2.76461 -5.31469 3.56526 -4.1259 11.5406 0.980866 -8.39885 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.89241e-13 1.16289e-12 -5.88403e-13 -163.847 -62.4883 155.373 -5.58982 -1.864 9.75339 -157.016 57.4325 167.289 6.27767e-09 -1.57758e-08 1.12989e-09 1.04902e-08 -2.52864e-08 1.22008e-09 6.27768e-09 -1.57758e-08 1.12988e-09 7.73091 5.47488 0.417314 6.27768e-09 -1.57758e-08 1.12989e-09 2.90554 0.965183 0.102902 6.27768e-09 -1.57758e-08 1.12989e-09 10.2786 0.731801 0.0259123 6.27767e-09 -1.57758e-08 1.12989e-09 2.22167 -0.733487 -0.20892 -1.89308e-13 1.16289e-12 -5.88601e-13 -26.3657 -7.54213 7.48147 13.5391 -6.58853 -24.6313 0.24188 13.869 -1.98855 1.72236e-09 3.35762e-09 -6.86795e-09 2.89415e-09 5.94415e-09 -1.19032e-08 1.72236e-09 3.35762e-09 -6.86793e-09 -7.73091 5.47488 -0.417314 1.72236e-09 3.35762e-09 -6.86794e-09 -2.90554 0.965183 -0.102902 1.72236e-09 3.35762e-09 -6.86794e-09 -10.2786 0.731801 -0.0259123 1.72236e-09 3.35763e-09 -6.86796e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.3998 -15.3448 9.15564 -0.0157505 23.7611 0.976261 -17.5362 -52.495 -20.7855 2.03217e-16 0.0 3.88251e-19 6.72354 -45.5432 15.6834 0.284229 39.9711 -1.01329 15.1577 -24.7443 28.5608
--33.6212 81.5526 106.966 189.021 -38.2841 556.817 8.95822 -13.9844 12.6755 0.914089 -7.71549 2.77102 -4.99059 3.45609 -3.94033 11.4755 0.909845 -8.086 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.60508e-13 1.28637e-12 -4.45383e-13 -161.323 -57.3859 158.782 -5.86875 -1.9876 10.2487 -158.767 50.7753 169.513 5.02192e-09 -1.15705e-08 5.47661e-11 8.30812e-09 -1.82879e-08 -4.0933e-10 5.02193e-09 -1.15705e-08 5.47625e-11 7.73091 5.47488 0.417314 5.02193e-09 -1.15706e-08 5.47674e-11 2.90554 0.965183 0.102902 5.02192e-09 -1.15705e-08 5.47659e-11 10.2786 0.731801 0.0259123 5.02192e-09 -1.15705e-08 5.4772e-11 2.22167 -0.733487 -0.20892 -2.60539e-13 1.28637e-12 -4.4556e-13 -24.8176 -8.0167 8.29198 13.3312 -6.42986 -24.213 0.253972 14.2179 -2.04055 6.05683e-10 4.70478e-09 -4.89704e-09 9.89488e-10 8.23041e-09 -8.47811e-09 6.05685e-10 4.70478e-09 -4.89703e-09 -7.73091 5.47488 -0.417314 6.05685e-10 4.70478e-09 -4.89704e-09 -2.90554 0.965183 -0.102902 6.05683e-10 4.70478e-09 -4.89704e-09 -10.2786 0.731801 -0.0259123 6.05689e-10 4.70479e-09 -4.89705e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -11.0356 -14.7448 8.79723 -0.0106849 23.5312 0.998268 -18.7531 -50.9295 -22.5429 2.03217e-16 0.0 3.88251e-19 6.98703 -45.5657 16.3791 0.268619 39.196 -1.00048 15.4926 -24.814 29.0851
--33.4345 81.7757 107.131 189.336 -37.1198 557.214 8.53821 -14.3947 12.7627 0.983091 -8.10288 2.77704 -4.62765 3.43389 -3.73091 11.3476 0.867436 -7.7576 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.60228e-13 1.41765e-12 -1.17292e-13 -162.19 -55.9859 159.647 -6.18981 -2.13241 10.8217 -159.558 47.9739 170.532 2.42314e-09 -3.43618e-09 -1.70575e-09 3.83497e-09 -4.84553e-09 -3.03039e-09 2.42314e-09 -3.43618e-09 -1.70575e-09 7.73091 5.47488 0.417314 2.42314e-09 -3.43619e-09 -1.70575e-09 2.90554 0.965183 0.102902 2.42314e-09 -3.43618e-09 -1.70575e-09 10.2786 0.731801 0.0259123 2.42313e-09 -3.43617e-09 -1.70574e-09 2.22167 -0.733487 -0.20892 -3.60201e-13 1.41765e-12 -1.17438e-13 -23.1229 -8.75239 9.14769 13.0498 -6.21597 -23.6549 0.283705 15.0121 -2.15977 -1.18772e-09 6.65287e-09 -7.75059e-10 -2.05796e-09 1.1512e-08 -1.32393e-09 -1.18772e-09 6.65286e-09 -7.75036e-10 -7.73091 5.47488 -0.417314 -1.18772e-09 6.65286e-09 -7.75058e-10 -2.90554 0.965183 -0.102902 -1.18772e-09 6.65286e-09 -7.75058e-10 -10.2786 0.731801 -0.0259123 -1.18772e-09 6.65287e-09 -7.75068e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.6323 -14.1913 8.56728 -0.00601462 23.2607 1.01411 -19.6864 -49.4439 -24.0017 2.03217e-16 0.0 3.88251e-19 7.32771 -45.6312 17.1544 0.25351 38.417 -0.987887 15.8199 -24.8708 29.6012
--33.2565 81.9989 107.27 189.728 -35.9829 557.528 8.16563 -14.7826 12.8875 1.02692 -8.52037 2.79051 -4.2707 3.43664 -3.52472 11.2182 0.816096 -7.43809 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.24681e-13 1.44406e-12 2.43205e-13 -164.298 -56.3088 159.696 -6.48596 -2.2672 11.3544 -160.02 47.2055 171.089 -3.84404e-10 5.02883e-09 -3.31559e-09 -9.66816e-10 9.07506e-09 -5.38435e-09 -3.84399e-10 5.02883e-09 -3.31559e-09 7.73091 5.47488 0.417314 -3.84403e-10 5.02882e-09 -3.31559e-09 2.90554 0.965183 0.102902 -3.84405e-10 5.02883e-09 -3.31559e-09 10.2786 0.731801 0.0259123 -3.84404e-10 5.02883e-09 -3.31558e-09 2.22167 -0.733487 -0.20892 -4.24603e-13 1.44406e-12 2.43089e-13 -21.3465 -9.55871 9.96477 12.7396 -5.98278 -23.0475 0.324531 16.0066 -2.31057 -2.78345e-09 8.03679e-09 3.62962e-09 -4.76007e-09 1.38134e-08 6.31537e-09 -2.78345e-09 8.03679e-09 3.62965e-09 -7.73091 5.47488 -0.417314 -2.78345e-09 8.03679e-09 3.62962e-09 -2.90554 0.965183 -0.102902 -2.78345e-09 8.03679e-09 3.62962e-09 -10.2786 0.731801 -0.0259123 -2.78344e-09 8.03679e-09 3.62962e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -10.206 -13.6161 8.38358 -0.00121776 22.9305 1.02492 -20.3524 -48.098 -25.1547 2.03217e-16 0.0 3.88251e-19 7.71944 -45.71 17.9542 0.239681 37.6847 -0.978239 16.1566 -24.9709 30.0932
--33.3897 82.1463 107.441 189.242 -34.8229 558.186 7.8444 -15.145 13.0593 1.06084 -8.83967 2.81917 -3.96373 3.40229 -3.34891 11.1492 0.718188 -7.1519 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.90149e-13 1.25294e-12 4.83444e-13 -166.208 -56.3075 159.931 -6.69237 -2.36139 11.7285 -160.31 46.6179 171.448 -2.26642e-09 1.0226e-08 -3.93868e-09 -4.13481e-09 1.75083e-08 -6.21249e-09 -2.26641e-09 1.0226e-08 -3.93869e-09 7.73091 5.47488 0.417314 -2.26642e-09 1.0226e-08 -3.93868e-09 2.90554 0.965183 0.102902 -2.26642e-09 1.0226e-08 -3.93868e-09 10.2786 0.731801 0.0259123 -2.26642e-09 1.0226e-08 -3.93867e-09 2.22167 -0.733487 -0.20892 -3.90056e-13 1.25294e-12 4.83345e-13 -19.5689 -10.2483 10.6556 12.4481 -5.7679 -22.4806 0.366154 16.9567 -2.45597 -3.30708e-09 7.69147e-09 6.44862e-09 -5.62875e-09 1.31592e-08 1.11958e-08 -3.30709e-09 7.69147e-09 6.44864e-09 -7.73091 5.47488 -0.417314 -3.30708e-09 7.69147e-09 6.44862e-09 -2.90554 0.965183 -0.102902 -3.30709e-09 7.69147e-09 6.44862e-09 -10.2786 0.731801 -0.0259123 -3.30708e-09 7.69147e-09 6.44861e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -9.76826 -12.95 8.16543 0.0042388 22.5214 1.03183 -20.7686 -46.9488 -25.9923 2.03217e-16 0.0 3.88251e-19 8.13329 -45.7743 18.7213 0.227704 37.0498 -0.974108 16.5213 -25.1705 30.5465
--33.5231 82.2631 107.615 188.703 -33.6709 558.84 7.57957 -15.4741 13.324 1.06944 -9.02663 2.87645 -3.72508 3.31733 -3.22551 11.171 0.528818 -6.9265 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.58262e-13 6.45038e-13 5.57637e-13 -167.691 -55.6849 160.547 -6.79487 -2.40821 11.9152 -160.412 46.0535 171.601 -2.81343e-09 1.05663e-08 -2.8889e-09 -4.91787e-09 1.77236e-08 -4.42644e-09 -2.81342e-09 1.05663e-08 -2.88891e-09 7.73091 5.47488 0.417314 -2.81343e-09 1.05663e-08 -2.8889e-09 2.90554 0.965183 0.102902 -2.81342e-09 1.05663e-08 -2.8889e-09 10.2786 0.731801 0.0259123 -2.81343e-09 1.05663e-08 -2.88889e-09 2.22167 -0.733487 -0.20892 -1.58213e-13 6.45038e-13 5.57535e-13 -17.821 -10.7801 11.1395 12.1807 -5.57621 -21.9603 0.40632 17.8368 -2.59176 -1.86132e-09 4.04791e-09 7.13346e-09 -3.1194e-09 6.85136e-09 1.23532e-08 -1.86133e-09 4.04791e-09 7.13348e-09 -7.73091 5.47488 -0.417314 -1.86133e-09 4.04791e-09 7.13346e-09 -2.90554 0.965183 -0.102902 -1.86133e-09 4.04791e-09 7.13346e-09 -10.2786 0.731801 -0.0259123 -1.86132e-09 4.04791e-09 7.13345e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -9.3371 -12.1744 7.85341 0.0102937 22.0252 1.03146 -20.7454 -46.1206 -26.2285 2.03217e-16 0.0 3.88251e-19 8.56288 -45.8203 19.4666 0.217581 36.5261 -0.975488 16.9109 -25.4779 30.9476
--33.4446 82.4139 107.705 188.937 -32.6665 559.038 7.36937 -15.7733 13.6624 1.05121 -9.14965 2.95441 -3.52905 3.21386 -3.13512 11.2467 0.279614 -6.74197 -0.0 0.0 0.0 -0.0 0.0 0.0 2.09873e-13 -2.63157e-13 5.48897e-13 -169.441 -55.4519 161.054 -6.82863 -2.42396 11.9766 -160.336 46.395 171.497 -2.66605e-09 8.17862e-09 -7.66538e-10 -4.43855e-09 1.32824e-08 -9.48429e-10 -2.66604e-09 8.17861e-09 -7.66542e-10 7.73091 5.47488 0.417314 -2.66604e-09 8.17861e-09 -7.66532e-10 2.90554 0.965183 0.102902 -2.66604e-09 8.17861e-09 -7.6653e-10 10.2786 0.731801 0.0259123 -2.66605e-09 8.17862e-09 -7.66529e-10 2.22167 -0.733487 -0.20892 2.09838e-13 -2.63157e-13 5.48779e-13 -16.067 -11.2537 11.4802 11.9148 -5.38968 -21.4443 0.451702 18.764 -2.73649 8.66097e-10 -1.85309e-09 6.69737e-09 1.59173e-09 -3.33284e-09 1.15506e-08 8.66081e-10 -1.85308e-09 6.69738e-09 -7.73091 5.47488 -0.417314 8.66088e-10 -1.85308e-09 6.69737e-09 -2.90554 0.965183 -0.102902 8.66081e-10 -1.85308e-09 6.69736e-09 -10.2786 0.731801 -0.0259123 8.66099e-10 -1.85309e-09 6.69736e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -8.89727 -11.3257 7.50454 0.0164845 21.4531 1.02459 -20.4072 -45.548 -26.0105 2.03217e-16 0.0 3.88251e-19 9.02292 -45.8617 20.2114 0.208741 36.0865 -0.980967 17.3204 -25.8655 31.3096
--33.2756 82.536 107.924 189.442 -31.3132 559.444 7.20618 -16.0561 13.9859 1.04207 -9.23421 3.02853 -3.35292 3.09823 -3.0428 11.3372 0.0477209 -6.55161 -0.0 0.0 0.0 -0.0 0.0 0.0 5.38749e-13 -1.1107e-12 4.97914e-13 -171.461 -55.5159 161.374 -6.80367 -2.41286 11.9307 -160.134 47.3404 171.216 -2.26516e-09 5.04183e-09 1.33483e-09 -3.54503e-09 7.65764e-09 2.46442e-09 -2.26514e-09 5.04181e-09 1.33482e-09 7.73091 5.47488 0.417314 -2.26514e-09 5.04181e-09 1.33483e-09 2.90554 0.965183 0.102902 -2.26513e-09 5.04181e-09 1.33484e-09 10.2786 0.731801 0.0259123 -2.26516e-09 5.04184e-09 1.33483e-09 2.22167 -0.733487 -0.20892 5.3863e-13 -1.1107e-12 4.97777e-13 -14.294 -11.694 11.8051 11.6588 -5.213 -20.9502 0.501098 19.7083 -2.88567 3.37206e-09 -7.26187e-09 5.61446e-09 5.91152e-09 -1.26556e-08 9.63535e-09 3.37204e-09 -7.26186e-09 5.61446e-09 -7.73091 5.47488 -0.417314 3.37204e-09 -7.26186e-09 5.61446e-09 -2.90554 0.965183 -0.102902 3.37204e-09 -7.26186e-09 5.61446e-09 -10.2786 0.731801 -0.0259123 3.37206e-09 -7.26187e-09 5.61446e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -8.41091 -10.4171 7.213 0.0229444 20.8152 1.01848 -20.2035 -45.0057 -25.9499 2.03217e-16 0.0 3.88251e-19 9.51376 -45.8993 20.9139 0.200823 35.7202 -0.990949 17.7671 -26.3348 31.6598
--33.1781 82.6631 107.985 189.849 -30.4426 559.575 7.08071 -16.3373 14.2056 1.07788 -9.30585 3.07435 -3.17376 2.97675 -2.91363 11.4031 -0.0896799 -6.30855 -0.0 0.0 0.0 -0.0 0.0 0.0 6.52862e-13 -1.53666e-12 4.45377e-13 -173.765 -55.784 161.413 -6.72968 -2.37906 11.7959 -159.854 48.5875 170.831 -2.05162e-09 3.13471e-09 2.32161e-09 -3.08548e-09 4.32207e-09 4.05498e-09 -2.0516e-09 3.13469e-09 2.32161e-09 7.73091 5.47488 0.417314 -2.0516e-09 3.13469e-09 2.32162e-09 2.90554 0.965183 0.102902 -2.05159e-09 3.13469e-09 2.32163e-09 10.2786 0.731801 0.0259123 -2.05162e-09 3.13471e-09 2.32162e-09 2.22167 -0.733487 -0.20892 6.52699e-13 -1.53666e-12 4.45228e-13 -12.484 -12.1243 12.2425 11.4214 -5.05107 -20.4955 0.552673 20.6398 -3.03449 4.15343e-09 -9.4288e-09 4.35887e-09 7.24684e-09 -1.63791e-08 7.45465e-09 4.15341e-09 -9.42878e-09 4.35887e-09 -7.73091 5.47488 -0.417314 4.15342e-09 -9.42878e-09 4.35887e-09 -2.90554 0.965183 -0.102902 4.15341e-09 -9.42878e-09 4.35887e-09 -10.2786 0.731801 -0.0259123 4.15343e-09 -9.4288e-09 4.35887e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.84668 -9.46293 7.07164 0.0301396 20.1212 1.02024 -20.5498 -44.2727 -26.637 2.03217e-16 0.0 3.88251e-19 10.0354 -45.935 21.5321 0.193484 35.4164 -1.00586 18.2694 -26.8869 32.0257
--33.0626 82.7717 108.125 190.272 -29.43 559.767 7.02235 -16.6304 14.2937 1.16815 -9.3576 3.0818 -2.97635 2.85707 -2.71831 11.4244 -0.109387 -5.9641 -0.0 0.0 0.0 -0.0 0.0 0.0 4.05312e-13 -1.30614e-12 3.82333e-13 -176.489 -56.3797 161.049 -6.57644 -2.30851 11.5183 -159.45 50.2179 170.292 -2.14072e-09 3.10118e-09 1.51301e-09 -3.32527e-09 4.49109e-09 2.70607e-09 -2.14071e-09 3.10118e-09 1.513e-09 7.73091 5.47488 0.417314 -2.14071e-09 3.10118e-09 1.51302e-09 2.90554 0.965183 0.102902 -2.1407e-09 3.10118e-09 1.51302e-09 10.2786 0.731801 0.0259123 -2.14073e-09 3.10118e-09 1.51302e-09 2.22167 -0.733487 -0.20892 4.05165e-13 -1.30614e-12 3.82182e-13 -10.6097 -12.511 12.8669 11.202 -4.90405 -20.0766 0.60569 21.5492 -3.18155 2.00695e-09 -6.27278e-09 2.56169e-09 3.51202e-09 -1.09058e-08 4.39517e-09 2.00693e-09 -6.27277e-09 2.56169e-09 -7.73091 5.47488 -0.417314 2.00694e-09 -6.27277e-09 2.56169e-09 -2.90554 0.965183 -0.102902 2.00693e-09 -6.27277e-09 2.56168e-09 -10.2786 0.731801 -0.0259123 2.00695e-09 -6.27278e-09 2.56168e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -7.18516 -8.45046 7.15539 0.0393947 19.3434 1.03481 -21.6884 -43.2525 -28.4218 2.03217e-16 0.0 3.88251e-19 10.5994 -45.9586 22.0216 0.186509 35.1708 -1.02773 18.8813 -27.6022 32.4283
--32.9262 82.8653 108.243 190.723 -28.3713 559.936 7.02303 -16.9252 14.2983 1.29356 -9.38046 3.06509 -2.77548 2.73376 -2.48213 11.4235 -0.0532382 -5.55524 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.69325e-14 -6.57856e-13 2.93683e-13 -179.613 -57.2997 160.334 -6.34849 -2.20371 11.1077 -158.848 52.3331 169.52 -2.2981e-09 3.84714e-09 -3.78007e-10 -3.79899e-09 6.21611e-09 -4.28973e-10 -2.29809e-09 3.84716e-09 -3.78029e-10 7.73091 5.47488 0.417314 -2.29809e-09 3.84716e-09 -3.78002e-10 2.90554 0.965183 0.102902 -2.29808e-09 3.84716e-09 -3.78002e-10 10.2786 0.731801 0.0259123 -2.29811e-09 3.84714e-09 -3.78004e-10 2.22167 -0.733487 -0.20892 -7.70281e-14 -6.57857e-13 2.93534e-13 -8.68619 -12.8533 13.5968 10.998 -4.77029 -19.6869 0.661209 22.4531 -3.32963 -1.99824e-09 2.90421e-10 1.35158e-10 -3.44522e-09 4.59536e-10 2.848e-10 -1.99825e-09 2.90434e-10 1.35161e-10 -7.73091 5.47488 -0.417314 -1.99825e-09 2.90432e-10 1.35159e-10 -2.90554 0.965183 -0.102902 -1.99825e-09 2.90433e-10 1.35152e-10 -10.2786 0.731801 -0.0259123 -1.99824e-09 2.90423e-10 1.35148e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -6.46024 -7.37928 7.39643 0.0506591 18.4866 1.05729 -23.2689 -42.0431 -30.8581 2.03217e-16 0.0 3.88251e-19 11.2007 -45.9753 22.4154 0.180068 34.9896 -1.05564 19.5827 -28.4521 32.856
--32.8211 82.9448 108.3 190.931 -27.4384 560.068 7.01649 -17.201 14.2443 1.44678 -9.3969 3.03609 -2.5932 2.59363 -2.25214 11.4244 0.0584174 -5.16366 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.58573e-13 5.87329e-14 2.10895e-13 177.091 -58.261 159.444 -6.10839 -2.0938 10.6782 -158.082 54.6622 168.571 -2.44013e-09 4.74432e-09 -2.35434e-09 -4.2586e-09 8.22392e-09 -3.70148e-09 -2.44013e-09 4.74436e-09 -2.35437e-09 7.73091 5.47488 0.417314 -2.44013e-09 4.74436e-09 -2.35434e-09 2.90554 0.965183 0.102902 -2.44012e-09 4.74436e-09 -2.35434e-09 10.2786 0.731801 0.0259123 -2.44014e-09 4.74432e-09 -2.35434e-09 2.22167 -0.733487 -0.20892 -5.5861e-13 5.87325e-14 2.10748e-13 -6.75507 -13.2228 14.3272 10.8151 -4.6521 -19.3386 0.719724 23.3595 -3.48005 -5.95664e-09 7.01518e-09 -2.02486e-09 -1.03179e-08 1.21008e-08 -3.36736e-09 -5.95665e-09 7.01519e-09 -2.02485e-09 -7.73091 5.47488 -0.417314 -5.95664e-09 7.01518e-09 -2.02486e-09 -2.90554 0.965183 -0.102902 -5.95665e-09 7.01518e-09 -2.02487e-09 -10.2786 0.731801 -0.0259123 -5.95664e-09 7.01518e-09 -2.02487e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.7193 -6.28236 7.67351 0.0622463 17.6098 1.07998 -24.8263 -40.7335 -33.3534 2.03217e-16 0.0 3.88251e-19 11.8154 -46.0094 22.7882 0.174498 34.8778 -1.08564 20.2768 -29.2739 33.2823
--32.6994 83.0109 108.334 190.96 -26.4468 560.248 6.93713 -17.4365 14.1563 1.62046 -9.42938 3.0067 -2.4518 2.42351 -2.07536 11.4523 0.205113 -4.871 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.04309e-13 4.94179e-13 1.65439e-13 173.898 -58.9866 158.6 -5.9203 -2.00834 10.3433 -157.22 56.9377 167.532 -2.4832e-09 5.16443e-09 -3.41889e-09 -4.45607e-09 9.24133e-09 -5.4628e-09 -2.4832e-09 5.16448e-09 -3.41892e-09 7.73091 5.47488 0.417314 -2.4832e-09 5.16448e-09 -3.41889e-09 2.90554 0.965183 0.102902 -2.48319e-09 5.16448e-09 -3.41889e-09 10.2786 0.731801 0.0259123 -2.4832e-09 5.16443e-09 -3.41889e-09 2.22167 -0.733487 -0.20892 -8.04309e-13 4.94178e-13 1.65289e-13 -4.85729 -13.6923 14.9542 10.6594 -4.55182 -19.044 0.781912 24.2766 -3.63427 -7.96275e-09 1.06559e-08 -3.02251e-09 -1.3799e-08 1.8402e-08 -5.05221e-09 -7.96276e-09 1.06559e-08 -3.02249e-09 -7.73091 5.47488 -0.417314 -7.96275e-09 1.06559e-08 -3.0225e-09 -2.90554 0.965183 -0.102902 -7.96275e-09 1.06559e-08 -3.02251e-09 -10.2786 0.731801 -0.0259123 -7.96275e-09 1.06559e-08 -3.02252e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -5.00016 -5.19172 7.8664 0.0719021 16.7718 1.09532 -25.9637 -39.4548 -35.375 2.03217e-16 0.0 3.88251e-19 12.421 -46.0838 23.2155 0.170217 34.8402 -1.11383 20.8595 -29.907 33.6715
--32.5089 83.0598 108.333 191.178 -25.5305 560.321 6.74751 -17.6242 14.0298 1.84521 -9.46947 2.98154 -2.35816 2.20035 -1.9754 11.5251 0.41142 -4.72601 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.83288e-13 5.01471e-13 1.79187e-13 170.992 -59.2285 157.94 -5.81163 -1.95961 10.15 -156.314 58.9977 166.465 -2.34876e-09 4.87491e-09 -3.06789e-09 -4.20765e-09 8.78406e-09 -4.87709e-09 -2.34876e-09 4.87496e-09 -3.06792e-09 7.73091 5.47488 0.417314 -2.34876e-09 4.87496e-09 -3.06789e-09 2.90554 0.965183 0.102902 -2.34875e-09 4.87496e-09 -3.06789e-09 10.2786 0.731801 0.0259123 -2.34876e-09 4.87491e-09 -3.06789e-09 2.22167 -0.733487 -0.20892 -6.83283e-13 5.0147e-13 1.79027e-13 -2.98593 -14.4012 15.4619 10.5276 -4.46756 -18.7955 0.856391 25.3354 -3.81453 -6.94047e-09 9.52981e-09 -2.14308e-09 -1.20176e-08 1.64482e-08 -3.55805e-09 -6.94048e-09 9.52981e-09 -2.14306e-09 -7.73091 5.47488 -0.417314 -6.94047e-09 9.52981e-09 -2.14308e-09 -2.90554 0.965183 -0.102902 -6.94048e-09 9.52981e-09 -2.14308e-09 -10.2786 0.731801 -0.0259123 -6.94047e-09 9.52981e-09 -2.14309e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -4.29234 -4.06921 7.98535 0.0785075 15.9408 1.10165 -26.704 -38.3438 -36.8808 2.03217e-16 0.0 3.88251e-19 13.0157 -46.1803 23.7101 0.167492 34.8595 -1.13892 21.2889 -30.2927 34.0077
--32.3459 83.0824 108.395 191.226 -24.7193 560.407 6.48865 -17.776 13.855 2.11407 -9.50999 2.95378 -2.30047 1.93773 -1.92351 11.626 0.678208 -4.67623 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.43705e-13 2.84924e-13 2.30864e-13 168.221 -59.1945 157.349 -5.74553 -1.9306 10.0321 -155.282 61.0126 165.277 -2.10016e-09 4.23252e-09 -1.91241e-09 -3.68482e-09 7.5794e-09 -2.9557e-09 -2.10017e-09 4.23255e-09 -1.91244e-09 7.73091 5.47488 0.417314 -2.10016e-09 4.23255e-09 -1.91242e-09 2.90554 0.965183 0.102902 -2.10015e-09 4.23255e-09 -1.91242e-09 10.2786 0.731801 0.0259123 -2.10016e-09 4.23252e-09 -1.91242e-09 2.22167 -0.733487 -0.20892 -3.43709e-13 2.84923e-13 2.30687e-13 -1.12179 -15.2708 15.9051 10.4189 -4.39933 -18.5902 0.942836 26.4883 -4.01469 -4.0954e-09 5.64043e-09 -2.29777e-11 -7.06692e-09 9.70705e-09 4.04985e-11 -4.0954e-09 5.64043e-09 -2.29543e-11 -7.73091 5.47488 -0.417314 -4.09539e-09 5.64043e-09 -2.29748e-11 -2.90554 0.965183 -0.102902 -4.0954e-09 5.64043e-09 -2.29786e-11 -10.2786 0.731801 -0.0259123 -4.09539e-09 5.64043e-09 -2.29876e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -3.57983 -2.91305 8.08133 0.0830259 15.1012 1.10302 -27.2546 -37.3137 -38.1539 2.03217e-16 0.0 3.88251e-19 13.6117 -46.2939 24.2354 0.166239 34.9394 -1.16319 21.6177 -30.5245 34.304
--32.2212 83.0877 108.525 191.205 -24.1188 560.549 6.21342 -17.8999 13.6489 2.36329 -9.57533 2.91815 -2.27325 1.67744 -1.88807 11.729 0.949385 -4.65144 -0.0 0.0 0.0 -0.0 0.0 0.0 3.11655e-14 2.20778e-14 2.87211e-13 165.363 -59.2944 156.682 -5.69064 -1.90714 9.93368 -153.981 63.2124 163.805 -1.8666e-09 3.49296e-09 -6.27626e-10 -3.17241e-09 6.17152e-09 -8.20755e-10 -1.86661e-09 3.49297e-09 -6.27649e-10 7.73091 5.47488 0.417314 -1.86661e-09 3.49297e-09 -6.27629e-10 2.90554 0.965183 0.102902 -1.8666e-09 3.49297e-09 -6.27632e-10 10.2786 0.731801 0.0259123 -1.8666e-09 3.49296e-09 -6.2763e-10 2.22167 -0.733487 -0.20892 3.11455e-14 2.20761e-14 2.87019e-13 0.705248 -16.0485 16.2821 10.3432 -4.35238 -18.4469 1.02313 27.4763 -4.19037 -9.44546e-10 1.27112e-09 2.20703e-09 -1.58695e-09 2.13646e-09 3.82309e-09 -9.44554e-10 1.27112e-09 2.20706e-09 -7.73091 5.47488 -0.417314 -9.44546e-10 1.27112e-09 2.20703e-09 -2.90554 0.965183 -0.102902 -9.44551e-10 1.27112e-09 2.20703e-09 -10.2786 0.731801 -0.0259123 -9.44539e-10 1.27112e-09 2.20702e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.88092 -1.80838 8.09517 0.0859554 14.3364 1.1004 -27.5303 -36.1913 -39.1871 2.03217e-16 0.0 3.88251e-19 14.2112 -46.4658 24.7953 0.166435 35.116 -1.18813 21.8805 -30.671 34.5641
--32.0112 83.0687 108.712 191.504 -23.775 560.695 5.97484 -18.004 13.4283 2.52903 -9.68988 2.86939 -2.27063 1.46125 -1.8375 11.8071 1.16894 -4.58134 -0.0 0.0 0.0 -0.0 0.0 0.0 2.58048e-13 -1.0953e-13 3.14974e-13 162.157 -59.9324 155.752 -5.61531 -1.87499 9.79884 -152.139 65.8178 161.761 -1.77729e-09 2.91192e-09 1.11319e-10 -2.95524e-09 5.10463e-09 4.05626e-10 -1.7773e-09 2.91192e-09 1.113e-10 7.73091 5.47488 0.417314 -1.77729e-09 2.91193e-09 1.11316e-10 2.90554 0.965183 0.102902 -1.77729e-09 2.91193e-09 1.11315e-10 10.2786 0.731801 0.0259123 -1.77729e-09 2.91193e-09 1.11316e-10 2.22167 -0.733487 -0.20892 2.58014e-13 -1.09532e-13 3.14776e-13 2.45834 -16.4832 16.5855 10.3101 -4.33196 -18.3843 1.07244 28.0409 -4.29292 9.95041e-10 -1.29473e-09 3.41617e-09 1.78252e-09 -2.30561e-09 5.86936e-09 9.95033e-10 -1.29473e-09 3.4162e-09 -7.73091 5.47488 -0.417314 9.95041e-10 -1.29473e-09 3.41617e-09 -2.90554 0.965183 -0.102902 9.95036e-10 -1.29473e-09 3.41617e-09 -10.2786 0.731801 -0.0259123 9.9505e-10 -1.29473e-09 3.41616e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -2.20951 -0.839737 7.96685 0.0878821 13.7301 1.09464 -27.4345 -34.8086 -39.9755 2.03217e-16 0.0 3.88251e-19 14.819 -46.7369 25.3962 0.168161 35.4259 -1.21531 22.1139 -30.8003 34.7936
--31.841 83.0088 108.91 191.544 -23.3967 560.853 5.77109 -18.0289 13.1302 2.57965 -9.88034 2.79153 -2.30717 1.29889 -1.75281 11.8643 1.34073 -4.42578 -0.0 0.0 0.0 -0.0 0.0 0.0 2.61279e-13 -1.55896e-14 3.22845e-13 158.31 -61.3496 154.335 -5.48918 -1.82125 9.57369 -149.184 69.0215 158.556 -2.07916e-09 2.78163e-09 1.18328e-10 -3.47198e-09 4.9222e-09 4.2981e-10 -2.07916e-09 2.78163e-09 1.18311e-10 7.73091 5.47488 0.417314 -2.07916e-09 2.78163e-09 1.18325e-10 2.90554 0.965183 0.102902 -2.07915e-09 2.78163e-09 1.18325e-10 10.2786 0.731801 0.0259123 -2.07916e-09 2.78164e-09 1.18328e-10 2.22167 -0.733487 -0.20892 2.61232e-13 -1.55923e-14 3.22654e-13 4.11046 -16.405 16.8186 10.3369 -4.34868 -18.4348 1.06919 27.9937 -4.28473 1.07034e-09 -1.05627e-09 3.21882e-09 1.90643e-09 -1.88605e-09 5.52757e-09 1.07033e-09 -1.05628e-09 3.21885e-09 -7.73091 5.47488 -0.417314 1.07034e-09 -1.05628e-09 3.21883e-09 -2.90554 0.965183 -0.102902 1.07033e-09 -1.05628e-09 3.21883e-09 -10.2786 0.731801 -0.0259123 1.07035e-09 -1.05627e-09 3.21882e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -1.5826 0.0162689 7.51741 0.0884354 13.3498 1.08488 -26.8737 -33.1085 -40.4611 2.03217e-16 0.0 3.88251e-19 15.3607 -47.0926 25.938 0.172327 35.9143 -1.24628 22.3267 -30.9427 34.9851
--31.7521 82.8427 109.087 191.258 -22.8893 561.036 5.58047 -17.99 12.7682 2.55346 -10.127 2.69217 -2.38068 1.16855 -1.65435 11.9108 1.48837 -4.22933 -0.0 0.0 0.0 -0.0 0.0 0.0 1.47537e-13 1.93555e-13 3.22705e-13 153.845 -63.2648 152.394 -5.33606 -1.75647 9.30103 -144.397 72.5796 153.485 -2.63247e-09 2.89104e-09 -2.44498e-10 -4.44984e-09 5.2012e-09 -1.51606e-10 -2.63248e-09 2.89103e-09 -2.44515e-10 7.73091 5.47488 0.417314 -2.63247e-09 2.89103e-09 -2.44501e-10 2.90554 0.965183 0.102902 -2.63247e-09 2.89103e-09 -2.445e-10 10.2786 0.731801 0.0259123 -2.63247e-09 2.89104e-09 -2.44495e-10 2.22167 -0.733487 -0.20892 1.47472e-13 1.93552e-13 3.22531e-13 5.67711 -15.9852 16.9797 10.4136 -4.39667 -18.5791 1.02819 27.5127 -4.19785 1.73249e-10 6.38021e-10 2.24611e-09 3.36382e-10 1.05834e-09 3.86847e-09 1.73244e-10 6.3802e-10 2.24614e-09 -7.73091 5.47488 -0.417314 1.73249e-10 6.38017e-10 2.24611e-09 -2.90554 0.965183 -0.102902 1.73244e-10 6.38017e-10 2.24611e-09 -10.2786 0.731801 -0.0259123 1.7326e-10 6.38021e-10 2.2461e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.973109 0.79139 6.83203 0.0874011 13.1359 1.07092 -25.9471 -31.1971 -40.7126 2.03217e-16 0.0 3.88251e-19 15.8638 -47.5195 26.4563 0.179184 36.5499 -1.2803 22.4982 -31.0587 35.1378
--31.5865 82.7291 109.283 191.304 -22.4573 561.226 5.42396 -18.0091 12.4746 2.49191 -10.3845 2.60142 -2.45998 1.06471 -1.5695 11.9295 1.58551 -4.04874 -0.0 0.0 0.0 -0.0 0.0 0.0 7.05353e-15 3.88469e-13 2.86087e-13 148.967 -65.2988 150.029 -5.20595 -1.70164 9.07012 -136.9 76.0214 145.703 -2.98642e-09 2.74094e-09 -8.30024e-10 -5.10638e-09 5.03607e-09 -1.1254e-09 -2.98643e-09 2.74094e-09 -8.3004e-10 7.73091 5.47488 0.417314 -2.98642e-09 2.74094e-09 -8.30027e-10 2.90554 0.965183 0.102902 -2.98642e-09 2.74094e-09 -8.30025e-10 10.2786 0.731801 0.0259123 -2.98643e-09 2.74094e-09 -8.30017e-10 2.22167 -0.733487 -0.20892 6.9772e-15 3.88465e-13 2.8593e-13 7.18644 -15.4837 17.0525 10.5089 -4.45653 -18.7592 0.977015 26.8888 -4.08654 -8.9583e-10 2.54763e-09 8.92305e-10 -1.53744e-09 4.3807e-09 1.5554e-09 -8.95832e-10 2.54763e-09 8.92335e-10 -7.73091 5.47488 -0.417314 -8.9583e-10 2.54763e-09 8.92314e-10 -2.90554 0.965183 -0.102902 -8.95834e-10 2.54763e-09 8.92311e-10 -10.2786 0.731801 -0.0259123 -8.95818e-10 2.54763e-09 8.92299e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 -0.344208 1.41161 6.24586 0.0856872 12.9809 1.05454 -24.8319 -29.1532 -40.9074 2.03217e-16 0.0 3.88251e-19 16.4969 -48.0554 27.1688 0.187723 37.2543 -1.3154 22.6221 -31.1114 35.2674
--31.3491 82.5965 109.484 191.56 -21.9963 561.288 5.32045 -18.209 12.3808 2.43727 -10.6078 2.54953 -2.51405 0.981852 -1.52562 11.9037 1.60573 -3.94078 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.99389e-14 4.39714e-13 1.84522e-13 144.044 -67.0891 147.509 -5.14949 -1.67789 8.97015 -125.91 78.8616 134.454 -2.69021e-09 1.83217e-09 -1.49111e-09 -4.65918e-09 3.52122e-09 -2.27833e-09 -2.69021e-09 1.83217e-09 -1.49113e-09 7.73091 5.47488 0.417314 -2.69021e-09 1.83217e-09 -1.49112e-09 2.90554 0.965183 0.102902 -2.6902e-09 1.83217e-09 -1.49111e-09 10.2786 0.731801 0.0259123 -2.69021e-09 1.83217e-09 -1.4911e-09 2.22167 -0.733487 -0.20892 -7.00101e-14 4.39709e-13 1.84373e-13 8.67 -15.1596 17.0193 10.5921 -4.509 -18.9166 0.93969 26.4131 -4.00279 -1.33651e-09 3.43203e-09 -4.48286e-10 -2.32489e-09 5.93413e-09 -7.48276e-10 -1.33651e-09 3.43203e-09 -4.48258e-10 -7.73091 5.47488 -0.417314 -1.33651e-09 3.43203e-09 -4.48277e-10 -2.90554 0.965183 -0.102902 -1.33652e-09 3.43203e-09 -4.48282e-10 -10.2786 0.731801 -0.0259123 -1.3365e-09 3.43203e-09 -4.48293e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 0.323806 1.80117 6.09425 0.0841301 12.7769 1.03756 -23.6847 -27.0588 -41.2019 2.03217e-16 0.0 3.88251e-19 17.4469 -48.729 28.3072 0.196589 37.9488 -1.34936 22.6917 -31.0636 35.3898
--30.8241 82.5895 110.279 192.687 -19.823 562.929 5.31369 -18.6741 12.6339 2.39086 -10.7917 2.56746 -2.52915 0.933408 -1.5465 11.8132 1.51546 -3.95042 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.46347e-14 2.28107e-13 -5.81492e-14 139.189 -68.6497 144.928 -5.20793 -1.70253 9.07358 -110.763 80.8584 119.076 -1.10763e-09 -6.30284e-10 -2.43297e-09 -2.03855e-09 -7.3724e-10 -4.00617e-09 -1.10763e-09 -6.30285e-10 -2.43299e-09 7.73091 5.47488 0.417314 -1.10763e-09 -6.30285e-10 -2.43298e-09 2.90554 0.965183 0.102902 -1.10763e-09 -6.30287e-10 -2.43297e-09 10.2786 0.731801 0.0259123 -1.10763e-09 -6.30287e-10 -2.43296e-09 2.22167 -0.733487 -0.20892 -3.4665e-14 2.28101e-13 -5.83025e-14 10.1322 -15.1101 16.8374 10.6567 -4.55007 -19.039 0.925079 26.2161 -3.96856 -6.49867e-10 2.57128e-09 -2.03466e-09 -1.16882e-09 4.4824e-09 -3.49983e-09 -6.49866e-10 2.57129e-09 -2.03463e-09 -7.73091 5.47488 -0.417314 -6.49866e-10 2.57128e-09 -2.03465e-09 -2.90554 0.965183 -0.102902 -6.4987e-10 2.57128e-09 -2.03466e-09 -10.2786 0.731801 -0.0259123 -6.49857e-10 2.57129e-09 -2.03467e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.02782 1.78978 6.6195 0.0818759 12.5996 1.02117 -22.7202 -25.0572 -41.7523 2.03217e-16 0.0 3.88251e-19 18.9163 -49.5787 30.0978 0.2057 38.6056 -1.37978 22.7391 -30.8424 35.5951
--30.5899 82.412 110.415 192.55 -19.399 563.073 5.39037 -19.3194 13.1309 2.33425 -10.9578 2.63156 -2.52391 0.917362 -1.61203 11.672 1.33762 -4.03746 -0.0 0.0 0.0 -0.0 0.0 0.0 5.65942e-14 -1.49096e-13 -4.03887e-13 134.151 -70.1314 142.085 -5.34489 -1.76039 9.31659 -90.8924 81.8979 98.9826 1.34889e-09 -4.15955e-09 -3.65259e-09 2.05122e-09 -6.87221e-09 -6.27175e-09 1.34888e-09 -4.15955e-09 -3.65261e-09 7.73091 5.47488 0.417314 1.34889e-09 -4.15955e-09 -3.6526e-09 2.90554 0.965183 0.102902 1.34889e-09 -4.15956e-09 -3.65259e-09 10.2786 0.731801 0.0259123 1.34888e-09 -4.15956e-09 -3.65259e-09 2.22167 -0.733487 -0.20892 5.66298e-14 -1.49105e-13 -4.04052e-13 11.5581 -15.1872 16.5286 10.7187 -4.58965 -19.1565 0.918765 26.1249 -3.95292 6.4207e-10 7.56722e-10 -3.95573e-09 1.02721e-09 1.39176e-09 -6.84167e-09 6.42071e-10 7.56725e-10 -3.95571e-09 -7.73091 5.47488 -0.417314 6.42073e-10 7.56724e-10 -3.95572e-09 -2.90554 0.965183 -0.102902 6.42069e-10 7.56724e-10 -3.95572e-09 -10.2786 0.731801 -0.0259123 6.42078e-10 7.56726e-10 -3.95573e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 1.76043 1.46753 7.59116 0.0788772 12.4714 1.00415 -21.7795 -23.0739 -42.4343 2.03217e-16 0.0 3.88251e-19 20.8377 -50.5332 32.4276 0.215606 39.2688 -1.40842 22.7538 -30.4894 35.8456
--30.3574 82.207 110.563 192.455 -19.1994 563.101 5.47684 -20.015 13.6253 2.28005 -11.1016 2.69018 -2.51591 0.905023 -1.68378 11.5158 1.13059 -4.1309 -0.0 0.0 0.0 -0.0 0.0 0.0 1.36215e-13 -4.96675e-13 -7.09865e-13 129.012 -71.4016 139.066 -5.49506 -1.82393 9.58407 -69.4731 81.8036 77.3477 3.55723e-09 -7.33205e-09 -4.69051e-09 5.7315e-09 -1.23977e-08 -8.21251e-09 3.55722e-09 -7.33205e-09 -4.69053e-09 7.73091 5.47488 0.417314 3.55723e-09 -7.33205e-09 -4.69052e-09 2.90554 0.965183 0.102902 3.55723e-09 -7.33205e-09 -4.69052e-09 10.2786 0.731801 0.0259123 3.55722e-09 -7.33206e-09 -4.69051e-09 2.22167 -0.733487 -0.20892 1.36306e-13 -4.96685e-13 -7.10045e-13 12.9509 -15.2817 16.1707 10.7808 -4.62951 -19.2742 0.907286 25.9761 -3.92691 1.80822e-09 -9.85311e-10 -5.56207e-09 3.01231e-09 -1.58093e-09 -9.63814e-09 1.80822e-09 -9.85307e-10 -5.56205e-09 -7.73091 5.47488 -0.417314 1.80823e-09 -9.85305e-10 -5.56207e-09 -2.90554 0.965183 -0.102902 1.80822e-09 -9.85306e-10 -5.56207e-09 -10.2786 0.731801 -0.0259123 1.80823e-09 -9.85304e-10 -5.56207e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 2.52078 1.14848 8.63603 0.0769171 12.2059 0.984803 -20.4624 -20.8694 -43.0013 2.03217e-16 0.0 3.88251e-19 22.9738 -51.4638 35.0033 0.225855 39.9681 -1.43928 22.6695 -30.1395 35.9673
--30.0826 82.0987 110.926 192.589 -18.5024 563.7 5.48311 -20.6368 13.8645 2.24032 -11.2184 2.69151 -2.52279 0.867708 -1.7233 11.3813 0.952652 -4.15972 -0.0 0.0 0.0 -0.0 0.0 0.0 1.36693e-13 -6.19408e-13 -8.33256e-13 123.979 -72.3368 136.09 -5.59394 -1.86581 9.76082 -51.3022 80.6855 58.9673 4.39528e-09 -8.72419e-09 -5.08729e-09 7.12368e-09 -1.48279e-08 -8.96588e-09 4.39528e-09 -8.72419e-09 -5.08731e-09 7.73091 5.47488 0.417314 4.39528e-09 -8.72419e-09 -5.0873e-09 2.90554 0.965183 0.102902 4.39529e-09 -8.7242e-09 -5.08729e-09 10.2786 0.731801 0.0259123 4.39527e-09 -8.7242e-09 -5.08729e-09 2.22167 -0.733487 -0.20892 1.36794e-13 -6.19417e-13 -8.33454e-13 14.3161 -15.2843 15.8422 10.8458 -4.67143 -19.3974 0.877961 25.606 -3.86203 2.11752e-09 -1.62846e-09 -6.20428e-09 3.5356e-09 -2.67881e-09 -1.07536e-08 2.11752e-09 -1.62846e-09 -6.20427e-09 -7.73091 5.47488 -0.417314 2.11753e-09 -1.62846e-09 -6.20428e-09 -2.90554 0.965183 -0.102902 2.11752e-09 -1.62846e-09 -6.20428e-09 -10.2786 0.731801 -0.0259123 2.11752e-09 -1.62845e-09 -6.20428e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 3.28173 1.14381 9.38089 0.0774678 11.6164 0.961573 -18.3956 -18.2024 -43.2559 2.03217e-16 0.0 3.88251e-19 25.0246 -52.2784 37.4836 0.236345 40.7335 -1.47661 22.4252 -29.9254 35.7871
--29.8423 81.9834 111.247 192.577 -17.9104 564.314 5.37582 -21.1516 13.7492 2.21514 -11.3313 2.61401 -2.56004 0.81153 -1.7257 11.3055 0.824128 -4.11621 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.52721e-15 -3.75626e-13 -6.72131e-13 119.022 -72.9659 133.135 -5.60853 -1.87179 9.78713 -37.6432 78.7817 45.093 2.96602e-09 -7.39831e-09 -4.6038e-09 4.717e-09 -1.25218e-08 -8.06704e-09 2.96601e-09 -7.39831e-09 -4.60382e-09 7.73091 5.47488 0.417314 2.96602e-09 -7.39831e-09 -4.60381e-09 2.90554 0.965183 0.102902 2.96602e-09 -7.39831e-09 -4.60381e-09 10.2786 0.731801 0.0259123 2.96601e-09 -7.39832e-09 -4.6038e-09 2.22167 -0.733487 -0.20892 -9.49149e-15 -3.7563e-13 -6.72355e-13 15.6586 -15.086 15.5528 10.917 -4.71764 -19.5327 0.82369 24.894 -3.73859 9.44956e-10 -4.14806e-10 -5.41232e-09 1.5268e-09 -6.05868e-10 -9.36488e-09 9.44956e-10 -4.148e-10 -5.41231e-09 -7.73091 5.47488 -0.417314 9.44961e-10 -4.148e-10 -5.41232e-09 -2.90554 0.965183 -0.102902 9.44953e-10 -4.148e-10 -5.41232e-09 -10.2786 0.731801 -0.0259123 9.4496e-10 -4.14797e-10 -5.41233e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.03536 1.67134 9.69894 0.0814303 10.4419 0.929027 -15.2416 -14.6655 -43.3328 2.03217e-16 0.0 3.88251e-19 26.876 -52.9419 39.7721 0.246422 41.5579 -1.52586 21.9636 -29.9154 35.1768
--29.5998 81.8374 111.539 192.514 -17.5968 564.98 5.19518 -21.6279 13.4206 2.19861 -11.4345 2.48776 -2.61459 0.747199 -1.70969 11.2602 0.7123 -4.0345 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.49913e-13 1.00683e-13 -3.23944e-13 114.28 -73.3492 130.336 -5.57871 -1.85883 9.73409 -28.255 76.4097 35.4847 6.71609e-11 -4.29967e-09 -3.52395e-09 -1.50026e-10 -7.13128e-09 -6.05431e-09 6.71583e-11 -4.29967e-09 -3.52397e-09 7.73091 5.47488 0.417314 6.71598e-11 -4.29967e-09 -3.52397e-09 2.90554 0.965183 0.102902 6.71683e-11 -4.29967e-09 -3.52396e-09 10.2786 0.731801 0.0259123 6.71574e-11 -4.29967e-09 -3.52396e-09 2.22167 -0.733487 -0.20892 -2.49991e-13 1.00686e-13 -3.24202e-13 16.9769 -14.7712 15.2655 10.9921 -4.76659 -19.6754 0.756768 23.9526 -3.57833 -1.17621e-09 1.94686e-09 -3.63151e-09 -2.10139e-09 3.42506e-09 -6.2511e-09 -1.17621e-09 1.94687e-09 -3.63149e-09 -7.73091 5.47488 -0.417314 -1.17621e-09 1.94687e-09 -3.63151e-09 -2.90554 0.965183 -0.102902 -1.17622e-09 1.94687e-09 -3.63151e-09 -10.2786 0.731801 -0.0259123 -1.17621e-09 1.94687e-09 -3.63151e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 4.79036 2.51952 9.80012 0.0862914 8.85226 0.890474 -11.3079 -10.5161 -43.451 2.03217e-16 0.0 3.88251e-19 28.673 -53.5138 42.0311 0.257364 42.4305 -1.58413 21.3312 -30.0204 34.2537
--29.3634 81.66 111.753 192.403 -17.4248 565.414 4.95318 -22.0968 12.9828 2.19402 -11.4805 2.33849 -2.66121 0.652921 -1.67228 11.1851 0.595862 -3.90631 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.7186e-13 5.91255e-13 5.50533e-14 110.384 -73.442 128.312 -5.54991 -1.8465 9.68269 -22.3107 74.0174 29.3367 -2.88126e-09 -8.29073e-10 -2.17283e-09 -5.08205e-09 -1.1095e-09 -3.56977e-09 -2.88126e-09 -8.29068e-10 -2.17284e-09 7.73091 5.47488 0.417314 -2.88126e-09 -8.29068e-10 -2.17284e-09 2.90554 0.965183 0.102902 -2.88125e-09 -8.29068e-10 -2.17284e-09 10.2786 0.731801 0.0259123 -2.88126e-09 -8.29068e-10 -2.17283e-09 2.22167 -0.733487 -0.20892 -4.72056e-13 5.91265e-13 5.47671e-14 18.2668 -14.5206 14.9879 11.0651 -4.81435 -19.8145 0.692263 22.9686 -3.41413 -3.23967e-09 4.2828e-09 -1.58542e-09 -5.62534e-09 7.40758e-09 -2.68005e-09 -3.23967e-09 4.28281e-09 -1.58541e-09 -7.73091 5.47488 -0.417314 -3.23967e-09 4.2828e-09 -1.58542e-09 -2.90554 0.965183 -0.102902 -3.23968e-09 4.2828e-09 -1.58542e-09 -10.2786 0.731801 -0.0259123 -3.23967e-09 4.28281e-09 -1.58543e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 5.53298 3.35384 9.8147 0.0896719 7.3075 0.856845 -7.2476 -6.43913 -43.4666 2.03217e-16 0.0 3.88251e-19 30.4747 -54.0722 44.2868 0.271912 43.3747 -1.64316 20.6257 -30.1376 33.2138
--29.0617 81.3923 111.986 192.454 -17.3398 565.575 4.66465 -22.5897 12.5407 2.20535 -11.4217 2.19204 -2.67455 0.5069 -1.61046 11.0203 0.45349 -3.72339 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.62764e-13 8.77826e-13 3.08613e-13 107.942 -73.2151 127.66 -5.56763 -1.85442 9.71391 -18.7928 72.0162 25.6553 -4.45922e-09 1.61267e-09 -8.75495e-10 -7.68375e-09 3.09031e-09 -1.25551e-09 -4.45922e-09 1.61267e-09 -8.75505e-10 7.73091 5.47488 0.417314 -4.45922e-09 1.61267e-09 -8.75508e-10 2.90554 0.965183 0.102902 -4.45921e-09 1.61268e-09 -8.75503e-10 10.2786 0.731801 0.0259123 -4.45922e-09 1.61268e-09 -8.75495e-10 2.22167 -0.733487 -0.20892 -5.6304e-13 8.7784e-13 3.08315e-13 19.5203 -14.5154 14.7257 11.1301 -4.85708 -19.9387 0.640848 22.1291 -3.2763 -4.2391e-09 5.41927e-09 2.34725e-12 -7.32146e-09 9.33527e-09 8.04927e-11 -4.23911e-09 5.41927e-09 2.36633e-12 -7.73091 5.47488 -0.417314 -4.2391e-09 5.41927e-09 2.35361e-12 -2.90554 0.965183 -0.102902 -4.23912e-09 5.41927e-09 2.35123e-12 -10.2786 0.731801 -0.0259123 -4.2391e-09 5.41927e-09 2.34089e-12 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.24463 3.83893 9.86999 0.0913309 6.26767 0.838042 -3.77527 -3.03323 -43.069 2.03217e-16 0.0 3.88251e-19 32.3621 -54.6903 46.5866 0.292204 44.4142 -1.69436 19.95 -30.1696 32.258
--28.7849 81.1025 112.376 192.3 -16.9933 566.203 4.33877 -23.1587 12.1235 2.24706 -11.1994 2.05436 -2.63758 0.287278 -1.5214 10.7229 0.280874 -3.47781 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.48713e-13 8.51878e-13 3.80279e-13 107.396 -72.5592 128.787 -5.65896 -1.89436 9.87612 -16.9065 70.6751 23.6622 -3.91537e-09 2.56715e-09 3.95118e-10 -6.67268e-09 4.64982e-09 8.9164e-10 -3.91537e-09 2.56716e-09 3.95111e-10 7.73091 5.47488 0.417314 -3.91537e-09 2.56716e-09 3.95107e-10 2.90554 0.965183 0.102902 -3.91536e-09 2.56716e-09 3.95112e-10 10.2786 0.731801 0.0259123 -3.91537e-09 2.56716e-09 3.95121e-10 2.22167 -0.733487 -0.20892 -4.49015e-13 8.51891e-13 3.79994e-13 20.729 -14.8647 14.4892 11.1796 -4.88958 -20.0333 0.601906 21.4761 -3.16995 -3.61212e-09 4.62426e-09 1.07557e-09 -6.22039e-09 7.94974e-09 1.9236e-09 -3.61212e-09 4.62425e-09 1.07558e-09 -7.73091 5.47488 -0.417314 -3.61212e-09 4.62426e-09 1.07557e-09 -2.90554 0.965183 -0.102902 -3.61213e-09 4.62426e-09 1.07557e-09 -10.2786 0.731801 -0.0259123 -3.61212e-09 4.62426e-09 1.07556e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 6.92714 3.81444 10.0077 0.092351 5.941 0.837596 -0.99424 -0.19372 -41.8062 2.03217e-16 0.0 3.88251e-19 34.3962 -55.4104 48.9377 0.318998 45.5711 -1.73285 19.3131 -30.1266 31.3898
--28.5126 80.7396 112.693 192.118 -16.7155 566.628 3.96266 -23.7724 11.6737 2.31409 -10.8543 1.91233 -2.56646 0.0110088 -1.4074 10.3351 0.0888574 -3.17591 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.0439e-13 6.46592e-13 3.58312e-13 108.139 -71.517 131.097 -5.79427 -1.9536 10.1172 -15.8666 69.8541 22.5577 -2.13128e-09 2.80976e-09 1.77447e-09 -3.54092e-09 4.93212e-09 3.15601e-09 -2.13128e-09 2.80976e-09 1.77446e-09 7.73091 5.47488 0.417314 -2.13128e-09 2.80976e-09 1.77446e-09 2.90554 0.965183 0.102902 -2.13128e-09 2.80977e-09 1.77446e-09 10.2786 0.731801 0.0259123 -2.13128e-09 2.80977e-09 1.77447e-09 2.22167 -0.733487 -0.20892 -2.04688e-13 6.46601e-13 3.58058e-13 21.8942 -15.4529 14.2721 11.2187 -4.91537 -20.1081 0.568722 20.9125 -3.07862 -1.99343e-09 2.66343e-09 1.97457e-09 -3.41131e-09 4.5622e-09 3.44837e-09 -1.99344e-09 2.66341e-09 1.97459e-09 -7.73091 5.47488 -0.417314 -1.99343e-09 2.66344e-09 1.97458e-09 -2.90554 0.965183 -0.102902 -1.99344e-09 2.66344e-09 1.97457e-09 -10.2786 0.731801 -0.0259123 -1.99343e-09 2.66344e-09 1.97456e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 7.5917 3.48346 10.1562 0.0935559 6.05366 0.849403 1.29718 2.466 -39.8715 2.03217e-16 0.0 3.88251e-19 36.5493 -56.1841 51.3506 0.350656 46.8277 -1.76413 18.6693 -30.0476 30.5206
--28.221 80.3159 113.004 191.975 -16.5693 567.0 3.52143 -24.3371 11.1676 2.38089 -10.4876 1.76313 -2.48563 -0.285491 -1.27318 9.92446 -0.121164 -2.8308 -0.0 0.0 0.0 -0.0 0.0 0.0 5.99151e-14 4.06245e-13 3.03545e-13 109.234 -70.2912 133.703 -5.93419 -2.01501 10.3675 -15.191 69.2939 21.8385 -1.36305e-10 2.79036e-09 3.10003e-09 -5.48892e-11 4.75611e-09 5.31719e-09 -1.36306e-10 2.79036e-09 3.10003e-09 7.73091 5.47488 0.417314 -1.36307e-10 2.79036e-09 3.10003e-09 2.90554 0.965183 0.102902 -1.36301e-10 2.79037e-09 3.10004e-09 10.2786 0.731801 0.0259123 -1.36303e-10 2.79037e-09 3.10005e-09 2.22167 -0.733487 -0.20892 5.96333e-14 4.06249e-13 3.03324e-13 23.0216 -16.1248 14.055 11.2611 -4.94357 -20.189 0.540162 20.4173 -2.99881 -1.72388e-10 6.09563e-10 2.57064e-09 -2.58346e-10 1.02061e-09 4.44607e-09 -1.7239e-10 6.09524e-10 2.57065e-09 -7.73091 5.47488 -0.417314 -1.72387e-10 6.09567e-10 2.57065e-09 -2.90554 0.965183 -0.102902 -1.72398e-10 6.09567e-10 2.57064e-09 -10.2786 0.731801 -0.0259123 -1.72388e-10 6.09569e-10 2.57063e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.22834 3.05486 10.2722 0.0950163 6.3425 0.868591 2.90963 4.70748 -37.7888 2.03217e-16 0.0 3.88251e-19 38.7774 -56.9415 53.8832 0.385607 48.1473 -1.79513 18.0451 -29.885 29.718
--27.9016 79.8481 113.404 191.973 -16.4499 567.55 3.00301 -24.7579 10.5821 2.42093 -10.2008 1.60367 -2.4199 -0.565792 -1.12345 9.55854 -0.347771 -2.45562 -0.0 0.0 0.0 -0.0 0.0 0.0 2.33914e-13 2.75117e-13 2.76808e-13 110.013 -69.1171 135.995 -6.03993 -2.06157 10.5572 -14.5524 68.7231 21.1554 1.04021e-09 2.95882e-09 4.20931e-09 2.01902e-09 4.94071e-09 7.15479e-09 1.04021e-09 2.95882e-09 4.20931e-09 7.73091 5.47488 0.417314 1.04021e-09 2.95882e-09 4.20931e-09 2.90554 0.965183 0.102902 1.04021e-09 2.95882e-09 4.20932e-09 10.2786 0.731801 0.0259123 1.04021e-09 2.95883e-09 4.20933e-09 2.22167 -0.733487 -0.20892 2.33643e-13 2.75117e-13 2.76609e-13 24.1187 -16.7244 13.817 11.3203 -4.98328 -20.3019 0.515452 19.9694 -2.92723 1.06167e-09 -4.64588e-10 2.73505e-09 1.87437e-09 -8.27052e-10 4.70796e-09 1.06167e-09 -4.64633e-10 2.73506e-09 -7.73091 5.47488 -0.417314 1.06167e-09 -4.64584e-10 2.73505e-09 -2.90554 0.965183 -0.102902 1.06167e-09 -4.64584e-10 2.73505e-09 -10.2786 0.731801 -0.0259123 1.06167e-09 -4.64583e-10 2.73504e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 8.82401 2.73698 10.3114 0.0969765 6.54441 0.890258 3.78607 6.18344 -36.0653 2.03217e-16 0.0 3.88251e-19 41.0199 -57.6076 56.5736 0.42308 49.4933 -1.83328 17.4681 -29.593 29.0506
--27.6543 79.3421 113.855 191.748 -16.1476 568.086 2.37614 -24.9863 9.88673 2.43291 -10.0209 1.43089 -2.36064 -0.847474 -0.956017 9.22814 -0.538427 -2.05597 -0.0 0.0 0.0 -0.0 0.0 0.0 2.8097e-13 3.18105e-13 3.04563e-13 110.465 -68.0244 137.973 -6.09655 -2.08668 10.6589 -13.9256 68.1146 20.4811 9.75744e-10 3.5597e-09 5.22079e-09 1.96462e-09 5.91517e-09 8.89699e-09 9.75745e-10 3.5597e-09 5.22078e-09 7.73091 5.47488 0.417314 9.75741e-10 3.5597e-09 5.22079e-09 2.90554 0.965183 0.102902 9.75745e-10 3.5597e-09 5.2208e-09 10.2786 0.731801 0.0259123 9.75743e-10 3.5597e-09 5.22081e-09 2.22167 -0.733487 -0.20892 2.807e-13 3.18104e-13 3.0437e-13 25.1818 -17.1169 13.5518 11.4137 -5.04629 -20.48 0.491609 19.5214 -2.85614 1.50463e-09 2.38106e-11 2.25227e-09 2.63092e-09 2.79919e-11 3.86488e-09 1.50463e-09 2.37724e-11 2.25228e-09 -7.73091 5.47488 -0.417314 1.50464e-09 2.38153e-11 2.25227e-09 -2.90554 0.965183 -0.102902 1.50463e-09 2.38151e-11 2.25227e-09 -10.2786 0.731801 -0.0259123 1.50464e-09 2.38156e-11 2.25226e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.35426 2.59094 10.2517 0.099674 6.61915 0.91415 3.99798 6.7721 -34.6518 2.03217e-16 0.0 3.88251e-19 43.2569 -58.1247 59.4843 0.464617 50.8747 -1.88132 16.919 -29.0988 28.5358
--27.4227 78.7392 114.129 191.129 -16.2068 568.223 1.66253 -25.0776 9.10355 2.42848 -9.89378 1.24703 -2.29912 -1.14087 -0.76949 8.90657 -0.711237 -1.62412 -0.0 0.0 0.0 -0.0 0.0 0.0 2.62313e-13 4.49452e-13 3.50954e-13 110.891 -66.8935 139.91 -6.12657 -2.10017 10.7127 -13.424 67.6014 19.9396 2.68625e-10 4.31153e-09 6.1672e-09 8.05714e-10 7.17245e-09 1.05657e-08 2.68631e-10 4.31154e-09 6.16718e-09 7.73091 5.47488 0.417314 2.68623e-10 4.31153e-09 6.1672e-09 2.90554 0.965183 0.102902 2.68626e-10 4.31154e-09 6.1672e-09 10.2786 0.731801 0.0259123 2.68623e-10 4.31154e-09 6.16721e-09 2.22167 -0.733487 -0.20892 2.62043e-13 4.4945e-13 3.50759e-13 26.2102 -17.416 13.2703 11.529 -5.12442 -20.7009 0.469467 19.0985 -2.78932 1.57535e-09 1.4037e-09 1.25136e-09 2.73622e-09 2.42816e-09 2.13266e-09 1.57535e-09 1.40367e-09 1.25136e-09 -7.73091 5.47488 -0.417314 1.57535e-09 1.4037e-09 1.25136e-09 -2.90554 0.965183 -0.102902 1.57535e-09 1.4037e-09 1.25135e-09 -10.2786 0.731801 -0.0259123 1.57536e-09 1.4037e-09 1.25135e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 9.83186 2.50357 10.1198 0.102863 6.69706 0.942544 3.66422 6.57295 -33.2876 2.03217e-16 0.0 3.88251e-19 45.5061 -58.5263 62.5582 0.511426 52.3047 -1.9364 16.3947 -28.4502 28.1423
--27.1513 78.1277 114.414 190.811 -16.1933 568.341 0.931133 -25.0932 8.28826 2.39982 -9.79921 1.0568 -2.26076 -1.39864 -0.569789 8.63739 -0.970798 -1.15318 -0.0 0.0 0.0 -0.0 0.0 0.0 2.14451e-13 5.87459e-13 3.83331e-13 111.287 -65.7609 141.812 -6.14757 -2.10978 10.7501 -12.9989 67.1463 19.4792 -5.79222e-10 4.87516e-09 6.75739e-09 -6.14156e-10 8.12698e-09 1.1631e-08 -5.79212e-10 4.87517e-09 6.75736e-09 7.73091 5.47488 0.417314 -5.79223e-10 4.87516e-09 6.75739e-09 2.90554 0.965183 0.102902 -5.79221e-10 4.87516e-09 6.75739e-09 10.2786 0.731801 0.0259123 -5.79226e-10 4.87517e-09 6.7574e-09 2.22167 -0.733487 -0.20892 2.14185e-13 5.87456e-13 3.83131e-13 27.2132 -17.8394 12.9768 11.6358 -5.19695 -20.9065 0.45357 18.7885 -2.74053 1.41895e-09 2.867e-09 1.20455e-10 2.44741e-09 4.97188e-09 1.80037e-10 1.41895e-09 2.86699e-09 1.20463e-10 -7.73091 5.47488 -0.417314 1.41895e-09 2.867e-09 1.20452e-10 -2.90554 0.965183 -0.102902 1.41894e-09 2.867e-09 1.2045e-10 -10.2786 0.731801 -0.0259123 1.41896e-09 2.867e-09 1.20444e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.2983 2.42147 9.94517 0.106412 6.77095 0.97424 2.86443 5.53873 -32.1847 2.03217e-16 0.0 3.88251e-19 47.7583 -58.8845 65.6512 0.562759 53.7534 -1.99785 15.9427 -27.7849 27.8626
--26.8778 77.5137 114.815 190.529 -16.1446 568.658 0.247511 -25.096 7.49537 2.33934 -9.71684 0.86497 -2.27176 -1.57347 -0.362837 8.46796 -1.42176 -0.63622 -0.0 0.0 0.0 -0.0 0.0 0.0 1.73894e-13 6.50425e-13 3.69044e-13 111.66 -64.6625 143.696 -6.17708 -2.12322 10.8029 -12.6105 66.7113 19.0571 -1.06587e-09 4.91142e-09 6.70022e-09 -1.45145e-09 8.19318e-09 1.15632e-08 -1.06586e-09 4.91142e-09 6.70018e-09 7.73091 5.47488 0.417314 -1.06587e-09 4.91142e-09 6.70021e-09 2.90554 0.965183 0.102902 -1.06587e-09 4.91142e-09 6.70022e-09 10.2786 0.731801 0.0259123 -1.06588e-09 4.91142e-09 6.70022e-09 2.22167 -0.733487 -0.20892 1.73642e-13 6.5042e-13 3.68845e-13 28.1954 -18.606 12.6759 11.7043 -5.24345 -21.039 0.447982 18.6792 -2.72336 1.18055e-09 3.60564e-09 -7.52284e-10 2.02162e-09 6.25755e-09 -1.32426e-09 1.18055e-09 3.60564e-09 -7.52274e-10 -7.73091 5.47488 -0.417314 1.18055e-09 3.60564e-09 -7.52287e-10 -2.90554 0.965183 -0.102902 1.18054e-09 3.60564e-09 -7.52287e-10 -10.2786 0.731801 -0.0259123 1.18056e-09 3.60564e-09 -7.52293e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.7946 2.29119 9.75732 0.110212 6.83359 1.00804 1.64739 3.64678 -31.5744 2.03217e-16 0.0 3.88251e-19 50.0287 -59.2878 68.6508 0.617544 55.1906 -2.06468 15.6071 -27.2402 27.6841
--26.5938 76.877 115.259 190.289 -16.2496 569.078 -0.369559 -25.1355 6.74004 2.23827 -9.61314 0.671912 -2.36458 -1.65811 -0.149041 8.47364 -2.10522 -0.056154 -0.0 0.0 0.0 -0.0 0.0 0.0 1.42382e-13 6.11746e-13 2.80808e-13 112.135 -63.542 145.687 -6.21411 -2.13994 10.8693 -12.2951 66.3423 18.713 -9.91763e-10 4.10619e-09 5.62069e-09 -1.38552e-09 6.84316e-09 9.70658e-09 -9.91751e-10 4.10619e-09 5.62066e-09 7.73091 5.47488 0.417314 -9.91764e-10 4.10619e-09 5.62069e-09 2.90554 0.965183 0.102902 -9.9176e-10 4.10619e-09 5.62069e-09 10.2786 0.731801 0.0259123 -9.91768e-10 4.10619e-09 5.6207e-09 2.22167 -0.733487 -0.20892 1.42157e-13 6.11735e-13 2.80619e-13 29.1779 -19.8091 12.3627 11.7165 -5.25163 -21.0627 0.455094 18.8181 -2.7452 7.47601e-10 3.27297e-09 -1.32824e-09 1.26537e-09 5.6836e-09 -2.31103e-09 7.47598e-10 3.27297e-09 -1.32823e-09 -7.73091 5.47488 -0.417314 7.47604e-10 3.27297e-09 -1.32824e-09 -2.90554 0.965183 -0.102902 7.47596e-10 3.27297e-09 -1.32824e-09 -10.2786 0.731801 -0.0259123 7.4761e-10 3.27297e-09 -1.32825e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.3443 2.05417 9.5663 0.114484 6.89172 1.04525 -0.205726 0.594112 -31.6697 2.03217e-16 0.0 3.88251e-19 52.3711 -59.7986 71.6034 0.675397 56.6089 -2.13826 15.4249 -26.8377 27.6565
--26.3718 76.1932 115.622 189.858 -16.372 569.345 -0.954488 -25.1673 5.99346 2.10288 -9.50832 0.475378 -2.51792 -1.67599 0.0743505 8.61957 -2.96074 0.578775 -0.0 0.0 0.0 -0.0 0.0 0.0 1.03109e-13 5.16601e-13 1.4223e-13 112.656 -62.391 147.731 -6.25117 -2.15668 10.9358 -12.0462 66.0416 18.4407 -6.46489e-10 2.71492e-09 3.77321e-09 -8.98164e-10 4.51313e-09 6.51512e-09 -6.46478e-10 2.71492e-09 3.77318e-09 7.73091 5.47488 0.417314 -6.4649e-10 2.71492e-09 3.77321e-09 2.90554 0.965183 0.102902 -6.46484e-10 2.71492e-09 3.77321e-09 10.2786 0.731801 0.0259123 -6.46494e-10 2.71492e-09 3.77322e-09 2.22167 -0.733487 -0.20892 1.0292e-13 5.16582e-13 1.42057e-13 30.1414 -21.3224 12.0392 11.692 -5.23483 -21.0154 0.472344 19.1504 -2.79757 9.31232e-11 2.34368e-09 -1.79279e-09 1.28855e-10 4.07349e-09 -3.10054e-09 9.31197e-11 2.34368e-09 -1.79278e-09 -7.73091 5.47488 -0.417314 9.31255e-11 2.34368e-09 -1.7928e-09 -2.90554 0.965183 -0.102902 9.31172e-11 2.34368e-09 -1.79279e-09 -10.2786 0.731801 -0.0259123 9.31308e-11 2.34368e-09 -1.79281e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.92 1.75346 9.35585 0.1192 6.94629 1.08598 -2.74281 -3.44446 -32.4319 2.03217e-16 0.0 3.88251e-19 54.7995 -60.3654 74.5949 0.738423 58.0241 -2.22003 15.357 -26.5119 27.7636
--26.1488 75.5025 116.04 189.446 -16.315 569.674 -1.52116 -25.1143 5.24433 1.94763 -9.46265 0.276095 -2.67809 -1.62577 0.30613 8.78887 -3.94055 1.23774 -0.0 0.0 0.0 -0.0 0.0 0.0 6.47631e-14 3.90966e-13 -3.00661e-15 113.019 -61.3282 149.636 -6.29608 -2.17714 11.0164 -11.7742 65.7058 18.1428 -2.61879e-10 1.25278e-09 1.81069e-09 -3.4948e-10 2.06371e-09 3.12359e-09 -2.6187e-10 1.25278e-09 1.81067e-09 7.73091 5.47488 0.417314 -2.6188e-10 1.25278e-09 1.81068e-09 2.90554 0.965183 0.102902 -2.61872e-10 1.25278e-09 1.81069e-09 10.2786 0.731801 0.0259123 -2.61883e-10 1.25278e-09 1.8107e-09 2.22167 -0.733487 -0.20892 6.46152e-14 3.9094e-13 -3.1658e-15 31.0296 -23.0353 11.7208 11.6573 -5.21117 -20.9485 0.496579 19.6103 -2.87033 -5.09408e-10 1.24171e-09 -2.0938e-09 -9.15211e-10 2.16317e-09 -3.60831e-09 -5.09413e-10 1.24171e-09 -2.09379e-09 -7.73091 5.47488 -0.417314 -5.09407e-10 1.24171e-09 -2.09381e-09 -2.90554 0.965183 -0.102902 -5.09415e-10 1.24171e-09 -2.0938e-09 -10.2786 0.731801 -0.0259123 -5.09403e-10 1.24172e-09 -2.09382e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.4872 1.48816 9.11584 0.123936 6.98146 1.12718 -5.68488 -7.76056 -33.6787 2.03217e-16 0.0 3.88251e-19 57.2678 -60.9202 77.5716 0.808829 59.4414 -2.30864 15.3357 -26.2679 27.8939
--25.9002 74.7886 116.505 189.01 -16.3889 569.958 -2.07891 -24.8989 4.48331 1.78611 -9.53641 0.0746522 -2.79147 -1.50613 0.545088 8.86089 -4.99685 1.88999 -0.0 0.0 0.0 -0.0 0.0 0.0 3.60345e-14 2.6082e-13 -1.1122e-13 113.081 -60.4851 151.267 -6.35658 -2.205 11.1248 -11.4007 65.23 17.7327 -6.97575e-11 2.34936e-10 3.86043e-10 -9.95752e-11 3.55554e-10 6.66726e-10 -6.97504e-11 2.34936e-10 3.86024e-10 7.73091 5.47488 0.417314 -6.97582e-11 2.3494e-10 3.86037e-10 2.90554 0.965183 0.102902 -6.97493e-11 2.3494e-10 3.86044e-10 10.2786 0.731801 0.0259123 -6.97613e-11 2.34942e-10 3.86053e-10 2.22167 -0.733487 -0.20892 3.59281e-14 2.6079e-13 -1.11369e-13 31.7905 -24.8367 11.4218 11.6392 -5.19885 -20.9137 0.524352 20.1321 -2.95319 -7.86518e-10 3.91021e-10 -2.17913e-09 -1.39413e-09 6.886e-10 -3.74983e-09 -7.86523e-10 3.91019e-10 -2.17912e-09 -7.73091 5.47488 -0.417314 -7.86518e-10 3.91018e-10 -2.17913e-09 -2.90554 0.965183 -0.102902 -7.86526e-10 3.91021e-10 -2.17913e-09 -10.2786 0.731801 -0.0259123 -7.86514e-10 3.91024e-10 -2.17914e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.0128 1.35758 8.83578 0.128325 6.98138 1.16581 -8.65236 -11.7054 -35.1239 2.03217e-16 0.0 3.88251e-19 59.6963 -61.404 80.4427 0.888606 60.8661 -2.40261 15.2959 -26.1104 27.9371
--25.6386 74.0411 116.996 188.545 -16.3917 570.189 -2.60299 -24.4755 3.68882 1.59427 -9.78536 -0.139735 -2.83521 -1.30796 0.794909 8.8017 -6.1035 2.53613 -0.0 0.0 0.0 -0.0 0.0 0.0 8.49758e-15 9.86699e-14 -1.92351e-13 112.86 -59.8939 152.651 -6.42653 -2.23702 11.2507 -10.9427 64.6132 17.2269 -2.58391e-10 -1.68483e-10 -5.20169e-10 -4.69554e-10 -3.32835e-10 -8.79064e-10 -2.58385e-10 -1.68484e-10 -5.20184e-10 7.73091 5.47488 0.417314 -2.58392e-10 -1.6848e-10 -5.20176e-10 2.90554 0.965183 0.102902 -2.58383e-10 -1.6848e-10 -5.2017e-10 10.2786 0.731801 0.0259123 -2.58396e-10 -1.68478e-10 -5.20162e-10 2.22167 -0.733487 -0.20892 8.44215e-15 9.86424e-14 -1.92495e-13 32.4478 -26.771 11.1501 11.647 -5.20419 -20.9287 0.558067 20.7497 -3.05186 -5.48102e-10 -1.33602e-10 -2.03968e-09 -9.79908e-10 -2.19656e-10 -3.51293e-09 -5.48107e-10 -1.33603e-10 -2.03966e-09 -7.73091 5.47488 -0.417314 -5.48101e-10 -1.33604e-10 -2.03968e-09 -2.90554 0.965183 -0.102902 -5.4811e-10 -1.33602e-10 -2.03967e-09 -10.2786 0.731801 -0.0259123 -5.48098e-10 -1.336e-10 -2.03968e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.5309 1.41159 8.49082 0.132413 6.93464 1.20126 -11.6434 -15.2611 -36.7636 2.03217e-16 0.0 3.88251e-19 62.0777 -61.8565 83.1464 0.980566 62.3325 -2.50393 15.2274 -26.0828 27.8468
--25.3801 73.285 117.445 188.095 -16.4869 570.362 -3.08483 -23.8928 2.87775 1.37153 -10.1641 -0.364177 -2.84255 -1.03491 1.05488 8.68199 -7.28957 3.19154 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.89011e-14 -9.78657e-14 -2.62501e-13 112.495 -59.4966 153.919 -6.50444 -2.27263 11.3913 -10.4462 63.901 16.675 -6.61991e-10 -2.43153e-10 -1.19165e-09 -1.19233e-09 -4.76795e-10 -2.01024e-09 -6.61986e-10 -2.43153e-10 -1.19166e-09 7.73091 5.47488 0.417314 -6.61991e-10 -2.4315e-10 -1.19166e-09 2.90554 0.965183 0.102902 -6.61984e-10 -2.43149e-10 -1.19165e-09 10.2786 0.731801 0.0259123 -6.61996e-10 -2.43148e-10 -1.19165e-09 2.22167 -0.733487 -0.20892 -1.88971e-14 -9.78872e-14 -2.62641e-13 33.0149 -28.8735 10.8999 11.6657 -5.21699 -20.9647 0.600377 21.4809 -3.17001 2.09285e-11 -5.45506e-10 -1.70165e-09 8.03468e-12 -9.3221e-10 -2.9392e-09 2.09243e-11 -5.45506e-10 -1.70164e-09 -7.73091 5.47488 -0.417314 2.09286e-11 -5.45507e-10 -1.70165e-09 -2.90554 0.965183 -0.102902 2.09206e-11 -5.45507e-10 -1.70164e-09 -10.2786 0.731801 -0.0259123 2.09317e-11 -5.45507e-10 -1.70165e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0482 1.58989 8.09376 0.136462 6.85207 1.23507 -14.9134 -18.6618 -38.757 2.03217e-16 0.0 3.88251e-19 64.444 -62.3125 85.7424 1.08538 63.8268 -2.61525 15.163 -26.1684 27.6871
--25.1448 72.5243 117.832 187.806 -16.8656 570.381 -3.55885 -23.2153 2.09796 1.16736 -10.5811 -0.577465 -2.84382 -0.704801 1.31721 8.53551 -8.59004 3.8479 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.64144e-14 -2.65144e-13 -2.87226e-13 112.047 -59.2944 155.117 -6.60489 -2.31943 11.5722 -9.89253 63.0571 16.0559 -9.81301e-10 -1.57598e-10 -1.37189e-09 -1.74574e-09 -3.46488e-10 -2.30138e-09 -9.81297e-10 -1.57598e-10 -1.37189e-09 7.73091 5.47488 0.417314 -9.81301e-10 -1.57596e-10 -1.37189e-09 2.90554 0.965183 0.102902 -9.81294e-10 -1.57595e-10 -1.37189e-09 10.2786 0.731801 0.0259123 -9.81307e-10 -1.57594e-10 -1.37189e-09 2.22167 -0.733487 -0.20892 -2.63619e-14 -2.65157e-13 -2.87367e-13 33.429 -31.0171 10.6618 11.6858 -5.23071 -21.0032 0.646785 22.2361 -3.29361 6.31521e-10 -8.52978e-10 -1.16585e-09 1.07128e-09 -1.46488e-09 -2.02488e-09 6.31518e-10 -8.52977e-10 -1.16584e-09 -7.73091 5.47488 -0.417314 6.31521e-10 -8.52977e-10 -1.16585e-09 -2.90554 0.965183 -0.102902 6.31513e-10 -8.52979e-10 -1.16584e-09 -10.2786 0.731801 -0.0259123 6.31524e-10 -8.52982e-10 -1.16585e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.491 1.82669 7.69048 0.140428 6.75126 1.26745 -18.3019 -21.7381 -40.9297 2.03217e-16 0.0 3.88251e-19 66.7329 -62.7084 88.274 1.20062 65.2821 -2.73477 15.102 -26.281 27.5142
--24.9399 71.7334 118.241 187.376 -16.9746 570.338 -4.0659 -22.5086 1.39452 1.03327 -10.9452 -0.758029 -2.86888 -0.335473 1.57413 8.39692 -10.0399 4.49754 -0.0 0.0 0.0 -0.0 0.0 0.0 5.70491e-15 -3.39521e-13 -2.32081e-13 111.569 -59.2874 156.286 -6.74223 -2.38497 11.8186 -9.27056 62.0449 15.3562 -9.17064e-10 -8.03472e-11 -8.04359e-10 -1.60761e-09 -2.12076e-10 -1.32704e-09 -9.1706e-10 -8.03464e-11 -8.04362e-10 7.73091 5.47488 0.417314 -9.17063e-10 -8.0345e-11 -8.04369e-10 2.90554 0.965183 0.102902 -9.17057e-10 -8.0344e-11 -8.04367e-10 10.2786 0.731801 0.0259123 -9.1707e-10 -8.0344e-11 -8.04362e-10 2.22167 -0.733487 -0.20892 5.77532e-15 -3.39527e-13 -2.3223e-13 33.6281 -33.0745 10.4236 11.6976 -5.23878 -21.026 0.69124 22.9262 -3.40782 9.94624e-10 -1.0643e-09 -4.33074e-10 1.7114e-09 -1.83347e-09 -7.66155e-10 9.94622e-10 -1.0643e-09 -4.33061e-10 -7.73091 5.47488 -0.417314 9.94625e-10 -1.0643e-09 -4.33067e-10 -2.90554 0.965183 -0.102902 9.94617e-10 -1.0643e-09 -4.33064e-10 -10.2786 0.731801 -0.0259123 9.94628e-10 -1.06431e-09 -4.33064e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.7831 2.05586 7.32684 0.144221 6.64974 1.29858 -21.5757 -24.3714 -43.0583 2.03217e-16 0.0 3.88251e-19 68.8581 -62.9764 90.7568 1.32191 66.6315 -2.85867 15.0451 -26.3343 27.3846
--24.6402 70.944 118.727 187.141 -16.9908 570.427 -4.64127 -21.7627 0.768528 1.00721 -11.2437 -0.897737 -2.93782 0.0804433 1.81828 8.26599 -11.6943 5.13974 -0.0 0.0 0.0 -0.0 0.0 0.0 1.16255e-13 -2.76398e-13 -2.02772e-14 111.099 -59.4867 157.496 -6.93309 -2.47723 12.1615 -8.63392 60.9063 14.6308 -2.13115e-10 1.70064e-11 1.13379e-09 -3.0954e-10 -9.79986e-12 1.96959e-09 -2.13112e-10 1.70069e-11 1.13379e-09 7.73091 5.47488 0.417314 -2.13115e-10 1.70085e-11 1.13378e-09 2.90554 0.965183 0.102902 -2.13109e-10 1.70094e-11 1.13378e-09 10.2786 0.731801 0.0259123 -2.13121e-10 1.70087e-11 1.13379e-09 2.22167 -0.733487 -0.20892 1.16293e-13 -2.76397e-13 -2.04512e-14 33.5825 -35.1323 10.1762 11.6971 -5.23848 -21.0251 0.732598 23.5537 -3.51247 1.02694e-09 -1.16335e-09 9.01508e-10 1.7927e-09 -2.01297e-09 1.53719e-09 1.02694e-09 -1.16334e-09 9.01518e-10 -7.73091 5.47488 -0.417314 1.02694e-09 -1.16334e-09 9.01511e-10 -2.90554 0.965183 -0.102902 1.02693e-09 -1.16335e-09 9.01514e-10 -10.2786 0.731801 -0.0259123 1.02694e-09 -1.16335e-09 9.01512e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.8871 2.28507 6.99675 0.147837 6.54449 1.32879 -24.6259 -26.5864 -45.0409 2.03217e-16 0.0 3.88251e-19 70.7593 -63.1176 93.1571 1.44792 67.8728 -2.98526 15.0059 -26.3042 27.3344
--24.3975 70.2767 119.194 186.617 -16.8906 570.488 -5.25523 -20.9534 0.19912 1.05481 -11.5215 -1.00869 -3.03162 0.548353 2.05568 8.13702 -13.518 5.78414 -0.0 0.0 0.0 -0.0 0.0 0.0 2.83526e-13 -1.18928e-13 3.07281e-13 110.646 -59.8907 158.746 -7.16446 -2.58989 12.5795 -7.9953 59.6415 13.8922 9.12154e-10 1.99895e-10 4.12094e-09 1.76026e-09 3.5916e-10 7.04716e-09 9.12157e-10 1.99895e-10 4.12094e-09 7.73091 5.47488 0.417314 9.12153e-10 1.99897e-10 4.12092e-09 2.90554 0.965183 0.102902 9.1216e-10 1.99897e-10 4.12093e-09 10.2786 0.731801 0.0259123 9.12148e-10 1.99896e-10 4.12094e-09 2.22167 -0.733487 -0.20892 2.83498e-13 -1.18918e-13 3.0707e-13 33.3283 -37.2181 9.9259 11.6901 -5.23363 -21.0115 0.77341 24.1575 -3.61399 8.84704e-10 -1.1518e-09 2.70331e-09 1.58193e-09 -2.0047e-09 4.65007e-09 8.84704e-10 -1.1518e-09 2.70331e-09 -7.73091 5.47488 -0.417314 8.84705e-10 -1.1518e-09 2.7033e-09 -2.90554 0.965183 -0.102902 8.84699e-10 -1.1518e-09 2.7033e-09 -10.2786 0.731801 -0.0259123 8.84708e-10 -1.1518e-09 2.7033e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.8497 2.54118 6.6819 0.151335 6.4287 1.35788 -27.5111 -28.4754 -46.9376 2.03217e-16 0.0 3.88251e-19 72.4532 -63.1751 95.434 1.58007 69.0365 -3.11576 14.9797 -26.2371 27.3265
--24.272 69.639 119.571 185.987 -16.869 570.411 -5.85802 -20.126 -0.304462 1.12027 -11.7734 -1.09941 -3.12111 1.04748 2.29861 8.03418 -15.4096 6.43843 -0.0 0.0 0.0 -0.0 0.0 0.0 4.36505e-13 6.49071e-14 6.08495e-13 110.216 -60.4816 159.962 -7.40654 -2.70904 13.019 -7.30517 58.1491 13.0855 2.04617e-09 3.55331e-10 6.99686e-09 3.83905e-09 6.77229e-10 1.19339e-08 2.04617e-09 3.5533e-10 6.99686e-09 7.73091 5.47488 0.417314 2.04616e-09 3.55333e-10 6.99685e-09 2.90554 0.965183 0.102902 2.04617e-09 3.55333e-10 6.99686e-09 10.2786 0.731801 0.0259123 2.04616e-09 3.55331e-10 6.99687e-09 2.22167 -0.733487 -0.20892 4.36408e-13 6.49235e-14 6.08253e-13 32.9066 -39.1144 9.67929 11.6812 -5.22753 -20.9944 0.811587 24.7028 -3.70658 6.38159e-10 -1.0647e-09 4.1624e-09 1.18436e-09 -1.86395e-09 7.17328e-09 6.38159e-10 -1.0647e-09 4.16241e-09 -7.73091 5.47488 -0.417314 6.38161e-10 -1.0647e-09 4.1624e-09 -2.90554 0.965183 -0.102902 6.38154e-10 -1.0647e-09 4.1624e-09 -10.2786 0.731801 -0.0259123 6.38164e-10 -1.0647e-09 4.16239e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.7183 2.78654 6.40967 0.154664 6.31434 1.38528 -30.2007 -30.0599 -48.7346 2.03217e-16 0.0 3.88251e-19 73.9487 -63.1424 97.5693 1.71555 70.1046 -3.24812 14.9408 -26.1524 27.3084
--24.1655 69.0265 119.948 185.34 -16.8564 570.263 -6.40233 -19.3257 -0.733818 1.14758 -11.9938 -1.17847 -3.17719 1.55705 2.55935 7.97777 -17.2682 7.10844 -0.0 0.0 0.0 -0.0 0.0 0.0 5.04178e-13 2.07124e-13 7.41268e-13 109.808 -61.2444 161.062 -7.63033 -2.82102 13.4266 -6.53678 56.3257 12.1773 2.77635e-09 3.70328e-10 8.60134e-09 5.16413e-09 7.26833e-10 1.46578e-08 2.77635e-09 3.70327e-10 8.60134e-09 7.73091 5.47488 0.417314 2.77634e-09 3.70329e-10 8.60133e-09 2.90554 0.965183 0.102902 2.77635e-09 3.7033e-10 8.60134e-09 10.2786 0.731801 0.0259123 2.77634e-09 3.70327e-10 8.60135e-09 2.22167 -0.733487 -0.20892 5.04041e-13 2.07142e-13 7.4102e-13 32.3644 -40.6032 9.44207 11.6752 -5.22346 -20.9829 0.844592 25.1549 -3.78418 3.57551e-10 -9.37085e-10 4.46889e-09 7.05278e-10 -1.64605e-09 7.7076e-09 3.57552e-10 -9.3708e-10 4.46889e-09 -7.73091 5.47488 -0.417314 3.57553e-10 -9.37083e-10 4.46888e-09 -2.90554 0.965183 -0.102902 3.57547e-10 -9.37084e-10 4.46888e-09 -10.2786 0.731801 -0.0259123 3.57557e-10 -9.37085e-10 4.46887e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.5392 2.98338 6.20746 0.157751 6.21334 1.41045 -32.6688 -31.3572 -50.4206 2.03217e-16 0.0 3.88251e-19 75.2543 -63.013 99.5439 1.85054 71.059 -3.37918 14.8639 -26.0692 27.2275
--24.044 68.502 120.367 184.698 -16.5914 570.163 -6.95642 -18.507 -1.09092 1.13976 -12.2038 -1.24437 -3.20364 2.09247 2.84266 7.98733 -19.1248 7.80477 -0.0 0.0 0.0 -0.0 0.0 0.0 4.34318e-13 3.13268e-13 6.16083e-13 109.407 -62.2759 162.042 -7.83752 -2.92727 13.8039 -5.63985 53.9067 11.0948 3.02913e-09 1.34849e-10 8.39062e-09 5.58257e-09 3.03637e-10 1.42919e-08 3.02913e-09 1.34848e-10 8.39062e-09 7.73091 5.47488 0.417314 3.02913e-09 1.3485e-10 8.39062e-09 2.90554 0.965183 0.102902 3.02914e-09 1.3485e-10 8.39062e-09 10.2786 0.731801 0.0259123 3.02913e-09 1.34848e-10 8.39063e-09 2.22167 -0.733487 -0.20892 4.34183e-13 3.13279e-13 6.15871e-13 31.7128 -41.5778 9.21899 11.6797 -5.22645 -20.9915 0.868808 25.4771 -3.83991 -6.65637e-11 -7.07266e-10 2.83206e-09 -6.00589e-11 -1.23967e-09 4.89027e-09 -6.65622e-11 -7.07262e-10 2.83206e-09 -7.73091 5.47488 -0.417314 -6.65622e-11 -7.07264e-10 2.83205e-09 -2.90554 0.965183 -0.102902 -6.65688e-11 -7.07265e-10 2.83205e-09 -10.2786 0.731801 -0.0259123 -6.65575e-11 -7.07266e-10 2.83204e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.235 3.12895 6.0788 0.160606 6.1249 1.43402 -34.8798 -32.3953 -51.959 2.03217e-16 0.0 3.88251e-19 76.2328 -62.7897 101.288 1.98243 71.8973 -3.50549 14.738 -25.9968 27.0585
--23.9154 68.0232 120.787 184.203 -16.3162 570.102 -7.52362 -17.6658 -1.38099 1.12118 -12.3988 -1.29371 -3.21356 2.65771 3.14172 8.05248 -21.0122 8.52721 -0.0 0.0 0.0 -0.0 0.0 0.0 2.75897e-13 4.11705e-13 3.25932e-13 109.051 -63.5561 162.966 -8.04053 -3.03339 14.1741 -4.74551 51.0172 9.97237 3.0124e-09 -2.64212e-10 7.06162e-09 5.48432e-09 -4.27549e-10 1.20216e-08 3.01241e-09 -2.6421e-10 7.06162e-09 7.73091 5.47488 0.417314 3.0124e-09 -2.64211e-10 7.06162e-09 2.90554 0.965183 0.102902 3.01241e-09 -2.64211e-10 7.06162e-09 10.2786 0.731801 0.0259123 3.0124e-09 -2.64212e-10 7.06163e-09 2.22167 -0.733487 -0.20892 2.75786e-13 4.11704e-13 3.25786e-13 30.9383 -42.1691 9.00541 11.6898 -5.23336 -21.0112 0.885263 25.6971 -3.87801 -6.28924e-10 -3.80234e-10 -1.24563e-10 -1.0902e-09 -6.57327e-10 -2.02588e-10 -6.28922e-10 -3.80234e-10 -1.24563e-10 -7.73091 5.47488 -0.417314 -6.28923e-10 -3.80235e-10 -1.2457e-10 -2.90554 0.965183 -0.102902 -6.28931e-10 -3.80236e-10 -1.24571e-10 -10.2786 0.731801 -0.0259123 -6.28917e-10 -3.80236e-10 -1.24579e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8097 3.24082 6.01036 0.163227 6.04398 1.45604 -36.7931 -33.2022 -53.3091 2.03217e-16 0.0 3.88251e-19 76.9039 -62.4909 102.809 2.10894 72.6284 -3.62464 14.5786 -25.9232 26.8332
--23.788 67.5855 121.21 183.856 -16.1486 570.1 -7.96268 -16.9099 -1.60139 1.06779 -12.5352 -1.33215 -3.19114 3.21481 3.45133 8.14017 -22.8335 9.26057 -0.0 0.0 0.0 -0.0 0.0 0.0 1.09695e-13 4.68685e-13 2.4856e-15 108.795 -64.8961 163.825 -8.2274 -3.13228 14.5161 -4.01611 48.1454 9.00804 2.73577e-09 -6.4444e-10 5.31508e-09 4.921e-09 -1.13058e-09 9.04385e-09 2.73578e-09 -6.44438e-10 5.31508e-09 7.73091 5.47488 0.417314 2.73577e-09 -6.44441e-10 5.31509e-09 2.90554 0.965183 0.102902 2.73578e-09 -6.4444e-10 5.31509e-09 10.2786 0.731801 0.0259123 2.73577e-09 -6.44441e-10 5.3151e-09 2.22167 -0.733487 -0.20892 1.0962e-13 4.6867e-13 2.40366e-15 30.0529 -42.5156 8.79354 11.6926 -5.23526 -21.0166 0.898583 25.8769 -3.90914 -1.08723e-09 -9.1033e-11 -3.08953e-09 -1.94055e-09 -1.40123e-10 -5.31183e-09 -1.08723e-09 -9.10356e-11 -3.08953e-09 -7.73091 5.47488 -0.417314 -1.08723e-09 -9.10361e-11 -3.08953e-09 -2.90554 0.965183 -0.102902 -1.08723e-09 -9.10366e-11 -3.08953e-09 -10.2786 0.731801 -0.0259123 -1.08722e-09 -9.10358e-11 -3.08954e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.4299 3.31168 6.00417 0.165481 5.97616 1.47501 -38.383 -33.7904 -54.4585 2.03217e-16 0.0 3.88251e-19 77.5126 -62.1292 104.201 2.22569 73.2511 -3.73406 14.4 -25.8351 26.5857
--23.6483 67.2113 121.572 183.662 -15.9991 569.987 -8.13386 -16.3465 -1.74966 0.95556 -12.5694 -1.36534 -3.11959 3.72586 3.76617 8.20957 -24.4931 9.98484 -0.0 0.0 0.0 -0.0 0.0 0.0 1.64975e-14 4.50459e-13 -2.22589e-13 108.66 -66.1058 164.593 -8.38647 -3.21696 14.8085 -3.5127 45.7883 8.30613 2.20884e-09 -8.23426e-10 3.85178e-09 3.94418e-09 -1.4693e-09 6.55568e-09 2.20885e-09 -8.23423e-10 3.85178e-09 7.73091 5.47488 0.417314 2.20884e-09 -8.23427e-10 3.85179e-09 2.90554 0.965183 0.102902 2.20885e-09 -8.23426e-10 3.85179e-09 10.2786 0.731801 0.0259123 2.20884e-09 -8.23426e-10 3.85179e-09 2.22167 -0.733487 -0.20892 1.64523e-14 4.50432e-13 -2.22639e-13 29.0655 -42.756 8.57485 11.6749 -5.22321 -20.9824 0.913784 26.0786 -3.94421 -1.19917e-09 2.52965e-11 -4.75138e-09 -2.16654e-09 7.08532e-11 -8.17831e-09 -1.19917e-09 2.52922e-11 -4.75138e-09 -7.73091 5.47488 -0.417314 -1.19917e-09 2.52923e-11 -4.75139e-09 -2.90554 0.965183 -0.102902 -1.19918e-09 2.52921e-11 -4.75139e-09 -10.2786 0.731801 -0.0259123 -1.19916e-09 2.52934e-11 -4.75139e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2631 3.33425 6.06227 0.167228 5.92704 1.48944 -39.6298 -34.1681 -55.3996 2.03217e-16 0.0 3.88251e-19 78.3024 -61.7112 105.559 2.32825 73.7644 -3.83112 14.2166 -25.7199 26.3501
--23.4777 66.8871 121.891 183.832 -15.9461 569.819 -7.96735 -16.0351 -1.79116 0.755391 -12.473 -1.38968 -2.99336 4.24423 4.08873 8.2512 -26.0862 10.6992 -0.0 0.0 0.0 -0.0 0.0 0.0 3.23876e-14 2.88917e-13 -3.33306e-13 108.648 -67.1856 165.25 -8.51503 -3.28611 15.0453 -3.1837 44.0882 7.83345 1.03046e-09 -6.51049e-10 2.49428e-09 1.86023e-09 -1.17918e-09 4.2616e-09 1.03047e-09 -6.51047e-10 2.49428e-09 7.73091 5.47488 0.417314 1.03046e-09 -6.51049e-10 2.49428e-09 2.90554 0.965183 0.102902 1.03047e-09 -6.51049e-10 2.49428e-09 10.2786 0.731801 0.0259123 1.03045e-09 -6.51048e-10 2.49429e-09 2.22167 -0.733487 -0.20892 3.23763e-14 2.8888e-13 -3.33367e-13 27.9742 -42.9201 8.32865 11.6305 -5.19295 -20.8968 0.93243 26.3204 -3.98651 -7.66247e-10 -1.39052e-10 -4.56258e-09 -1.41432e-09 -2.14038e-10 -7.86035e-09 -7.66245e-10 -1.39056e-10 -4.56257e-09 -7.73091 5.47488 -0.417314 -7.66246e-10 -1.39056e-10 -4.56258e-09 -2.90554 0.965183 -0.102902 -7.66254e-10 -1.39056e-10 -4.56258e-09 -10.2786 0.731801 -0.0259123 -7.66241e-10 -1.39054e-10 -4.56258e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.3773 3.29346 6.22169 0.168501 5.89498 1.49976 -40.5548 -34.3943 -56.1256 2.03217e-16 0.0 3.88251e-19 79.4533 -61.2111 107.007 2.41645 74.183 -3.91605 14.039 -25.5814 26.1418
--23.2591 66.6643 122.183 184.202 -15.8783 569.703 -7.55391 -15.9081 -1.73994 0.487913 -12.2749 -1.40381 -2.82211 4.76885 4.42069 8.28042 -27.6239 11.4119 -0.0 0.0 0.0 -0.0 0.0 0.0 1.09434e-13 2.17632e-14 -3.93513e-13 108.716 -68.2219 165.789 -8.61981 -3.34349 15.2379 -2.94016 42.7836 7.48088 -6.69927e-10 -2.58421e-10 9.90271e-10 -1.12257e-09 -4.97786e-10 1.72811e-09 -6.69922e-10 -2.58421e-10 9.90266e-10 7.73091 5.47488 0.417314 -6.69928e-10 -2.58421e-10 9.90269e-10 2.90554 0.965183 0.102902 -6.69919e-10 -2.58421e-10 9.9027e-10 10.2786 0.731801 0.0259123 -6.69935e-10 -2.58419e-10 9.90279e-10 2.22167 -0.733487 -0.20892 1.09464e-13 2.17147e-14 -3.93612e-13 26.7796 -42.9358 8.06784 11.5672 -5.1498 -20.7752 0.951824 26.5687 -4.03013 3.76831e-11 -4.88124e-10 -3.2885e-09 5.88196e-13 -8.24432e-10 -5.67592e-09 3.76835e-11 -4.88128e-10 -3.28849e-09 -7.73091 5.47488 -0.417314 3.76845e-11 -4.88127e-10 -3.2885e-09 -2.90554 0.965183 -0.102902 3.76775e-11 -4.88126e-10 -3.2885e-09 -10.2786 0.731801 -0.0259123 3.76867e-11 -4.88125e-10 -3.28851e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6761 3.19759 6.46915 0.169318 5.87804 1.50647 -41.1338 -34.4711 -56.6211 2.03217e-16 0.0 3.88251e-19 80.7794 -60.6339 108.439 2.48709 74.5024 -3.98464 13.8577 -25.424 25.9409
--23.0179 66.5852 122.423 184.58 -15.8167 569.722 -6.99314 -15.8829 -1.66607 0.203684 -12.0173 -1.41674 -2.60876 5.18038 4.75503 8.27726 -28.8871 12.1038 -0.0 0.0 0.0 -0.0 0.0 0.0 2.02395e-13 -2.26034e-13 -3.91292e-13 108.787 -69.1534 166.167 -8.70336 -3.38978 15.3914 -2.7561 41.768 7.2123 -2.08682e-09 1.15024e-10 -7.17855e-11 -3.59972e-09 1.57832e-10 -5.48284e-11 -2.08682e-09 1.15022e-10 -7.1793e-11 7.73091 5.47488 0.417314 -2.08682e-09 1.15023e-10 -7.17924e-11 2.90554 0.965183 0.102902 -2.08681e-09 1.15024e-10 -7.17883e-11 10.2786 0.731801 0.0259123 -2.08683e-09 1.15027e-10 -7.17796e-11 2.22167 -0.733487 -0.20892 2.02453e-13 -2.26091e-13 -3.91442e-13 25.4929 -42.7895 7.83371 11.4927 -5.09918 -20.6323 0.970759 26.8075 -4.07227 8.96378e-10 -8.51322e-10 -1.5871e-09 1.51865e-09 -1.46141e-09 -2.7553e-09 8.96377e-10 -8.51324e-10 -1.58709e-09 -7.73091 5.47488 -0.417314 8.9638e-10 -8.51324e-10 -1.5871e-09 -2.90554 0.965183 -0.102902 8.96373e-10 -8.51322e-10 -1.5871e-09 -10.2786 0.731801 -0.0259123 8.96378e-10 -8.51321e-10 -1.58711e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0797 3.07438 6.73126 0.169509 5.88135 1.50828 -41.2833 -34.317 -56.8704 2.03217e-16 0.0 3.88251e-19 81.9954 -60.0386 109.636 2.53075 74.6929 -4.02721 13.6568 -25.2355 25.7284
--22.811 66.66 122.626 184.814 -15.7385 569.868 -6.38418 -15.8768 -1.6395 -0.0466534 -11.7428 -1.43747 -2.35325 5.35975 5.08419 8.20811 -29.6586 12.7453 -0.0 0.0 0.0 -0.0 0.0 0.0 2.6603e-13 -3.29506e-13 -3.14726e-13 108.771 -69.9185 166.335 -8.76816 -3.42567 15.5109 -2.61577 40.934 7.00099 -2.41472e-09 2.2985e-10 -1.03428e-10 -4.16673e-09 3.70633e-10 -9.72391e-11 -2.41472e-09 2.29847e-10 -1.03438e-10 7.73091 5.47488 0.417314 -2.41472e-09 2.29849e-10 -1.03438e-10 2.90554 0.965183 0.102902 -2.41472e-09 2.2985e-10 -1.03433e-10 10.2786 0.731801 0.0259123 -2.41473e-09 2.29854e-10 -1.03425e-10 2.22167 -0.733487 -0.20892 2.66085e-13 -3.29564e-13 -3.14925e-13 24.1245 -42.4681 7.66734 11.4146 -5.04656 -20.4826 0.987928 27.0207 -4.11009 1.49359e-09 -1.05805e-09 -1.16329e-10 2.58034e-09 -1.82606e-09 -2.28781e-10 1.49359e-09 -1.05805e-09 -1.16316e-10 -7.73091 5.47488 -0.417314 1.4936e-09 -1.05805e-09 -1.16329e-10 -2.90554 0.965183 -0.102902 1.49359e-09 -1.05805e-09 -1.1633e-10 -10.2786 0.731801 -0.0259123 1.49359e-09 -1.05804e-09 -1.16338e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.5074 2.95152 6.93465 0.168916 5.91003 1.50385 -40.9249 -33.8472 -56.8644 2.03217e-16 0.0 3.88251e-19 82.8444 -59.4931 110.407 2.53833 74.7246 -4.03434 13.4212 -25.0035 25.4857
--22.6528 66.808 122.641 185.119 -15.8714 569.63 -5.66796 -15.9323 -1.67422 -0.249527 -11.4034 -1.46802 -2.03004 5.20244 5.41628 8.02816 -29.8248 13.3228 -0.0 0.0 0.0 -0.0 0.0 0.0 3.06758e-13 -1.91457e-13 -1.04904e-13 108.548 -70.6879 166.177 -8.83133 -3.46025 15.6282 -2.49321 40.1355 6.80849 -8.54204e-10 -1.13867e-10 1.86978e-09 -1.41387e-09 -2.02213e-10 3.25442e-09 -8.54201e-10 -1.1387e-10 1.86976e-09 7.73091 5.47488 0.417314 -8.54205e-10 -1.13868e-10 1.86977e-09 2.90554 0.965183 0.102902 -8.54197e-10 -1.13868e-10 1.86977e-09 10.2786 0.731801 0.0259123 -8.54212e-10 -1.13864e-10 1.86978e-09 2.22167 -0.733487 -0.20892 3.06755e-13 -1.91504e-13 -1.05158e-13 22.6459 -41.8672 7.61669 11.3401 -4.99638 -20.3401 1.00082 27.1781 -4.13814 1.85314e-09 -1.09358e-09 1.13604e-09 3.22687e-09 -1.892e-09 1.92303e-09 1.85313e-09 -1.09358e-09 1.13605e-09 -7.73091 5.47488 -0.417314 1.85314e-09 -1.09358e-09 1.13604e-09 -2.90554 0.965183 -0.102902 1.85313e-09 -1.09358e-09 1.13603e-09 -10.2786 0.731801 -0.0259123 1.85313e-09 -1.09358e-09 1.13603e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.9938 2.80133 7.0916 0.167182 5.97926 1.49017 -39.8351 -32.8713 -56.5393 2.03217e-16 0.0 3.88251e-19 83.3354 -58.954 110.765 2.49968 74.5554 -3.99631 13.1038 -24.6624 25.1747
--22.4671 67.021 122.688 185.717 -15.9564 569.571 -4.82022 -16.0719 -1.73451 -0.431673 -10.9963 -1.50371 -1.6404 4.79683 5.75136 7.73524 -29.5256 13.8345 -0.0 0.0 0.0 -0.0 0.0 0.0 3.42547e-13 1.00172e-13 2.1324e-13 108.136 -71.4313 165.697 -8.88621 -3.49026 15.7304 -2.39461 39.4698 6.65133 1.97026e-09 -7.4307e-10 5.26148e-09 3.56473e-09 -1.26108e-09 9.00898e-09 1.97026e-09 -7.43072e-10 5.26147e-09 7.73091 5.47488 0.417314 1.97026e-09 -7.43072e-10 5.26147e-09 2.90554 0.965183 0.102902 1.97027e-09 -7.43072e-10 5.26147e-09 10.2786 0.731801 0.0259123 1.97026e-09 -7.43069e-10 5.26147e-09 2.22167 -0.733487 -0.20892 3.42447e-13 1.00144e-13 2.1292e-13 21.0603 -41.0279 7.64771 11.2632 -4.94471 -20.1936 1.01064 27.2969 -4.15939 2.10762e-09 -1.03865e-09 2.45835e-09 3.69317e-09 -1.80088e-09 4.19603e-09 2.10762e-09 -1.03865e-09 2.45836e-09 -7.73091 5.47488 -0.417314 2.10762e-09 -1.03865e-09 2.45834e-09 -2.90554 0.965183 -0.102902 2.10761e-09 -1.03865e-09 2.45834e-09 -10.2786 0.731801 -0.0259123 2.10762e-09 -1.03864e-09 2.45833e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.5633 2.62079 7.23065 0.164559 6.08171 1.46882 -38.1523 -31.4874 -55.9735 2.03217e-16 0.0 3.88251e-19 83.6128 -58.4162 110.826 2.42373 74.2125 -3.92205 12.7306 -24.2381 24.8185
--22.3482 67.2819 122.735 186.263 -16.1419 569.483 -3.99226 -16.1832 -1.81575 -0.603019 -10.6312 -1.5434 -1.22552 4.31319 6.06976 7.35875 -28.9249 14.2679 -0.0 0.0 0.0 -0.0 0.0 0.0 3.45476e-13 3.92648e-13 5.25858e-13 107.702 -71.7858 165.07 -8.89978 -3.49783 15.7556 -2.35281 39.1945 6.58584 4.7283e-09 -1.33772e-09 8.31896e-09 8.4178e-09 -2.25931e-09 1.41893e-08 4.72831e-09 -1.33772e-09 8.31895e-09 7.73091 5.47488 0.417314 4.7283e-09 -1.33772e-09 8.31896e-09 2.90554 0.965183 0.102902 4.72831e-09 -1.33772e-09 8.31895e-09 10.2786 0.731801 0.0259123 4.7283e-09 -1.33772e-09 8.31896e-09 2.22167 -0.733487 -0.20892 3.45282e-13 3.9264e-13 5.25484e-13 19.427 -40.1552 7.67869 11.1725 -4.88442 -20.0203 1.02173 27.4324 -4.18357 2.10402e-09 -8.65823e-10 3.60682e-09 3.71035e-09 -1.5058e-09 6.17465e-09 2.10403e-09 -8.65822e-10 3.60683e-09 -7.73091 5.47488 -0.417314 2.10403e-09 -8.65822e-10 3.60682e-09 -2.90554 0.965183 -0.102902 2.10402e-09 -8.65821e-10 3.60682e-09 -10.2786 0.731801 -0.0259123 2.10402e-09 -8.6582e-10 3.60681e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.1183 2.47437 7.30288 0.161764 6.18873 1.44542 -36.3285 -30.0414 -55.3457 2.03217e-16 0.0 3.88251e-19 83.6409 -58.0063 110.573 2.33063 73.7703 -3.8308 12.3921 -23.8567 24.4886
--22.2028 67.5179 122.738 186.978 -16.6283 569.147 -3.33472 -16.1539 -1.91312 -0.773833 -10.4182 -1.58594 -0.831157 3.92136 6.35173 6.93725 -28.1852 14.6152 -0.0 0.0 0.0 -0.0 0.0 0.0 2.87627e-13 5.33237e-13 7.19104e-13 107.49 -71.3908 164.543 -8.83893 -3.46508 15.6415 -2.40117 39.5675 6.66889 6.08956e-09 -1.57778e-09 9.28952e-09 1.07941e-08 -2.65027e-09 1.58184e-08 6.08957e-09 -1.57778e-09 9.28951e-09 7.73091 5.47488 0.417314 6.08956e-09 -1.57778e-09 9.28952e-09 2.90554 0.965183 0.102902 6.08957e-09 -1.57778e-09 9.28951e-09 10.2786 0.731801 0.0259123 6.08956e-09 -1.57778e-09 9.28951e-09 2.22167 -0.733487 -0.20892 2.87377e-13 5.33241e-13 7.18706e-13 17.8114 -39.4531 7.63046 11.056 -4.80828 -19.7974 1.03866 27.6395 -4.22058 1.68933e-09 -5.4768e-10 4.33768e-09 3.00952e-09 -9.59853e-10 7.44333e-09 1.68933e-09 -5.47678e-10 4.33769e-09 -7.73091 5.47488 -0.417314 1.68933e-09 -5.47679e-10 4.33768e-09 -2.90554 0.965183 -0.102902 1.68932e-09 -5.47678e-10 4.33768e-09 -10.2786 0.731801 -0.0259123 1.68933e-09 -5.47678e-10 4.33767e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.5606 2.42645 7.25932 0.15944 6.27168 1.4256 -34.7829 -28.8836 -54.7719 2.03217e-16 0.0 3.88251e-19 83.3773 -57.847 109.981 2.23799 73.303 -3.73928 12.1739 -23.6464 24.2526
--22.1316 67.7812 122.686 187.432 -16.9034 568.676 -2.86681 -15.922 -2.04759 -0.967943 -10.4272 -1.64077 -0.463333 3.71113 6.58869 6.47562 -27.3129 14.8654 -0.0 0.0 0.0 -0.0 0.0 0.0 9.46997e-14 4.36769e-13 7.5509e-13 107.557 -69.9408 164.122 -8.67423 -3.37535 15.3356 -2.59727 40.8962 6.98317 5.3172e-09 -1.25448e-09 6.74728e-09 9.37465e-09 -2.06758e-09 1.14631e-08 5.3172e-09 -1.25448e-09 6.74727e-09 7.73091 5.47488 0.417314 5.3172e-09 -1.25448e-09 6.74729e-09 2.90554 0.965183 0.102902 5.31721e-09 -1.25448e-09 6.74728e-09 10.2786 0.731801 0.0259123 5.3172e-09 -1.25448e-09 6.74728e-09 2.22167 -0.733487 -0.20892 9.44583e-14 4.36775e-13 7.54719e-13 16.2013 -38.8451 7.46604 10.9083 -4.7123 -19.5156 1.05928 27.8788 -4.26394 3.27071e-10 1.75581e-10 4.57793e-09 6.63701e-10 2.83852e-10 7.88953e-09 3.27072e-10 1.75584e-10 4.57794e-09 -7.73091 5.47488 -0.417314 3.27074e-10 1.75583e-10 4.57793e-09 -2.90554 0.965183 -0.102902 3.27064e-10 1.75583e-10 4.57794e-09 -10.2786 0.731801 -0.0259123 3.27071e-10 1.75583e-10 4.57793e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.8565 2.54135 7.0467 0.157715 6.32413 1.41103 -33.544 -28.1052 -54.1799 2.03217e-16 0.0 3.88251e-19 82.6901 -57.9937 108.901 2.14931 72.8271 -3.65141 12.1141 -23.6734 24.1402
--22.1431 68.0705 122.657 187.506 -17.1491 568.223 -2.51335 -15.5583 -2.21388 -1.17346 -10.586 -1.70532 -0.102075 3.57692 6.7923 5.95521 -26.2352 15.0299 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.96129e-13 1.99517e-13 6.97045e-13 107.859 -67.7006 163.756 -8.42851 -3.24153 14.8831 -2.94438 42.9602 7.50746 3.2481e-09 -5.79647e-10 1.94652e-09 5.64422e-09 -8.76312e-10 3.25757e-09 3.24811e-09 -5.79646e-10 1.94652e-09 7.73091 5.47488 0.417314 3.2481e-09 -5.79649e-10 1.94653e-09 2.90554 0.965183 0.102902 3.24812e-09 -5.79648e-10 1.94652e-09 10.2786 0.731801 0.0259123 3.2481e-09 -5.79649e-10 1.94652e-09 2.22167 -0.733487 -0.20892 -1.96325e-13 1.99518e-13 6.96734e-13 14.5761 -38.2652 7.23538 10.7357 -4.60067 -19.1883 1.0825 28.1387 -4.31155 -1.73591e-09 1.20517e-09 4.46026e-09 -2.89861e-09 2.0555e-09 7.73545e-09 -1.73591e-09 1.20518e-09 4.46026e-09 -7.73091 5.47488 -0.417314 -1.73591e-09 1.20517e-09 4.46026e-09 -2.90554 0.965183 -0.102902 -1.73592e-09 1.20517e-09 4.46026e-09 -10.2786 0.731801 -0.0259123 -1.73591e-09 1.20517e-09 4.46025e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.0627 2.76916 6.70453 0.156226 6.36095 1.39864 -32.4082 -27.5124 -53.5153 2.03217e-16 0.0 3.88251e-19 81.6115 -58.3531 107.362 2.05762 72.3042 -3.5605 12.1586 -23.8602 24.1094
--22.1119 68.3486 122.626 187.738 -17.7155 567.741 -2.28392 -15.1487 -2.3679 -1.34701 -10.791 -1.76046 0.244497 3.39536 6.97313 5.38514 -24.9946 15.1356 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.45572e-13 -5.90922e-14 5.8279e-13 108.43 -65.1665 163.555 -8.14741 -3.09012 14.369 -3.3852 45.2268 8.13572 9.12477e-10 1.3586e-10 -2.84527e-09 1.45669e-09 3.72989e-10 -4.92433e-09 9.12484e-10 1.35862e-10 -2.84527e-09 7.73091 5.47488 0.417314 9.12478e-10 1.35859e-10 -2.84527e-09 2.90554 0.965183 0.102902 9.12496e-10 1.3586e-10 -2.84527e-09 10.2786 0.731801 0.0259123 9.12476e-10 1.35858e-10 -2.84526e-09 2.22167 -0.733487 -0.20892 -4.45715e-13 -5.90974e-14 5.82546e-13 12.9872 -37.934 6.98663 10.5443 -4.4784 -18.8264 1.11534 28.5171 -4.38047 -3.47773e-09 2.03063e-09 4.04938e-09 -5.91309e-09 3.47697e-09 7.06767e-09 -3.47773e-09 2.03064e-09 4.04939e-09 -7.73091 5.47488 -0.417314 -3.47772e-09 2.03063e-09 4.04938e-09 -2.90554 0.965183 -0.102902 -3.47773e-09 2.03064e-09 4.04939e-09 -10.2786 0.731801 -0.0259123 -3.47773e-09 2.03063e-09 4.04938e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.2153 3.00281 6.32291 0.154825 6.38545 1.387 -31.4227 -27.038 -52.8838 2.03217e-16 0.0 3.88251e-19 80.3374 -58.8302 105.601 1.96265 71.726 -3.46514 12.2531 -24.1203 24.1202
--22.1435 68.6718 122.636 187.595 -18.0623 567.47 -2.19024 -14.7795 -2.46604 -1.44453 -10.9387 -1.78693 0.569972 3.04325 7.14182 4.77389 -23.6335 15.2089 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.14341e-13 -2.19629e-13 4.50148e-13 109.232 -62.8324 163.585 -7.87812 -2.9482 13.8781 -3.81246 47.1674 8.7195 -6.59476e-10 5.81189e-10 -5.36061e-09 -1.33403e-09 1.12978e-09 -9.2088e-09 -6.59469e-10 5.81191e-10 -5.36061e-09 7.73091 5.47488 0.417314 -6.59475e-10 5.81189e-10 -5.36061e-09 2.90554 0.965183 0.102902 -6.59456e-10 5.8119e-10 -5.3606e-09 10.2786 0.731801 0.0259123 -6.59477e-10 5.81188e-10 -5.3606e-09 2.22167 -0.733487 -0.20892 -5.14453e-13 -2.19636e-13 4.49949e-13 11.4788 -38.073 6.76345 10.3402 -4.3506 -18.4408 1.16605 29.1115 -4.48861 -3.87647e-09 2.14151e-09 3.41004e-09 -6.61544e-09 3.67013e-09 5.97278e-09 -3.87647e-09 2.14151e-09 3.41004e-09 -7.73091 5.47488 -0.417314 -3.87647e-09 2.14151e-09 3.41004e-09 -2.90554 0.965183 -0.102902 -3.87648e-09 2.14151e-09 3.41004e-09 -10.2786 0.731801 -0.0259123 -3.87647e-09 2.14151e-09 3.41004e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.3466 3.13483 5.99196 0.153372 6.40095 1.37465 -30.6331 -26.6227 -52.3955 2.03217e-16 0.0 3.88251e-19 79.0892 -59.347 103.882 1.86453 71.0845 -3.36431 12.3435 -24.3674 24.132
--22.1684 68.9923 122.663 187.34 -18.1726 567.292 -2.27671 -14.4368 -2.48572 -1.43316 -11.0208 -1.77184 0.868344 2.43018 7.27831 4.10289 -22.0256 15.2005 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.88787e-13 -2.3913e-13 2.78034e-13 110.272 -60.7943 163.895 -7.61296 -2.81303 13.3941 -4.1571 48.6088 9.18017 -1.1339e-09 6.21278e-10 -4.37686e-09 -2.10876e-09 1.14323e-09 -7.5005e-09 -1.13389e-09 6.21281e-10 -4.37687e-09 7.73091 5.47488 0.417314 -1.1339e-09 6.21279e-10 -4.37686e-09 2.90554 0.965183 0.102902 -1.13388e-09 6.2128e-10 -4.37686e-09 10.2786 0.731801 0.0259123 -1.1339e-09 6.21277e-10 -4.37685e-09 2.22167 -0.733487 -0.20892 -2.88906e-13 -2.39128e-13 2.77849e-13 9.98752 -38.8541 6.49658 10.1061 -4.20737 -17.9987 1.24628 30.0106 -4.65492 -2.09296e-09 1.09255e-09 2.3868e-09 -3.56075e-09 1.86898e-09 4.16205e-09 -2.09296e-09 1.09255e-09 2.38681e-09 -7.73091 5.47488 -0.417314 -2.09296e-09 1.09255e-09 2.3868e-09 -2.90554 0.965183 -0.102902 -2.09296e-09 1.09255e-09 2.38681e-09 -10.2786 0.731801 -0.0259123 -2.09296e-09 1.09255e-09 2.3868e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.4598 3.14655 5.70157 0.151759 6.40812 1.36075 -30.0527 -26.262 -52.0777 2.03217e-16 0.0 3.88251e-19 77.8407 -59.9547 102.144 1.762 70.3564 -3.25614 12.4214 -24.6486 24.0999
--22.1228 69.308 122.675 187.166 -18.3893 567.037 -2.52496 -14.0871 -2.45429 -1.34316 -11.086 -1.72801 1.14553 1.64122 7.38552 3.38407 -20.193 15.1267 -0.0 0.0 0.0 -0.0 0.0 0.0 1.31302e-13 -1.84996e-13 5.6666e-14 111.478 -58.7973 164.363 -7.3331 -2.67339 12.8846 -4.47199 49.8452 9.59505 -1.07995e-09 4.39306e-10 -1.30935e-09 -1.89784e-09 7.41632e-10 -2.21958e-09 -1.07995e-09 4.39308e-10 -1.30935e-09 7.73091 5.47488 0.417314 -1.07995e-09 4.39306e-10 -1.30934e-09 2.90554 0.965183 0.102902 -1.07994e-09 4.39307e-10 -1.30934e-09 10.2786 0.731801 0.0259123 -1.07995e-09 4.39306e-10 -1.30933e-09 2.22167 -0.733487 -0.20892 1.31156e-13 -1.8498e-13 5.64797e-14 8.49826 -40.1222 6.18155 9.84407 -4.04929 -17.5062 1.35521 31.1411 -4.8698 1.1389e-09 -7.40971e-10 1.00271e-09 1.98522e-09 -1.28086e-09 1.69324e-09 1.13889e-09 -7.40969e-10 1.00272e-09 -7.73091 5.47488 -0.417314 1.1389e-09 -7.40972e-10 1.0027e-09 -2.90554 0.965183 -0.102902 1.13889e-09 -7.40971e-10 1.00271e-09 -10.2786 0.731801 -0.0259123 1.1389e-09 -7.40972e-10 1.00271e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.5377 3.09172 5.41513 0.150072 6.40525 1.34621 -29.6485 -25.991 -51.8644 2.03217e-16 0.0 3.88251e-19 76.4566 -60.663 100.238 1.65852 69.553 -3.14482 12.5135 -24.9867 24.0575
--22.0324 69.6269 122.749 187.123 -18.694 566.867 -2.85335 -13.7865 -2.40311 -1.22498 -11.1164 -1.67458 1.41468 0.816579 7.50829 2.65956 -18.4022 15.1002 -0.0 0.0 0.0 -0.0 0.0 0.0 5.65056e-13 -1.03345e-13 -1.59179e-13 112.707 -56.808 164.828 -7.07127 -2.54444 12.4107 -4.79663 51.0529 10.0179 -8.21934e-10 2.01778e-10 2.1525e-09 -1.32168e-09 2.43143e-10 3.73457e-09 -8.2193e-10 2.0178e-10 2.15249e-09 7.73091 5.47488 0.417314 -8.21934e-10 2.01778e-10 2.15251e-09 2.90554 0.965183 0.102902 -8.21927e-10 2.01779e-10 2.1525e-09 10.2786 0.731801 0.0259123 -8.2194e-10 2.01779e-10 2.15251e-09 2.22167 -0.733487 -0.20892 5.64883e-13 -1.03317e-13 -1.59373e-13 7.13955 -41.6089 5.96598 9.5903 -3.8977 -17.033 1.48149 32.3568 -5.10777 4.48137e-09 -2.63868e-09 -4.09806e-10 7.72074e-09 -4.54011e-09 -8.27323e-10 4.48137e-09 -2.63868e-09 -4.09795e-10 -7.73091 5.47488 -0.417314 4.48138e-09 -2.63868e-09 -4.09811e-10 -2.90554 0.965183 -0.102902 4.48137e-09 -2.63868e-09 -4.09803e-10 -10.2786 0.731801 -0.0259123 4.48137e-09 -2.63868e-09 -4.09808e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.5791 2.97151 5.18299 0.148465 6.39212 1.33228 -29.3967 -25.8125 -51.7288 2.03217e-16 0.0 3.88251e-19 75.0545 -61.3578 98.3583 1.55998 68.7182 -3.03712 12.6186 -25.2584 24.0803
--21.9321 69.9453 122.842 187.222 -18.9061 566.826 -3.17931 -13.5915 -2.3633 -1.12918 -11.0942 -1.63071 1.69015 0.0966229 7.69051 1.95749 -16.9218 15.2204 -0.0 0.0 0.0 -0.0 0.0 0.0 8.31609e-13 -4.02939e-14 -3.14726e-13 113.855 -54.7964 165.158 -6.86127 -2.44164 12.0331 -5.18716 52.4067 10.5177 -6.8416e-10 7.52006e-11 4.31923e-09 -1.00066e-09 -3.40796e-11 7.46256e-09 -6.84156e-10 7.52022e-11 4.31922e-09 7.73091 5.47488 0.417314 -6.8416e-10 7.52012e-11 4.31925e-09 2.90554 0.965183 0.102902 -6.84155e-10 7.52012e-11 4.31924e-09 10.2786 0.731801 0.0259123 -6.84166e-10 7.52022e-11 4.31925e-09 2.22167 -0.733487 -0.20892 8.31428e-13 -4.02644e-14 -3.14925e-13 6.06695 -43.0453 6.01275 9.38262 -3.77454 -16.6487 1.60884 33.5123 -5.33998 6.59673e-09 -3.88023e-09 -1.5183e-09 1.13441e-08 -6.66951e-09 -2.79331e-09 6.59673e-09 -3.88023e-09 -1.51829e-09 -7.73091 5.47488 -0.417314 6.59674e-09 -3.88023e-09 -1.5183e-09 -2.90554 0.965183 -0.102902 6.59673e-09 -3.88023e-09 -1.5183e-09 -10.2786 0.731801 -0.0259123 6.59673e-09 -3.88023e-09 -1.5183e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.5837 2.78717 5.05548 0.147094 6.36851 1.3202 -29.2748 -25.7278 -51.6456 2.03217e-16 0.0 3.88251e-19 73.8022 -61.9404 96.7591 1.47037 67.8957 -2.93792 12.7367 -25.3395 24.2433
--21.9251 70.2504 122.89 186.964 -18.9848 566.838 -3.50268 -13.5379 -2.36339 -1.04871 -10.9855 -1.60405 1.99268 -0.490666 7.95653 1.24843 -15.8167 15.5219 -0.0 0.0 0.0 -0.0 0.0 0.0 8.60156e-13 8.90968e-15 -3.89776e-13 114.944 -52.7082 165.355 -6.7208 -2.37363 11.7813 -5.68003 53.9605 11.1346 -6.82978e-10 1.64349e-10 4.77629e-09 -9.75426e-10 9.86225e-11 8.24924e-09 -6.82975e-10 1.64349e-10 4.77628e-09 7.73091 5.47488 0.417314 -6.82978e-10 1.64349e-10 4.7763e-09 2.90554 0.965183 0.102902 -6.82974e-10 1.64349e-10 4.77629e-09 10.2786 0.731801 0.0259123 -6.82986e-10 1.64351e-10 4.7763e-09 2.22167 -0.733487 -0.20892 8.6e-13 8.92457e-15 -3.89974e-13 5.3673 -44.3422 6.43227 9.23651 -3.68909 -16.3789 1.73013 34.5608 -5.55588 6.96474e-09 -4.18768e-09 -2.23707e-09 1.1959e-08 -7.18876e-09 -4.04442e-09 6.96474e-09 -4.18768e-09 -2.23705e-09 -7.73091 5.47488 -0.417314 6.96475e-09 -4.18768e-09 -2.23707e-09 -2.90554 0.965183 -0.102902 6.96474e-09 -4.18768e-09 -2.23707e-09 -10.2786 0.731801 -0.0259123 6.96475e-09 -4.18768e-09 -2.23707e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.5516 2.52236 5.03849 0.146046 6.32702 1.31064 -29.3278 -25.8048 -51.5964 2.03217e-16 0.0 3.88251e-19 72.777 -62.4288 95.5631 1.38631 67.0632 -2.843 12.868 -25.1497 24.5997
--21.8123 70.5401 123.16 187.117 -18.7555 567.365 -3.86003 -13.5886 -2.37995 -0.963578 -10.8096 -1.58357 2.31083 -1.0167 8.27837 0.520235 -14.9469 15.9391 -0.0 0.0 0.0 -0.0 0.0 0.0 7.54684e-13 6.31785e-14 -4.15407e-13 116.034 -50.5762 165.493 -6.63035 -2.3311 11.6183 -6.26412 55.6167 11.8496 -6.68802e-10 3.60294e-10 4.41271e-09 -9.56698e-10 4.3696e-10 7.62162e-09 -6.68799e-10 3.60294e-10 4.4127e-09 7.73091 5.47488 0.417314 -6.68803e-10 3.60295e-10 4.41272e-09 2.90554 0.965183 0.102902 -6.68797e-10 3.60294e-10 4.41271e-09 10.2786 0.731801 0.0259123 -6.68811e-10 3.60297e-10 4.41272e-09 2.22167 -0.733487 -0.20892 7.54573e-13 6.31679e-14 -4.15603e-13 4.98574 -45.6439 7.14554 9.13149 -3.62913 -16.184 1.85453 35.5825 -5.77176 6.35337e-09 -3.97383e-09 -2.74244e-09 1.08871e-08 -6.80875e-09 -4.90355e-09 6.35336e-09 -3.97384e-09 -2.74242e-09 -7.73091 5.47488 -0.417314 6.35337e-09 -3.97384e-09 -2.74244e-09 -2.90554 0.965183 -0.102902 6.35336e-09 -3.97384e-09 -2.74244e-09 -10.2786 0.731801 -0.0259123 6.35337e-09 -3.97383e-09 -2.74244e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.4841 2.18212 5.10777 0.145212 6.27021 1.30281 -29.5494 -26.0215 -51.5981 2.03217e-16 0.0 3.88251e-19 71.9191 -62.8805 94.6622 1.30675 66.2085 -2.75121 13.0075 -24.7712 25.0963
--21.8067 70.8001 123.219 186.71 -18.6152 567.424 -4.22329 -13.6909 -2.36597 -0.90502 -10.628 -1.56041 2.60994 -1.4903 8.6208 -0.17506 -14.2741 16.4153 -0.0 0.0 0.0 -0.0 0.0 0.0 5.96513e-13 9.76325e-14 -4.13757e-13 117.101 -48.5033 165.573 -6.56808 -2.30264 11.5054 -6.93633 57.3211 12.6553 -7.17031e-10 5.08991e-10 3.4945e-09 -1.07001e-09 7.09668e-10 6.04349e-09 -7.17028e-10 5.08989e-10 3.4945e-09 7.73091 5.47488 0.417314 -7.17032e-10 5.08992e-10 3.49451e-09 2.90554 0.965183 0.102902 -7.17025e-10 5.08991e-10 3.4945e-09 10.2786 0.731801 0.0259123 -7.1704e-10 5.08995e-10 3.49451e-09 2.22167 -0.733487 -0.20892 5.96444e-13 9.75964e-14 -4.13952e-13 4.8777 -47.0316 8.03922 9.05193 -3.58458 -16.0356 1.98705 36.6228 -5.99689 5.35716e-09 -3.55444e-09 -3.09499e-09 9.1539e-09 -6.07696e-09 -5.48922e-09 5.35715e-09 -3.55444e-09 -3.09497e-09 -7.73091 5.47488 -0.417314 5.35716e-09 -3.55445e-09 -3.09499e-09 -2.90554 0.965183 -0.102902 5.35715e-09 -3.55445e-09 -3.09499e-09 -10.2786 0.731801 -0.0259123 5.35716e-09 -3.55444e-09 -3.09499e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.3841 1.79986 5.26836 0.144469 6.21281 1.29582 -29.8425 -26.2426 -51.6788 2.03217e-16 0.0 3.88251e-19 71.2252 -63.2632 94.0002 1.23644 65.3913 -2.66915 13.1478 -24.3235 25.6493
--21.7161 71.0101 123.383 186.738 -18.5499 567.612 -4.56407 -13.7917 -2.27436 -0.904264 -10.502 -1.5257 2.85424 -1.92045 8.94857 -0.782356 -13.7598 16.8957 -0.0 0.0 0.0 -0.0 0.0 0.0 4.66963e-13 8.73915e-14 -4.06962e-13 118.119 -46.5918 165.6 -6.51184 -2.27677 11.4038 -7.68699 59.0207 13.538 -9.03065e-10 4.56393e-10 2.28765e-09 -1.44088e-09 6.45478e-10 3.97865e-09 -9.03061e-10 4.56391e-10 2.28765e-09 7.73091 5.47488 0.417314 -9.03066e-10 4.56394e-10 2.28766e-09 2.90554 0.965183 0.102902 -9.03058e-10 4.56393e-10 2.28765e-09 10.2786 0.731801 0.0259123 -9.03074e-10 4.56397e-10 2.28766e-09 2.22167 -0.733487 -0.20892 4.66908e-13 8.7341e-14 -4.07161e-13 4.99154 -48.5892 8.99704 8.98184 -3.54523 -15.9055 2.13451 37.7268 -6.24196 4.57067e-09 -3.24525e-09 -3.35532e-09 7.78488e-09 -5.5409e-09 -5.91992e-09 4.57067e-09 -3.24525e-09 -3.3553e-09 -7.73091 5.47488 -0.417314 4.57067e-09 -3.24526e-09 -3.35531e-09 -2.90554 0.965183 -0.102902 4.57066e-09 -3.24525e-09 -3.35532e-09 -10.2786 0.731801 -0.0259123 4.57067e-09 -3.24525e-09 -3.35532e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.2548 1.40901 5.52526 0.143694 6.16956 1.28877 -30.1094 -26.3316 -51.8643 2.03217e-16 0.0 3.88251e-19 70.6886 -63.5413 93.5182 1.1785 64.6712 -2.6018 13.2875 -23.9251 26.1762
--21.6482 71.2458 123.582 186.758 -18.2814 567.973 -4.8809 -13.902 -2.10577 -0.988543 -10.4535 -1.48471 3.01994 -2.30768 9.26473 -1.24546 -13.4025 17.403 -0.0 0.0 0.0 -0.0 0.0 0.0 3.72321e-13 -4.90791e-15 -3.96998e-13 119.084 -44.9053 165.554 -6.46052 -2.25281 11.3117 -8.53227 60.7224 14.5154 -1.40524e-09 1.1466e-11 3.19876e-10 -2.40351e-09 -7.1948e-11 6.26598e-10 -1.40523e-09 1.14637e-11 3.19874e-10 7.73091 5.47488 0.417314 -1.40524e-09 1.14669e-11 3.19884e-10 2.90554 0.965183 0.102902 -1.40523e-09 1.14664e-11 3.19877e-10 10.2786 0.731801 0.0259123 -1.40524e-09 1.14696e-11 3.19883e-10 2.22167 -0.733487 -0.20892 3.72231e-13 -4.95594e-15 -3.97207e-13 5.39595 -50.6133 10.0662 8.91231 -3.50594 -15.7772 2.33421 39.1473 -6.56677 4.06695e-09 -3.10123e-09 -3.54324e-09 6.9042e-09 -5.29905e-09 -6.23106e-09 4.06695e-09 -3.10123e-09 -3.54322e-09 -7.73091 5.47488 -0.417314 4.06696e-09 -3.10123e-09 -3.54323e-09 -2.90554 0.965183 -0.102902 4.06695e-09 -3.10123e-09 -3.54323e-09 -10.2786 0.731801 -0.0259123 4.06696e-09 -3.10123e-09 -3.54324e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 17.0855 1.00133 5.87974 0.142874 6.14344 1.28146 -30.3187 -26.2371 -52.1685 2.03217e-16 0.0 3.88251e-19 70.3287 -63.7163 93.2463 1.1315 64.0599 -2.54814 13.4295 -23.5738 26.6796
--21.6135 71.4454 123.683 186.698 -17.9146 568.113 -5.18603 -14.0414 -1.88072 -1.1348 -10.4477 -1.43961 3.12952 -2.64794 9.5837 -1.60101 -13.2177 17.9534 -0.0 0.0 0.0 -0.0 0.0 0.0 2.74347e-13 -1.55753e-13 -3.73367e-13 120.022 -43.3773 165.455 -6.42446 -2.23615 11.2468 -9.50577 62.4447 15.6226 -2.13059e-09 -6.93646e-10 -2.36961e-09 -3.79071e-09 -1.2166e-09 -3.95196e-09 -2.13058e-09 -6.93648e-10 -2.36962e-09 7.73091 5.47488 0.417314 -2.13059e-09 -6.93645e-10 -2.36961e-09 2.90554 0.965183 0.102902 -2.13058e-09 -6.93646e-10 -2.36961e-09 10.2786 0.731801 0.0259123 -2.13059e-09 -6.93644e-10 -2.3696e-09 2.22167 -0.733487 -0.20892 2.74192e-13 -1.55789e-13 -3.73591e-13 6.17441 -52.9587 11.3591 8.85358 -3.47302 -15.6688 2.58463 40.7789 -6.95845 3.55742e-09 -2.96372e-09 -3.62521e-09 6.01472e-09 -5.07526e-09 -6.35817e-09 3.55742e-09 -2.96372e-09 -3.62519e-09 -7.73091 5.47488 -0.417314 3.55742e-09 -2.96372e-09 -3.62521e-09 -2.90554 0.965183 -0.102902 3.55742e-09 -2.96372e-09 -3.62521e-09 -10.2786 0.731801 -0.0259123 3.55742e-09 -2.96372e-09 -3.62522e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.8825 0.565102 6.3292 0.142074 6.12691 1.27436 -30.5227 -26.0357 -52.5737 2.03217e-16 0.0 3.88251e-19 70.1608 -63.8081 93.222 1.09185 63.527 -2.50357 13.5729 -23.2178 27.1952
--21.5966 71.6304 123.913 186.644 -17.2419 568.479 -5.47173 -14.1704 -1.5819 -1.29884 -10.462 -1.37682 3.21566 -2.9436 9.88729 -1.93148 -13.1924 18.4842 -0.0 0.0 0.0 -0.0 0.0 0.0 1.87581e-13 -2.98711e-13 -3.39499e-13 120.946 -41.9149 165.363 -6.39855 -2.22427 11.2002 -10.6141 64.1531 16.8632 -2.74759e-09 -1.32823e-09 -4.74758e-09 -4.97595e-09 -2.24622e-09 -8.00144e-09 -2.74759e-09 -1.32823e-09 -4.74759e-09 7.73091 5.47488 0.417314 -2.74759e-09 -1.32823e-09 -4.74757e-09 2.90554 0.965183 0.102902 -2.74758e-09 -1.32823e-09 -4.74758e-09 10.2786 0.731801 0.0259123 -2.74759e-09 -1.32822e-09 -4.74757e-09 2.22167 -0.733487 -0.20892 1.8736e-13 -2.98732e-13 -3.39738e-13 7.22867 -55.0541 12.7975 8.81838 -3.45346 -15.6037 2.81334 42.1308 -7.30143 3.09414e-09 -2.82804e-09 -3.58181e-09 5.20987e-09 -4.85503e-09 -6.26993e-09 3.09414e-09 -2.82803e-09 -3.5818e-09 -7.73091 5.47488 -0.417314 3.09414e-09 -2.82804e-09 -3.58181e-09 -2.90554 0.965183 -0.102902 3.09414e-09 -2.82804e-09 -3.58181e-09 -10.2786 0.731801 -0.0259123 3.09415e-09 -2.82803e-09 -3.58182e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.6741 0.128603 6.87287 0.141298 6.11891 1.26754 -30.7484 -25.7839 -53.0567 2.03217e-16 0.0 3.88251e-19 70.1656 -63.8049 93.389 1.05877 63.0692 -2.46715 13.7183 -22.8997 27.6919
--21.6078 71.7972 124.105 186.497 -16.6999 568.73 -5.73095 -14.2491 -1.1922 -1.43652 -10.4732 -1.28277 3.31077 -3.1971 10.1573 -2.31977 -13.3143 18.9332 -0.0 0.0 0.0 -0.0 0.0 0.0 1.26559e-13 -3.67349e-13 -2.98823e-13 121.864 -40.4248 165.328 -6.37762 -2.21466 11.1625 -11.8577 65.8133 18.2348 -2.92471e-09 -1.56156e-09 -5.78079e-09 -5.33268e-09 -2.61856e-09 -9.76626e-09 -2.92471e-09 -1.56156e-09 -5.7808e-09 7.73091 5.47488 0.417314 -2.92471e-09 -1.56155e-09 -5.78078e-09 2.90554 0.965183 0.102902 -2.9247e-09 -1.56155e-09 -5.78078e-09 10.2786 0.731801 0.0259123 -2.92471e-09 -1.56155e-09 -5.78078e-09 2.22167 -0.733487 -0.20892 1.26303e-13 -3.67361e-13 -2.99072e-13 8.33604 -56.338 14.1863 8.81946 -3.45423 -15.6055 2.9189 42.7151 -7.4555 2.72921e-09 -2.6895e-09 -3.3936e-09 4.58311e-09 -4.62386e-09 -5.93499e-09 2.7292e-09 -2.6895e-09 -3.39359e-09 -7.73091 5.47488 -0.417314 2.72921e-09 -2.6895e-09 -3.3936e-09 -2.90554 0.965183 -0.102902 2.72921e-09 -2.6895e-09 -3.3936e-09 -10.2786 0.731801 -0.0259123 2.72921e-09 -2.6895e-09 -3.39361e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.4872 -0.279944 7.50989 0.140546 6.11836 1.26107 -31.0244 -25.5372 -53.5944 2.03217e-16 0.0 3.88251e-19 70.3187 -63.6943 93.6857 1.03173 62.6834 -2.43818 13.8682 -22.6615 28.1389
--21.5367 71.9725 124.384 186.666 -15.8231 569.111 -5.95266 -14.2764 -0.671494 -1.52945 -10.4605 -1.14215 3.4172 -3.41283 10.3841 -2.79288 -13.6294 19.2779 -0.0 0.0 0.0 -0.0 0.0 0.0 9.40053e-14 -3.2277e-13 -2.3044e-13 122.811 -38.7732 165.397 -6.35494 -2.20419 11.1219 -13.3206 67.4989 19.8281 -2.3747e-09 -1.12375e-09 -4.66746e-09 -4.32324e-09 -1.89392e-09 -7.88569e-09 -2.3747e-09 -1.12375e-09 -4.66748e-09 7.73091 5.47488 0.417314 -2.3747e-09 -1.12375e-09 -4.66746e-09 2.90554 0.965183 0.102902 -2.3747e-09 -1.12375e-09 -4.66746e-09 10.2786 0.731801 0.0259123 -2.37471e-09 -1.12375e-09 -4.66746e-09 2.22167 -0.733487 -0.20892 9.37558e-14 -3.22783e-13 -2.30692e-13 9.3048 -56.4929 15.3534 8.87286 -3.48427 -15.7037 2.81613 42.1494 -7.30597 2.48476e-09 -2.50361e-09 -2.81781e-09 4.18199e-09 -4.30525e-09 -4.93564e-09 2.48475e-09 -2.50361e-09 -2.81779e-09 -7.73091 5.47488 -0.417314 2.48476e-09 -2.50361e-09 -2.81781e-09 -2.90554 0.965183 -0.102902 2.48476e-09 -2.50361e-09 -2.81781e-09 -10.2786 0.731801 -0.0259123 2.48476e-09 -2.50361e-09 -2.81782e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.3251 -0.676191 8.30494 0.13979 6.12846 1.2547 -31.3566 -25.2816 -54.2061 2.03217e-16 0.0 3.88251e-19 70.6764 -63.4339 94.1587 1.01 62.3682 -2.41639 14.0398 -22.5242 28.5451
--21.5317 72.0948 124.544 186.56 -15.0674 569.151 -6.14462 -14.2692 -0.0410071 -1.60348 -10.4411 -0.9661 3.51809 -3.58853 10.5787 -3.2998 -14.1268 19.556 -0.0 0.0 0.0 -0.0 0.0 0.0 8.25496e-14 -2.07467e-13 -1.39792e-13 123.758 -37.045 165.523 -6.33507 -2.19502 11.0863 -15.0548 69.1944 21.6948 -1.34067e-09 -2.51753e-10 -2.13408e-09 -2.40532e-09 -4.59857e-10 -3.59357e-09 -1.34066e-09 -2.51755e-10 -2.1341e-09 7.73091 5.47488 0.417314 -1.34067e-09 -2.51753e-10 -2.13409e-09 2.90554 0.965183 0.102902 -1.34066e-09 -2.51753e-10 -2.13408e-09 10.2786 0.731801 0.0259123 -1.34067e-09 -2.51752e-10 -2.13408e-09 2.22167 -0.733487 -0.20892 8.23323e-14 -2.07485e-13 -1.40044e-13 10.1494 -55.886 16.3122 8.96734 -3.5374 -15.8781 2.58259 40.7775 -6.95701 2.33027e-09 -2.2873e-09 -1.94399e-09 3.94915e-09 -3.93113e-09 -3.42502e-09 2.33027e-09 -2.2873e-09 -1.94397e-09 -7.73091 5.47488 -0.417314 2.33027e-09 -2.2873e-09 -1.94399e-09 -2.90554 0.965183 -0.102902 2.33026e-09 -2.2873e-09 -1.94399e-09 -10.2786 0.731801 -0.0259123 2.33027e-09 -2.2873e-09 -1.944e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.1788 -1.06651 9.237 0.139045 6.14861 1.2485 -31.7287 -24.9948 -54.8936 2.03217e-16 0.0 3.88251e-19 71.2147 -63.0405 94.8017 0.99311 62.1253 -2.40123 14.2298 -22.4611 28.9221
--21.4319 72.1691 124.817 186.852 -14.1764 569.43 -6.32953 -14.2155 0.624052 -1.68053 -10.4489 -0.780741 3.61709 -3.71674 10.754 -3.80948 -14.7106 19.7941 -0.0 0.0 0.0 -0.0 0.0 0.0 9.15938e-14 -7.70839e-14 -6.98196e-14 124.632 -35.4757 165.62 -6.32977 -2.19261 11.0768 -16.9393 70.7376 23.7007 -2.86577e-10 6.24898e-10 5.60226e-10 -4.45413e-10 9.8497e-10 9.73835e-10 -2.86574e-10 6.24897e-10 5.60218e-10 7.73091 5.47488 0.417314 -2.86577e-10 6.24899e-10 5.6022e-10 2.90554 0.965183 0.102902 -2.86567e-10 6.24899e-10 5.60225e-10 10.2786 0.731801 0.0259123 -2.86581e-10 6.249e-10 5.60222e-10 2.22167 -0.733487 -0.20892 9.14173e-14 -7.71074e-14 -7.00693e-14 10.9141 -54.9901 17.1036 9.07485 -3.59802 -16.0773 2.34076 39.2032 -6.57886 2.2388e-09 -2.12797e-09 -1.25123e-09 3.82056e-09 -3.6497e-09 -2.22819e-09 2.2388e-09 -2.12797e-09 -1.25121e-09 -7.73091 5.47488 -0.417314 2.2388e-09 -2.12797e-09 -1.25123e-09 -2.90554 0.965183 -0.102902 2.23879e-09 -2.12797e-09 -1.25123e-09 -10.2786 0.731801 -0.0259123 2.2388e-09 -2.12796e-09 -1.25124e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 16.0519 -1.40953 10.1765 0.138374 6.17209 1.24294 -32.1388 -24.7182 -55.6088 2.03217e-16 0.0 3.88251e-19 71.7938 -62.5915 95.4794 0.981198 61.9567 -2.39183 14.4103 -22.4438 29.2434
--21.3193 72.229 125.017 187.012 -13.4428 569.432 -6.53061 -14.1041 1.24835 -1.78207 -10.5177 -0.612114 3.71793 -3.78998 10.9229 -4.29206 -15.2848 20.0178 -0.0 0.0 0.0 -0.0 0.0 0.0 1.20539e-13 1.27344e-14 -6.3462e-14 125.37 -34.3021 165.616 -6.35082 -2.20241 11.1144 -18.73 71.9757 25.5893 3.23581e-10 1.07667e-09 2.15635e-09 6.89951e-10 1.74191e-09 3.68027e-09 3.23584e-10 1.07667e-09 2.15634e-09 7.73091 5.47488 0.417314 3.23581e-10 1.07667e-09 2.15634e-09 2.90554 0.965183 0.102902 3.23592e-10 1.07667e-09 2.15634e-09 10.2786 0.731801 0.0259123 3.23576e-10 1.07667e-09 2.15634e-09 2.22167 -0.733487 -0.20892 1.20396e-13 1.2709e-14 -6.37105e-14 11.6979 -54.2718 17.8103 9.16768 -3.65067 -16.2496 2.17721 38.0332 -6.3115 2.1834e-09 -2.11303e-09 -1.21862e-09 3.73224e-09 -3.60912e-09 -2.17016e-09 2.1834e-09 -2.11303e-09 -1.2186e-09 -7.73091 5.47488 -0.417314 2.1834e-09 -2.11303e-09 -1.21862e-09 -2.90554 0.965183 -0.102902 2.1834e-09 -2.11303e-09 -1.21862e-09 -10.2786 0.731801 -0.0259123 2.18341e-09 -2.11303e-09 -1.21863e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.9422 -1.66501 10.9935 0.137837 6.19215 1.23848 -32.5871 -24.4941 -56.3049 2.03217e-16 0.0 3.88251e-19 72.2889 -62.1669 96.0734 0.974499 61.8645 -2.38743 14.5524 -22.4444 29.4822
--21.1968 72.2543 125.251 187.072 -12.6321 569.426 -6.73359 -13.9131 1.83675 -1.9432 -10.6919 -0.465009 3.83533 -3.76944 11.0745 -4.72535 -15.8412 20.2061 -0.0 0.0 0.0 -0.0 0.0 0.0 1.95611e-13 4.01341e-14 -1.67535e-13 125.954 -33.6774 165.459 -6.41892 -2.23405 11.2364 -20.1303 72.8233 27.057 2.60145e-10 8.9146e-10 2.12761e-09 5.76525e-10 1.4701e-09 3.63415e-09 2.60149e-10 8.91463e-10 2.1276e-09 7.73091 5.47488 0.417314 2.60145e-10 8.9146e-10 2.1276e-09 2.90554 0.965183 0.102902 2.60156e-10 8.9146e-10 2.1276e-09 10.2786 0.731801 0.0259123 2.6014e-10 8.91462e-10 2.1276e-09 2.22167 -0.733487 -0.20892 1.95491e-13 4.01121e-14 -1.67788e-13 12.5904 -53.8928 18.4488 9.23602 -3.68969 -16.3766 2.11067 37.5273 -6.19929 2.26989e-09 -2.43149e-09 -2.34097e-09 3.85093e-09 -4.12645e-09 -4.10668e-09 2.26989e-09 -2.43149e-09 -2.34096e-09 -7.73091 5.47488 -0.417314 2.26989e-09 -2.43149e-09 -2.34097e-09 -2.90554 0.965183 -0.102902 2.26988e-09 -2.43149e-09 -2.34097e-09 -10.2786 0.731801 -0.0259123 2.2699e-09 -2.43149e-09 -2.34098e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.8756 -1.79879 11.6564 0.137386 6.21143 1.23477 -33.0805 -24.3055 -57.0049 2.03217e-16 0.0 3.88251e-19 72.6961 -61.7532 96.5601 0.974891 61.8778 -2.38987 14.6287 -22.4635 29.5903
--21.1276 72.2492 125.464 187.151 -11.9203 569.563 -6.93644 -13.6552 2.4203 -2.14176 -10.9415 -0.326094 3.96162 -3.67161 11.2066 -5.13146 -16.4258 20.355 -0.0 0.0 0.0 -0.0 0.0 0.0 3.08335e-13 3.71308e-14 -3.47348e-13 126.423 -33.4446 165.209 -6.5217 -2.28184 11.4209 -21.1532 73.3925 28.1261 -1.94117e-10 3.30866e-10 1.20917e-09 -2.59155e-10 5.93664e-10 2.08212e-09 -1.94111e-10 3.30874e-10 1.20917e-09 7.73091 5.47488 0.417314 -1.94117e-10 3.30867e-10 1.20917e-09 2.90554 0.965183 0.102902 -1.94106e-10 3.30867e-10 1.20917e-09 10.2786 0.731801 0.0259123 -1.94123e-10 3.30869e-10 1.20917e-09 2.22167 -0.733487 -0.20892 3.08235e-13 3.7115e-14 -3.47609e-13 13.5329 -53.5941 18.9896 9.29555 -3.7239 -16.4872 2.08529 37.3302 -6.15596 2.47496e-09 -2.98148e-09 -4.24042e-09 4.14949e-09 -5.03013e-09 -7.38581e-09 2.47496e-09 -2.98149e-09 -4.24041e-09 -7.73091 5.47488 -0.417314 2.47496e-09 -2.98149e-09 -4.24042e-09 -2.90554 0.965183 -0.102902 2.47495e-09 -2.98149e-09 -4.24042e-09 -10.2786 0.731801 -0.0259123 2.47497e-09 -2.98148e-09 -4.24042e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.8371 -1.84146 12.2331 0.137008 6.23205 1.23172 -33.6182 -24.1369 -57.7217 2.03217e-16 0.0 3.88251e-19 73.0741 -61.32 97.002 0.981563 61.9862 -2.39878 14.6613 -22.514 29.5959
--21.0463 72.1824 125.567 187.402 -11.5376 569.526 -7.17898 -13.371 2.96336 -2.31377 -11.1896 -0.194287 4.06757 -3.57179 11.345 -5.54604 -17.0237 20.514 -0.0 0.0 0.0 -0.0 0.0 0.0 4.06058e-13 2.88838e-14 -5.23585e-13 126.802 -33.3764 164.967 -6.6215 -2.32828 11.6007 -21.9879 73.8298 28.9968 -7.34538e-10 -3.24065e-10 3.46771e-11 -1.25743e-09 -4.38528e-10 9.52424e-11 -7.34531e-10 -3.24052e-10 3.46749e-11 7.73091 5.47488 0.417314 -7.34538e-10 -3.24064e-10 3.46813e-11 2.90554 0.965183 0.102902 -7.34527e-10 -3.24064e-10 3.46778e-11 10.2786 0.731801 0.0259123 -7.34545e-10 -3.24062e-10 3.46805e-11 2.22167 -0.733487 -0.20892 4.05977e-13 2.88756e-14 -5.23848e-13 14.4179 -53.2082 19.4546 9.3571 -3.75957 -16.6015 2.05661 37.1276 -6.1099 2.57804e-09 -3.41417e-09 -6.08703e-09 4.27309e-09 -5.73549e-09 -1.05711e-08 2.57804e-09 -3.41418e-09 -6.08702e-09 -7.73091 5.47488 -0.417314 2.57804e-09 -3.41418e-09 -6.08703e-09 -2.90554 0.965183 -0.102902 2.57803e-09 -3.41418e-09 -6.08703e-09 -10.2786 0.731801 -0.0259123 2.57804e-09 -3.41417e-09 -6.08703e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.7617 -1.85043 12.7428 0.136815 6.24648 1.23021 -34.1919 -24.0331 -58.3958 2.03217e-16 0.0 3.88251e-19 73.4054 -60.9246 97.4247 0.990803 62.1314 -2.41021 14.6956 -22.5861 29.5868
--21.0541 72.1017 125.661 187.223 -11.1155 569.418 -7.49862 -13.1014 3.43083 -2.39595 -11.3591 -0.0686405 4.12456 -3.54517 11.5153 -6.00276 -17.6188 20.7327 -0.0 0.0 0.0 -0.0 0.0 0.0 4.36131e-13 4.05527e-14 -6.16928e-13 127.12 -33.2464 164.834 -6.68106 -2.35599 11.7083 -22.8986 74.2751 29.9443 -1.05645e-09 -7.9229e-10 -7.62245e-10 -1.85863e-09 -1.17761e-09 -1.25543e-09 -1.05644e-09 -7.92275e-10 -7.62249e-10 7.73091 5.47488 0.417314 -1.05645e-09 -7.92289e-10 -7.62239e-10 2.90554 0.965183 0.102902 -1.05644e-09 -7.92289e-10 -7.62244e-10 10.2786 0.731801 0.0259123 -1.05646e-09 -7.92287e-10 -7.62239e-10 2.22167 -0.733487 -0.20892 4.36066e-13 4.05517e-14 -6.17177e-13 15.1286 -52.5682 19.8597 9.43137 -3.80295 -16.7394 1.98365 36.605 -5.99225 2.35854e-09 -3.38072e-09 -7.05087e-09 3.8669e-09 -5.65786e-09 -1.22261e-08 2.35855e-09 -3.38072e-09 -7.05086e-09 -7.73091 5.47488 -0.417314 2.35855e-09 -3.38072e-09 -7.05087e-09 -2.90554 0.965183 -0.102902 2.35854e-09 -3.38072e-09 -7.05087e-09 -10.2786 0.731801 -0.0259123 2.35855e-09 -3.38071e-09 -7.05088e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.5871 -1.88255 13.2046 0.136914 6.2472 1.23111 -34.7944 -24.0414 -58.9698 2.03217e-16 0.0 3.88251e-19 73.6751 -60.6237 97.8563 0.99877 62.2554 -2.42007 14.7772 -22.6701 29.6511
--21.0978 72.0388 125.839 186.892 -10.592 569.497 -7.92621 -12.8452 3.81252 -2.34055 -11.4075 0.0567518 4.11304 -3.65031 11.7373 -6.55268 -18.2075 21.042 -0.0 0.0 0.0 -0.0 0.0 0.0 3.59242e-13 7.24541e-14 -6.01563e-13 127.375 -32.9147 164.889 -6.68076 -2.35576 11.7078 -24.1488 74.8382 31.2414 -1.12007e-09 -1.09293e-09 -1.18366e-09 -1.99501e-09 -1.66113e-09 -1.97477e-09 -1.12006e-09 -1.09292e-09 -1.18366e-09 7.73091 5.47488 0.417314 -1.12007e-09 -1.09293e-09 -1.18365e-09 2.90554 0.965183 0.102902 -1.12006e-09 -1.09293e-09 -1.18366e-09 10.2786 0.731801 0.0259123 -1.12008e-09 -1.09293e-09 -1.18365e-09 2.22167 -0.733487 -0.20892 3.59196e-13 7.24601e-14 -6.01765e-13 15.56 -51.4574 20.1718 9.52816 -3.85985 -16.9192 1.83972 35.5165 -5.75377 1.61303e-09 -2.61171e-09 -6.7998e-09 2.59075e-09 -4.34143e-09 -1.17728e-08 1.61303e-09 -2.61171e-09 -6.79979e-09 -7.73091 5.47488 -0.417314 1.61303e-09 -2.61171e-09 -6.7998e-09 -2.90554 0.965183 -0.102902 1.61303e-09 -2.61171e-09 -6.7998e-09 -10.2786 0.731801 -0.0259123 1.61304e-09 -2.61171e-09 -6.79981e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.2658 -1.94837 13.6291 0.137449 6.229 1.23559 -35.4979 -24.2219 -59.454 2.03217e-16 0.0 3.88251e-19 73.8884 -60.4432 98.3315 1.00581 62.3657 -2.42917 14.946 -22.8061 29.8238
--21.067 71.9569 126.075 186.786 -10.0533 569.681 -8.43333 -12.5852 4.12782 -2.19247 -11.3833 0.179336 4.05376 -3.83395 11.9931 -7.16055 -18.7966 21.4107 -0.0 0.0 0.0 -0.0 0.0 0.0 2.11895e-13 1.13301e-13 -5.21347e-13 127.553 -32.5281 165.059 -6.64382 -2.33842 11.6412 -25.5588 75.4179 32.7002 -1.07407e-09 -1.34452e-09 -1.51048e-09 -1.93788e-09 -2.07605e-09 -2.53716e-09 -1.07406e-09 -1.34451e-09 -1.5105e-09 7.73091 5.47488 0.417314 -1.07407e-09 -1.34452e-09 -1.51048e-09 2.90554 0.965183 0.102902 -1.07406e-09 -1.34452e-09 -1.51048e-09 10.2786 0.731801 0.0259123 -1.07407e-09 -1.34452e-09 -1.51048e-09 2.22167 -0.733487 -0.20892 2.11869e-13 1.13314e-13 -5.21481e-13 15.795 -50.0254 20.401 9.63919 -3.92545 -17.126 1.66557 34.0827 -5.45191 5.07353e-10 -1.35201e-09 -5.81339e-09 7.15729e-10 -2.19799e-09 -1.00422e-08 5.07353e-10 -1.35201e-09 -5.81338e-09 -7.73091 5.47488 -0.417314 5.07355e-10 -1.35201e-09 -5.8134e-09 -2.90554 0.965183 -0.102902 5.07352e-10 -1.35201e-09 -5.81339e-09 -10.2786 0.731801 -0.0259123 5.07361e-10 -1.352e-09 -5.8134e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.8412 -2.01917 14.0042 0.138328 6.19695 1.24285 -36.286 -24.5349 -59.877 2.03217e-16 0.0 3.88251e-19 74.0572 -60.3489 98.8344 1.01354 62.4856 -2.43907 15.1695 -22.9841 30.055
--21.0807 71.874 126.283 186.461 -9.5079 569.768 -8.96678 -12.3383 4.38639 -2.02751 -11.3457 0.287353 3.97795 -4.00355 12.252 -7.73056 -19.386 21.7952 -0.0 0.0 0.0 -0.0 0.0 0.0 5.51616e-14 1.70845e-13 -4.01469e-13 127.663 -32.2919 165.218 -6.59746 -2.3167 11.5577 -26.6819 75.8421 33.8595 -8.96457e-10 -1.41514e-09 -1.52739e-09 -1.63621e-09 -2.19769e-09 -2.57588e-09 -8.96451e-10 -1.41514e-09 -1.52742e-09 7.73091 5.47488 0.417314 -8.96456e-10 -1.41514e-09 -1.5274e-09 2.90554 0.965183 0.102902 -8.9645e-10 -1.41514e-09 -1.5274e-09 10.2786 0.731801 0.0259123 -8.9646e-10 -1.41514e-09 -1.52739e-09 2.22167 -0.733487 -0.20892 5.51477e-14 1.70866e-13 -4.01541e-13 15.9959 -48.6534 20.6193 9.74818 -3.99009 -17.3297 1.51318 32.6894 -5.17148 -6.25116e-10 -2.40977e-11 -4.47929e-09 -1.1961e-09 5.57291e-11 -7.71169e-09 -6.25117e-10 -2.4096e-11 -4.47927e-09 -7.73091 5.47488 -0.417314 -6.25115e-10 -2.40973e-11 -4.4793e-09 -2.90554 0.965183 -0.102902 -6.25119e-10 -2.40966e-11 -4.47929e-09 -10.2786 0.731801 -0.0259123 -6.25109e-10 -2.40954e-11 -4.4793e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3888 -2.0926 14.3155 0.139311 6.15898 1.25089 -37.0155 -24.8823 -60.2071 2.03217e-16 0.0 3.88251e-19 74.177 -60.3067 99.3187 1.01984 62.5809 -2.44666 15.3844 -23.1201 30.3037
--21.0485 71.7471 126.449 186.326 -9.2079 569.828 -9.47323 -12.1212 4.59786 -1.92097 -11.3538 0.369146 3.91486 -4.06707 12.4831 -8.16891 -19.9769 22.1512 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.98891e-14 2.5284e-13 -2.67117e-13 127.719 -32.4128 165.243 -6.56902 -2.30339 11.5065 -26.9722 75.9476 34.1589 -5.65247e-10 -1.17285e-09 -1.01906e-09 -1.03898e-09 -1.80136e-09 -1.72419e-09 -5.65242e-10 -1.17286e-09 -1.01908e-09 7.73091 5.47488 0.417314 -5.65246e-10 -1.17286e-09 -1.01906e-09 2.90554 0.965183 0.102902 -5.6524e-10 -1.17285e-09 -1.01906e-09 10.2786 0.731801 0.0259123 -5.6525e-10 -1.17285e-09 -1.01905e-09 2.22167 -0.733487 -0.20892 -4.99043e-14 2.52868e-13 -2.67167e-13 16.3246 -47.7197 20.8863 9.83912 -4.04424 -17.5002 1.41703 31.724 -4.9842 -1.451e-09 9.49516e-10 -3.18513e-09 -2.58269e-09 1.703e-09 -5.45833e-09 -1.451e-09 9.49518e-10 -3.18511e-09 -7.73091 5.47488 -0.417314 -1.45099e-09 9.49517e-10 -3.18514e-09 -2.90554 0.965183 -0.102902 -1.451e-09 9.49518e-10 -3.18513e-09 -10.2786 0.731801 -0.0259123 -1.45099e-09 9.49518e-10 -3.18514e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9837 -2.16634 14.5485 0.140147 6.12301 1.25767 -37.5399 -25.1677 -60.4068 2.03217e-16 0.0 3.88251e-19 74.2406 -60.2839 99.7359 1.02249 62.6172 -2.44872 15.5251 -23.1306 30.528
--21.0261 71.6687 126.588 186.191 -8.9623 569.883 -9.96229 -11.9419 4.74754 -1.90147 -11.4532 0.412769 3.867 -3.96276 12.678 -8.43452 -20.5998 22.4699 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.19268e-14 3.97291e-13 -7.82784e-14 127.675 -33.0924 165.062 -6.57894 -2.30795 11.5245 -25.9511 75.5727 33.1058 1.08994e-10 -3.37367e-10 5.10769e-10 2.08455e-10 -4.2438e-10 8.567e-10 1.08998e-10 -3.37372e-10 5.10743e-10 7.73091 5.47488 0.417314 1.08994e-10 -3.37368e-10 5.10764e-10 2.90554 0.965183 0.102902 1.09e-10 -3.37367e-10 5.10767e-10 10.2786 0.731801 0.0259123 1.08991e-10 -3.37366e-10 5.10774e-10 2.22167 -0.733487 -0.20892 -8.1971e-14 3.97326e-13 -7.83682e-14 16.8856 -47.4131 21.2448 9.9059 -4.08427 -17.6255 1.38374 31.3703 -4.91701 -1.85737e-09 1.44403e-09 -1.70676e-09 -3.2447e-09 2.52599e-09 -2.89881e-09 -1.85737e-09 1.44403e-09 -1.70674e-09 -7.73091 5.47488 -0.417314 -1.85737e-09 1.44403e-09 -1.70677e-09 -2.90554 0.965183 -0.102902 -1.85738e-09 1.44403e-09 -1.70676e-09 -10.2786 0.731801 -0.0259123 -1.85737e-09 1.44403e-09 -1.70677e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6157 -2.24935 14.6794 0.140816 6.08847 1.26309 -37.7799 -25.3732 -60.4229 2.03217e-16 0.0 3.88251e-19 74.2392 -60.3003 100.091 1.02036 62.577 -2.44372 15.5751 -22.9788 30.7336
--20.9857 71.6198 126.721 185.956 -8.8099 569.965 -10.4529 -11.7903 4.83636 -1.92593 -11.6025 0.427402 3.81867 -3.75255 12.8532 -8.58318 -21.2443 22.7742 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.52039e-14 5.88082e-13 1.62904e-13 127.528 -34.17 164.744 -6.60823 -2.32154 11.5774 -24.1285 74.8346 31.221 1.05335e-09 9.39256e-10 2.80097e-09 1.9652e-09 1.67917e-09 4.7242e-09 1.05335e-09 9.3925e-10 2.80094e-09 7.73091 5.47488 0.417314 1.05335e-09 9.39255e-10 2.80096e-09 2.90554 0.965183 0.102902 1.05335e-09 9.39257e-10 2.80096e-09 10.2786 0.731801 0.0259123 1.05334e-09 9.39259e-10 2.80097e-09 2.22167 -0.733487 -0.20892 -7.52969e-14 5.88126e-13 1.62733e-13 17.5851 -47.4994 21.6572 9.95793 -4.11572 -17.7229 1.38603 31.3959 -4.92179 -2.03005e-09 1.68882e-09 5.33931e-11 -3.49838e-09 2.91584e-09 1.40081e-10 -2.03005e-09 1.68882e-09 5.34017e-11 -7.73091 5.47488 -0.417314 -2.03005e-09 1.68882e-09 5.33829e-11 -2.90554 0.965183 -0.102902 -2.03006e-09 1.68882e-09 5.33888e-11 -10.2786 0.731801 -0.0259123 -2.03005e-09 1.68882e-09 5.33835e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2543 -2.33986 14.7226 0.141435 6.05202 1.26808 -37.8236 -25.5515 -60.2869 2.03217e-16 0.0 3.88251e-19 74.1821 -60.3648 100.409 1.01482 62.4814 -2.43362 15.5669 -22.7151 30.9368
--20.9603 71.6382 126.883 185.565 -8.6049 570.179 -10.9062 -11.6564 4.89726 -1.9619 -11.7304 0.433113 3.77155 -3.52995 13.015 -8.66883 -21.8514 23.0667 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.20233e-14 7.51791e-13 3.68007e-13 127.37 -35.3098 164.383 -6.62528 -2.32953 11.6082 -22.316 73.9989 29.3392 1.89628e-09 2.14038e-09 4.93084e-09 3.53899e-09 3.65881e-09 8.32298e-09 1.89628e-09 2.14037e-09 4.93081e-09 7.73091 5.47488 0.417314 1.89628e-09 2.14038e-09 4.93083e-09 2.90554 0.965183 0.102902 1.89629e-09 2.14038e-09 4.93083e-09 10.2786 0.731801 0.0259123 1.89628e-09 2.14039e-09 4.93084e-09 2.22167 -0.733487 -0.20892 -5.21603e-14 7.51841e-13 3.67754e-13 18.2858 -47.7218 22.0556 10.0025 -4.14286 -17.8063 1.40152 31.5635 -4.95346 -2.08373e-09 1.79267e-09 1.51779e-09 -3.55505e-09 3.06934e-09 2.66586e-09 -2.08373e-09 1.79267e-09 1.51779e-09 -7.73091 5.47488 -0.417314 -2.08373e-09 1.79267e-09 1.51778e-09 -2.90554 0.965183 -0.102902 -2.08374e-09 1.79267e-09 1.51778e-09 -10.2786 0.731801 -0.0259123 -2.08373e-09 1.79267e-09 1.51778e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.9442 -2.41946 14.7207 0.141952 6.01747 1.27219 -37.7746 -25.7109 -60.0855 2.03217e-16 0.0 3.88251e-19 74.0863 -60.4287 100.662 1.00745 62.3542 -2.42043 15.5077 -22.3879 31.1113
--20.9342 71.6726 127.004 185.345 -8.5605 570.271 -11.2837 -11.5301 4.96314 -1.9768 -11.7656 0.44999 3.72837 -3.38821 13.1693 -8.74655 -22.3623 23.348 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.46878e-14 8.14993e-13 4.48607e-13 127.308 -36.1786 164.089 -6.5985 -2.31729 11.5597 -21.0668 73.3536 28.0371 2.26625e-09 2.74937e-09 5.97968e-09 4.23754e-09 4.66407e-09 1.00977e-08 2.26626e-09 2.74937e-09 5.97966e-09 7.73091 5.47488 0.417314 2.26625e-09 2.74937e-09 5.97967e-09 2.90554 0.965183 0.102902 2.26626e-09 2.74937e-09 5.97968e-09 10.2786 0.731801 0.0259123 2.26625e-09 2.74938e-09 5.97968e-09 2.22167 -0.733487 -0.20892 -3.48397e-14 8.15041e-13 4.48309e-13 18.8388 -47.8261 22.363 10.0468 -4.16988 -17.8893 1.40802 31.6359 -4.96704 -2.13311e-09 1.86435e-09 2.10889e-09 -3.62602e-09 3.18325e-09 3.68606e-09 -2.13311e-09 1.86435e-09 2.10889e-09 -7.73091 5.47488 -0.417314 -2.13311e-09 1.86435e-09 2.10888e-09 -2.90554 0.965183 -0.102902 -2.13312e-09 1.86435e-09 2.10888e-09 -10.2786 0.731801 -0.0259123 -2.13311e-09 1.86435e-09 2.10888e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.7301 -2.4697 14.7165 0.142314 5.9886 1.27498 -37.7377 -25.8603 -59.907 2.03217e-16 0.0 3.88251e-19 73.9668 -60.4436 100.822 0.999763 62.219 -2.40609 15.4064 -22.0452 31.231
--20.8676 71.6803 127.079 185.319 -8.6036 570.241 -11.6079 -11.4154 5.03104 -1.94232 -11.6533 0.48437 3.67854 -3.37445 13.3267 -8.80566 -22.7933 23.6386 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.06704e-14 7.48775e-13 3.39793e-13 127.398 -36.7199 163.94 -6.50725 -2.27519 11.395 -20.2411 72.8928 27.174 1.9529e-09 2.64153e-09 5.64381e-09 3.68328e-09 4.49996e-09 9.53952e-09 1.9529e-09 2.64153e-09 5.64379e-09 7.73091 5.47488 0.417314 1.9529e-09 2.64154e-09 5.6438e-09 2.90554 0.965183 0.102902 1.9529e-09 2.64154e-09 5.64381e-09 10.2786 0.731801 0.0259123 1.95289e-09 2.64154e-09 5.64381e-09 2.22167 -0.733487 -0.20892 -2.07906e-14 7.48806e-13 3.39511e-13 19.2264 -47.7536 22.6043 10.0971 -4.20063 -17.9837 1.3986 31.5436 -4.94909 -2.26125e-09 1.94422e-09 1.35264e-09 -3.86623e-09 3.33629e-09 2.38547e-09 -2.26125e-09 1.94422e-09 1.35264e-09 -7.73091 5.47488 -0.417314 -2.26125e-09 1.94422e-09 1.35263e-09 -2.90554 0.965183 -0.102902 -2.26125e-09 1.94422e-09 1.35264e-09 -10.2786 0.731801 -0.0259123 -2.26125e-09 1.94422e-09 1.35263e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.6132 -2.48426 14.7252 0.142493 5.96506 1.27626 -37.7267 -26.0155 -59.75 2.03217e-16 0.0 3.88251e-19 73.7888 -60.3718 100.882 0.991293 62.0648 -2.38885 15.2271 -21.6345 31.2782
--20.7579 71.7017 127.154 185.318 -8.6636 570.22 -11.8881 -11.3155 5.08735 -1.88267 -11.4435 0.525158 3.62541 -3.43129 13.4809 -8.82721 -23.1657 23.9294 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.00914e-16 5.95408e-13 1.02501e-13 127.582 -37.102 163.87 -6.37204 -2.21284 11.1518 -19.5702 72.4966 26.4711 1.19147e-09 2.08805e-09 4.43366e-09 2.30973e-09 3.60944e-09 7.50928e-09 1.19147e-09 2.08805e-09 4.43364e-09 7.73091 5.47488 0.417314 1.19147e-09 2.08805e-09 4.43365e-09 2.90554 0.965183 0.102902 1.19148e-09 2.08805e-09 4.43365e-09 10.2786 0.731801 0.0259123 1.19146e-09 2.08805e-09 4.43365e-09 2.22167 -0.733487 -0.20892 -9.59665e-16 5.95411e-13 1.02272e-13 19.5192 -47.6377 22.8044 10.1481 -4.23196 -18.0795 1.38561 31.4153 -4.92421 -2.38948e-09 1.97048e-09 -3.36258e-10 -4.13012e-09 3.41476e-09 -5.23077e-10 -2.38948e-09 1.97048e-09 -3.3626e-10 -7.73091 5.47488 -0.417314 -2.38948e-09 1.97048e-09 -3.36265e-10 -2.90554 0.965183 -0.102902 -2.38949e-09 1.97048e-09 -3.36263e-10 -10.2786 0.731801 -0.0259123 -2.38948e-09 1.97048e-09 -3.36266e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.5731 -2.47348 14.7227 0.142518 5.94527 1.27628 -37.6902 -26.1672 -59.5754 2.03217e-16 0.0 3.88251e-19 73.5568 -60.2479 100.854 0.981674 61.8848 -2.36857 14.9793 -21.1518 31.2724
--20.7184 71.7835 127.196 185.112 -8.5626 570.18 -12.0669 -11.2189 5.14892 -1.84383 -11.2219 0.566335 3.5927 -3.4952 13.613 -8.85652 -23.4287 24.1753 -0.0 0.0 0.0 -0.0 0.0 0.0 1.21319e-14 3.88244e-13 -1.6292e-13 127.803 -37.3307 163.777 -6.22311 -2.14446 10.8848 -19.2405 72.2952 26.1253 2.78845e-10 1.16609e-09 2.6497e-09 6.41331e-10 2.09905e-09 4.5063e-09 2.7885e-10 1.1661e-09 2.64969e-09 7.73091 5.47488 0.417314 2.78845e-10 1.1661e-09 2.64969e-09 2.90554 0.965183 0.102902 2.78855e-10 1.1661e-09 2.6497e-09 10.2786 0.731801 0.0259123 2.78842e-10 1.1661e-09 2.6497e-09 2.22167 -0.733487 -0.20892 1.21382e-14 3.88221e-13 -1.63095e-13 19.6949 -47.514 22.8818 10.1898 -4.25759 -18.1578 1.37511 31.3107 -4.90398 -2.38992e-09 1.89868e-09 -2.2022e-09 -4.17822e-09 3.32683e-09 -3.73998e-09 -2.38992e-09 1.89867e-09 -2.2022e-09 -7.73091 5.47488 -0.417314 -2.38992e-09 1.89867e-09 -2.20221e-09 -2.90554 0.965183 -0.102902 -2.38992e-09 1.89867e-09 -2.2022e-09 -10.2786 0.731801 -0.0259123 -2.38991e-09 1.89868e-09 -2.20221e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.6228 -2.44376 14.6926 0.142419 5.93124 1.27529 -37.6364 -26.2865 -59.416 2.03217e-16 0.0 3.88251e-19 73.3447 -60.1317 100.748 0.972381 61.709 -2.34946 14.74 -20.7173 31.2412
--20.6492 71.85 127.178 185.279 -8.6309 570.072 -12.0868 -11.1145 5.23258 -1.87148 -11.0746 0.601933 3.60345 -3.50283 13.7038 -8.94048 -23.5323 24.33 -0.0 0.0 0.0 -0.0 0.0 0.0 5.93944e-15 1.60636e-13 -3.56123e-13 128.001 -37.4115 163.559 -6.09115 -2.08444 10.6488 -19.4364 72.4193 26.3312 -4.88082e-10 -4.71605e-11 5.92426e-10 -7.97476e-10 7.52837e-11 1.02989e-09 -4.88077e-10 -4.71565e-11 5.92416e-10 7.73091 5.47488 0.417314 -4.88083e-10 -4.7158e-11 5.9242e-10 2.90554 0.965183 0.102902 -4.88072e-10 -4.71591e-11 5.92419e-10 10.2786 0.731801 0.0259123 -4.88085e-10 -4.71605e-11 5.9242e-10 2.22167 -0.733487 -0.20892 5.98824e-15 1.606e-13 -3.56272e-13 19.7326 -47.4174 22.756 10.212 -4.27128 -18.1997 1.37296 31.2895 -4.89988 -2.13466e-09 1.68436e-09 -3.48957e-09 -3.77105e-09 2.98067e-09 -5.96565e-09 -2.13467e-09 1.68436e-09 -3.48957e-09 -7.73091 5.47488 -0.417314 -2.13466e-09 1.68436e-09 -3.48958e-09 -2.90554 0.965183 -0.102902 -2.13467e-09 1.68436e-09 -3.48958e-09 -10.2786 0.731801 -0.0259123 -2.13466e-09 1.68437e-09 -3.48958e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.7751 -2.4015 14.6182 0.142222 5.92494 1.27355 -37.5737 -26.3452 -59.3044 2.03217e-16 0.0 3.88251e-19 73.2255 -60.0826 100.569 0.9647 61.5675 -2.33552 14.5849 -20.4512 31.2094
--20.5275 71.87 127.151 185.728 -8.8924 569.932 -11.8676 -10.9879 5.32718 -1.99104 -11.0212 0.625167 3.68829 -3.44749 13.7471 -9.11846 -23.4295 24.3672 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.24831e-14 -1.53124e-13 -4.65372e-13 128.168 -37.295 163.17 -5.98155 -2.03536 10.4528 -20.343 72.9559 27.2812 -1.14758e-09 -2.08329e-09 -2.40973e-09 -2.11647e-09 -3.36904e-09 -4.06479e-09 -1.14758e-09 -2.08328e-09 -2.40974e-09 7.73091 5.47488 0.417314 -1.14759e-09 -2.08329e-09 -2.40973e-09 2.90554 0.965183 0.102902 -1.14758e-09 -2.08329e-09 -2.40973e-09 10.2786 0.731801 0.0259123 -1.14759e-09 -2.08329e-09 -2.40973e-09 2.22167 -0.733487 -0.20892 -3.24225e-14 -1.53152e-13 -4.65543e-13 19.6126 -47.3214 22.3909 10.2064 -4.26778 -18.1892 1.38259 31.3858 -4.91847 -1.39624e-09 1.19623e-09 -4.06473e-09 -2.51341e-09 2.14608e-09 -6.97524e-09 -1.39624e-09 1.19623e-09 -4.06473e-09 -7.73091 5.47488 -0.417314 -1.39624e-09 1.19623e-09 -4.06473e-09 -2.90554 0.965183 -0.102902 -1.39625e-09 1.19623e-09 -4.06473e-09 -10.2786 0.731801 -0.0259123 -1.39624e-09 1.19623e-09 -4.06474e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.0864 -2.33325 14.4746 0.141902 5.92992 1.27085 -37.5114 -26.3323 -59.2606 2.03217e-16 0.0 3.88251e-19 73.2446 -60.1156 100.292 0.959698 61.4841 -2.32918 14.5396 -20.4144 31.1665
--20.4458 71.9155 127.121 186.012 -9.2071 569.767 -11.4616 -10.849 5.42895 -2.17357 -11.017 0.640979 3.82664 -3.3596 13.7534 -9.35818 -23.1592 24.3155 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.32502e-14 -5.45958e-13 -5.39179e-13 128.337 -36.9944 162.676 -5.879 -1.99 10.2695 -21.9368 73.808 28.9444 -1.81885e-09 -4.7994e-09 -6.26646e-09 -3.51214e-09 -7.97886e-09 -1.0618e-08 -1.81885e-09 -4.7994e-09 -6.26647e-09 7.73091 5.47488 0.417314 -1.81886e-09 -4.7994e-09 -6.26645e-09 2.90554 0.965183 0.102902 -1.81885e-09 -4.7994e-09 -6.26646e-09 10.2786 0.731801 0.0259123 -1.81886e-09 -4.7994e-09 -6.26645e-09 2.22167 -0.733487 -0.20892 -9.31942e-14 -5.45965e-13 -5.39399e-13 19.3538 -47.2166 21.8363 10.1802 -4.25163 -18.1399 1.40038 31.5617 -4.95258 -3.07319e-10 4.97804e-10 -4.30803e-09 -6.43452e-10 9.40621e-10 -7.4213e-09 -3.07319e-10 4.97803e-10 -4.30803e-09 -7.73091 5.47488 -0.417314 -3.07315e-10 4.97803e-10 -4.30804e-09 -2.90554 0.965183 -0.102902 -3.07323e-10 4.97804e-10 -4.30804e-09 -10.2786 0.731801 -0.0259123 -3.07313e-10 4.97809e-10 -4.30804e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.5326 -2.24051 14.2775 0.141456 5.94412 1.26715 -37.4431 -26.2641 -59.2638 2.03217e-16 0.0 3.88251e-19 73.3524 -60.1982 99.92 0.956289 61.4375 -2.32769 14.5616 -20.533 31.1035
--20.3801 71.9517 127.083 186.216 -9.6306 569.543 -11.0111 -10.7223 5.56567 -2.38297 -11.0511 0.661032 3.96448 -3.23157 13.729 -9.5987 -22.7998 24.2117 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.54515e-13 -8.75331e-13 -5.67563e-13 128.515 -36.6092 162.136 -5.78353 -1.94814 10.0989 -24.1251 74.827 31.2169 -2.32639e-09 -7.10662e-09 -9.53448e-09 -4.59013e-09 -1.19043e-08 -1.61738e-08 -2.32639e-09 -7.10661e-09 -9.5345e-09 7.73091 5.47488 0.417314 -2.32639e-09 -7.10662e-09 -9.53447e-09 2.90554 0.965183 0.102902 -2.32639e-09 -7.10662e-09 -9.53448e-09 10.2786 0.731801 0.0259123 -2.3264e-09 -7.10662e-09 -9.53447e-09 2.22167 -0.733487 -0.20892 -1.54473e-13 -8.75315e-13 -5.67834e-13 18.9915 -47.1636 21.1385 10.1471 -4.23127 -18.0777 1.42161 31.769 -4.99296 7.19783e-10 -1.63119e-10 -4.23494e-09 1.12822e-09 -2.05966e-10 -7.32031e-09 7.19784e-10 -1.63119e-10 -4.23494e-09 -7.73091 5.47488 -0.417314 7.19787e-10 -1.63119e-10 -4.23495e-09 -2.90554 0.965183 -0.102902 7.1978e-10 -1.63119e-10 -4.23494e-09 -10.2786 0.731801 -0.0259123 7.19789e-10 -1.63115e-10 -4.23495e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0061 -2.15214 14.0715 0.14095 5.96109 1.26295 -37.3532 -26.1531 -59.2854 2.03217e-16 0.0 3.88251e-19 73.4786 -60.319 99.5041 0.952486 61.3902 -2.32728 14.6242 -20.7253 31.0476
--20.3366 72.0048 127.07 186.271 -9.9094 569.39 -10.6583 -10.6324 5.76512 -2.58316 -11.1126 0.696988 4.04789 -3.05576 13.68 -9.77972 -22.4297 24.0922 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.94432e-13 -9.98707e-13 -5.40545e-13 128.701 -36.2386 161.608 -5.69516 -1.90957 9.94125 -26.7545 75.8692 33.9345 -2.49469e-09 -7.91607e-09 -1.07705e-08 -4.95606e-09 -1.32955e-08 -1.82758e-08 -2.49469e-09 -7.91606e-09 -1.07705e-08 7.73091 5.47488 0.417314 -2.4947e-09 -7.91608e-09 -1.07705e-08 2.90554 0.965183 0.102902 -2.49469e-09 -7.91607e-09 -1.07705e-08 10.2786 0.731801 0.0259123 -2.4947e-09 -7.91607e-09 -1.07705e-08 2.22167 -0.733487 -0.20892 -1.94404e-13 -9.9868e-13 -5.40843e-13 18.5558 -47.2241 20.3399 10.121 -4.21517 -18.0285 1.4413 31.9592 -5.03019 1.27274e-09 -5.38743e-10 -3.8609e-09 2.09101e-09 -8.63934e-10 -6.68878e-09 1.27274e-09 -5.38742e-10 -3.8609e-09 -7.73091 5.47488 -0.417314 1.27275e-09 -5.38742e-10 -3.86091e-09 -2.90554 0.965183 -0.102902 1.27274e-09 -5.38742e-10 -3.8609e-09 -10.2786 0.731801 -0.0259123 1.27275e-09 -5.38739e-10 -3.86091e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3984 -2.0972 13.9012 0.140448 5.97442 1.25873 -37.2262 -26.0117 -59.2972 2.03217e-16 0.0 3.88251e-19 73.5536 -60.4676 99.0964 0.946343 61.3048 -2.32426 14.7009 -20.9094 31.0257
--20.2488 72.0438 127.125 186.485 -10.0577 569.375 -10.4188 -10.5958 6.08103 -2.7919 -11.2278 0.75977 4.0564 -2.7594 13.5918 -9.87626 -22.1089 23.9424 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.99378e-13 -7.93213e-13 -4.18523e-13 128.957 -35.8011 161.105 -5.61267 -1.87379 9.79422 -30.4061 77.0617 37.6908 -2.14125e-09 -6.2562e-09 -8.71152e-09 -4.21484e-09 -1.05105e-08 -1.47757e-08 -2.14124e-09 -6.25619e-09 -8.71153e-09 7.73091 5.47488 0.417314 -2.14125e-09 -6.2562e-09 -8.71151e-09 2.90554 0.965183 0.102902 -2.14125e-09 -6.2562e-09 -8.71152e-09 10.2786 0.731801 0.0259123 -2.14126e-09 -6.2562e-09 -8.7115e-09 2.22167 -0.733487 -0.20892 -1.99366e-13 -7.93194e-13 -4.1881e-13 17.9996 -47.4467 19.3565 10.1029 -4.20413 -17.9947 1.46025 32.1414 -5.06595 1.1114e-09 -5.007e-10 -2.94047e-09 1.83777e-09 -8.1524e-10 -5.0976e-09 1.11139e-09 -5.00697e-10 -2.94047e-09 -7.73091 5.47488 -0.417314 1.1114e-09 -5.007e-10 -2.94048e-09 -2.90554 0.965183 -0.102902 1.1114e-09 -5.007e-10 -2.94048e-09 -10.2786 0.731801 -0.0259123 1.11141e-09 -5.00697e-10 -2.94048e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.6976 -2.09437 13.7952 0.139877 5.98674 1.25393 -37.0128 -25.7814 -59.3065 2.03217e-16 0.0 3.88251e-19 73.5967 -60.6557 98.7042 0.937145 61.1714 -2.31868 14.8139 -21.1107 31.0537
--20.1712 72.0557 127.215 186.666 -10.1483 569.418 -10.2237 -10.5958 6.48321 -3.01895 -11.3928 0.84063 4.02212 -2.36982 13.467 -9.922 -21.7818 23.7516 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.83605e-13 -3.63154e-13 -2.19132e-13 129.266 -35.2805 160.599 -5.53654 -1.8411 9.65851 -35.5933 78.3666 42.9996 -1.4049e-09 -2.9348e-09 -4.41994e-09 -2.67346e-09 -4.91885e-09 -7.48111e-09 -1.40489e-09 -2.9348e-09 -4.41994e-09 7.73091 5.47488 0.417314 -1.4049e-09 -2.9348e-09 -4.41993e-09 2.90554 0.965183 0.102902 -1.4049e-09 -2.9348e-09 -4.41993e-09 10.2786 0.731801 0.0259123 -1.4049e-09 -2.9348e-09 -4.41992e-09 2.22167 -0.733487 -0.20892 -1.83612e-13 -3.63155e-13 -2.19387e-13 17.3099 -47.782 18.1853 10.0865 -4.19413 -17.9639 1.48046 32.334 -5.1039 4.9906e-10 -2.01912e-10 -1.54861e-09 8.20036e-10 -3.23563e-10 -2.68247e-09 4.99044e-10 -2.01905e-10 -1.54861e-09 -7.73091 5.47488 -0.417314 4.99062e-10 -2.01911e-10 -1.54862e-09 -2.90554 0.965183 -0.102902 4.99056e-10 -2.01912e-10 -1.54861e-09 -10.2786 0.731801 -0.0259123 4.99065e-10 -2.01911e-10 -1.54862e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.9554 -2.12465 13.7241 0.139233 6.00004 1.24851 -36.7363 -25.4767 -59.3252 2.03217e-16 0.0 3.88251e-19 73.6291 -60.8838 98.298 0.926041 61.01 -2.31224 14.968 -21.357 31.1148
--20.1019 72.0627 127.212 186.768 -10.3506 569.255 -10.0884 -10.6068 6.87356 -3.21645 -11.5513 0.921668 3.96882 -2.02979 13.3373 -9.94562 -21.3545 23.5619 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.67072e-13 9.32311e-14 -1.82521e-14 129.5 -34.8727 160.081 -5.46935 -1.81242 9.53882 -41.4058 79.4459 48.9222 -5.92161e-10 4.67975e-10 5.91546e-11 -9.90616e-10 8.12252e-10 1.29453e-10 -5.92159e-10 4.67971e-10 5.91553e-11 7.73091 5.47488 0.417314 -5.92163e-10 4.6797e-10 5.91611e-11 2.90554 0.965183 0.102902 -5.9216e-10 4.67973e-10 5.91585e-11 10.2786 0.731801 0.0259123 -5.92167e-10 4.67976e-10 5.91669e-11 2.22167 -0.733487 -0.20892 -1.67102e-13 9.32104e-14 -1.84711e-14 16.5705 -48.15 16.9925 10.0738 -4.1864 -17.94 1.49842 32.503 -5.13739 -2.2139e-10 1.83486e-10 -1.81323e-10 -3.84753e-10 3.18261e-10 -3.07102e-10 -2.21413e-10 1.83496e-10 -1.8132e-10 -7.73091 5.47488 -0.417314 -2.21388e-10 1.83486e-10 -1.81329e-10 -2.90554 0.965183 -0.102902 -2.21393e-10 1.83486e-10 -1.81326e-10 -10.2786 0.731801 -0.0259123 -2.21384e-10 1.83486e-10 -1.81332e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.1587 -2.16056 13.6455 0.13868 6.00687 1.2438 -36.4907 -25.2189 -59.3295 2.03217e-16 0.0 3.88251e-19 73.5864 -61.1254 97.8776 0.913946 60.8275 -2.30367 15.1115 -21.5696 31.1866
--20.0362 72.0964 127.193 186.716 -10.5917 569.069 -10.0292 -10.6038 7.15385 -3.33707 -11.647 0.984879 3.91833 -1.88258 13.2336 -9.97589 -20.7334 23.4165 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.6974e-13 3.77704e-13 1.08238e-13 129.519 -34.7714 159.537 -5.41372 -1.78871 9.43985 -45.8143 80.0706 53.4013 -9.56076e-12 2.37197e-09 2.68069e-09 1.74958e-10 4.01547e-09 4.57758e-09 -9.55916e-12 2.37197e-09 2.68069e-09 7.73091 5.47488 0.417314 -9.56174e-12 2.37197e-09 2.68069e-09 2.90554 0.965183 0.102902 -9.55837e-12 2.37197e-09 2.68069e-09 10.2786 0.731801 0.0259123 -9.56572e-12 2.37197e-09 2.6807e-09 2.22167 -0.733487 -0.20892 -1.69795e-13 3.77677e-13 1.08039e-13 15.8781 -48.4762 15.9548 10.0669 -4.18219 -17.927 1.51042 32.6147 -5.1596 -7.07061e-10 4.81357e-10 6.65369e-10 -1.19915e-09 8.17396e-10 1.1648e-09 -7.07088e-10 4.81368e-10 6.65372e-10 -7.73091 5.47488 -0.417314 -7.07059e-10 4.81357e-10 6.65362e-10 -2.90554 0.965183 -0.102902 -7.07065e-10 4.81356e-10 6.65366e-10 -10.2786 0.731801 -0.0259123 -7.07055e-10 4.81359e-10 6.65359e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.2948 -2.17462 13.5169 0.138377 5.99977 1.24112 -36.3698 -25.128 -59.293 2.03217e-16 0.0 3.88251e-19 73.4058 -61.3539 97.4446 0.901805 60.6309 -2.29175 15.192 -21.6701 31.2457
--19.968 72.1447 127.224 186.693 -10.7769 569.042 -10.0803 -10.5829 7.27425 -3.33041 -11.6462 1.02475 3.85217 -2.01347 13.1688 -10.0133 -19.8312 23.3502 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.0426e-13 4.037e-13 1.24735e-13 129.249 -35.0149 158.948 -5.37257 -1.7712 9.36672 -47.7187 80.2969 55.3332 2.97619e-10 1.97988e-09 2.48535e-09 6.8125e-10 3.33892e-09 4.22595e-09 2.97621e-10 1.97987e-09 2.48535e-09 7.73091 5.47488 0.417314 2.97619e-10 1.97987e-09 2.48535e-09 2.90554 0.965183 0.102902 2.97624e-10 1.97987e-09 2.48535e-09 10.2786 0.731801 0.0259123 2.97614e-10 1.97988e-09 2.48536e-09 2.22167 -0.733487 -0.20892 -2.0436e-13 4.03688e-13 1.24531e-13 15.2462 -48.76 15.1475 10.0682 -4.18296 -17.9294 1.51329 32.641 -5.16485 -7.85965e-10 5.99663e-10 7.50102e-10 -1.33318e-09 1.01853e-09 1.31271e-09 -7.85988e-10 5.99673e-10 7.50106e-10 -7.73091 5.47488 -0.417314 -7.85963e-10 5.99663e-10 7.50096e-10 -2.90554 0.965183 -0.102902 -7.85968e-10 5.99662e-10 7.50099e-10 -10.2786 0.731801 -0.0259123 -7.85958e-10 5.9967e-10 7.50092e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.3453 -2.16224 13.3214 0.138442 5.97114 1.24141 -36.4496 -25.2979 -59.1961 2.03217e-16 0.0 3.88251e-19 73.0324 -61.5719 96.9839 0.888923 60.4009 -2.27412 15.1875 -21.5975 31.3075
--19.9075 72.1738 127.212 186.651 -11.0774 568.911 -10.2232 -10.5568 7.29503 -3.23462 -11.5853 1.05106 3.76553 -2.33066 13.125 -10.0464 -18.7201 23.3378 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.57544e-13 2.88179e-13 7.68303e-14 128.758 -35.5003 158.315 -5.34386 -1.75909 9.31562 -47.6519 80.2851 55.2649 4.80706e-10 2.59752e-10 7.01826e-10 8.68363e-10 4.1869e-10 1.16631e-09 4.80709e-10 2.59749e-10 7.01826e-10 7.73091 5.47488 0.417314 4.80705e-10 2.5975e-10 7.01826e-10 2.90554 0.965183 0.102902 4.80712e-10 2.5975e-10 7.01828e-10 10.2786 0.731801 0.0259123 4.807e-10 2.59753e-10 7.01834e-10 2.22167 -0.733487 -0.20892 -2.57701e-13 2.88196e-13 7.66066e-14 14.6318 -49.0396 14.4711 10.0759 -4.18766 -17.9439 1.50956 32.6063 -5.15796 -6.67824e-10 6.46478e-10 3.73783e-10 -1.14013e-09 1.10359e-09 6.60662e-10 -6.6784e-10 6.46484e-10 3.73789e-10 -7.73091 5.47488 -0.417314 -6.67823e-10 6.46477e-10 3.73778e-10 -2.90554 0.965183 -0.102902 -6.67827e-10 6.46476e-10 3.73781e-10 -10.2786 0.731801 -0.0259123 -6.67816e-10 6.46494e-10 3.73773e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.3222 -2.13709 13.0836 0.138766 5.92682 1.24378 -36.662 -25.645 -59.0574 2.03217e-16 0.0 3.88251e-19 72.5116 -61.79 96.499 0.87535 60.1407 -2.25234 15.128 -21.4071 31.377
--19.869 72.1971 127.225 186.492 -11.2748 568.892 -10.395 -10.5257 7.28307 -3.13532 -11.5129 1.0687 3.70005 -2.71196 13.086 -10.0852 -17.5453 23.3312 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.10941e-13 1.38194e-13 1.04385e-14 128.125 -36.209 157.657 -5.32269 -1.75022 9.27791 -45.517 80.0232 53.0983 5.28092e-10 -1.72049e-09 -1.43295e-09 8.00757e-10 -2.93055e-09 -2.4862e-09 5.28096e-10 -1.72049e-09 -1.43295e-09 7.73091 5.47488 0.417314 5.28092e-10 -1.72049e-09 -1.43295e-09 2.90554 0.965183 0.102902 5.28101e-10 -1.72049e-09 -1.43294e-09 10.2786 0.731801 0.0259123 5.28087e-10 -1.72049e-09 -1.43294e-09 2.22167 -0.733487 -0.20892 -3.1114e-13 1.38239e-13 1.01955e-14 14.0566 -49.3019 13.8476 10.086 -4.19379 -17.9628 1.50407 32.5552 -5.14779 -5.82324e-10 7.47831e-10 -1.46201e-10 -1.00751e-09 1.28558e-09 -2.38164e-10 -5.82332e-10 7.47833e-10 -1.46193e-10 -7.73091 5.47488 -0.417314 -5.82322e-10 7.4783e-10 -1.46205e-10 -2.90554 0.965183 -0.102902 -5.82327e-10 7.4783e-10 -1.46201e-10 -10.2786 0.731801 -0.0259123 -5.82315e-10 7.47854e-10 -1.46211e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.2584 -2.09904 12.823 0.13917 5.87957 1.24677 -36.8855 -26.0214 -58.906 2.03217e-16 0.0 3.88251e-19 71.9337 -61.994 96.0223 0.86298 59.8913 -2.23089 15.0392 -21.1955 31.4149
--19.8799 72.2424 127.262 186.149 -11.3331 568.895 -10.533 -10.49 7.3052 -3.11804 -11.4777 1.08256 3.69743 -3.03517 13.0353 -10.1357 -16.4501 23.2786 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.45798e-13 6.08002e-14 -2.85256e-14 127.429 -37.1235 156.993 -5.30416 -1.74245 9.24494 -41.5409 79.4605 49.059 4.28173e-10 -2.89295e-09 -2.68204e-09 5.42895e-10 -4.89413e-09 -4.61644e-09 4.28177e-10 -2.89295e-09 -2.68205e-09 7.73091 5.47488 0.417314 4.28172e-10 -2.89295e-09 -2.68204e-09 2.90554 0.965183 0.102902 4.28182e-10 -2.89295e-09 -2.68204e-09 10.2786 0.731801 0.0259123 4.28167e-10 -2.89295e-09 -2.68203e-09 2.22167 -0.733487 -0.20892 -3.45996e-13 6.08549e-14 -2.87741e-14 13.541 -49.5317 13.1976 10.0943 -4.19886 -17.9784 1.5016 32.5322 -5.14321 -7.59146e-10 1.02975e-09 -4.92461e-10 -1.32281e-09 1.7775e-09 -8.30595e-10 -7.59149e-10 1.02975e-09 -4.92452e-10 -7.73091 5.47488 -0.417314 -7.59145e-10 1.02975e-09 -4.92464e-10 -2.90554 0.965183 -0.102902 -7.5915e-10 1.02975e-09 -4.92461e-10 -10.2786 0.731801 -0.0259123 -7.59138e-10 1.02978e-09 -4.92471e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.1867 -2.04797 12.559 0.139468 5.84217 1.24893 -36.9995 -26.2772 -58.7676 2.03217e-16 0.0 3.88251e-19 71.3912 -62.1704 95.5887 0.853436 59.6939 -2.21401 14.9477 -21.0586 31.3812
--19.8616 72.2699 127.281 185.915 -11.4686 568.86 -10.6109 -10.4589 7.37167 -3.23546 -11.4925 1.08763 3.78327 -3.28594 12.9631 -10.1723 -15.4196 23.1535 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.65179e-13 1.14852e-13 -1.71328e-14 126.64 -38.3657 156.296 -5.27985 -1.7322 9.20178 -35.6422 78.3797 43.05 8.60658e-11 -2.79366e-09 -2.52617e-09 -3.26268e-11 -4.66559e-09 -4.33117e-09 8.60704e-11 -2.79366e-09 -2.52618e-09 7.73091 5.47488 0.417314 8.60652e-11 -2.79366e-09 -2.52617e-09 2.90554 0.965183 0.102902 8.6075e-11 -2.79366e-09 -2.52617e-09 10.2786 0.731801 0.0259123 8.60626e-11 -2.79366e-09 -2.52616e-09 2.22167 -0.733487 -0.20892 -3.65299e-13 1.14887e-13 -1.7361e-14 13.1007 -49.7828 12.4821 10.0941 -4.19874 -17.9782 1.51114 32.6189 -5.16059 -1.53222e-09 1.78788e-09 -4.72953e-10 -2.65761e-09 3.08711e-09 -7.76736e-10 -1.53222e-09 1.78788e-09 -4.72943e-10 -7.73091 5.47488 -0.417314 -1.53222e-09 1.78788e-09 -4.72955e-10 -2.90554 0.965183 -0.102902 -1.53222e-09 1.78788e-09 -4.72953e-10 -10.2786 0.731801 -0.0259123 -1.53221e-09 1.7879e-09 -4.72961e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.1117 -1.97989 12.2722 0.139588 5.81861 1.24972 -36.9572 -26.3526 -58.6488 2.03217e-16 0.0 3.88251e-19 70.8863 -62.3178 95.2026 0.847232 59.564 -2.20287 14.8481 -21.046 31.2205
--19.8616 72.2833 127.261 185.693 -11.6199 568.811 -10.6652 -10.4292 7.44936 -3.43196 -11.5314 1.08341 3.93036 -3.52337 12.8799 -10.1969 -14.3934 22.9882 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.76352e-13 2.33151e-13 1.65675e-14 125.706 -39.8992 155.539 -5.25473 -1.72161 9.15725 -29.2526 76.7285 36.5076 -4.61443e-10 -2.05191e-09 -1.68817e-09 -9.1199e-10 -3.32027e-09 -2.8682e-09 -4.61439e-10 -2.05191e-09 -1.68818e-09 7.73091 5.47488 0.417314 -4.61444e-10 -2.05191e-09 -1.68818e-09 2.90554 0.965183 0.102902 -4.61436e-10 -2.05191e-09 -1.68817e-09 10.2786 0.731801 0.0259123 -4.61443e-10 -2.05191e-09 -1.68817e-09 2.22167 -0.733487 -0.20892 -3.7634e-13 2.33148e-13 1.63749e-14 12.7207 -50.0435 11.7487 10.0896 -4.19591 -17.9698 1.52772 32.7684 -5.19064 -2.68814e-09 2.86765e-09 -2.92754e-10 -4.64915e-09 4.95047e-09 -4.35742e-10 -2.68814e-09 2.86765e-09 -2.92743e-10 -7.73091 5.47488 -0.417314 -2.68814e-09 2.86765e-09 -2.92753e-10 -2.90554 0.965183 -0.102902 -2.68815e-09 2.86765e-09 -2.92753e-10 -10.2786 0.731801 -0.0259123 -2.68814e-09 2.86766e-09 -2.9276e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 15.0178 -1.89603 11.9604 0.139635 5.80189 1.24996 -36.8284 -26.3332 -58.5352 2.03217e-16 0.0 3.88251e-19 70.3802 -62.4433 94.8504 0.843268 59.4783 -2.195 14.7302 -21.0983 30.9689
--19.9035 72.2837 127.226 185.384 -11.8371 568.737 -10.7283 -10.3825 7.54001 -3.63068 -11.5851 1.08157 4.10141 -3.73546 12.7992 -10.2565 -13.4456 22.8142 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.66973e-13 3.33671e-13 4.20212e-14 124.688 -41.4716 154.748 -5.24408 -1.71714 9.13834 -24.0083 74.7908 31.0969 -1.02846e-09 -1.23963e-09 -7.94324e-10 -1.8189e-09 -1.86622e-09 -1.30897e-09 -1.02846e-09 -1.23963e-09 -7.94331e-10 7.73091 5.47488 0.417314 -1.02846e-09 -1.23963e-09 -7.94327e-10 2.90554 0.965183 0.102902 -1.02845e-09 -1.23963e-09 -7.94325e-10 10.2786 0.731801 0.0259123 -1.02846e-09 -1.23963e-09 -7.94318e-10 2.22167 -0.733487 -0.20892 -3.66836e-13 3.33631e-13 4.18613e-14 12.3823 -50.2004 11.0532 10.0927 -4.19779 -17.9756 1.53473 32.8321 -5.20342 -3.63564e-09 3.7198e-09 -2.30156e-10 -6.28346e-09 6.42311e-09 -3.0301e-10 -3.63564e-09 3.7198e-09 -2.30146e-10 -7.73091 5.47488 -0.417314 -3.63564e-09 3.7198e-09 -2.30153e-10 -2.90554 0.965183 -0.102902 -3.63565e-09 3.7198e-09 -2.30156e-10 -10.2786 0.731801 -0.0259123 -3.63564e-09 3.71981e-09 -2.3016e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.9071 -1.80432 11.6691 0.139683 5.78825 1.25025 -36.6687 -26.2855 -58.4187 2.03217e-16 0.0 3.88251e-19 69.9045 -62.5469 94.541 0.840646 59.419 -2.18904 14.6143 -21.1472 30.7232
--19.8677 72.2222 127.223 185.425 -12.0962 568.716 -10.8323 -10.3005 7.64535 -3.7547 -11.6439 1.09378 4.25939 -3.91011 12.7343 -10.4014 -12.6515 22.6599 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.24697e-13 3.34386e-13 2.86747e-14 123.671 -42.8338 153.979 -5.26314 -1.72527 9.17207 -20.3435 72.9536 27.2814 -1.42909e-09 -9.28764e-10 -4.70887e-10 -2.47707e-09 -1.3115e-09 -7.34923e-10 -1.42909e-09 -9.28767e-10 -4.70894e-10 7.73091 5.47488 0.417314 -1.42909e-09 -9.28765e-10 -4.70891e-10 2.90554 0.965183 0.102902 -1.42909e-09 -9.28764e-10 -4.70889e-10 10.2786 0.731801 0.0259123 -1.42909e-09 -9.28763e-10 -4.70881e-10 2.22167 -0.733487 -0.20892 -3.24505e-13 3.34327e-13 2.85256e-14 12.0755 -50.141 10.4582 10.1154 -4.21177 -18.018 1.51544 32.6614 -5.1689 -3.78343e-09 3.79508e-09 -5.63454e-10 -6.5466e-09 6.56055e-09 -8.73938e-10 -3.78343e-09 3.79509e-09 -5.63445e-10 -7.73091 5.47488 -0.417314 -3.78343e-09 3.79508e-09 -5.63451e-10 -2.90554 0.965183 -0.102902 -3.78344e-09 3.79508e-09 -5.63454e-10 -10.2786 0.731801 -0.0259123 -3.78343e-09 3.79509e-09 -5.63458e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.7811 -1.71278 11.4438 0.139807 5.77393 1.25119 -36.5331 -26.2764 -58.2909 2.03217e-16 0.0 3.88251e-19 69.4908 -62.6285 94.2835 0.838511 59.3685 -2.18367 14.5217 -21.1248 30.5809
--19.8117 72.196 127.285 185.316 -11.9397 568.714 -11.0137 -10.157 7.7858 -3.77405 -11.7053 1.13039 4.40788 -3.98867 12.6884 -10.6736 -12.1091 22.5176 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.24329e-13 1.67846e-13 -4.96535e-14 122.68 -43.9572 153.263 -5.32863 -1.75307 9.28819 -17.686 71.2711 24.4898 -1.60753e-09 -1.57291e-09 -1.201e-09 -2.81979e-09 -2.45137e-09 -1.97699e-09 -1.60753e-09 -1.57291e-09 -1.20101e-09 7.73091 5.47488 0.417314 -1.60753e-09 -1.57291e-09 -1.20101e-09 2.90554 0.965183 0.102902 -1.60753e-09 -1.57291e-09 -1.201e-09 10.2786 0.731801 0.0259123 -1.60753e-09 -1.57291e-09 -1.201e-09 2.22167 -0.733487 -0.20892 -2.24185e-13 1.67797e-13 -4.98293e-14 11.8031 -49.7674 9.97004 10.1644 -4.24194 -18.1099 1.4561 32.1182 -5.06045 -2.64588e-09 2.60996e-09 -1.66163e-09 -4.60907e-09 4.53406e-09 -2.79775e-09 -2.64588e-09 2.60996e-09 -1.66162e-09 -7.73091 5.47488 -0.417314 -2.64588e-09 2.60996e-09 -1.66163e-09 -2.90554 0.965183 -0.102902 -2.64588e-09 2.60996e-09 -1.66163e-09 -10.2786 0.731801 -0.0259123 -2.64587e-09 2.60996e-09 -1.66164e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.6261 -1.60794 11.3117 0.140022 5.7598 1.25291 -36.4009 -26.3052 -58.1334 2.03217e-16 0.0 3.88251e-19 69.1459 -62.677 94.0785 0.837179 59.3339 -2.17954 14.4663 -21.0064 30.5886
--19.794 72.169 127.35 184.993 -11.809 568.635 -11.2468 -9.96907 7.95371 -3.7328 -11.7743 1.1828 4.56258 -3.99596 12.6544 -11.0392 -11.7527 22.3721 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.97526e-14 -1.07011e-13 -1.70657e-13 121.682 -44.9653 152.58 -5.42801 -1.79526 9.4648 -15.5242 69.6 22.1967 -1.665e-09 -2.76667e-09 -2.54528e-09 -2.99208e-09 -4.57274e-09 -4.27756e-09 -1.66499e-09 -2.76667e-09 -2.54529e-09 7.73091 5.47488 0.417314 -1.665e-09 -2.76667e-09 -2.54529e-09 2.90554 0.965183 0.102902 -1.66499e-09 -2.76667e-09 -2.54528e-09 10.2786 0.731801 0.0259123 -1.665e-09 -2.76666e-09 -2.54528e-09 2.22167 -0.733487 -0.20892 -7.97244e-14 -1.0703e-13 -1.70883e-13 11.5824 -49.1638 9.57056 10.2319 -4.28358 -18.2369 1.37281 31.3141 -4.90323 -6.47653e-10 5.6972e-10 -3.278e-09 -1.19802e-09 1.03966e-09 -5.63785e-09 -6.47655e-10 5.69721e-10 -3.278e-09 -7.73091 5.47488 -0.417314 -6.47653e-10 5.69721e-10 -3.27801e-09 -2.90554 0.965183 -0.102902 -6.47662e-10 5.6972e-10 -3.27801e-09 -10.2786 0.731801 -0.0259123 -6.4765e-10 5.69717e-10 -3.27801e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4455 -1.49086 11.2434 0.140291 5.74724 1.2551 -36.2543 -26.3423 -57.9558 2.03217e-16 0.0 3.88251e-19 68.8553 -62.6966 93.924 0.836896 59.3207 -2.177 14.4335 -20.8308 30.6876
--19.7589 72.1462 127.373 184.857 -11.8908 568.578 -11.47 -9.78285 8.10879 -3.66513 -11.8531 1.23418 4.70452 -4.04516 12.6302 -11.4358 -11.4131 22.2419 -0.0 0.0 0.0 -0.0 0.0 0.0 6.27538e-14 -3.82626e-13 -2.92157e-13 120.698 -45.8393 151.927 -5.53271 -1.83979 9.65137 -13.8679 68.0688 20.4206 -1.65115e-09 -3.7935e-09 -3.74621e-09 -3.03528e-09 -6.42104e-09 -6.33524e-09 -1.65114e-09 -3.7935e-09 -3.74621e-09 7.73091 5.47488 0.417314 -1.65115e-09 -3.7935e-09 -3.74622e-09 2.90554 0.965183 0.102902 -1.65114e-09 -3.7935e-09 -3.74621e-09 10.2786 0.731801 0.0259123 -1.65115e-09 -3.79349e-09 -3.7462e-09 2.22167 -0.733487 -0.20892 6.2655e-14 -3.82614e-13 -2.92433e-13 11.4217 -48.4916 9.28182 10.3084 -4.33091 -18.381 1.2913 30.4759 -4.74318 1.43708e-09 -1.54165e-09 -4.76738e-09 2.36558e-09 -2.58004e-09 -8.26094e-09 1.43708e-09 -1.54165e-09 -4.76737e-09 -7.73091 5.47488 -0.417314 1.43708e-09 -1.54165e-09 -4.76738e-09 -2.90554 0.965183 -0.102902 1.43707e-09 -1.54165e-09 -4.76738e-09 -10.2786 0.731801 -0.0259123 1.43709e-09 -1.54166e-09 -4.76739e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2665 -1.39136 11.1998 0.140609 5.73324 1.25771 -36.1525 -26.4115 -57.7917 2.03217e-16 0.0 3.88251e-19 68.6186 -62.7107 93.824 0.836735 59.3087 -2.17429 14.4025 -20.6256 30.8177
--19.7568 72.12 127.377 184.694 -11.9432 568.559 -11.6206 -9.64466 8.21084 -3.60529 -11.9436 1.26772 4.81452 -4.24949 12.6141 -11.7998 -10.921 22.1476 -0.0 0.0 0.0 -0.0 0.0 0.0 1.56913e-13 -5.51444e-13 -3.71976e-13 119.745 -46.5601 151.303 -5.61448 -1.87469 9.79737 -12.6959 66.8087 19.1501 -1.61564e-09 -3.93685e-09 -4.04625e-09 -2.99074e-09 -6.74175e-09 -6.84867e-09 -1.61563e-09 -3.93685e-09 -4.04625e-09 7.73091 5.47488 0.417314 -1.61564e-09 -3.93685e-09 -4.04626e-09 2.90554 0.965183 0.102902 -1.61563e-09 -3.93684e-09 -4.04625e-09 10.2786 0.731801 0.0259123 -1.61565e-09 -3.93684e-09 -4.04624e-09 2.22167 -0.733487 -0.20892 1.5673e-13 -5.51414e-13 -3.72274e-13 11.3208 -47.9122 9.11856 10.3844 -4.37821 -18.5242 1.23186 29.8306 -4.62238 2.83418e-09 -2.94018e-09 -5.48455e-09 4.76078e-09 -4.9824e-09 -9.53373e-09 2.83418e-09 -2.94018e-09 -5.48455e-09 -7.73091 5.47488 -0.417314 2.83418e-09 -2.94018e-09 -5.48456e-09 -2.90554 0.965183 -0.102902 2.83417e-09 -2.94018e-09 -5.48455e-09 -10.2786 0.731801 -0.0259123 2.83419e-09 -2.94018e-09 -5.48456e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1164 -1.33921 11.1418 0.140973 5.71481 1.2607 -36.1545 -26.5371 -57.6749 2.03217e-16 0.0 3.88251e-19 68.4346 -62.7427 93.7821 0.835783 59.2779 -2.16966 14.3535 -20.4185 30.9188
--19.7442 72.0957 127.338 184.681 -12.1159 568.581 -11.6777 -9.57204 8.23925 -3.55167 -12.0635 1.276 4.85422 -4.68188 12.6095 -12.0631 -10.1752 22.1206 -0.0 0.0 0.0 -0.0 0.0 0.0 1.86117e-13 -5.53185e-13 -4.04281e-13 118.796 -47.0633 150.665 -5.67503 -1.90074 9.90549 -11.9539 65.9204 18.3389 -1.55889e-09 -2.52835e-09 -2.79809e-09 -2.82282e-09 -4.39418e-09 -4.70657e-09 -1.55888e-09 -2.52835e-09 -2.7981e-09 7.73091 5.47488 0.417314 -1.55889e-09 -2.52835e-09 -2.7981e-09 2.90554 0.965183 0.102902 -1.55888e-09 -2.52835e-09 -2.79809e-09 10.2786 0.731801 0.0259123 -1.55889e-09 -2.52835e-09 -2.79809e-09 2.22167 -0.733487 -0.20892 1.85912e-13 -5.53158e-13 -4.04559e-13 11.287 -47.4778 9.11253 10.4602 -4.4258 -18.6672 1.19811 29.4562 -4.55292 3.28063e-09 -3.37952e-09 -5.15627e-09 5.5406e-09 -5.74711e-09 -8.97779e-09 3.28062e-09 -3.37951e-09 -5.15626e-09 -7.73091 5.47488 -0.417314 3.28063e-09 -3.37951e-09 -5.15628e-09 -2.90554 0.965183 -0.102902 3.28062e-09 -3.37951e-09 -5.15627e-09 -10.2786 0.731801 -0.0259123 3.28063e-09 -3.37952e-09 -5.15628e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9917 -1.34246 11.0697 0.141474 5.68841 1.26481 -36.3369 -26.7801 -57.6259 2.03217e-16 0.0 3.88251e-19 68.3229 -62.7809 93.845 0.834549 59.2333 -2.16272 14.2684 -20.1739 30.9899
--19.7882 72.0765 127.313 184.566 -12.2684 568.724 -11.6757 -9.53854 8.21884 -3.4897 -12.206 1.26896 4.84511 -5.26768 12.617 -12.2787 -9.2858 22.1444 -0.0 0.0 0.0 -0.0 0.0 0.0 1.76471e-13 -4.55746e-13 -4.09764e-13 117.868 -47.3808 150.044 -5.72645 -1.92303 9.99729 -11.4839 65.3272 17.823 -1.45869e-09 -1.09262e-10 -5.54189e-10 -2.52504e-09 -3.16148e-10 -8.57748e-10 -1.45868e-09 -1.09263e-10 -5.54197e-10 7.73091 5.47488 0.417314 -1.45869e-09 -1.09259e-10 -5.54186e-10 2.90554 0.965183 0.102902 -1.45868e-09 -1.09262e-10 -5.54193e-10 10.2786 0.731801 0.0259123 -1.45869e-09 -1.09261e-10 -5.54187e-10 2.22167 -0.733487 -0.20892 1.76275e-13 -4.55732e-13 -4.09993e-13 11.3084 -47.1001 9.23905 10.5399 -4.47608 -18.8177 1.17714 29.2259 -4.51018 3.20816e-09 -3.29021e-09 -4.16038e-09 5.44113e-09 -5.611e-09 -7.25628e-09 3.20816e-09 -3.2902e-09 -4.16037e-09 -7.73091 5.47488 -0.417314 3.20816e-09 -3.2902e-09 -4.16039e-09 -2.90554 0.965183 -0.102902 3.20815e-09 -3.2902e-09 -4.16038e-09 -10.2786 0.731801 -0.0259123 3.20816e-09 -3.29021e-09 -4.16039e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8811 -1.38523 11.0007 0.142086 5.65655 1.26982 -36.6483 -27.1102 -57.6251 2.03217e-16 0.0 3.88251e-19 68.2779 -62.8187 93.9961 0.833285 59.182 -2.15438 14.1619 -19.8916 31.0583
--19.7797 72.0796 127.382 184.525 -12.3134 568.855 -11.6338 -9.5244 8.17749 -3.43425 -12.3367 1.25576 4.85768 -5.89878 12.6306 -12.5626 -8.39902 22.1667 -0.0 0.0 0.0 -0.0 0.0 0.0 1.45761e-13 -3.43832e-13 -3.86027e-13 117.046 -47.6404 149.549 -5.75629 -1.93607 10.0505 -11.1478 64.8899 17.4534 -1.33075e-09 2.22253e-09 1.64334e-09 -2.18241e-09 3.62921e-09 2.90904e-09 -1.33074e-09 2.22253e-09 1.64332e-09 7.73091 5.47488 0.417314 -1.33075e-09 2.22254e-09 1.64335e-09 2.90554 0.965183 0.102902 -1.33074e-09 2.22253e-09 1.64333e-09 10.2786 0.731801 0.0259123 -1.33075e-09 2.22253e-09 1.64334e-09 2.22167 -0.733487 -0.20892 1.45586e-13 -3.43833e-13 -3.86207e-13 11.3559 -46.7301 9.42737 10.6195 -4.52653 -18.9683 1.16175 29.0603 -4.47931 2.88475e-09 -2.90363e-09 -2.82831e-09 4.916e-09 -4.96715e-09 -4.94828e-09 2.88475e-09 -2.90362e-09 -2.8283e-09 -7.73091 5.47488 -0.417314 2.88475e-09 -2.90363e-09 -2.82831e-09 -2.90554 0.965183 -0.102902 2.88474e-09 -2.90363e-09 -2.82831e-09 -10.2786 0.731801 -0.0259123 2.88475e-09 -2.90363e-09 -2.82832e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8007 -1.46144 10.921 0.14263 5.62529 1.27421 -36.9554 -27.4148 -57.6445 2.03217e-16 0.0 3.88251e-19 68.2611 -62.8873 94.144 0.830728 59.1076 -2.14493 14.0646 -19.6512 31.1067
--19.7591 72.16 127.477 184.225 -12.137 568.94 -11.5715 -9.50985 8.1431 -3.40009 -12.4211 1.24557 4.96212 -6.4671 12.6434 -13.0275 -7.65949 22.1327 -0.0 0.0 0.0 -0.0 0.0 0.0 1.11776e-13 -3.02149e-13 -3.30678e-13 116.41 -47.9717 149.284 -5.75211 -1.93438 10.0429 -10.8375 64.4671 17.1105 -1.19079e-09 3.36916e-09 2.75236e-09 -1.87993e-09 5.57876e-09 4.80505e-09 -1.19078e-09 3.36916e-09 2.75234e-09 7.73091 5.47488 0.417314 -1.19079e-09 3.36916e-09 2.75237e-09 2.90554 0.965183 0.102902 -1.19078e-09 3.36916e-09 2.75235e-09 10.2786 0.731801 0.0259123 -1.19079e-09 3.36916e-09 2.75236e-09 2.22167 -0.733487 -0.20892 1.11616e-13 -3.02158e-13 -3.30827e-13 11.4026 -46.3192 9.60851 10.6952 -4.57468 -19.1116 1.14534 28.8797 -4.44589 2.57838e-09 -2.45115e-09 -1.4915e-09 4.41882e-09 -4.20866e-09 -2.63288e-09 2.57837e-09 -2.45115e-09 -1.49149e-09 -7.73091 5.47488 -0.417314 2.57838e-09 -2.45115e-09 -1.4915e-09 -2.90554 0.965183 -0.102902 2.57836e-09 -2.45115e-09 -1.4915e-09 -10.2786 0.731801 -0.0259123 2.57837e-09 -2.45115e-09 -1.49151e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.7667 -1.56502 10.8168 0.142925 5.6007 1.27648 -37.124 -27.5804 -57.6528 2.03217e-16 0.0 3.88251e-19 68.2333 -63.0181 94.1966 0.825633 58.9934 -2.13467 14.0073 -19.5318 31.1172
--19.7105 72.2072 127.523 184.115 -12.1503 569.017 -11.4597 -9.50706 8.11931 -3.39287 -12.4129 1.24228 5.21068 -6.9506 12.6631 -13.7681 -7.13733 22.0237 -0.0 0.0 0.0 -0.0 0.0 0.0 6.95346e-14 -3.78741e-13 -2.03435e-13 116.052 -48.4438 149.413 -5.68508 -1.90551 9.92291 -10.5087 63.9965 16.7453 -9.68768e-10 2.83521e-09 2.32193e-09 -1.52272e-09 4.69652e-09 4.05184e-09 -9.68761e-10 2.83521e-09 2.32191e-09 7.73091 5.47488 0.417314 -9.68767e-10 2.83521e-09 2.32194e-09 2.90554 0.965183 0.102902 -9.68762e-10 2.83521e-09 2.32192e-09 10.2786 0.731801 0.0259123 -9.6877e-10 2.83521e-09 2.32192e-09 2.22167 -0.733487 -0.20892 6.9384e-14 -3.78747e-13 -2.03585e-13 11.4461 -45.8768 9.78404 10.77 -4.62267 -19.2535 1.12808 28.6834 -4.40991 2.34179e-09 -1.88699e-09 1.79701e-10 4.04712e-09 -3.26119e-09 2.57505e-10 2.34179e-09 -1.88699e-09 1.79717e-10 -7.73091 5.47488 -0.417314 2.34179e-09 -1.88699e-09 1.79702e-10 -2.90554 0.965183 -0.102902 2.34178e-09 -1.88699e-09 1.79703e-10 -10.2786 0.731801 -0.0259123 2.34179e-09 -1.88699e-09 1.79697e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8145 -1.71331 10.6807 0.142845 5.5877 1.27565 -37.076 -27.5251 -57.6446 2.03217e-16 0.0 3.88251e-19 68.2453 -63.2318 94.1596 0.817601 58.8348 -2.12418 14.0036 -19.5796 31.0706
--19.6596 72.2251 127.549 184.196 -12.3586 569.096 -11.2994 -9.52075 8.09252 -3.40413 -12.3429 1.24052 5.55497 -7.40461 12.69 -14.7011 -6.74399 21.8679 -0.0 0.0 0.0 -0.0 0.0 0.0 1.27926e-14 -5.19948e-13 -1.87883e-14 115.92 -48.979 149.846 -5.57008 -1.85599 9.71768 -10.216 63.5625 16.419 -6.81052e-10 1.27377e-09 9.6552e-10 -1.10461e-09 2.08923e-09 1.7039e-09 -6.81045e-10 1.27378e-09 9.65508e-10 7.73091 5.47488 0.417314 -6.81053e-10 1.27377e-09 9.65523e-10 2.90554 0.965183 0.102902 -6.81046e-10 1.27378e-09 9.65513e-10 10.2786 0.731801 0.0259123 -6.81057e-10 1.27378e-09 9.65517e-10 2.22167 -0.733487 -0.20892 1.26527e-14 -5.19945e-13 -1.8956e-14 11.4975 -45.4214 9.98311 10.8447 -4.67088 -19.3952 1.11269 28.5071 -4.3777 2.03831e-09 -1.12358e-09 2.22272e-09 3.56678e-09 -1.9748e-09 3.79106e-09 2.03831e-09 -1.12358e-09 2.22273e-09 -7.73091 5.47488 -0.417314 2.03831e-09 -1.12358e-09 2.22272e-09 -2.90554 0.965183 -0.102902 2.0383e-09 -1.12358e-09 2.22272e-09 -10.2786 0.731801 -0.0259123 2.03831e-09 -1.12358e-09 2.22272e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9243 -1.90335 10.5214 0.14251 5.58196 1.2727 -36.8971 -27.3264 -57.6351 2.03217e-16 0.0 3.88251e-19 68.2956 -63.5076 94.07 0.807397 58.6407 -2.11321 14.035 -19.744 30.9811
--19.6444 72.2651 127.604 184.148 -12.6303 569.344 -11.1556 -9.52004 8.0647 -3.42739 -12.2921 1.23559 5.91343 -7.83727 12.7049 -15.6703 -6.38529 21.679 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.25626e-14 -6.57913e-13 1.43497e-13 115.873 -49.4861 150.297 -5.46051 -1.80885 9.52276 -10.0069 63.2429 16.1852 -4.72938e-10 -6.90322e-10 -7.62326e-10 -8.43749e-10 -1.19225e-09 -1.27815e-09 -4.72931e-10 -6.90311e-10 -7.62335e-10 7.73091 5.47488 0.417314 -4.7294e-10 -6.90322e-10 -7.6233e-10 2.90554 0.965183 0.102902 -4.72933e-10 -6.90311e-10 -7.62333e-10 10.2786 0.731801 0.0259123 -4.72945e-10 -6.90307e-10 -7.62328e-10 2.22167 -0.733487 -0.20892 -4.26949e-14 -6.579e-13 1.43308e-13 11.5523 -44.9177 10.1797 10.9118 -4.71426 -19.5226 1.09693 28.3255 -4.3446 1.65174e-09 -3.29613e-10 3.86777e-09 2.93398e-09 -6.29225e-10 6.63956e-09 1.65173e-09 -3.29612e-10 3.86778e-09 -7.73091 5.47488 -0.417314 1.65174e-09 -3.29612e-10 3.86777e-09 -2.90554 0.965183 -0.102902 1.65173e-09 -3.29611e-10 3.86777e-09 -10.2786 0.731801 -0.0259123 1.65174e-09 -3.29608e-10 3.86777e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0301 -2.09856 10.349 0.142099 5.57564 1.26911 -36.6982 -27.11 -57.6218 2.03217e-16 0.0 3.88251e-19 68.264 -63.8144 93.8788 0.795554 58.4147 -2.10087 14.0852 -19.9589 30.8806
--19.6204 72.3369 127.636 184.089 -12.9764 569.508 -11.0934 -9.47403 8.03785 -3.45622 -12.3419 1.22279 6.20396 -8.25686 12.6886 -16.5191 -5.9669 21.4717 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.0643e-14 -7.24779e-13 2.03655e-13 115.754 -49.8761 150.464 -5.41032 -1.78727 9.43369 -9.9254 63.116 16.0939 -4.89723e-10 -2.43224e-09 -2.30708e-09 -9.58248e-10 -4.09703e-09 -3.93368e-09 -4.89716e-10 -2.43223e-09 -2.30709e-09 7.73091 5.47488 0.417314 -4.89724e-10 -2.43224e-09 -2.30709e-09 2.90554 0.965183 0.102902 -4.89717e-10 -2.43223e-09 -2.30709e-09 10.2786 0.731801 0.0259123 -4.89731e-10 -2.43222e-09 -2.30708e-09 2.22167 -0.733487 -0.20892 -8.07756e-14 -7.24759e-13 2.03456e-13 11.6063 -44.3308 10.3484 10.9635 -4.74777 -19.6211 1.07864 28.1135 -4.30608 1.16586e-09 3.26208e-10 4.34508e-09 2.10493e-09 4.95833e-10 7.47479e-09 1.16586e-09 3.26208e-10 4.34509e-09 -7.73091 5.47488 -0.417314 1.16586e-09 3.26209e-10 4.34508e-09 -2.90554 0.965183 -0.102902 1.16586e-09 3.2621e-10 4.34508e-09 -10.2786 0.731801 -0.0259123 1.16587e-09 3.26214e-10 4.34508e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0664 -2.26228 10.1735 0.141792 5.56092 1.26632 -36.5895 -27.0009 -57.5998 2.03217e-16 0.0 3.88251e-19 68.0277 -64.1208 93.535 0.782633 58.1603 -2.0863 14.1384 -20.1582 30.801
--19.645 72.4542 127.656 183.807 -13.1603 569.617 -11.1745 -9.35983 8.00802 -3.48837 -12.5502 1.19683 6.43383 -8.67845 12.6314 -17.2332 -5.38977 21.2369 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.04157e-14 -7.19442e-13 8.37641e-14 115.449 -50.1532 150.149 -5.45749 -1.80753 9.51743 -9.97651 63.1938 16.151 -9.61683e-10 -4.26764e-09 -3.97056e-09 -1.85933e-09 -7.15181e-09 -6.76876e-09 -9.61677e-10 -4.26763e-09 -3.97056e-09 7.73091 5.47488 0.417314 -9.61684e-10 -4.26765e-09 -3.97056e-09 2.90554 0.965183 0.102902 -9.61678e-10 -4.26763e-09 -3.97056e-09 10.2786 0.731801 0.0259123 -9.61691e-10 -4.26763e-09 -3.97056e-09 2.22167 -0.733487 -0.20892 -9.0566e-14 -7.19419e-13 8.3573e-14 11.677 -43.513 10.495 11.0037 -4.77389 -19.6979 1.05099 27.7891 -4.2474 4.93632e-10 8.18407e-10 2.8475e-09 9.11874e-10 1.3691e-09 4.90581e-09 4.93629e-10 8.18407e-10 2.84751e-09 -7.73091 5.47488 -0.417314 4.93634e-10 8.18408e-10 2.8475e-09 -2.90554 0.965183 -0.102902 4.93631e-10 8.18408e-10 2.8475e-09 -10.2786 0.731801 -0.0259123 4.93639e-10 8.18412e-10 2.8475e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.987 -2.37407 9.99218 0.141659 5.53289 1.26491 -36.6317 -27.0688 -57.564 2.03217e-16 0.0 3.88251e-19 67.4617 -64.4212 92.949 0.768337 57.8669 -2.06872 14.1999 -20.3498 30.7428
--19.6154 72.5645 127.673 183.659 -13.2483 569.683 -11.3493 -9.19878 7.97571 -3.52776 -12.8617 1.16151 6.63599 -9.09355 12.5448 -17.884 -4.72774 20.9726 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.26195e-14 -6.72427e-13 -1.54751e-13 115.055 -50.3518 149.544 -5.56528 -1.85388 9.70921 -10.1367 63.4377 16.3299 -1.74748e-09 -6.36902e-09 -5.89861e-09 -3.31297e-09 -1.06481e-08 -1.00416e-08 -1.74748e-09 -6.36901e-09 -5.89861e-09 7.73091 5.47488 0.417314 -1.74748e-09 -6.36902e-09 -5.89861e-09 2.90554 0.965183 0.102902 -1.74748e-09 -6.36901e-09 -5.89861e-09 10.2786 0.731801 0.0259123 -1.74749e-09 -6.36901e-09 -5.8986e-09 2.22167 -0.733487 -0.20892 -8.27997e-14 -6.72403e-13 -1.54925e-13 11.7587 -42.5296 10.6297 11.0346 -4.79408 -19.7571 1.01791 27.3907 -4.17593 -3.28732e-10 1.23045e-09 -1.37867e-11 -5.69795e-10 2.12532e-09 -1.34208e-11 -3.28734e-10 1.23045e-09 -1.37743e-11 -7.73091 5.47488 -0.417314 -3.28729e-10 1.23045e-09 -1.3783e-11 -2.90554 0.965183 -0.102902 -3.28733e-10 1.23045e-09 -1.37845e-11 -10.2786 0.731801 -0.0259123 -3.28727e-10 1.23046e-09 -1.37903e-11 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8367 -2.45697 9.80142 0.141598 5.49667 1.26406 -36.7553 -27.2352 -57.5182 2.03217e-16 0.0 3.88251e-19 66.6498 -64.7279 92.1598 0.752722 57.5367 -2.04896 14.275 -20.5607 30.6919
--19.6285 72.6743 127.703 183.412 -13.2757 569.764 -11.5157 -9.02636 7.94956 -3.57705 -13.1872 1.12583 6.76688 -9.47514 12.4412 -18.4458 -4.14666 20.7033 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.40247e-14 -5.63328e-13 -3.82632e-13 114.73 -50.4328 148.937 -5.67608 -1.90158 9.90693 -10.4116 63.8499 16.6366 -2.435e-09 -7.89675e-09 -7.30277e-09 -4.56945e-09 -1.31822e-08 -1.242e-08 -2.435e-09 -7.89675e-09 -7.30277e-09 7.73091 5.47488 0.417314 -2.435e-09 -7.89676e-09 -7.30276e-09 2.90554 0.965183 0.102902 -2.435e-09 -7.89675e-09 -7.30277e-09 10.2786 0.731801 0.0259123 -2.43501e-09 -7.89675e-09 -7.30276e-09 2.22167 -0.733487 -0.20892 -7.42294e-14 -5.63304e-13 -3.82789e-13 11.818 -41.6641 10.7351 11.0464 -4.80184 -19.7794 0.992303 27.074 -4.11959 -1.13252e-09 1.55707e-09 -2.8811e-09 -2.0192e-09 2.73379e-09 -4.94376e-09 -1.13252e-09 1.55707e-09 -2.88109e-09 -7.73091 5.47488 -0.417314 -1.13252e-09 1.55707e-09 -2.8811e-09 -2.90554 0.965183 -0.102902 -1.13252e-09 1.55707e-09 -2.8811e-09 -10.2786 0.731801 -0.0259123 -1.13252e-09 1.55707e-09 -2.88111e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6868 -2.53947 9.61008 0.141523 5.45944 1.26307 -36.8757 -27.4018 -57.4693 2.03217e-16 0.0 3.88251e-19 65.7875 -65.0367 91.3146 0.736817 57.1914 -2.02858 14.3489 -20.7519 30.6578
--19.6252 72.7368 127.736 183.341 -13.5218 569.834 -11.572 -8.87808 7.93813 -3.63845 -13.4374 1.0988 6.78349 -9.79603 12.333 -18.8968 -3.81387 20.4508 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.14013e-14 -3.7174e-13 -4.70623e-13 114.64 -50.3641 148.622 -5.73283 -1.92601 10.0085 -10.8124 64.4319 17.0826 -2.61212e-09 -8.01124e-09 -7.39457e-09 -4.87904e-09 -1.33504e-08 -1.25714e-08 -2.61211e-09 -8.01123e-09 -7.39458e-09 7.73091 5.47488 0.417314 -2.61211e-09 -8.01124e-09 -7.39456e-09 2.90554 0.965183 0.102902 -2.61211e-09 -8.01124e-09 -7.39457e-09 10.2786 0.731801 0.0259123 -2.61212e-09 -8.01123e-09 -7.39456e-09 2.22167 -0.733487 -0.20892 -8.16076e-14 -3.71717e-13 -4.70772e-13 11.8252 -41.1997 10.7937 11.0291 -4.79068 -19.746 0.985857 26.995 -4.10553 -1.74903e-09 1.79297e-09 -4.39677e-09 -3.11546e-09 3.16382e-09 -7.54606e-09 -1.74903e-09 1.79297e-09 -4.39675e-09 -7.73091 5.47488 -0.417314 -1.74903e-09 1.79297e-09 -4.39676e-09 -2.90554 0.965183 -0.102902 -1.74903e-09 1.79297e-09 -4.39677e-09 -10.2786 0.731801 -0.0259123 -1.74903e-09 1.79297e-09 -4.39678e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6081 -2.65013 9.42703 0.141345 5.42838 1.26124 -36.9085 -27.4699 -57.4232 2.03217e-16 0.0 3.88251e-19 65.0781 -65.3473 90.5692 0.721535 56.8528 -2.00901 14.4067 -20.8844 30.6498
--19.6131 72.7985 127.8 183.335 -13.8123 569.965 -11.4713 -8.75593 7.93662 -3.71308 -13.603 1.07988 6.64571 -10.0446 12.2175 -19.2374 -3.81884 20.2128 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.22248e-13 2.31191e-14 -3.04077e-13 114.918 -50.0339 148.745 -5.7027 -1.91296 9.95468 -11.4797 65.3435 17.821 -1.86666e-09 -5.40826e-09 -4.97672e-09 -3.4692e-09 -8.95935e-09 -8.46305e-09 -1.86666e-09 -5.40826e-09 -4.97673e-09 7.73091 5.47488 0.417314 -1.86666e-09 -5.40826e-09 -4.97671e-09 2.90554 0.965183 0.102902 -1.86666e-09 -5.40826e-09 -4.97671e-09 10.2786 0.731801 0.0259123 -1.86667e-09 -5.40826e-09 -4.9767e-09 2.22167 -0.733487 -0.20892 -1.22417e-13 2.31401e-14 -3.04232e-13 11.7627 -41.2748 10.7967 10.9743 -4.75505 -19.6415 1.00585 27.2464 -4.15007 -2.23665e-09 1.98982e-09 -3.5886e-09 -3.93694e-09 3.48754e-09 -6.14178e-09 -2.23666e-09 1.98983e-09 -3.58859e-09 -7.73091 5.47488 -0.417314 -2.23665e-09 1.98982e-09 -3.5886e-09 -2.90554 0.965183 -0.102902 -2.23666e-09 1.98982e-09 -3.5886e-09 -10.2786 0.731801 -0.0259123 -2.23665e-09 1.98982e-09 -3.58861e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6323 -2.80254 9.24823 0.141003 5.40608 1.25807 -36.8056 -27.3826 -57.3819 2.03217e-16 0.0 3.88251e-19 64.5857 -65.6779 89.96 0.70661 56.5172 -1.99013 14.4468 -20.9249 30.6946
--19.584 72.863 127.883 183.373 -14.0897 570.117 -11.2746 -8.64349 7.94278 -3.79937 -13.7267 1.06526 6.38629 -10.2366 12.0898 -19.4824 -4.05931 19.9788 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.83277e-13 5.71919e-13 2.13414e-14 115.441 -49.4942 149.121 -5.622 -1.8781 9.81063 -12.4358 66.5249 18.8688 -5.19196e-10 -8.95715e-10 -7.98726e-10 -9.30629e-10 -1.36403e-09 -1.36471e-09 -5.19191e-10 -8.95719e-10 -7.98746e-10 7.73091 5.47488 0.417314 -5.19195e-10 -8.95719e-10 -7.98722e-10 2.90554 0.965183 0.102902 -5.19194e-10 -8.95716e-10 -7.98723e-10 10.2786 0.731801 0.0259123 -5.192e-10 -8.95714e-10 -7.98715e-10 2.22167 -0.733487 -0.20892 -1.83384e-13 5.71937e-13 2.11736e-14 11.652 -41.7173 10.7556 10.8891 -4.69957 -19.4795 1.04549 27.7281 -4.23624 -2.65091e-09 2.13275e-09 -1.38408e-09 -4.60013e-09 3.69457e-09 -2.33006e-09 -2.65091e-09 2.13276e-09 -1.38407e-09 -7.73091 5.47488 -0.417314 -2.65091e-09 2.13275e-09 -1.38408e-09 -2.90554 0.965183 -0.102902 -2.65091e-09 2.13275e-09 -1.38409e-09 -10.2786 0.731801 -0.0259123 -2.65091e-09 2.13276e-09 -1.3841e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.717 -2.97952 9.07111 0.140556 5.38849 1.25404 -36.621 -27.2028 -57.3427 2.03217e-16 0.0 3.88251e-19 64.2007 -66.0242 89.4081 0.691733 56.1762 -1.97135 14.4763 -20.9017 30.779
--19.5786 72.938 127.945 183.273 -14.28 570.163 -11.042 -8.54863 7.96896 -3.89535 -13.7979 1.05914 6.072 -10.3863 11.959 -19.6324 -4.41537 19.7577 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.35084e-13 1.0399e-12 3.19429e-13 115.993 -48.9622 149.548 -5.53777 -1.84176 9.66064 -13.4616 67.6523 19.9818 7.43335e-10 3.19784e-09 3.0076e-09 1.44143e-09 5.51666e-09 5.102e-09 7.4334e-10 3.19784e-09 3.00757e-09 7.73091 5.47488 0.417314 7.43335e-10 3.19784e-09 3.0076e-09 2.90554 0.965183 0.102902 7.43335e-10 3.19784e-09 3.0076e-09 10.2786 0.731801 0.0259123 7.43331e-10 3.19784e-09 3.00761e-09 2.22167 -0.733487 -0.20892 -2.35128e-13 1.03991e-12 3.19245e-13 11.5223 -42.3442 10.6818 10.7862 -4.63297 -19.2843 1.09488 28.3061 -4.3409 -2.81877e-09 2.11668e-09 7.25009e-10 -4.84135e-09 3.63037e-09 1.31172e-09 -2.81877e-09 2.11668e-09 7.2502e-10 -7.73091 5.47488 -0.417314 -2.81876e-09 2.11668e-09 7.25004e-10 -2.90554 0.965183 -0.102902 -2.81877e-09 2.11667e-09 7.25001e-10 -10.2786 0.731801 -0.0259123 -2.81876e-09 2.11668e-09 7.24991e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.822 -3.16352 8.90678 0.140097 5.3728 1.24993 -36.4232 -27.0106 -57.3033 2.03217e-16 0.0 3.88251e-19 63.8742 -66.3555 88.9055 0.677612 55.8445 -1.95327 14.4944 -20.8682 30.8521
--19.5336 73.0058 127.973 183.253 -14.4119 570.233 -10.8336 -8.47926 8.02747 -3.99905 -13.8057 1.06572 5.76961 -10.5076 11.8342 -19.6861 -4.76634 19.5581 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.48262e-13 1.1923e-12 4.0398e-13 116.382 -48.6589 149.843 -5.49745 -1.82437 9.58896 -14.225 68.4111 20.8036 1.23398e-09 4.54386e-09 4.31047e-09 2.35175e-09 7.76382e-09 7.31547e-09 1.23398e-09 4.54385e-09 4.31044e-09 7.73091 5.47488 0.417314 1.23398e-09 4.54386e-09 4.31047e-09 2.90554 0.965183 0.102902 1.23398e-09 4.54386e-09 4.31047e-09 10.2786 0.731801 0.0259123 1.23397e-09 4.54386e-09 4.31048e-09 2.22167 -0.733487 -0.20892 -2.48269e-13 1.19232e-12 4.03781e-13 11.4033 -42.9727 10.5863 10.6786 -4.56409 -19.0804 1.14243 28.8469 -4.43987 -2.56719e-09 1.8365e-09 1.24688e-09 -4.39693e-09 3.14042e-09 2.20617e-09 -2.56719e-09 1.8365e-09 1.24689e-09 -7.73091 5.47488 -0.417314 -2.56719e-09 1.8365e-09 1.24687e-09 -2.90554 0.965183 -0.102902 -2.56719e-09 1.8365e-09 1.24687e-09 -10.2786 0.731801 -0.0259123 -2.56718e-09 1.8365e-09 1.24686e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9076 -3.3369 8.76632 0.139719 5.3562 1.24653 -36.2806 -26.8859 -57.2602 2.03217e-16 0.0 3.88251e-19 63.5592 -66.6407 88.4467 0.664899 55.5371 -1.93641 14.5004 -20.8778 30.8631
--19.4688 73.0608 127.998 183.321 -14.5587 570.326 -10.6517 -8.44493 8.13893 -4.11562 -13.7087 1.0936 5.45583 -10.633 11.7061 -19.5956 -5.0835 19.3771 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.0633e-13 8.55024e-13 1.54737e-13 116.556 -48.6981 149.982 -5.52226 -1.83504 9.63309 -14.4939 68.6635 21.0919 5.12383e-10 1.48695e-09 1.61428e-09 9.62113e-10 2.58664e-09 2.73384e-09 5.12388e-10 1.48694e-09 1.61426e-09 7.73091 5.47488 0.417314 5.12381e-10 1.48695e-09 1.61428e-09 2.90554 0.965183 0.102902 5.12384e-10 1.48695e-09 1.61428e-09 10.2786 0.731801 0.0259123 5.12377e-10 1.48695e-09 1.61429e-09 2.22167 -0.733487 -0.20892 -2.06341e-13 8.55033e-13 1.54522e-13 11.2802 -43.6007 10.4423 10.5606 -4.48939 -18.8564 1.18555 29.3276 -4.5286 -1.70978e-09 1.21072e-09 -7.88466e-10 -2.96842e-09 2.10241e-09 -1.32382e-09 -1.70978e-09 1.21072e-09 -7.88457e-10 -7.73091 5.47488 -0.417314 -1.70978e-09 1.21072e-09 -7.88471e-10 -2.90554 0.965183 -0.102902 -1.70978e-09 1.21072e-09 -7.88472e-10 -10.2786 0.731801 -0.0259123 -1.70977e-09 1.21072e-09 -7.88481e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9679 -3.49628 8.64971 0.13946 5.33764 1.24413 -36.2177 -26.8664 -57.2034 2.03217e-16 0.0 3.88251e-19 63.2448 -66.8773 88.0219 0.653752 55.2584 -1.92075 14.4893 -20.9743 30.7633
--19.4704 73.1371 128.031 183.261 -14.7399 570.368 -10.4687 -8.43891 8.29099 -4.24443 -13.5254 1.13801 5.10894 -10.7454 11.5735 -19.3776 -5.4301 19.2123 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.2785e-13 1.90432e-13 -3.05457e-13 116.626 -48.9449 150.062 -5.58403 -1.86165 9.74307 -14.427 68.6007 21.0201 -9.69358e-10 -4.38619e-09 -3.63497e-09 -1.87241e-09 -7.34287e-09 -6.186e-09 -9.69354e-10 -4.38619e-09 -3.63498e-09 7.73091 5.47488 0.417314 -9.6936e-10 -4.38619e-09 -3.63498e-09 2.90554 0.965183 0.102902 -9.69354e-10 -4.38619e-09 -3.63497e-09 10.2786 0.731801 0.0259123 -9.69366e-10 -4.38618e-09 -3.63496e-09 2.22167 -0.733487 -0.20892 -1.27892e-13 1.90439e-13 -3.0569e-13 11.1404 -44.3103 10.2517 10.4279 -4.40598 -18.6055 1.23046 29.8153 -4.61953 -3.85579e-10 3.13216e-10 -4.39467e-09 -7.72495e-10 6.25788e-10 -7.57369e-09 -3.85582e-10 3.13218e-10 -4.39466e-09 -7.73091 5.47488 -0.417314 -3.85578e-10 3.13216e-10 -4.39467e-09 -2.90554 0.965183 -0.102902 -3.85585e-10 3.13215e-10 -4.39467e-09 -10.2786 0.731801 -0.0259123 -3.85571e-10 3.13217e-10 -4.39468e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0229 -3.65058 8.55201 0.139267 5.31872 1.24229 -36.1958 -26.9039 -57.1375 2.03217e-16 0.0 3.88251e-19 62.9619 -67.0809 87.6439 0.64373 55.0004 -1.90595 14.4624 -21.1195 30.5914
--19.4408 73.2067 128.106 183.307 -14.9517 570.457 -10.3003 -8.44463 8.44649 -4.37467 -13.3355 1.18312 4.79855 -10.7845 11.4587 -19.1257 -5.82287 19.0719 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.5983e-14 -5.31509e-13 -7.98153e-13 116.642 -49.2494 150.081 -5.65634 -1.89283 9.87202 -14.2213 68.406 20.7994 -2.55952e-09 -1.05409e-08 -9.15667e-09 -4.90714e-09 -1.77494e-08 -1.55675e-08 -2.55952e-09 -1.05409e-08 -9.15668e-09 7.73091 5.47488 0.417314 -2.55952e-09 -1.05409e-08 -9.15668e-09 2.90554 0.965183 0.102902 -2.55951e-09 -1.05409e-08 -9.15667e-09 10.2786 0.731801 0.0259123 -2.55953e-09 -1.05409e-08 -9.15667e-09 2.22167 -0.733487 -0.20892 -3.60567e-14 -5.31504e-13 -7.984e-13 11.0217 -45.0447 10.0701 10.2964 -4.32381 -18.3579 1.27723 30.311 -4.71286 1.09031e-09 -7.28041e-10 -8.12903e-09 1.68186e-09 -1.09633e-09 -1.40484e-08 1.0903e-09 -7.28039e-10 -8.12902e-09 -7.73091 5.47488 -0.417314 1.09031e-09 -7.28041e-10 -8.12903e-09 -2.90554 0.965183 -0.102902 1.0903e-09 -7.28041e-10 -8.12902e-09 -10.2786 0.731801 -0.0259123 1.09031e-09 -7.28039e-10 -8.12903e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0719 -3.80059 8.47702 0.139098 5.3006 1.24066 -36.1881 -26.9495 -57.079 2.03217e-16 0.0 3.88251e-19 62.7282 -67.2477 87.3429 0.63455 54.7589 -1.89208 14.4294 -21.2436 30.4279
--19.4357 73.301 128.203 183.232 -14.9604 570.612 -10.1619 -8.44558 8.56827 -4.49511 -13.2187 1.21317 4.59472 -10.6897 11.3838 -18.9331 -6.2785 18.9643 -0.0 0.0 0.0 -0.0 0.0 0.0 4.61125e-14 -1.04084e-12 -1.1449e-12 116.655 -49.4615 150.04 -5.7129 -1.91729 9.97301 -14.073 68.2628 20.6401 -3.60638e-09 -1.44427e-08 -1.26702e-08 -6.89735e-09 -2.43577e-08 -2.15343e-08 -3.60638e-09 -1.44427e-08 -1.26702e-08 7.73091 5.47488 0.417314 -3.60638e-09 -1.44427e-08 -1.26702e-08 2.90554 0.965183 0.102902 -3.60637e-09 -1.44427e-08 -1.26702e-08 10.2786 0.731801 0.0259123 -3.60639e-09 -1.44427e-08 -1.26702e-08 2.22167 -0.733487 -0.20892 4.60272e-14 -1.04083e-12 -1.14515e-12 10.9667 -45.7468 9.95647 10.1825 -4.25299 -18.1441 1.32599 30.8156 -4.80881 2.40277e-09 -1.78507e-09 -1.05488e-08 3.88565e-09 -2.87084e-09 -1.82529e-08 2.40277e-09 -1.78507e-09 -1.05488e-08 -7.73091 5.47488 -0.417314 2.40277e-09 -1.78507e-09 -1.05488e-08 -2.90554 0.965183 -0.102902 2.40276e-09 -1.78507e-09 -1.05488e-08 -10.2786 0.731801 -0.0259123 2.40278e-09 -1.78507e-09 -1.05488e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1143 -3.9471 8.42856 0.138913 5.28445 1.23891 -36.1679 -26.9541 -57.0447 2.03217e-16 0.0 3.88251e-19 62.5624 -67.3739 87.1496 0.62594 54.5299 -1.87925 14.4013 -21.2767 30.3535
--19.4297 73.3639 128.289 183.136 -14.9278 570.723 -10.0422 -8.45151 8.64901 -4.62072 -13.2218 1.21981 4.54988 -10.369 11.3585 -18.8547 -6.86805 18.8775 -0.0 0.0 0.0 -0.0 0.0 0.0 1.36416e-13 -1.30454e-12 -1.32886e-12 116.648 -49.5693 149.887 -5.75156 -1.9341 10.042 -13.9859 68.1768 20.5463 -3.95778e-09 -1.54077e-08 -1.35717e-08 -7.54772e-09 -2.60271e-08 -2.30578e-08 -3.95778e-09 -1.54077e-08 -1.35717e-08 7.73091 5.47488 0.417314 -3.95778e-09 -1.54077e-08 -1.35717e-08 2.90554 0.965183 0.102902 -3.95777e-09 -1.54077e-08 -1.35717e-08 10.2786 0.731801 0.0259123 -3.95779e-09 -1.54077e-08 -1.35717e-08 2.22167 -0.733487 -0.20892 1.36357e-13 -1.30453e-12 -1.32909e-12 11.0064 -46.4047 9.92742 10.0897 -4.19582 -17.97 1.38116 31.3751 -4.9162 3.85511e-09 -3.26035e-09 -1.14049e-08 6.36706e-09 -5.39562e-09 -1.97659e-08 3.85511e-09 -3.26035e-09 -1.14049e-08 -7.73091 5.47488 -0.417314 3.85511e-09 -3.26035e-09 -1.14049e-08 -2.90554 0.965183 -0.102902 3.8551e-09 -3.26035e-09 -1.14049e-08 -10.2786 0.731801 -0.0259123 3.85511e-09 -3.26035e-09 -1.14049e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1631 -4.10721 8.41351 0.138667 5.27211 1.23667 -36.1155 -26.8835 -57.0455 2.03217e-16 0.0 3.88251e-19 62.5246 -67.4616 87.1219 0.617721 54.3123 -1.86776 14.3903 -21.1877 30.4169
--19.3883 73.4211 128.332 183.143 -14.9752 570.747 -9.938 -8.46653 8.70767 -4.75137 -13.2937 1.21283 4.61538 -9.88013 11.3704 -18.8303 -7.56042 18.8132 -0.0 0.0 0.0 -0.0 0.0 0.0 2.39229e-13 -1.45359e-12 -1.43495e-12 116.604 -49.643 149.637 -5.78474 -1.9486 10.1012 -13.8734 68.0646 20.4251 -3.9541e-09 -1.47904e-08 -1.30759e-08 -7.50989e-09 -2.50379e-08 -2.22038e-08 -3.9541e-09 -1.47904e-08 -1.30759e-08 7.73091 5.47488 0.417314 -3.9541e-09 -1.47904e-08 -1.30759e-08 2.90554 0.965183 0.102902 -3.95409e-09 -1.47904e-08 -1.30759e-08 10.2786 0.731801 0.0259123 -3.9541e-09 -1.47904e-08 -1.30759e-08 2.22167 -0.733487 -0.20892 2.39215e-13 -1.45359e-12 -1.43515e-12 11.1163 -47.0476 9.95451 10.0098 -4.1472 -17.82 1.44198 31.9737 -5.03257 5.48627e-09 -5.07658e-09 -1.14216e-08 9.17624e-09 -8.52386e-09 -1.98368e-08 5.48627e-09 -5.07658e-09 -1.14216e-08 -7.73091 5.47488 -0.417314 5.48627e-09 -5.07658e-09 -1.14216e-08 -2.90554 0.965183 -0.102902 5.48626e-09 -5.07658e-09 -1.14216e-08 -10.2786 0.731801 -0.0259123 5.48627e-09 -5.07658e-09 -1.14216e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2146 -4.27483 8.42794 0.138394 5.26245 1.23422 -36.0492 -26.7711 -57.0705 2.03217e-16 0.0 3.88251e-19 62.591 -67.5123 87.2314 0.610006 54.1082 -1.85742 14.3871 -21.018 30.5659
--19.3325 73.4585 128.384 183.206 -15.0237 570.785 -9.87754 -8.46575 8.7465 -4.85293 -13.3677 1.20383 4.70953 -9.38691 11.408 -18.7796 -8.21837 18.7997 -0.0 0.0 0.0 -0.0 0.0 0.0 3.10869e-13 -1.46405e-12 -1.43738e-12 116.571 -49.6552 149.398 -5.80821 -1.9589 10.143 -13.7856 67.976 20.3304 -3.6824e-09 -1.31134e-08 -1.16307e-08 -6.95964e-09 -2.22464e-08 -1.9737e-08 -3.6824e-09 -1.31134e-08 -1.16307e-08 7.73091 5.47488 0.417314 -3.6824e-09 -1.31134e-08 -1.16307e-08 2.90554 0.965183 0.102902 -3.68239e-09 -1.31134e-08 -1.16307e-08 10.2786 0.731801 0.0259123 -3.6824e-09 -1.31134e-08 -1.16307e-08 2.22167 -0.733487 -0.20892 3.10898e-13 -1.46405e-12 -1.43754e-12 11.2589 -47.6802 10.0308 9.94185 -4.10613 -17.6924 1.49961 32.5198 -5.14038 6.58463e-09 -6.38619e-09 -1.06162e-08 1.10872e-08 -1.07954e-08 -1.84764e-08 6.58462e-09 -6.38619e-09 -1.06162e-08 -7.73091 5.47488 -0.417314 6.58463e-09 -6.3862e-09 -1.06162e-08 -2.90554 0.965183 -0.102902 6.58462e-09 -6.3862e-09 -1.06162e-08 -10.2786 0.731801 -0.0259123 6.58463e-09 -6.3862e-09 -1.06162e-08 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2432 -4.41591 8.45928 0.138168 5.25215 1.23217 -36.0 -26.6688 -57.1038 2.03217e-16 0.0 3.88251e-19 62.652 -67.5215 87.3784 0.602981 53.9185 -1.84752 14.3713 -20.807 30.7307
--19.2743 73.4677 128.501 183.274 -15.0683 570.915 -9.88921 -8.42425 8.76771 -4.8912 -13.3771 1.20438 4.75125 -9.05312 11.4587 -18.6208 -8.7041 18.863 -0.0 0.0 0.0 -0.0 0.0 0.0 3.07658e-13 -1.31198e-12 -1.31034e-12 116.597 -49.5802 149.276 -5.81775 -1.96309 10.16 -13.771 67.9613 20.3146 -3.22974e-09 -1.08993e-08 -9.68356e-09 -6.07276e-09 -1.85088e-08 -1.6422e-08 -3.22974e-09 -1.08993e-08 -9.68358e-09 7.73091 5.47488 0.417314 -3.22974e-09 -1.08993e-08 -9.68356e-09 2.90554 0.965183 0.102902 -3.22973e-09 -1.08993e-08 -9.68356e-09 10.2786 0.731801 0.0259123 -3.22974e-09 -1.08993e-08 -9.68356e-09 2.22167 -0.733487 -0.20892 3.07701e-13 -1.31198e-12 -1.31049e-12 11.3963 -48.3074 10.1492 9.8847 -4.07161 -17.5854 1.54363 32.9221 -5.22095 6.43855e-09 -6.3416e-09 -9.00608e-09 1.08739e-08 -1.07502e-08 -1.56957e-08 6.43855e-09 -6.3416e-09 -9.00607e-09 -7.73091 5.47488 -0.417314 6.43856e-09 -6.3416e-09 -9.00608e-09 -2.90554 0.965183 -0.102902 6.43855e-09 -6.3416e-09 -9.00608e-09 -10.2786 0.731801 -0.0259123 6.43856e-09 -6.3416e-09 -9.00609e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.223 -4.49644 8.49494 0.138065 5.23792 1.23116 -35.9988 -26.6281 -57.1289 2.03217e-16 0.0 3.88251e-19 62.5969 -67.485 87.4619 0.596848 53.7443 -1.83735 14.3236 -20.5933 30.8414
--19.2162 73.4752 128.587 183.362 -14.9855 570.978 -10.0077 -8.31201 8.74975 -4.8275 -13.2929 1.21657 4.71068 -8.97183 11.5317 -18.3018 -8.92693 19.0456 -0.0 0.0 0.0 -0.0 0.0 0.0 1.70863e-13 -8.6498e-13 -9.47785e-13 116.693 -49.3679 149.309 -5.81127 -1.96023 10.1485 -13.8564 68.0476 20.4068 -2.40734e-09 -7.59508e-09 -6.71084e-09 -4.4975e-09 -1.28621e-08 -1.13731e-08 -2.40734e-09 -7.59509e-09 -6.71086e-09 7.73091 5.47488 0.417314 -2.40734e-09 -7.59508e-09 -6.71085e-09 2.90554 0.965183 0.102902 -2.40733e-09 -7.59508e-09 -6.71085e-09 10.2786 0.731801 0.0259123 -2.40734e-09 -7.59508e-09 -6.71084e-09 2.22167 -0.733487 -0.20892 1.70871e-13 -8.64968e-13 -9.47939e-13 11.5403 -48.9718 10.3539 9.83677 -4.04267 -17.4958 1.56755 33.136 -5.26418 4.13225e-09 -3.94261e-09 -5.74691e-09 6.97916e-09 -6.68244e-09 -1.00144e-08 4.13225e-09 -3.94261e-09 -5.7469e-09 -7.73091 5.47488 -0.417314 4.13226e-09 -3.94261e-09 -5.74691e-09 -2.90554 0.965183 -0.102902 4.13225e-09 -3.94261e-09 -5.74691e-09 -10.2786 0.731801 -0.0259123 4.13226e-09 -3.94261e-09 -5.74692e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1325 -4.48181 8.52633 0.138149 5.21673 1.23173 -36.0772 -26.6806 -57.1472 2.03217e-16 0.0 3.88251e-19 62.346 -67.3803 87.4302 0.591803 53.5862 -1.82615 14.2214 -20.3559 30.875
--19.1918 73.4816 128.636 183.219 -14.739 571.056 -10.2086 -8.15007 8.69891 -4.69001 -13.1543 1.23454 4.63421 -9.03911 11.6289 -17.8754 -8.97781 19.32 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.0525e-14 -1.77824e-13 -3.96532e-13 116.832 -49.0468 149.435 -5.79137 -1.95149 10.113 -14.0128 68.2036 20.5753 -1.23944e-09 -3.15293e-09 -2.68815e-09 -2.27298e-09 -5.2467e-09 -4.54562e-09 -1.23943e-09 -3.15293e-09 -2.68816e-09 7.73091 5.47488 0.417314 -1.23944e-09 -3.15293e-09 -2.68814e-09 2.90554 0.965183 0.102902 -1.23943e-09 -3.15293e-09 -2.68815e-09 10.2786 0.731801 0.0259123 -1.23944e-09 -3.15293e-09 -2.68815e-09 2.22167 -0.733487 -0.20892 -6.05825e-14 -1.77802e-13 -3.96703e-13 11.7104 -49.6562 10.6385 9.7992 -4.02013 -17.4256 1.57646 33.2171 -5.28051 2.87271e-10 1.00684e-10 -1.11242e-09 4.66951e-10 1.90367e-10 -1.92116e-09 2.87269e-10 1.00686e-10 -1.11241e-09 -7.73091 5.47488 -0.417314 2.87272e-10 1.00685e-10 -1.11242e-09 -2.90554 0.965183 -0.102902 2.87269e-10 1.00685e-10 -1.11242e-09 -10.2786 0.731801 -0.0259123 2.87275e-10 1.00685e-10 -1.11243e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9903 -4.3987 8.56188 0.138369 5.19105 1.23341 -36.2109 -26.793 -57.1658 2.03217e-16 0.0 3.88251e-19 61.9758 -67.2168 87.3461 0.587675 53.4437 -1.81447 14.0813 -20.0845 30.8707
--19.1714 73.4788 128.637 183.086 -14.6201 570.939 -10.4319 -7.99019 8.65908 -4.54472 -12.9972 1.25798 4.55544 -9.1232 11.7275 -17.4175 -8.99141 19.6074 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.83602e-13 4.92684e-13 1.39915e-13 117.008 -48.7084 149.61 -5.76075 -1.9381 10.0584 -14.2043 68.3911 20.7814 -1.32614e-10 1.14732e-09 1.18782e-09 -1.61292e-10 2.12591e-09 2.03387e-09 -1.3261e-10 1.14731e-09 1.18781e-09 7.73091 5.47488 0.417314 -1.32614e-10 1.14732e-09 1.18783e-09 2.90554 0.965183 0.102902 -1.32604e-10 1.14732e-09 1.18782e-09 10.2786 0.731801 0.0259123 -1.3262e-10 1.14732e-09 1.18782e-09 2.22167 -0.733487 -0.20892 -2.83726e-13 4.92716e-13 1.39725e-13 11.8739 -50.2766 10.9147 9.77496 -4.00566 -17.3802 1.57697 33.2244 -5.28181 -3.502e-09 4.07041e-09 3.20299e-09 -5.95701e-09 6.94336e-09 5.62009e-09 -3.50201e-09 4.07041e-09 3.203e-09 -7.73091 5.47488 -0.417314 -3.502e-09 4.07041e-09 3.20298e-09 -2.90554 0.965183 -0.102902 -3.502e-09 4.07041e-09 3.20298e-09 -10.2786 0.731801 -0.0259123 -3.502e-09 4.07041e-09 3.20297e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8303 -4.30502 8.61446 0.138619 5.16583 1.23536 -36.3476 -26.9188 -57.1765 2.03217e-16 0.0 3.88251e-19 61.609 -67.0381 87.2799 0.584106 53.3153 -1.80357 13.9439 -19.8338 30.8522
--19.1982 73.4736 128.652 182.844 -14.5371 570.821 -10.6184 -7.88424 8.67401 -4.45764 -12.8573 1.28658 4.50708 -9.09255 11.8042 -17.0017 -9.10202 19.8297 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.95463e-13 8.89742e-13 4.5805e-13 117.219 -48.4446 149.795 -5.72214 -1.92132 9.98943 -14.3928 68.5722 20.984 5.06538e-10 4.02579e-09 3.72035e-09 1.07546e-09 7.04429e-09 6.3389e-09 5.06543e-10 4.02579e-09 3.72034e-09 7.73091 5.47488 0.417314 5.06538e-10 4.02579e-09 3.72036e-09 2.90554 0.965183 0.102902 5.06549e-10 4.02579e-09 3.72035e-09 10.2786 0.731801 0.0259123 5.06532e-10 4.02579e-09 3.72035e-09 2.22167 -0.733487 -0.20892 -3.95627e-13 8.89778e-13 4.57851e-13 11.9896 -50.7503 11.087 9.76702 -4.00094 -17.3653 1.57592 33.2165 -5.28013 -5.64117e-09 6.24871e-09 5.50491e-09 -9.587e-09 1.06517e-08 9.64533e-09 -5.64117e-09 6.24871e-09 5.50493e-09 -7.73091 5.47488 -0.417314 -5.64117e-09 6.24871e-09 5.50491e-09 -2.90554 0.965183 -0.102902 -5.64117e-09 6.24871e-09 5.50491e-09 -10.2786 0.731801 -0.0259123 -5.64117e-09 6.24871e-09 5.5049e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6866 -4.2587 8.69693 0.138796 5.14599 1.2367 -36.4346 -27.0119 -57.1706 2.03217e-16 0.0 3.88251e-19 61.3657 -66.8881 87.2987 0.580722 53.1996 -1.79473 13.8493 -19.6585 30.8421
--19.2721 73.4713 128.699 182.47 -14.3261 570.787 -10.7714 -7.87476 8.78355 -4.46407 -12.747 1.32499 4.50151 -8.87463 11.8493 -16.6267 -9.36942 19.9604 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.30701e-13 8.69747e-13 4.38381e-13 117.502 -48.2849 150.005 -5.66604 -1.89709 9.88922 -14.5872 68.7558 21.1927 4.01962e-10 4.74934e-09 4.20741e-09 9.25844e-10 8.24045e-09 7.18308e-09 4.01967e-10 4.74934e-09 4.20741e-09 7.73091 5.47488 0.417314 4.01962e-10 4.74935e-09 4.20742e-09 2.90554 0.965183 0.102902 4.01974e-10 4.74934e-09 4.20741e-09 10.2786 0.731801 0.0259123 4.01957e-10 4.74934e-09 4.20741e-09 2.22167 -0.733487 -0.20892 -3.30859e-13 8.6978e-13 4.3819e-13 12.0329 -51.0578 11.0893 9.77774 -4.00733 -17.3854 1.57538 33.2111 -5.27907 -5.21438e-09 5.62507e-09 4.54169e-09 -8.87557e-09 9.60069e-09 7.97154e-09 -5.21439e-09 5.62506e-09 4.5417e-09 -7.73091 5.47488 -0.417314 -5.21438e-09 5.62506e-09 4.54168e-09 -2.90554 0.965183 -0.102902 -5.21438e-09 5.62506e-09 4.54168e-09 -10.2786 0.731801 -0.0259123 -5.21438e-09 5.62507e-09 4.54167e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.5493 -4.29341 8.83711 0.138859 5.1334 1.23713 -36.4451 -27.0565 -57.136 2.03217e-16 0.0 3.88251e-19 61.3008 -66.7752 87.4646 0.577063 53.0944 -1.7886 13.8288 -19.6101 30.8496
--19.2558 73.4758 128.765 182.503 -14.2159 570.774 -10.916 -7.92444 8.95496 -4.52298 -12.6463 1.37177 4.5198 -8.55217 11.8767 -16.2602 -9.71413 20.0438 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.56854e-13 5.94701e-13 2.11187e-13 117.846 -48.1782 150.255 -5.59432 -1.86618 9.76127 -14.8031 68.9556 21.4242 -1.73617e-10 4.13119e-09 3.41489e-09 -1.00947e-10 7.11991e-09 5.86253e-09 -1.73611e-10 4.13119e-09 3.41488e-09 7.73091 5.47488 0.417314 -1.73617e-10 4.13119e-09 3.41489e-09 2.90554 0.965183 0.102902 -1.73605e-10 4.13119e-09 3.41488e-09 10.2786 0.731801 0.0259123 -1.7362e-10 4.13119e-09 3.41488e-09 2.22167 -0.733487 -0.20892 -1.56979e-13 5.94726e-13 2.11013e-13 12.0234 -51.2428 10.9797 9.80503 -4.02362 -17.4365 1.57161 33.1762 -5.27208 -3.23555e-09 3.29982e-09 1.48359e-09 -5.54108e-09 5.66186e-09 2.64372e-09 -3.23555e-09 3.29981e-09 1.4836e-09 -7.73091 5.47488 -0.417314 -3.23555e-09 3.29981e-09 1.48359e-09 -2.90554 0.965183 -0.102902 -3.23555e-09 3.29981e-09 1.48359e-09 -10.2786 0.731801 -0.0259123 -3.23554e-09 3.29983e-09 1.48358e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.4071 -4.37208 9.02006 0.138867 5.12524 1.23713 -36.4113 -27.0785 -57.0806 2.03217e-16 0.0 3.88251e-19 61.3406 -66.6767 87.7245 0.5734 53.0009 -1.78437 13.8543 -19.647 30.8612
--19.1649 73.4847 128.888 182.691 -14.0456 570.868 -11.026 -7.9655 9.12296 -4.58573 -12.5422 1.41755 4.54724 -8.22655 11.8981 -15.9279 -10.0612 20.1071 -0.0 0.0 0.0 -0.0 0.0 0.0 2.95651e-14 2.66208e-13 -5.23864e-14 118.177 -48.0959 150.501 -5.5268 -1.83712 9.64105 -15.0082 69.1414 21.6439 -8.03613e-10 3.21099e-09 2.34793e-09 -1.23609e-09 5.48153e-09 4.07456e-09 -8.03607e-10 3.21099e-09 2.34793e-09 7.73091 5.47488 0.417314 -8.03614e-10 3.211e-09 2.34794e-09 2.90554 0.965183 0.102902 -8.036e-10 3.21099e-09 2.34792e-09 10.2786 0.731801 0.0259123 -8.03614e-10 3.21099e-09 2.34793e-09 2.22167 -0.733487 -0.20892 2.94723e-14 2.66224e-13 -5.25432e-14 11.9844 -51.3185 10.8482 9.8451 -4.04765 -17.5114 1.56282 33.0962 -5.25598 -1.00489e-09 7.21357e-10 -1.73081e-09 -1.77651e-09 1.28954e-09 -2.96007e-09 -1.0049e-09 7.21336e-10 -1.7308e-09 -7.73091 5.47488 -0.417314 -1.00489e-09 7.21337e-10 -1.73081e-09 -2.90554 0.965183 -0.102902 -1.0049e-09 7.21338e-10 -1.73081e-09 -10.2786 0.731801 -0.0259123 -1.00488e-09 7.21364e-10 -1.73081e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2915 -4.44655 9.19438 0.138863 5.11945 1.23706 -36.3692 -27.0933 -57.0245 2.03217e-16 0.0 3.88251e-19 61.4119 -66.59 87.9736 0.570463 52.9234 -1.78107 13.876 -19.6846 30.8651
--19.1118 73.4891 128.996 182.657 -13.7954 570.967 -11.0759 -7.9304 9.22213 -4.60363 -12.4219 1.45296 4.56906 -7.99912 11.925 -15.6556 -10.3357 20.1772 -0.0 0.0 0.0 -0.0 0.0 0.0 1.32041e-13 8.58703e-14 -1.81192e-13 118.42 -48.0099 150.701 -5.48347 -1.81847 9.56402 -15.168 69.2835 21.8147 -1.07144e-09 3.0284e-09 2.0117e-09 -1.71077e-09 5.12418e-09 3.51646e-09 -1.07143e-09 3.0284e-09 2.0117e-09 7.73091 5.47488 0.417314 -1.07144e-09 3.02841e-09 2.0117e-09 2.90554 0.965183 0.102902 -1.07143e-09 3.0284e-09 2.01169e-09 10.2786 0.731801 0.0259123 -1.07144e-09 3.02841e-09 2.0117e-09 2.22167 -0.733487 -0.20892 1.31953e-13 8.58796e-14 -1.81341e-13 11.9407 -51.2981 10.7859 9.89414 -4.07726 -17.6031 1.54727 32.9555 -5.22765 1.7735e-10 -6.6194e-10 -3.16294e-09 2.25192e-10 -1.06193e-09 -5.46174e-09 1.77348e-10 -6.61965e-10 -3.16293e-09 -7.73091 5.47488 -0.417314 1.77352e-10 -6.61963e-10 -3.16295e-09 -2.90554 0.965183 -0.102902 1.77346e-10 -6.61963e-10 -3.16294e-09 -10.2786 0.731801 -0.0259123 1.7736e-10 -6.61933e-10 -3.16295e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2331 -4.46882 9.30858 0.138893 5.11395 1.23727 -36.3549 -27.1165 -56.9883 2.03217e-16 0.0 3.88251e-19 61.4432 -66.513 88.1088 0.56899 52.8658 -1.77773 13.8442 -19.6385 30.8496
--19.1098 73.4849 129.011 182.535 -13.6706 570.816 -11.0402 -7.77154 9.212 -4.54906 -12.2804 1.47171 4.59659 -7.91991 11.9631 -15.4895 -10.4806 20.2581 -0.0 0.0 0.0 -0.0 0.0 0.0 1.01272e-13 1.5201e-13 -8.55846e-14 118.502 -47.9418 150.827 -5.47966 -1.81678 9.55731 -15.2154 69.3248 21.8653 -7.52104e-10 4.24759e-09 3.01212e-09 -1.1056e-09 7.19196e-09 5.21288e-09 -7.52097e-10 4.2476e-09 3.01212e-09 7.73091 5.47488 0.417314 -7.52104e-10 4.2476e-09 3.01213e-09 2.90554 0.965183 0.102902 -7.52091e-10 4.2476e-09 3.01212e-09 10.2786 0.731801 0.0259123 -7.52104e-10 4.2476e-09 3.01212e-09 2.22167 -0.733487 -0.20892 1.01138e-13 1.52019e-13 -8.57426e-14 11.8863 -51.1394 10.8354 9.96044 -4.11753 -17.727 1.52279 32.7313 -5.18272 -3.80286e-10 -8.06669e-11 -1.62969e-09 -6.9885e-10 -9.15943e-11 -2.80225e-09 -3.80289e-10 -8.06882e-11 -1.62968e-09 -7.73091 5.47488 -0.417314 -3.80285e-10 -8.06871e-11 -1.62969e-09 -2.90554 0.965183 -0.102902 -3.80293e-10 -8.0687e-11 -1.62969e-09 -10.2786 0.731801 -0.0259123 -3.80278e-10 -8.06618e-11 -1.62969e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2536 -4.40962 9.32555 0.138992 5.10752 1.23807 -36.3884 -27.162 -56.9791 2.03217e-16 0.0 3.88251e-19 61.3938 -66.4553 88.0597 0.569818 52.8343 -1.77415 13.7262 -19.4556 30.8041
--19.0458 73.4848 129.031 182.685 -13.7151 570.657 -10.9383 -7.53475 9.13532 -4.45278 -12.1251 1.48009 4.63286 -7.92715 12.0051 -15.4033 -10.5485 20.336 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.41202e-15 3.42252e-13 1.28489e-13 118.482 -47.8976 150.907 -5.50145 -1.82608 9.59612 -15.1854 69.2978 21.8333 -1.05753e-10 6.1851e-09 4.70049e-09 9.79165e-11 1.0504e-08 8.06791e-09 -1.05747e-10 6.18511e-09 4.70048e-09 7.73091 5.47488 0.417314 -1.05753e-10 6.18511e-09 4.70049e-09 2.90554 0.965183 0.102902 -1.05741e-10 6.18511e-09 4.70048e-09 10.2786 0.731801 0.0259123 -1.05754e-10 6.18511e-09 4.70049e-09 2.22167 -0.733487 -0.20892 -3.6234e-15 3.42263e-13 1.28312e-13 11.8113 -50.8506 10.9415 10.0427 -4.16765 -17.8812 1.49138 32.4381 -5.12443 -1.86943e-09 1.56498e-09 1.613e-09 -3.18636e-09 2.67608e-09 2.83069e-09 -1.86944e-09 1.56497e-09 1.61301e-09 -7.73091 5.47488 -0.417314 -1.86943e-09 1.56497e-09 1.61299e-09 -2.90554 0.965183 -0.102902 -1.86944e-09 1.56497e-09 1.613e-09 -10.2786 0.731801 -0.0259123 -1.86943e-09 1.56498e-09 1.613e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.332 -4.30008 9.28057 0.139128 5.10148 1.23921 -36.4471 -27.2183 -56.9854 2.03217e-16 0.0 3.88251e-19 61.3106 -66.4149 87.8974 0.572325 52.8251 -1.77081 13.5553 -19.1908 30.7382
--19.0091 73.4866 129.075 182.794 -13.739 570.582 -10.8127 -7.29286 9.0513 -4.35371 -11.9617 1.48758 4.65048 -7.95449 12.0433 -15.3134 -10.6281 20.411 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.15579e-13 5.27151e-13 3.38787e-13 118.479 -47.8247 150.987 -5.52497 -1.83615 9.63799 -15.1957 69.3069 21.8442 5.56489e-10 7.85916e-09 6.19999e-09 1.31732e-09 1.33717e-08 1.0598e-08 5.56496e-10 7.85917e-09 6.19997e-09 7.73091 5.47488 0.417314 5.56489e-10 7.85916e-09 6.19999e-09 2.90554 0.965183 0.102902 5.56501e-10 7.85916e-09 6.19999e-09 10.2786 0.731801 0.0259123 5.56488e-10 7.85916e-09 6.2e-09 2.22167 -0.733487 -0.20892 -1.15861e-13 5.27164e-13 3.38592e-13 11.7357 -50.5208 11.0494 10.1231 -4.21668 -18.0322 1.45755 32.1161 -5.06095 -3.34056e-09 3.21899e-09 4.84503e-09 -5.6426e-09 5.45729e-09 8.44498e-09 -3.34057e-09 3.21899e-09 4.84504e-09 -7.73091 5.47488 -0.417314 -3.34056e-09 3.21899e-09 4.84503e-09 -2.90554 0.965183 -0.102902 -3.34057e-09 3.21899e-09 4.84504e-09 -10.2786 0.731801 -0.0259123 -3.34056e-09 3.21899e-09 4.84504e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.4348 -4.18288 9.23062 0.139244 5.09762 1.24018 -36.5026 -27.2627 -57.0 2.03217e-16 0.0 3.88251e-19 61.2545 -66.3719 87.7316 0.575074 52.8271 -1.76781 13.3814 -18.9223 30.6696
--18.9807 73.4896 129.115 182.887 -13.9204 570.5 -10.7072 -7.1189 9.01882 -4.29089 -11.7961 1.50365 4.62189 -7.93566 12.0699 -15.1357 -10.8084 20.4835 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.68794e-13 5.77265e-13 4.23063e-13 118.612 -47.6705 151.111 -5.52639 -1.8368 9.64048 -15.3649 69.4559 22.0251 9.23499e-10 8.28798e-09 6.63384e-09 1.97014e-09 1.41065e-08 1.13197e-08 9.23505e-10 8.28799e-09 6.63382e-09 7.73091 5.47488 0.417314 9.23499e-10 8.28798e-09 6.63384e-09 2.90554 0.965183 0.102902 9.2351e-10 8.28798e-09 6.63384e-09 10.2786 0.731801 0.0259123 9.23498e-10 8.28798e-09 6.63385e-09 2.22167 -0.733487 -0.20892 -1.69101e-13 5.77274e-13 4.22865e-13 11.6821 -50.2393 11.1061 10.1838 -4.25376 -18.1465 1.42544 31.8058 -5.00018 -3.84416e-09 3.82536e-09 6.34634e-09 -6.47282e-09 6.46822e-09 1.10486e-08 -3.84416e-09 3.82536e-09 6.34635e-09 -7.73091 5.47488 -0.417314 -3.84416e-09 3.82536e-09 6.34633e-09 -2.90554 0.965183 -0.102902 -3.84417e-09 3.82536e-09 6.34634e-09 -10.2786 0.731801 -0.0259123 -3.84416e-09 3.82536e-09 6.34634e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.5281 -4.10078 9.23262 0.139281 5.09773 1.2405 -36.5266 -27.2726 -57.0153 2.03217e-16 0.0 3.88251e-19 61.2859 -66.3072 87.6716 0.57663 52.8296 -1.76526 13.2536 -18.7282 30.6155
--18.9792 73.4915 129.14 182.885 -13.9144 570.423 -10.6361 -7.04446 9.06113 -4.27697 -11.621 1.53312 4.53119 -7.85833 12.0815 -14.8314 -11.1325 20.5546 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.26103e-13 4.03149e-13 3.07576e-13 118.914 -47.4217 151.281 -5.49912 -1.82516 9.59188 -15.7421 69.778 22.4276 8.48578e-10 6.92101e-09 5.49836e-09 1.77752e-09 1.17574e-08 9.37907e-09 8.48584e-10 6.92102e-09 5.49834e-09 7.73091 5.47488 0.417314 8.48578e-10 6.92101e-09 5.49836e-09 2.90554 0.965183 0.102902 8.48588e-10 6.92101e-09 5.49836e-09 10.2786 0.731801 0.0259123 8.48577e-10 6.92101e-09 5.49837e-09 2.22167 -0.733487 -0.20892 -1.26362e-13 4.03145e-13 3.07395e-13 11.6765 -50.0584 11.1125 10.2165 -4.27386 -18.2083 1.39665 31.5235 -4.94523 -2.75879e-09 2.70783e-09 5.23902e-09 -4.62678e-09 4.56098e-09 9.11123e-09 -2.7588e-09 2.70783e-09 5.23903e-09 -7.73091 5.47488 -0.417314 -2.75879e-09 2.70783e-09 5.23902e-09 -2.90554 0.965183 -0.102902 -2.75881e-09 2.70783e-09 5.23902e-09 -10.2786 0.731801 -0.0259123 -2.75879e-09 2.70783e-09 5.23902e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6031 -4.07025 9.31394 0.139195 5.10358 1.23981 -36.5024 -27.2249 -57.0353 2.03217e-16 0.0 3.88251e-19 61.4409 -66.2078 87.7668 0.576344 52.8304 -1.76299 13.1817 -18.6364 30.5668
--18.9658 73.4921 129.159 182.942 -13.7927 570.375 -10.5755 -7.02658 9.14418 -4.29052 -11.4361 1.57015 4.39595 -7.75607 12.0828 -14.4501 -11.5464 20.6246 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.93505e-14 9.21472e-14 7.12363e-14 119.32 -47.1058 151.474 -5.45592 -1.80671 9.51495 -16.2769 70.2144 22.9966 5.18902e-10 4.37811e-09 3.35113e-09 1.09128e-09 7.39191e-09 5.72004e-09 5.18909e-10 4.37812e-09 3.35112e-09 7.73091 5.47488 0.417314 5.18902e-10 4.37811e-09 3.35114e-09 2.90554 0.965183 0.102902 5.18912e-10 4.37811e-09 3.35113e-09 10.2786 0.731801 0.0259123 5.18902e-10 4.37811e-09 3.35114e-09 2.22167 -0.733487 -0.20892 -2.95133e-14 9.21248e-14 7.10872e-14 11.7012 -49.921 11.0924 10.2321 -4.28354 -18.2377 1.36875 31.2458 -4.89153 -7.13621e-10 5.6115e-10 2.58019e-09 -1.16334e-09 9.10992e-10 4.47288e-09 -7.13624e-10 5.61152e-10 2.5802e-09 -7.73091 5.47488 -0.417314 -7.1362e-10 5.61152e-10 2.58019e-09 -2.90554 0.965183 -0.102902 -7.13631e-10 5.61152e-10 2.5802e-09 -10.2786 0.731801 -0.0259123 -7.13619e-10 5.6115e-10 2.58019e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6776 -4.06678 9.44012 0.139028 5.11378 1.23845 -36.4481 -27.1375 -57.0622 2.03217e-16 0.0 3.88251e-19 61.6789 -66.0865 87.9501 0.575069 52.835 -1.76099 13.1401 -18.6031 30.5185
--18.9298 73.4958 129.199 183.093 -13.6836 570.345 -10.5125 -7.02663 9.24073 -4.31944 -11.2582 1.60822 4.23868 -7.63146 12.0778 -14.0409 -11.9931 20.6931 -0.0 0.0 0.0 -0.0 0.0 0.0 6.96988e-14 -2.19998e-13 -1.79216e-13 119.797 -46.731 151.699 -5.40199 -1.78377 9.41897 -16.9449 70.7309 23.7053 1.24162e-10 1.43314e-09 9.07224e-10 2.75001e-10 2.34902e-09 1.55599e-09 1.24169e-10 1.43314e-09 9.07219e-10 7.73091 5.47488 0.417314 1.24161e-10 1.43314e-09 9.07233e-10 2.90554 0.965183 0.102902 1.24171e-10 1.43314e-09 9.07226e-10 10.2786 0.731801 0.0259123 1.24163e-10 1.43314e-09 9.07235e-10 2.22167 -0.733487 -0.20892 6.96343e-14 -2.20037e-13 -1.79333e-13 11.7151 -49.7521 11.0289 10.2415 -4.28942 -18.2553 1.33969 30.9535 -4.83529 1.36503e-09 -1.61417e-09 -4.47726e-10 2.3486e-09 -2.78054e-09 -8.03505e-10 1.36502e-09 -1.61417e-09 -4.47715e-10 -7.73091 5.47488 -0.417314 1.36503e-09 -1.61417e-09 -4.47728e-10 -2.90554 0.965183 -0.102902 1.36502e-09 -1.61417e-09 -4.47728e-10 -10.2786 0.731801 -0.0259123 1.36503e-09 -1.61417e-09 -4.4774e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.7578 -4.07178 9.57535 0.138847 5.12541 1.23697 -36.3875 -27.0488 -57.0851 2.03217e-16 0.0 3.88251e-19 61.9448 -65.9628 88.1564 0.573624 52.8441 -1.75968 13.125 -18.5985 30.4928
--18.875 73.4981 129.211 183.329 -13.6488 570.297 -10.4344 -7.00601 9.32353 -4.35153 -11.1038 1.64084 4.08188 -7.48711 12.0703 -13.6529 -12.4156 20.7591 -0.0 0.0 0.0 -0.0 0.0 0.0 1.19279e-13 -3.97547e-13 -3.37039e-13 120.315 -46.3056 151.965 -5.34255 -1.75869 9.3132 -17.7181 71.2937 24.5231 -1.45953e-10 -1.14005e-09 -1.11829e-09 -3.07739e-10 -2.03228e-09 -1.8997e-09 -1.45946e-10 -1.14005e-09 -1.11829e-09 7.73091 5.47488 0.417314 -1.45953e-10 -1.14004e-09 -1.11828e-09 2.90554 0.965183 0.102902 -1.45944e-10 -1.14005e-09 -1.11828e-09 10.2786 0.731801 0.0259123 -1.45951e-10 -1.14005e-09 -1.11828e-09 2.22167 -0.733487 -0.20892 1.1927e-13 -3.97593e-13 -3.37139e-13 11.6778 -49.4768 10.9057 10.2554 -4.29809 -18.2814 1.30762 30.6272 -4.77285 2.55081e-09 -2.81764e-09 -2.66232e-09 4.34014e-09 -4.81241e-09 -4.65492e-09 2.55081e-09 -2.81764e-09 -2.66232e-09 -7.73091 5.47488 -0.417314 2.55081e-09 -2.81764e-09 -2.66233e-09 -2.90554 0.965183 -0.102902 2.5508e-09 -2.81764e-09 -2.66233e-09 -10.2786 0.731801 -0.0259123 2.55081e-09 -2.81764e-09 -2.66234e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.8494 -4.06668 9.68377 0.138716 5.13555 1.23592 -36.3445 -26.9974 -57.0931 2.03217e-16 0.0 3.88251e-19 62.1859 -65.8566 88.3229 0.572829 52.8583 -1.75947 13.1322 -18.5933 30.5117
--18.8595 73.4938 129.188 183.418 -13.709 570.137 -10.324 -6.95102 9.39041 -4.38949 -10.9897 1.6663 3.90813 -7.32657 12.0609 -13.2615 -12.8033 20.8344 -0.0 0.0 0.0 -0.0 0.0 0.0 9.17907e-14 -3.62621e-13 -3.41434e-13 120.917 -45.7726 152.306 -5.26997 -1.72834 9.18406 -18.6961 71.9562 25.5539 -1.72258e-10 -3.34416e-09 -2.63704e-09 -4.51036e-10 -5.74384e-09 -4.50405e-09 -1.72253e-10 -3.34416e-09 -2.63705e-09 7.73091 5.47488 0.417314 -1.72259e-10 -3.34415e-09 -2.63704e-09 2.90554 0.965183 0.102902 -1.7225e-10 -3.34416e-09 -2.63705e-09 10.2786 0.731801 0.0259123 -1.72259e-10 -3.34416e-09 -2.63704e-09 2.22167 -0.733487 -0.20892 9.17722e-14 -3.62657e-13 -3.41534e-13 11.5621 -48.9741 10.7037 10.2816 -4.31434 -18.3307 1.26624 30.2005 -4.69172 2.41587e-09 -2.58615e-09 -3.69063e-09 4.08237e-09 -4.39337e-09 -6.42784e-09 2.41587e-09 -2.58615e-09 -3.69062e-09 -7.73091 5.47488 -0.417314 2.41587e-09 -2.58615e-09 -3.69063e-09 -2.90554 0.965183 -0.102902 2.41586e-09 -2.58615e-09 -3.69063e-09 -10.2786 0.731801 -0.0259123 2.41587e-09 -2.58615e-09 -3.69064e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9658 -4.05127 9.76309 0.138664 5.1436 1.23553 -36.3304 -27.0048 -57.0783 2.03217e-16 0.0 3.88251e-19 62.4225 -65.7715 88.458 0.572901 52.8788 -1.76084 13.1786 -18.5802 30.6155
--18.84 73.4917 129.187 183.51 -13.7456 570.055 -10.1928 -6.88339 9.45422 -4.43774 -10.9029 1.68809 3.7133 -7.14748 12.0477 -12.853 -13.185 20.9155 -0.0 0.0 0.0 -0.0 0.0 0.0 1.94396e-14 -2.01511e-13 -2.60107e-13 121.594 -45.1459 152.7 -5.18438 -1.6927 9.03196 -19.917 72.7108 26.8354 -7.879e-11 -5.52223e-09 -3.99631e-09 -3.85114e-10 -9.38349e-09 -6.84398e-09 -7.87868e-11 -5.52223e-09 -3.99632e-09 7.73091 5.47488 0.417314 -7.87912e-11 -5.52222e-09 -3.99632e-09 2.90554 0.965183 0.102902 -7.87813e-11 -5.52223e-09 -3.99632e-09 10.2786 0.731801 0.0259123 -7.8793e-11 -5.52223e-09 -3.99631e-09 2.22167 -0.733487 -0.20892 1.93745e-14 -2.01526e-13 -2.60218e-13 11.4018 -48.3172 10.4426 10.3127 -4.33363 -18.3892 1.21942 29.704 -4.59834 1.51454e-09 -1.51873e-09 -4.18247e-09 2.51556e-09 -2.54326e-09 -7.257e-09 1.51453e-09 -1.51873e-09 -4.18247e-09 -7.73091 5.47488 -0.417314 1.51454e-09 -1.51873e-09 -4.18248e-09 -2.90554 0.965183 -0.102902 1.51453e-09 -1.51873e-09 -4.18248e-09 -10.2786 0.731801 -0.0259123 1.51454e-09 -1.51873e-09 -4.18249e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1 -4.03388 9.83001 0.138652 5.15106 1.23549 -36.3308 -27.0467 -57.0482 2.03217e-16 0.0 3.88251e-19 62.672 -65.6974 88.5875 0.573408 52.9051 -1.76345 13.2604 -18.5745 30.7808
--18.7822 73.4991 129.215 183.743 -13.7072 570.106 -10.071 -6.81771 9.51018 -4.48658 -10.8154 1.70743 3.5398 -6.94361 12.0313 -12.4937 -13.5634 20.9777 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.98274e-14 -2.47215e-14 -1.79079e-13 122.248 -44.5406 153.079 -5.10273 -1.65878 8.88714 -21.2159 73.4358 28.193 -4.06825e-11 -7.41089e-09 -5.13445e-09 -4.00592e-10 -1.25212e-08 -8.80106e-09 -4.06813e-11 -7.41089e-09 -5.13445e-09 7.73091 5.47488 0.417314 -4.06839e-11 -7.41088e-09 -5.13446e-09 2.90554 0.965183 0.102902 -4.06738e-11 -7.41089e-09 -5.13445e-09 10.2786 0.731801 0.0259123 -4.06879e-11 -7.41089e-09 -5.13445e-09 2.22167 -0.733487 -0.20892 -5.99482e-14 -2.47151e-14 -1.79209e-13 11.2443 -47.7214 10.1604 10.3368 -4.3486 -18.4347 1.17937 29.2642 -4.51663 3.93738e-10 -2.08109e-10 -4.48968e-09 5.74534e-10 -2.77525e-10 -7.76179e-09 3.93736e-10 -2.08109e-10 -4.48968e-09 -7.73091 5.47488 -0.417314 3.93739e-10 -2.08108e-10 -4.48969e-09 -2.90554 0.965183 -0.102902 3.9373e-10 -2.08108e-10 -4.48969e-09 -10.2786 0.731801 -0.0259123 3.93743e-10 -2.08108e-10 -4.4897e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.227 -4.0088 9.87716 0.138645 5.15816 1.2355 -36.3311 -27.0925 -57.0145 2.03217e-16 0.0 3.88251e-19 62.8781 -65.6343 88.676 0.57419 52.9346 -1.76649 13.3428 -18.5808 30.935
--18.768 73.5011 129.222 183.816 -13.6552 570.059 -9.98863 -6.76854 9.55353 -4.52636 -10.6991 1.72556 3.43006 -6.70872 12.0125 -12.2506 -13.9414 20.9963 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.08064e-13 5.72401e-14 -1.84373e-13 122.784 -44.0733 153.382 -5.04213 -1.63365 8.77983 -22.357 74.0153 29.3813 -2.33071e-10 -8.74677e-09 -5.9898e-09 -7.8809e-10 -1.47268e-08 -1.02569e-08 -2.33071e-10 -8.74677e-09 -5.98981e-09 7.73091 5.47488 0.417314 -2.33072e-10 -8.74676e-09 -5.98981e-09 2.90554 0.965183 0.102902 -2.33063e-10 -8.74677e-09 -5.98981e-09 10.2786 0.731801 0.0259123 -2.33078e-10 -8.74677e-09 -5.9898e-09 2.22167 -0.733487 -0.20892 -1.08221e-13 5.72583e-14 -1.84522e-13 11.1287 -47.4029 9.8874 10.3422 -4.35193 -18.4447 1.15673 29.0075 -4.46943 -3.99587e-10 7.52992e-10 -4.96407e-09 -8.05881e-10 1.38838e-09 -8.56159e-09 -3.99591e-10 7.52992e-10 -4.96407e-09 -7.73091 5.47488 -0.417314 -3.99587e-10 7.52992e-10 -4.96408e-09 -2.90554 0.965183 -0.102902 -3.99594e-10 7.52992e-10 -4.96407e-09 -10.2786 0.731801 -0.0259123 -3.99582e-10 7.52992e-10 -4.96408e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3219 -3.97032 9.89716 0.138608 5.16512 1.23524 -36.3166 -27.1116 -56.9888 2.03217e-16 0.0 3.88251e-19 62.9846 -65.5824 88.6884 0.575087 52.9652 -1.76915 13.391 -18.604 31.0053
--18.795 73.4958 129.192 183.734 -13.7093 569.893 -9.95511 -6.73963 9.58025 -4.55662 -10.5369 1.74253 3.41673 -6.41396 11.9932 -12.1891 -14.3369 20.9531 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.11288e-13 -2.90377e-14 -3.53314e-13 123.184 -43.8105 153.602 -5.00406 -1.61792 8.71245 -23.2189 74.4228 30.2768 -8.95948e-10 -9.65865e-09 -6.72191e-09 -1.96582e-09 -1.62089e-08 -1.14682e-08 -8.95947e-10 -9.65865e-09 -6.72192e-09 7.73091 5.47488 0.417314 -8.95949e-10 -9.65865e-09 -6.72192e-09 2.90554 0.965183 0.102902 -8.95941e-10 -9.65865e-09 -6.72192e-09 10.2786 0.731801 0.0259123 -8.95955e-10 -9.65865e-09 -6.72191e-09 2.22167 -0.733487 -0.20892 -1.11457e-13 -2.90215e-14 -3.53489e-13 11.0583 -47.467 9.60916 10.318 -4.33693 -18.399 1.15748 29.014 -4.4707 -7.52605e-10 1.29564e-09 -5.95592e-09 -1.43989e-09 2.34188e-09 -1.02626e-08 -7.52614e-10 1.29565e-09 -5.95592e-09 -7.73091 5.47488 -0.417314 -7.52604e-10 1.29564e-09 -5.95593e-09 -2.90554 0.965183 -0.102902 -7.5261e-10 1.29564e-09 -5.95593e-09 -10.2786 0.731801 -0.0259123 -7.52599e-10 1.29564e-09 -5.95594e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3767 -3.90432 9.87306 0.138528 5.17157 1.23461 -36.2872 -27.101 -56.973 2.03217e-16 0.0 3.88251e-19 62.9313 -65.5437 88.5666 0.576106 52.9957 -1.77114 13.3867 -18.6575 30.943
--18.8156 73.491 129.168 183.67 -13.7789 569.776 -9.95384 -6.72323 9.59379 -4.58183 -10.3471 1.75779 3.4702 -6.0717 11.9727 -12.2592 -14.743 20.8648 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.1025e-14 -2.0997e-13 -6.21895e-13 123.501 -43.6795 153.775 -4.98054 -1.60828 8.67076 -23.8874 74.7234 30.9704 -1.87148e-09 -1.02207e-08 -7.30501e-09 -3.66522e-09 -1.7089e-08 -1.24021e-08 -1.87148e-09 -1.02207e-08 -7.30501e-09 7.73091 5.47488 0.417314 -1.87148e-09 -1.02207e-08 -7.30501e-09 2.90554 0.965183 0.102902 -1.87147e-09 -1.02207e-08 -7.30501e-09 10.2786 0.731801 0.0259123 -1.87148e-09 -1.02207e-08 -7.30501e-09 2.22167 -0.733487 -0.20892 -9.11951e-14 -2.09964e-13 -6.22103e-13 11.0057 -47.7829 9.30986 10.273 -4.30905 -18.3143 1.17414 29.2008 -4.50514 -9.46007e-10 1.70625e-09 -7.19212e-09 -1.8049e-09 3.07183e-09 -1.23876e-08 -9.46023e-10 1.70626e-09 -7.19211e-09 -7.73091 5.47488 -0.417314 -9.46007e-10 1.70625e-09 -7.19212e-09 -2.90554 0.965183 -0.102902 -9.4601e-10 1.70625e-09 -7.19212e-09 -10.2786 0.731801 -0.0259123 -9.46002e-10 1.70625e-09 -7.19213e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4053 -3.81801 9.81383 0.138427 5.17755 1.23378 -36.2494 -27.0755 -56.9613 2.03217e-16 0.0 3.88251e-19 62.764 -65.5173 88.3464 0.577316 53.0275 -1.77291 13.3512 -18.7348 30.7967
--18.8108 73.4918 129.172 183.689 -13.7566 569.799 -9.97602 -6.71671 9.60062 -4.59973 -10.1543 1.77163 3.53944 -5.73754 11.9475 -12.3549 -15.1262 20.7591 -0.0 0.0 0.0 -0.0 0.0 0.0 -6.25905e-14 -3.7557e-13 -8.64138e-13 123.757 -43.5888 153.908 -4.9745 -1.60587 8.65996 -24.3941 74.9429 31.4955 -2.73806e-09 -1.00874e-08 -7.39945e-09 -5.14673e-09 -1.6807e-08 -1.25054e-08 -2.73805e-09 -1.00874e-08 -7.39945e-09 7.73091 5.47488 0.417314 -2.73806e-09 -1.00874e-08 -7.39945e-09 2.90554 0.965183 0.102902 -2.73805e-09 -1.00874e-08 -7.39945e-09 10.2786 0.731801 0.0259123 -2.73806e-09 -1.00874e-08 -7.39944e-09 2.22167 -0.733487 -0.20892 -6.27531e-14 -3.75577e-13 -8.64375e-13 10.9614 -48.2127 9.0156 10.2249 -4.27924 -18.2238 1.19671 29.4501 -4.55135 -1.02316e-09 1.9251e-09 -8.08935e-09 -1.96089e-09 3.46485e-09 -1.39304e-08 -1.02318e-09 1.92511e-09 -8.08935e-09 -7.73091 5.47488 -0.417314 -1.02316e-09 1.92511e-09 -8.08935e-09 -2.90554 0.965183 -0.102902 -1.02316e-09 1.9251e-09 -8.08935e-09 -10.2786 0.731801 -0.0259123 -1.02315e-09 1.92511e-09 -8.08936e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4154 -3.73769 9.75092 0.138315 5.18385 1.23287 -36.1988 -27.0303 -56.9539 2.03217e-16 0.0 3.88251e-19 62.5853 -65.4987 88.133 0.578645 53.062 -1.77478 13.3092 -18.811 30.6394
--18.7649 73.4941 129.165 183.893 -13.8177 569.771 -10.0129 -6.71742 9.60718 -4.60804 -9.98285 1.7843 3.57344 -5.4671 11.9135 -12.3696 -15.4523 20.6636 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.12997e-14 -4.15849e-13 -9.54067e-13 123.971 -43.4469 154.005 -4.98886 -1.61185 8.68528 -24.7827 75.1057 31.8977 -3.07407e-09 -8.91366e-09 -6.66559e-09 -5.67078e-09 -1.48028e-08 -1.1225e-08 -3.07406e-09 -8.91367e-09 -6.66559e-09 7.73091 5.47488 0.417314 -3.07407e-09 -8.91367e-09 -6.66559e-09 2.90554 0.965183 0.102902 -3.07407e-09 -8.91367e-09 -6.66559e-09 10.2786 0.731801 0.0259123 -3.07407e-09 -8.91366e-09 -6.66558e-09 2.22167 -0.733487 -0.20892 -4.1447e-14 -4.15868e-13 -9.54316e-13 10.9212 -48.6186 8.75588 10.1914 -4.25849 -18.1609 1.21459 29.6444 -4.58756 -1.02742e-09 1.89248e-09 -8.06433e-09 -1.96786e-09 3.4076e-09 -1.38852e-08 -1.02745e-09 1.89249e-09 -8.06433e-09 -7.73091 5.47488 -0.417314 -1.02742e-09 1.89248e-09 -8.06433e-09 -2.90554 0.965183 -0.102902 -1.02742e-09 1.89248e-09 -8.06433e-09 -10.2786 0.731801 -0.0259123 -1.02742e-09 1.89248e-09 -8.06434e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.414 -3.68973 9.71573 0.138207 5.19127 1.23199 -36.1311 -26.9612 -56.9511 2.03217e-16 0.0 3.88251e-19 62.4975 -65.484 88.0317 0.58002 53.1007 -1.77709 13.2861 -18.8613 30.5446
--18.7881 73.4848 129.146 183.831 -13.8263 569.637 -10.064 -6.74272 9.61968 -4.61413 -9.84371 1.79577 3.57659 -5.27345 11.8659 -12.2807 -15.6794 20.5744 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.54413e-14 -2.72986e-13 -8.14259e-13 124.165 -43.1969 154.064 -5.02883 -1.62828 8.7561 -25.079 75.2265 32.2042 -2.55729e-09 -6.05293e-09 -4.60355e-09 -4.65539e-09 -1.00107e-08 -7.72546e-09 -2.55728e-09 -6.05293e-09 -4.60355e-09 7.73091 5.47488 0.417314 -2.55729e-09 -6.05294e-09 -4.60355e-09 2.90554 0.965183 0.102902 -2.55728e-09 -6.05293e-09 -4.60354e-09 10.2786 0.731801 0.0259123 -2.55729e-09 -6.05293e-09 -4.60354e-09 2.22167 -0.733487 -0.20892 -2.55554e-14 -2.73015e-13 -8.14491e-13 10.8982 -48.989 8.54781 10.1773 -4.24979 -18.1344 1.22553 29.7623 -4.60959 -8.26981e-10 1.37785e-09 -6.57907e-09 -1.58469e-09 2.49256e-09 -1.13274e-08 -8.27004e-10 1.37786e-09 -6.57906e-09 -7.73091 5.47488 -0.417314 -8.2698e-10 1.37785e-09 -6.57907e-09 -2.90554 0.965183 -0.102902 -8.26982e-10 1.37785e-09 -6.57908e-09 -10.2786 0.731801 -0.0259123 -8.26976e-10 1.37786e-09 -6.57908e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3956 -3.69765 9.72554 0.138059 5.20184 1.2308 -36.0145 -26.8299 -56.9559 2.03217e-16 0.0 3.88251e-19 62.5477 -65.4796 88.0972 0.581224 53.1417 -1.78033 13.3051 -18.8818 30.5611
--18.8308 73.4727 129.159 183.668 -13.7294 569.6 -10.1334 -6.788 9.63318 -4.61651 -9.72231 1.80594 3.57015 -5.12749 11.808 -12.1428 -15.8365 20.4801 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.77904e-15 -1.51374e-14 -5.26512e-13 124.322 -42.8987 154.084 -5.09131 -1.65393 8.86698 -25.239 75.2907 32.3697 -1.4825e-09 -1.8742e-09 -1.5309e-09 -2.62324e-09 -3.03491e-09 -2.53106e-09 -1.48249e-09 -1.8742e-09 -1.5309e-09 7.73091 5.47488 0.417314 -1.4825e-09 -1.87421e-09 -1.5309e-09 2.90554 0.965183 0.102902 -1.48249e-09 -1.8742e-09 -1.5309e-09 10.2786 0.731801 0.0259123 -1.4825e-09 -1.8742e-09 -1.53089e-09 2.22167 -0.733487 -0.20892 -8.84481e-15 -1.51782e-14 -5.26708e-13 10.8904 -49.3892 8.37317 10.1732 -4.24728 -18.1267 1.23491 29.8631 -4.62847 -4.46498e-10 4.84612e-10 -4.07214e-09 -8.65108e-10 9.05947e-10 -7.01227e-09 -4.46514e-10 4.84605e-10 -4.07213e-09 -7.73091 5.47488 -0.417314 -4.46497e-10 4.84598e-10 -4.07214e-09 -2.90554 0.965183 -0.102902 -4.46501e-10 4.84597e-10 -4.07215e-09 -10.2786 0.731801 -0.0259123 -4.46492e-10 4.84615e-10 -4.07216e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.359 -3.74191 9.76063 0.13788 5.21452 1.22937 -35.8615 -26.6515 -56.9676 2.03217e-16 0.0 3.88251e-19 62.6746 -65.485 88.2643 0.582367 53.1851 -1.7842 13.3476 -18.8848 30.6401
--18.8237 73.4639 129.202 183.69 -13.695 569.674 -10.219 -6.81763 9.63743 -4.59964 -9.60524 1.81496 3.52817 -5.02164 11.7475 -11.9638 -15.9956 20.3972 -0.0 0.0 0.0 -0.0 0.0 0.0 1.59814e-16 2.78715e-13 -2.03677e-13 124.411 -42.6362 154.071 -5.1667 -1.68505 9.00088 -25.2095 75.279 32.3391 -3.5364e-10 2.44489e-09 1.66578e-09 -4.91808e-10 4.18018e-09 2.87173e-09 -3.53634e-10 2.44489e-09 1.66578e-09 7.73091 5.47488 0.417314 -3.53641e-10 2.44488e-09 1.66578e-09 2.90554 0.965183 0.102902 -3.53633e-10 2.44489e-09 1.66578e-09 10.2786 0.731801 0.0259123 -3.53637e-10 2.44489e-09 1.66579e-09 2.22167 -0.733487 -0.20892 1.36329e-16 2.78664e-13 -2.03838e-13 10.8751 -49.797 8.21077 10.1755 -4.24868 -18.1308 1.24307 29.9505 -4.64486 -1.64069e-10 -3.4611e-10 -1.42508e-09 -3.11286e-10 -5.74987e-10 -2.45343e-09 -1.64079e-10 -3.46129e-10 -1.42507e-09 -7.73091 5.47488 -0.417314 -1.64068e-10 -3.46133e-10 -1.42508e-09 -2.90554 0.965183 -0.102902 -1.64074e-10 -3.46133e-10 -1.42509e-09 -10.2786 0.731801 -0.0259123 -1.64062e-10 -3.46107e-10 -1.4251e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3171 -3.78427 9.79687 0.137759 5.22553 1.22841 -35.7342 -26.5005 -56.9805 2.03217e-16 0.0 3.88251e-19 62.8176 -65.4868 88.4578 0.583864 53.2348 -1.7878 13.3755 -18.8697 30.7083
--18.7837 73.4581 129.262 183.829 -13.6963 569.845 -10.3187 -6.79599 9.62216 -4.54797 -9.47911 1.82301 3.42468 -4.94828 11.6925 -11.7521 -16.2289 20.3423 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.15206e-15 5.2959e-13 4.13969e-14 124.397 -42.4928 154.029 -5.24548 -1.71788 9.14077 -24.9426 75.1714 32.0632 3.25352e-10 5.72667e-09 4.09993e-09 8.21432e-10 9.69023e-09 6.99647e-09 3.25357e-10 5.72667e-09 4.09993e-09 7.73091 5.47488 0.417314 3.2535e-10 5.72666e-09 4.09992e-09 2.90554 0.965183 0.102902 3.2536e-10 5.72667e-09 4.09993e-09 10.2786 0.731801 0.0259123 3.25355e-10 5.72667e-09 4.09994e-09 2.22167 -0.733487 -0.20892 -7.16059e-15 5.29535e-13 4.12478e-14 10.8291 -50.1895 8.03895 10.1804 -4.25172 -18.14 1.25036 30.0281 -4.65945 -2.5779e-10 -6.73182e-10 4.80569e-10 -4.25409e-10 -1.17299e-09 8.35614e-10 -2.57795e-10 -6.73206e-10 4.80588e-10 -7.73091 5.47488 -0.417314 -2.57789e-10 -6.73207e-10 4.80569e-10 -2.90554 0.965183 -0.102902 -2.57796e-10 -6.73207e-10 4.80564e-10 -10.2786 0.731801 -0.0259123 -2.57783e-10 -6.73179e-10 4.80556e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2829 -3.78654 9.81014 0.137781 5.23107 1.22865 -35.6945 -26.4515 -56.988 2.03217e-16 0.0 3.88251e-19 62.9156 -65.4721 88.6018 0.586127 53.2948 -1.79024 13.3507 -18.8362 30.6926
--18.7808 73.4439 129.274 183.833 -13.6858 569.92 -10.442 -6.70173 9.56043 -4.42877 -9.32594 1.82716 3.22494 -4.96259 11.6498 -11.4905 -16.502 20.3456 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.57328e-14 7.50469e-13 1.9162e-13 124.196 -42.5281 153.914 -5.33763 -1.75677 9.30431 -24.3031 74.9054 31.4014 3.28312e-10 7.66117e-09 5.55691e-09 9.15261e-10 1.30037e-08 9.48894e-09 3.28318e-10 7.66117e-09 5.55691e-09 7.73091 5.47488 0.417314 3.28311e-10 7.66116e-09 5.5569e-09 2.90554 0.965183 0.102902 3.28322e-10 7.66117e-09 5.55691e-09 10.2786 0.731801 0.0259123 3.28315e-10 7.66117e-09 5.55692e-09 2.22167 -0.733487 -0.20892 -4.57706e-14 7.50417e-13 1.91448e-13 10.7343 -50.589 7.86557 10.1884 -4.25671 -18.1552 1.25634 30.0914 -4.67137 -1.02676e-09 -1.72965e-10 1.37082e-09 -1.73065e-09 -3.24307e-10 2.38933e-09 -1.02676e-09 -1.72986e-10 1.37084e-09 -7.73091 5.47488 -0.417314 -1.02676e-09 -1.72987e-10 1.37082e-09 -2.90554 0.965183 -0.102902 -1.02677e-09 -1.72987e-10 1.37081e-09 -10.2786 0.731801 -0.0259123 -1.02676e-09 -1.72963e-10 1.3708e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2581 -3.73126 9.7799 0.138035 5.22705 1.23082 -35.7992 -26.5647 -56.9903 2.03217e-16 0.0 3.88251e-19 62.9371 -65.4338 88.6743 0.589469 53.3661 -1.79037 13.2329 -18.77 30.5281
--18.8358 73.4158 129.251 183.625 -13.6593 569.845 -10.5863 -6.55774 9.46587 -4.25984 -9.15766 1.82834 2.9518 -5.04961 11.6135 -11.1804 -16.7941 20.39 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.06786e-13 9.72129e-13 3.02845e-13 123.85 -42.6847 153.739 -5.4439 -1.80189 9.49319 -23.3974 74.5072 30.4625 -4.53981e-11 8.87511e-09 6.5023e-09 3.31183e-10 1.51485e-08 1.11278e-08 -4.53929e-11 8.87511e-09 6.50229e-09 7.73091 5.47488 0.417314 -4.53995e-11 8.8751e-09 6.50229e-09 2.90554 0.965183 0.102902 -4.53879e-11 8.87511e-09 6.5023e-09 10.2786 0.731801 0.0259123 -4.53984e-11 8.87511e-09 6.50231e-09 2.22167 -0.733487 -0.20892 -1.06883e-13 9.72084e-13 3.02628e-13 10.6072 -50.9981 7.69767 10.2012 -4.26457 -18.1792 1.26095 30.1401 -4.68056 -2.24768e-09 8.50602e-10 1.72878e-09 -3.82941e-09 1.43769e-09 3.03557e-09 -2.24769e-09 8.50588e-10 1.7288e-09 -7.73091 5.47488 -0.417314 -2.24768e-09 8.50588e-10 1.72879e-09 -2.90554 0.965183 -0.102902 -2.24769e-09 8.50588e-10 1.72878e-09 -10.2786 0.731801 -0.0259123 -2.24768e-09 8.50603e-10 1.72877e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2365 -3.64119 9.72373 0.138454 5.21652 1.23437 -36.0019 -26.7871 -56.9909 2.03217e-16 0.0 3.88251e-19 62.9196 -65.38 88.7161 0.593591 53.4468 -1.78896 13.0533 -18.6753 30.2693
--18.8584 73.3822 129.229 183.56 -13.6763 569.724 -10.7316 -6.39476 9.38902 -4.10144 -9.00577 1.8324 2.66586 -5.09654 11.5726 -10.8578 -17.1981 20.4225 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.63119e-13 1.14228e-12 3.71631e-13 123.518 -42.8711 153.594 -5.54114 -1.84331 9.66642 -22.514 74.0927 29.5448 -5.11429e-10 9.59591e-09 7.06984e-09 -4.34184e-10 1.64598e-08 1.21262e-08 -5.11424e-10 9.5959e-09 7.06982e-09 7.73091 5.47488 0.417314 -5.1143e-10 9.5959e-09 7.06983e-09 2.90554 0.965183 0.102902 -5.11419e-10 9.59591e-09 7.06984e-09 10.2786 0.731801 0.0259123 -5.11432e-10 9.59591e-09 7.06985e-09 2.22167 -0.733487 -0.20892 -1.63276e-13 1.14224e-12 3.71366e-13 10.4756 -51.365 7.51183 10.2163 -4.27386 -18.2076 1.2652 30.185 -4.68902 -3.41506e-09 1.89729e-09 1.80862e-09 -5.84277e-09 3.2446e-09 3.20092e-09 -3.41506e-09 1.89728e-09 1.80864e-09 -7.73091 5.47488 -0.417314 -3.41506e-09 1.89728e-09 1.80863e-09 -2.90554 0.965183 -0.102902 -3.41506e-09 1.89728e-09 1.80862e-09 -10.2786 0.731801 -0.0259123 -3.41506e-09 1.89729e-09 1.80861e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2192 -3.53855 9.67471 0.138891 5.20638 1.23805 -36.21 -27.0229 -56.9871 2.03217e-16 0.0 3.88251e-19 62.9055 -65.3212 88.746 0.597991 53.5358 -1.78803 12.8805 -18.5799 30.0216
--18.831 73.3632 129.258 183.703 -13.6996 569.613 -10.8584 -6.2437 9.38025 -4.01388 -8.90175 1.84518 2.42807 -4.99051 11.5157 -10.5603 -17.8072 20.3906 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.87537e-13 1.20862e-12 3.94538e-13 123.36 -42.9966 153.572 -5.60642 -1.87113 9.78301 -21.8884 73.7822 28.8937 -7.85429e-10 1.0051e-08 7.39328e-09 -8.84224e-10 1.72725e-08 1.26968e-08 -7.85424e-10 1.0051e-08 7.39326e-09 7.73091 5.47488 0.417314 -7.85429e-10 1.0051e-08 7.39328e-09 2.90554 0.965183 0.102902 -7.85419e-10 1.0051e-08 7.39328e-09 10.2786 0.731801 0.0259123 -7.85433e-10 1.0051e-08 7.39329e-09 2.22167 -0.733487 -0.20892 -1.87731e-13 1.2086e-12 3.9424e-13 10.3678 -51.6376 7.28462 10.2313 -4.28318 -18.236 1.27007 30.2364 -4.69871 -4.02337e-09 2.46687e-09 1.86449e-09 -6.89177e-09 4.22805e-09 3.31194e-09 -4.02338e-09 2.46687e-09 1.8645e-09 -7.73091 5.47488 -0.417314 -4.02337e-09 2.46687e-09 1.8645e-09 -2.90554 0.965183 -0.102902 -4.02337e-09 2.46687e-09 1.86449e-09 -10.2786 0.731801 -0.0259123 -4.02337e-09 2.46687e-09 1.86448e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.207 -3.4456 9.66584 0.139195 5.20349 1.24065 -36.3306 -27.1756 -56.9742 2.03217e-16 0.0 3.88251e-19 62.9371 -65.2678 88.7825 0.602191 53.6322 -1.78963 12.7815 -18.513 29.89
--18.809 73.3495 129.306 183.811 -13.5398 569.602 -10.9638 -6.12131 9.48842 -4.04926 -8.88718 1.87258 2.29047 -4.65736 11.4317 -10.3266 -18.6918 20.2484 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.57267e-13 1.11497e-12 3.43484e-13 123.48 -43.043 153.731 -5.62311 -1.87818 9.81292 -21.5808 73.6243 28.5731 -7.60752e-10 1.02914e-08 7.46659e-09 -8.35503e-10 1.76433e-08 1.28245e-08 -7.60748e-10 1.02914e-08 7.46657e-09 7.73091 5.47488 0.417314 -7.60753e-10 1.02914e-08 7.46658e-09 2.90554 0.965183 0.102902 -7.60744e-10 1.02914e-08 7.46659e-09 10.2786 0.731801 0.0259123 -7.60756e-10 1.02914e-08 7.4666e-09 2.22167 -0.733487 -0.20892 -1.57463e-13 1.11495e-12 3.43172e-13 10.306 -51.7788 6.97834 10.2442 -4.29112 -18.2603 1.27808 30.3204 -4.71461 -3.75574e-09 2.27362e-09 1.89644e-09 -6.42931e-09 3.89483e-09 3.36147e-09 -3.75574e-09 2.27362e-09 1.89645e-09 -7.73091 5.47488 -0.417314 -3.75574e-09 2.27362e-09 1.89644e-09 -2.90554 0.965183 -0.102902 -3.75574e-09 2.27362e-09 1.89644e-09 -10.2786 0.731801 -0.0259123 -3.75573e-09 2.27362e-09 1.89643e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2 -3.37242 9.73202 0.1393 5.21105 1.24162 -36.3237 -27.2149 -56.9398 2.03217e-16 0.0 3.88251e-19 63.0553 -65.2176 88.8456 0.605959 53.7359 -1.79495 12.7964 -18.4995 29.9306
--18.818 73.3336 129.312 183.785 -13.3299 569.625 -11.0583 -6.00836 9.67475 -4.16332 -8.93421 1.91004 2.20999 -4.17171 11.3299 -10.1336 -19.7893 20.0374 -0.0 0.0 0.0 -0.0 0.0 0.0 -9.19862e-14 9.0328e-13 2.2936e-13 123.772 -43.0563 154.011 -5.6071 -1.87129 9.78438 -21.4406 73.5513 28.427 -5.99325e-10 1.01991e-08 7.23233e-09 -5.69884e-10 1.74042e-08 1.24198e-08 -5.99322e-10 1.01991e-08 7.23231e-09 7.73091 5.47488 0.417314 -5.99327e-10 1.01991e-08 7.23232e-09 2.90554 0.965183 0.102902 -5.99321e-10 1.01991e-08 7.23233e-09 10.2786 0.731801 0.0259123 -5.99328e-10 1.01991e-08 7.23234e-09 2.22167 -0.733487 -0.20892 -9.21658e-14 9.03275e-13 2.29043e-13 10.2724 -51.8233 6.61747 10.2566 -4.29877 -18.2836 1.28801 30.4238 -4.73421 -2.94244e-09 1.6351e-09 1.7915e-09 -5.02841e-09 2.7953e-09 3.16232e-09 -2.94245e-09 1.6351e-09 1.79151e-09 -7.73091 5.47488 -0.417314 -2.94244e-09 1.63511e-09 1.7915e-09 -2.90554 0.965183 -0.102902 -2.94245e-09 1.63511e-09 1.7915e-09 -10.2786 0.731801 -0.0259123 -2.94244e-09 1.63511e-09 1.79149e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1974 -3.30579 9.84692 0.139294 5.22492 1.24169 -36.2439 -27.1936 -56.8895 2.03217e-16 0.0 3.88251e-19 63.2273 -65.1667 88.9201 0.609625 53.8474 -1.80273 12.8814 -18.5183 30.0778
--18.8183 73.3114 129.274 183.816 -13.2509 569.541 -11.1424 -5.88182 9.85817 -4.272 -8.97015 1.9477 2.10444 -3.64392 11.2302 -9.92425 -20.9934 19.8373 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.81764e-14 6.68535e-13 1.07179e-13 124.087 -43.0423 154.329 -5.58434 -1.86157 9.74376 -21.3645 73.5117 28.3477 -4.19656e-10 9.74768e-09 6.74716e-09 -2.88696e-10 1.65542e-08 1.15841e-08 -4.19654e-10 9.74768e-09 6.74715e-09 7.73091 5.47488 0.417314 -4.19658e-10 9.74768e-09 6.74715e-09 2.90554 0.965183 0.102902 -4.19656e-10 9.74768e-09 6.74716e-09 10.2786 0.731801 0.0259123 -4.19658e-10 9.74768e-09 6.74717e-09 2.22167 -0.733487 -0.20892 -2.83312e-14 6.6854e-13 1.06867e-13 10.2355 -51.8275 6.27191 10.2723 -4.30847 -18.3131 1.29514 30.4977 -4.74824 -2.0488e-09 9.56024e-10 1.63426e-09 -3.49028e-09 1.62637e-09 2.87097e-09 -2.0488e-09 9.56023e-10 1.63427e-09 -7.73091 5.47488 -0.417314 -2.0488e-09 9.56024e-10 1.63425e-09 -2.90554 0.965183 -0.102902 -2.0488e-09 9.56024e-10 1.63425e-09 -10.2786 0.731801 -0.0259123 -2.04879e-09 9.56027e-10 1.63425e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1992 -3.23306 9.95171 0.139258 5.24106 1.24153 -36.1401 -27.1392 -56.8449 2.03217e-16 0.0 3.88251e-19 63.3861 -65.1229 88.9727 0.613556 53.9665 -1.81129 12.9779 -18.5305 30.254
--18.8204 73.267 129.204 183.858 -13.333 569.358 -11.2162 -5.71868 9.95772 -4.29142 -8.92233 1.97564 1.89024 -3.18464 11.1516 -9.63331 -22.1954 19.7273 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.31927e-15 5.05703e-13 3.19546e-14 124.276 -43.0078 154.605 -5.58083 -1.86013 9.73746 -21.2535 73.4533 28.2319 -3.40253e-10 8.91083e-09 6.06773e-09 -1.93266e-10 1.50919e-08 1.04189e-08 -3.40252e-10 8.91083e-09 6.06773e-09 7.73091 5.47488 0.417314 -3.40255e-10 8.91083e-09 6.06773e-09 2.90554 0.965183 0.102902 -3.40254e-10 8.91083e-09 6.06773e-09 10.2786 0.731801 0.0259123 -3.40254e-10 8.91083e-09 6.06774e-09 2.22167 -0.733487 -0.20892 -2.45177e-15 5.05712e-13 3.16565e-14 10.1615 -51.8484 6.01004 10.295 -4.32256 -18.3558 1.29468 30.4933 -4.74739 -1.5401e-09 6.41078e-10 1.50931e-09 -2.61615e-09 1.08494e-09 2.64394e-09 -1.54011e-09 6.41076e-10 1.50932e-09 -7.73091 5.47488 -0.417314 -1.5401e-09 6.41077e-10 1.5093e-09 -2.90554 0.965183 -0.102902 -1.54011e-09 6.41077e-10 1.50931e-09 -10.2786 0.731801 -0.0259123 -1.54009e-09 6.41082e-10 1.50931e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2056 -3.14155 9.98761 0.139275 5.25538 1.24179 -36.061 -27.0796 -56.8275 2.03217e-16 0.0 3.88251e-19 63.4647 -65.0938 88.9701 0.618094 54.093 -1.81893 13.0265 -18.4973 30.3813
--18.8275 73.2009 129.115 183.917 -13.5434 569.057 -11.2773 -5.48234 9.92556 -4.16732 -8.74053 1.98869 1.49806 -2.89856 11.103 -9.18928 -23.3431 19.7652 -0.0 0.0 0.0 -0.0 0.0 0.0 -4.02167e-14 4.54096e-13 3.52121e-14 124.278 -42.9126 154.838 -5.61012 -1.8728 9.7896 -21.0761 73.3586 28.0467 -4.09788e-10 7.52678e-09 5.11929e-09 -3.72607e-10 1.27642e-08 8.79768e-09 -4.09788e-10 7.52678e-09 5.11929e-09 7.73091 5.47488 0.417314 -4.09791e-10 7.52678e-09 5.11929e-09 2.90554 0.965183 0.102902 -4.09788e-10 7.52678e-09 5.11929e-09 10.2786 0.731801 0.0259123 -4.09791e-10 7.52678e-09 5.1193e-09 2.22167 -0.733487 -0.20892 -4.03221e-14 4.54101e-13 3.49465e-14 10.0284 -51.9479 5.88084 10.3245 -4.34093 -18.4115 1.28723 30.4144 -4.73249 -1.63402e-09 9.01183e-10 1.52512e-09 -2.77948e-09 1.53314e-09 2.67334e-09 -1.63402e-09 9.0118e-10 1.52513e-09 -7.73091 5.47488 -0.417314 -1.63402e-09 9.01181e-10 1.52512e-09 -2.90554 0.965183 -0.102902 -1.63402e-09 9.01181e-10 1.52512e-09 -10.2786 0.731801 -0.0259123 -1.63401e-09 9.01186e-10 1.52512e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2153 -3.01455 9.9204 0.139362 5.26809 1.24265 -36.0112 -26.9971 -56.8569 2.03217e-16 0.0 3.88251e-19 63.4128 -65.0826 88.8772 0.623711 54.237 -1.82541 13.0017 -18.3865 30.4431
--18.8391 73.1612 129.076 183.962 -13.6852 568.917 -11.325 -5.19501 9.81391 -3.95512 -8.47379 1.99299 0.987237 -2.70179 11.0724 -8.63553 -24.4996 19.9006 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.17054e-13 4.584e-13 8.19925e-14 124.18 -42.767 155.065 -5.65608 -1.89269 9.87152 -20.8874 73.2565 27.8498 -5.59369e-10 5.66117e-09 3.90158e-09 -7.07567e-10 9.65619e-09 6.71754e-09 -5.5937e-10 5.66117e-09 3.90158e-09 7.73091 5.47488 0.417314 -5.59371e-10 5.66117e-09 3.90157e-09 2.90554 0.965183 0.102902 -5.59366e-10 5.66117e-09 3.90158e-09 10.2786 0.731801 0.0259123 -5.59373e-10 5.66117e-09 3.90158e-09 2.22167 -0.733487 -0.20892 -1.17125e-13 4.58394e-13 8.1775e-14 9.85899 -52.0806 5.83796 10.3594 -4.36258 -18.4772 1.27479 30.2814 -4.70744 -2.05119e-09 1.48617e-09 1.60794e-09 -3.49969e-09 2.54052e-09 2.82557e-09 -2.05119e-09 1.48616e-09 1.60796e-09 -7.73091 5.47488 -0.417314 -2.05119e-09 1.48616e-09 1.60794e-09 -2.90554 0.965183 -0.102902 -2.05119e-09 1.48616e-09 1.60794e-09 -10.2786 0.731801 -0.0259123 -2.05118e-09 1.48617e-09 1.60793e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2296 -2.86313 9.7877 0.139477 5.28093 1.24376 -35.9675 -26.8855 -56.917 2.03217e-16 0.0 3.88251e-19 63.277 -65.0847 88.7206 0.630104 54.3952 -1.83158 12.9383 -18.2261 30.4798
--18.8876 73.1552 129.064 183.841 -13.6631 568.903 -11.3626 -4.922 9.69174 -3.73549 -8.19834 1.99563 0.466701 -2.42221 11.0477 -8.07791 -25.7294 20.0506 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.93388e-13 4.7165e-13 1.27583e-13 124.051 -42.6551 155.256 -5.7003 -1.91183 9.95044 -20.7198 73.1645 27.6747 -7.31148e-10 3.62872e-09 2.58299e-09 -1.08724e-09 6.27338e-09 4.46521e-09 -7.3115e-10 3.62872e-09 2.583e-09 7.73091 5.47488 0.417314 -7.3115e-10 3.62873e-09 2.58298e-09 2.90554 0.965183 0.102902 -7.31142e-10 3.62872e-09 2.58299e-09 10.2786 0.731801 0.0259123 -7.31154e-10 3.62872e-09 2.58299e-09 2.22167 -0.733487 -0.20892 -1.93436e-13 4.71632e-13 1.27411e-13 9.68523 -52.1429 5.80579 10.4008 -4.38843 -18.5553 1.25484 30.0706 -4.66769 -2.51139e-09 2.10909e-09 1.56903e-09 -4.29692e-09 3.61513e-09 2.76856e-09 -2.51139e-09 2.10909e-09 1.56905e-09 -7.73091 5.47488 -0.417314 -2.51139e-09 2.10909e-09 1.56903e-09 -2.90554 0.965183 -0.102902 -2.51139e-09 2.10909e-09 1.56903e-09 -10.2786 0.731801 -0.0259123 -2.51138e-09 2.1091e-09 1.56902e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2513 -2.71636 9.63841 0.139608 5.29214 1.24499 -35.9365 -26.7892 -56.9757 2.03217e-16 0.0 3.88251e-19 63.1357 -65.0963 88.5595 0.636423 54.5475 -1.83733 12.8668 -18.0685 30.4984
--18.9081 73.1279 129.055 183.826 -13.6805 568.901 -11.395 -4.72896 9.62765 -3.58922 -7.99043 2.0036 0.0459475 -1.88758 11.0179 -7.62933 -27.0992 20.1313 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.29776e-13 4.46882e-13 1.27272e-13 123.962 -42.6611 155.384 -5.72443 -1.92228 9.99354 -20.6041 73.1002 27.5538 -8.6728e-10 1.74417e-09 1.33193e-09 -1.4007e-09 3.12142e-09 2.32739e-09 -8.67282e-10 1.74417e-09 1.33194e-09 7.73091 5.47488 0.417314 -8.67282e-10 1.74417e-09 1.33192e-09 2.90554 0.965183 0.102902 -8.67272e-10 1.74417e-09 1.33193e-09 10.2786 0.731801 0.0259123 -8.67287e-10 1.74416e-09 1.33193e-09 2.22167 -0.733487 -0.20892 -2.2983e-13 4.46854e-13 1.27123e-13 9.53912 -52.031 5.70862 10.4501 -4.4194 -18.6482 1.22514 29.7583 -4.60885 -2.73438e-09 2.48304e-09 1.21966e-09 -4.6913e-09 4.26502e-09 2.17021e-09 -2.73438e-09 2.48304e-09 1.21968e-09 -7.73091 5.47488 -0.417314 -2.73438e-09 2.48304e-09 1.21966e-09 -2.90554 0.965183 -0.102902 -2.73439e-09 2.48304e-09 1.21966e-09 -10.2786 0.731801 -0.0259123 -2.73438e-09 2.48304e-09 1.21965e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.283 -2.60347 9.52136 0.139745 5.29999 1.24625 -35.9254 -26.7527 -57.0009 2.03217e-16 0.0 3.88251e-19 63.0673 -65.1142 88.4531 0.641804 54.6739 -1.84256 12.8177 -17.9659 30.5057
--18.8924 73.0875 129.025 183.965 -13.7797 568.805 -11.3991 -4.66245 9.66645 -3.55762 -7.88319 2.02466 -0.247473 -0.897756 10.9667 -7.34402 -28.7753 20.0772 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.09008e-13 3.73247e-13 4.75239e-14 123.936 -42.8735 155.435 -5.71694 -1.91902 9.98014 -20.5448 73.0671 27.4918 -1.01579e-09 -1.24522e-10 4.09849e-11 -1.73656e-09 -2.27024e-11 1.2289e-10 -1.01579e-09 -1.24519e-10 4.09905e-11 7.73091 5.47488 0.417314 -1.01579e-09 -1.24521e-10 4.0979e-11 2.90554 0.965183 0.102902 -1.01578e-09 -1.24521e-10 4.0983e-11 10.2786 0.731801 0.0259123 -1.0158e-09 -1.24523e-10 4.0983e-11 2.22167 -0.733487 -0.20892 -2.09124e-13 3.73213e-13 4.73628e-14 9.43526 -51.5724 5.50971 10.5174 -4.46197 -18.7751 1.17508 29.2241 -4.50887 -2.70758e-09 2.5882e-09 2.39364e-10 -4.66829e-09 4.46095e-09 4.77015e-10 -2.70758e-09 2.5882e-09 2.39385e-10 -7.73091 5.47488 -0.417314 -2.70758e-09 2.5882e-09 2.39366e-10 -2.90554 0.965183 -0.102902 -2.70758e-09 2.5882e-09 2.39364e-10 -10.2786 0.731801 -0.0259123 -2.70757e-09 2.5882e-09 2.39353e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3427 -2.53589 9.44998 0.139897 5.30345 1.2476 -35.9459 -26.8092 -56.9751 2.03217e-16 0.0 3.88251e-19 63.1219 -65.1511 88.413 0.646027 54.7685 -1.84759 12.8125 -17.9547 30.5068
--18.87 73.0448 128.998 184.103 -13.88 568.734 -11.3809 -4.67785 9.76254 -3.59102 -7.8317 2.05307 -0.469573 0.404346 10.9089 -7.16508 -30.6768 19.9523 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.54353e-13 2.75237e-13 -8.06103e-14 123.934 -43.2258 155.427 -5.68984 -1.90725 9.93172 -20.5253 73.0561 27.4714 -1.18638e-09 -2.07321e-09 -1.32889e-09 -2.11457e-09 -3.30937e-09 -2.21532e-09 -1.18638e-09 -2.07321e-09 -1.32888e-09 7.73091 5.47488 0.417314 -1.18638e-09 -2.07322e-09 -1.32889e-09 2.90554 0.965183 0.102902 -1.18637e-09 -2.07321e-09 -1.32889e-09 10.2786 0.731801 0.0259123 -1.18638e-09 -2.07321e-09 -1.32889e-09 2.22167 -0.733487 -0.20892 -1.54569e-13 2.75197e-13 -8.0806e-14 9.36235 -50.8701 5.2617 10.5986 -4.51349 -18.9285 1.11189 28.5183 -4.37887 -2.55972e-09 2.5587e-09 -1.18115e-09 -4.44602e-09 4.43131e-09 -1.97893e-09 -2.55972e-09 2.5587e-09 -1.18114e-09 -7.73091 5.47488 -0.417314 -2.55972e-09 2.5587e-09 -1.18115e-09 -2.90554 0.965183 -0.102902 -2.55972e-09 2.5587e-09 -1.18115e-09 -10.2786 0.731801 -0.0259123 -2.55971e-09 2.5587e-09 -1.18116e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4232 -2.4969 9.39803 0.140066 5.30363 1.24907 -35.9909 -26.9278 -56.9185 2.03217e-16 0.0 3.88251e-19 63.2479 -65.2043 88.409 0.649528 54.8421 -1.85236 12.8304 -17.9994 30.4969
--18.8809 73.0389 128.99 184.067 -13.9638 568.737 -11.3899 -4.70424 9.84871 -3.63372 -7.79508 2.07563 -0.638548 1.67592 10.8763 -7.03342 -32.4982 19.8618 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.70781e-14 1.58887e-13 -2.04966e-13 123.935 -43.5701 155.375 -5.66014 -1.89437 9.87871 -20.5445 73.0669 27.4915 -1.26371e-09 -3.73295e-09 -2.50672e-09 -2.32057e-09 -6.124e-09 -4.22928e-09 -1.26371e-09 -3.73295e-09 -2.50673e-09 7.73091 5.47488 0.417314 -1.26371e-09 -3.73296e-09 -2.50673e-09 2.90554 0.965183 0.102902 -1.2637e-09 -3.73295e-09 -2.50672e-09 10.2786 0.731801 0.0259123 -1.26371e-09 -3.73295e-09 -2.50672e-09 2.22167 -0.733487 -0.20892 -8.73858e-14 1.58843e-13 -2.05198e-13 9.30739 -50.234 5.0173 10.6738 -4.56129 -19.0711 1.05734 27.8741 -4.26232 -2.22258e-09 2.3385e-09 -2.46387e-09 -3.8936e-09 4.07059e-09 -4.20131e-09 -2.22258e-09 2.3385e-09 -2.46387e-09 -7.73091 5.47488 -0.417314 -2.22258e-09 2.3385e-09 -2.46387e-09 -2.90554 0.965183 -0.102902 -2.22258e-09 2.3385e-09 -2.46387e-09 -10.2786 0.731801 -0.0259123 -2.22257e-09 2.3385e-09 -2.46388e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4875 -2.47356 9.35483 0.14023 5.30199 1.25047 -36.0392 -27.0572 -56.8553 2.03217e-16 0.0 3.88251e-19 63.3717 -65.2474 88.4383 0.652407 54.8999 -1.85606 12.8391 -18.0446 30.4677
--18.9086 73.031 128.992 183.955 -13.9469 568.782 -11.4762 -4.67077 9.85776 -3.63008 -7.73249 2.07914 -0.77589 2.57352 10.8954 -6.87389 -33.9285 19.9058 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.84538e-14 3.0237e-14 -2.73379e-13 123.921 -43.7586 155.297 -5.64491 -1.88776 9.85153 -20.6016 73.0988 27.5512 -1.13247e-09 -4.73477e-09 -3.22157e-09 -2.1404e-09 -7.85201e-09 -5.46102e-09 -1.13246e-09 -4.73477e-09 -3.22157e-09 7.73091 5.47488 0.417314 -1.13247e-09 -4.73478e-09 -3.22157e-09 2.90554 0.965183 0.102902 -1.13246e-09 -4.73477e-09 -3.22157e-09 10.2786 0.731801 0.0259123 -1.13247e-09 -4.73477e-09 -3.22156e-09 2.22167 -0.733487 -0.20892 -2.87978e-14 3.01912e-14 -2.73627e-13 9.24621 -49.9741 4.81946 10.7234 -4.59282 -19.1654 1.02915 27.5251 -4.20005 -1.62794e-09 1.87154e-09 -3.03079e-09 -2.88015e-09 3.27328e-09 -5.19378e-09 -1.62794e-09 1.87154e-09 -3.03079e-09 -7.73091 5.47488 -0.417314 -1.62794e-09 1.87154e-09 -3.0308e-09 -2.90554 0.965183 -0.102902 -1.62794e-09 1.87154e-09 -3.03079e-09 -10.2786 0.731801 -0.0259123 -1.62793e-09 1.87154e-09 -3.0308e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4988 -2.45294 9.30971 0.140363 5.29999 1.2516 -36.0695 -27.1456 -56.8095 2.03217e-16 0.0 3.88251e-19 63.4193 -65.2537 88.4981 0.654767 54.9472 -1.85792 12.806 -18.035 30.4111
--18.9743 73.0215 128.994 183.694 -13.8754 568.84 -11.6959 -4.52149 9.72509 -3.54796 -7.63554 2.04649 -0.883039 2.9035 10.9893 -6.61157 -34.818 20.16 -0.0 0.0 0.0 -0.0 0.0 0.0 2.88654e-14 -1.37215e-13 -2.71867e-13 123.893 -43.664 155.193 -5.65466 -1.89199 9.86889 -20.7645 73.1891 27.7214 -6.66145e-10 -4.73588e-09 -3.25139e-09 -1.34315e-09 -7.93591e-09 -5.53633e-09 -6.66143e-10 -4.73588e-09 -3.2514e-09 7.73091 5.47488 0.417314 -6.66147e-10 -4.73589e-09 -3.25139e-09 2.90554 0.965183 0.102902 -6.66137e-10 -4.73588e-09 -3.25139e-09 10.2786 0.731801 0.0259123 -6.66146e-10 -4.73588e-09 -3.25138e-09 2.22167 -0.733487 -0.20892 2.85719e-14 -1.37258e-13 -2.721e-13 9.1925 -50.3899 4.70063 10.7274 -4.59522 -19.1732 1.04384 27.6993 -4.23142 -4.95192e-10 8.94149e-10 -2.6041e-09 -9.14421e-10 1.57957e-09 -4.48311e-09 -4.95193e-10 8.9415e-10 -2.6041e-09 -7.73091 5.47488 -0.417314 -4.95192e-10 8.9415e-10 -2.6041e-09 -2.90554 0.965183 -0.102902 -4.95198e-10 8.94149e-10 -2.6041e-09 -10.2786 0.731801 -0.0259123 -4.95185e-10 8.9415e-10 -2.60411e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.4228 -2.42773 9.24653 0.140454 5.29646 1.25236 -36.0722 -27.1744 -56.7861 2.03217e-16 0.0 3.88251e-19 63.3081 -65.2081 88.5668 0.656175 54.9739 -1.85653 12.7049 -17.9325 30.3126
--19.0235 73.012 128.974 183.541 -13.8473 568.846 -12.0069 -4.30626 9.50231 -3.42259 -7.52518 1.98927 -0.950739 2.88288 11.1354 -6.29594 -35.3501 20.547 -0.0 0.0 0.0 -0.0 0.0 0.0 9.18842e-14 -3.3732e-13 -2.28276e-13 123.86 -43.3944 155.056 -5.67829 -1.90224 9.91104 -21.0145 73.3253 27.9825 4.18278e-11 -4.01454e-09 -2.79062e-09 -1.00971e-10 -6.83469e-09 -4.7835e-09 4.18285e-11 -4.01454e-09 -2.79063e-09 7.73091 5.47488 0.417314 4.18262e-11 -4.01455e-09 -2.79062e-09 2.90554 0.965183 0.102902 4.18339e-11 -4.01454e-09 -2.79062e-09 10.2786 0.731801 0.0259123 4.1826e-11 -4.01454e-09 -2.79061e-09 2.22167 -0.733487 -0.20892 9.16966e-14 -3.37357e-13 -2.28475e-13 9.14492 -51.2442 4.62558 10.7014 -4.57843 -19.1239 1.08777 28.2171 -4.32498 1.0518e-09 -4.80873e-10 -1.5333e-09 1.78167e-09 -8.1037e-10 -2.66984e-09 1.0518e-09 -4.80872e-10 -1.5333e-09 -7.73091 5.47488 -0.417314 1.0518e-09 -4.80873e-10 -1.5333e-09 -2.90554 0.965183 -0.102902 1.05179e-09 -4.80873e-10 -1.5333e-09 -10.2786 0.731801 -0.0259123 1.05181e-09 -4.80873e-10 -1.53331e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2873 -2.40612 9.17542 0.140517 5.29114 1.25286 -36.0599 -27.1729 -56.7726 2.03217e-16 0.0 3.88251e-19 63.098 -65.1275 88.6525 0.656718 54.9811 -1.8527 12.5595 -17.7739 30.181
--19.0417 73.006 128.934 183.575 -13.9196 568.859 -12.3127 -4.11331 9.29629 -3.29953 -7.40454 1.93734 -0.985618 2.78396 11.2894 -6.03577 -35.7128 20.9342 -0.0 0.0 0.0 -0.0 0.0 0.0 1.38822e-13 -5.1506e-13 -1.53179e-13 123.816 -43.1552 154.895 -5.70051 -1.91188 9.9507 -21.2152 73.4328 28.1919 7.76909e-10 -3.13333e-09 -2.19301e-09 1.19571e-09 -5.45843e-09 -3.79826e-09 7.76909e-10 -3.13333e-09 -2.19303e-09 7.73091 5.47488 0.417314 7.76908e-10 -3.13333e-09 -2.19301e-09 2.90554 0.965183 0.102902 7.76914e-10 -3.13333e-09 -2.19301e-09 10.2786 0.731801 0.0259123 7.76906e-10 -3.13333e-09 -2.19301e-09 2.22167 -0.733487 -0.20892 1.38749e-13 -5.15091e-13 -1.53344e-13 9.05264 -52.0423 4.53124 10.679 -4.5641 -19.0814 1.13013 28.7001 -4.41325 2.47459e-09 -1.74485e-09 -1.81329e-10 4.26924e-09 -3.01211e-09 -3.68373e-10 2.47459e-09 -1.74485e-09 -1.81323e-10 -7.73091 5.47488 -0.417314 2.47459e-09 -1.74485e-09 -1.81327e-10 -2.90554 0.965183 -0.102902 2.47458e-09 -1.74485e-09 -1.8133e-10 -10.2786 0.731801 -0.0259123 2.47459e-09 -1.74485e-09 -1.81337e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1488 -2.39841 9.12507 0.14057 5.28684 1.25328 -36.0454 -27.1602 -56.767 2.03217e-16 0.0 3.88251e-19 62.9284 -65.0329 88.7955 0.657273 54.9904 -1.84894 12.4124 -17.6167 30.0428
--19.0834 72.9966 128.892 183.568 -13.9408 568.913 -12.5199 -4.03137 9.21356 -3.22456 -7.27678 1.92049 -0.996853 2.87859 11.4075 -5.94001 -36.0962 21.1919 -0.0 0.0 0.0 -0.0 0.0 0.0 1.47898e-13 -6.15423e-13 -5.71506e-14 123.75 -43.151 154.718 -5.70605 -1.9143 9.9606 -21.2236 73.4374 28.2007 1.32455e-09 -2.65484e-09 -1.81231e-09 2.15648e-09 -4.71725e-09 -3.1764e-09 1.32455e-09 -2.65484e-09 -1.81233e-09 7.73091 5.47488 0.417314 1.32455e-09 -2.65484e-09 -1.81231e-09 2.90554 0.965183 0.102902 1.32456e-09 -2.65484e-09 -1.81231e-09 10.2786 0.731801 0.0259123 1.32455e-09 -2.65484e-09 -1.81231e-09 2.22167 -0.733487 -0.20892 1.47903e-13 -6.15451e-13 -5.72997e-14 8.86556 -52.2895 4.35318 10.6941 -4.57396 -19.1096 1.13567 28.7705 -4.42584 3.23472e-09 -2.38911e-09 1.08886e-09 5.60941e-09 -4.14119e-09 1.80689e-09 3.23472e-09 -2.3891e-09 1.08887e-09 -7.73091 5.47488 -0.417314 3.23472e-09 -2.38911e-09 1.08886e-09 -2.90554 0.965183 -0.102902 3.23471e-09 -2.38911e-09 1.08886e-09 -10.2786 0.731801 -0.0259123 3.23473e-09 -2.38911e-09 1.08885e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0636 -2.41491 9.12414 0.140631 5.28636 1.25381 -36.0416 -27.1556 -56.7672 2.03217e-16 0.0 3.88251e-19 62.9383 -64.945 89.036 0.658714 55.0232 -1.8478 12.3054 -17.5186 29.9235
--19.1305 72.9834 128.845 183.547 -13.9507 568.953 -12.5925 -4.14305 9.32967 -3.21652 -7.12246 1.96162 -0.98065 3.29995 11.4694 -6.08724 -36.5649 21.2481 -0.0 0.0 0.0 -0.0 0.0 0.0 8.91544e-14 -6.03147e-13 1.00096e-13 123.645 -43.5167 154.532 -5.68972 -1.90722 9.93149 -20.9225 73.276 27.8865 1.65351e-09 -2.83205e-09 -1.76128e-09 2.71934e-09 -5.0143e-09 -3.11127e-09 1.65351e-09 -2.83205e-09 -1.76129e-09 7.73091 5.47488 0.417314 1.65351e-09 -2.83205e-09 -1.76128e-09 2.90554 0.965183 0.102902 1.65351e-09 -2.83205e-09 -1.76128e-09 10.2786 0.731801 0.0259123 1.65351e-09 -2.83205e-09 -1.76127e-09 2.22167 -0.733487 -0.20892 8.91851e-14 -6.03176e-13 9.99312e-14 8.56745 -51.7021 4.0599 10.7708 -4.62361 -19.2543 1.08146 28.1768 -4.31631 2.94187e-09 -2.01999e-09 2.57887e-09 5.1334e-09 -3.52046e-09 4.38535e-09 2.94186e-09 -2.01999e-09 2.57888e-09 -7.73091 5.47488 -0.417314 2.94187e-09 -2.01999e-09 2.57887e-09 -2.90554 0.965183 -0.102902 2.94186e-09 -2.01999e-09 2.57887e-09 -10.2786 0.731801 -0.0259123 2.94187e-09 -2.02e-09 2.57887e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0535 -2.47209 9.21631 0.140733 5.29062 1.25471 -36.0825 -27.1803 -56.7891 2.03217e-16 0.0 3.88251e-19 63.2381 -64.8477 89.4635 0.661555 55.0912 -1.85023 12.2472 -17.4918 29.8287
--19.1277 72.9668 128.794 183.644 -13.8837 568.901 -12.5832 -4.3812 9.57224 -3.24929 -6.94665 2.03979 -0.934434 3.88281 11.5022 -6.40973 -37.0149 21.18 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.7743e-14 -5.14437e-13 3.09831e-13 123.505 -44.1158 154.325 -5.66003 -1.89434 9.87858 -20.4267 73.0015 27.3684 1.86954e-09 -3.33059e-09 -1.8451e-09 3.07849e-09 -5.81071e-09 -3.27364e-09 1.86955e-09 -3.33059e-09 -1.84511e-09 7.73091 5.47488 0.417314 1.86954e-09 -3.33059e-09 -1.84511e-09 2.90554 0.965183 0.102902 1.86955e-09 -3.33059e-09 -1.84511e-09 10.2786 0.731801 0.0259123 1.86954e-09 -3.33058e-09 -1.8451e-09 2.22167 -0.733487 -0.20892 -1.7713e-14 -5.14471e-13 3.09632e-13 8.20607 -50.5935 3.70703 10.8857 -4.69798 -19.472 0.995885 27.1704 -4.13474 1.96544e-09 -9.94809e-10 4.34948e-09 3.4814e-09 -1.76872e-09 7.4636e-09 1.96544e-09 -9.94808e-10 4.3495e-09 -7.73091 5.47488 -0.417314 1.96544e-09 -9.9481e-10 4.34948e-09 -2.90554 0.965183 -0.102902 1.96544e-09 -9.9481e-10 4.34948e-09 -10.2786 0.731801 -0.0259123 1.96545e-09 -9.94809e-10 4.34948e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0864 -2.55979 9.37432 0.140855 5.29807 1.25583 -36.1513 -27.2186 -56.8284 2.03217e-16 0.0 3.88251e-19 63.7259 -64.7352 90.0265 0.665259 55.1809 -1.85483 12.2159 -17.5071 29.7448
--19.1191 72.9256 128.802 183.728 -13.8427 568.99 -12.5336 -4.61041 9.82545 -3.30098 -6.78935 2.11909 -0.870938 4.451 11.533 -6.79298 -37.3836 21.0857 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.20137e-13 -4.01475e-13 4.87959e-13 123.356 -44.7455 154.077 -5.62224 -1.878 9.81126 -19.9297 72.7151 26.8484 1.96366e-09 -3.83204e-09 -1.95618e-09 3.22775e-09 -6.60351e-09 -3.47535e-09 1.96366e-09 -3.83204e-09 -1.9562e-09 7.73091 5.47488 0.417314 1.96366e-09 -3.83204e-09 -1.9562e-09 2.90554 0.965183 0.102902 1.96366e-09 -3.83204e-09 -1.95619e-09 10.2786 0.731801 0.0259123 1.96365e-09 -3.83204e-09 -1.95618e-09 2.22167 -0.733487 -0.20892 -1.20121e-13 -4.01514e-13 4.87726e-13 7.82071 -49.3645 3.35413 11.0013 -4.77293 -19.6924 0.914895 26.128 -3.95159 9.06642e-10 6.87158e-11 5.6765e-09 1.67804e-09 5.45169e-11 9.77807e-09 9.06638e-10 6.87159e-11 5.67652e-09 -7.73091 5.47488 -0.417314 9.06643e-10 6.87145e-11 5.6765e-09 -2.90554 0.965183 -0.102902 9.06637e-10 6.87146e-11 5.6765e-09 -10.2786 0.731801 -0.0259123 9.06643e-10 6.8716e-11 5.6765e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1383 -2.64851 9.52039 0.140941 5.30782 1.25666 -36.1836 -27.2347 -56.8525 2.03217e-16 0.0 3.88251e-19 64.2263 -64.6453 90.5585 0.669112 55.2763 -1.86049 12.2065 -17.5592 29.6687
--19.1149 72.91 128.848 183.883 -13.6875 569.218 -12.4886 -4.69603 9.97288 -3.34911 -6.69051 2.16363 -0.80341 4.82824 11.5873 -7.1187 -37.6081 21.0651 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.65372e-13 -3.16446e-13 5.50385e-13 123.224 -45.2026 153.774 -5.58165 -1.86052 9.73892 -19.6023 72.5199 26.5051 1.92684e-09 -4.018e-09 -1.98692e-09 3.16094e-09 -6.88973e-09 -3.52822e-09 1.92684e-09 -4.018e-09 -1.98694e-09 7.73091 5.47488 0.417314 1.92684e-09 -4.018e-09 -1.98694e-09 2.90554 0.965183 0.102902 1.92684e-09 -4.018e-09 -1.98694e-09 10.2786 0.731801 0.0259123 1.92683e-09 -4.018e-09 -1.98693e-09 2.22167 -0.733487 -0.20892 -1.65367e-13 -3.16483e-13 5.50137e-13 7.42983 -48.4169 3.0426 11.081 -4.82467 -19.845 0.86463 25.4271 -3.83108 3.66646e-10 5.52844e-10 5.83574e-09 7.47932e-10 8.89728e-10 1.00652e-08 3.66642e-10 5.52844e-10 5.83575e-09 -7.73091 5.47488 -0.417314 3.66647e-10 5.52843e-10 5.83573e-09 -2.90554 0.965183 -0.102902 3.66643e-10 5.52843e-10 5.83574e-09 -10.2786 0.731801 -0.0259123 3.66647e-10 5.52845e-10 5.83573e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1846 -2.70891 9.57671 0.140935 5.31896 1.25672 -36.1153 -27.1927 -56.8286 2.03217e-16 0.0 3.88251e-19 64.5695 -64.6188 90.8993 0.672382 55.3612 -1.8661 12.2144 -17.6431 29.5975
--19.1064 72.9068 128.877 184.081 -13.6302 569.387 -12.4491 -4.56716 9.96324 -3.39715 -6.68405 2.15602 -0.738437 4.9464 11.677 -7.33703 -37.6388 21.1662 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.25474e-13 -2.66186e-13 4.3322e-13 123.116 -45.4152 153.398 -5.53945 -1.8424 9.6637 -19.4821 72.4469 26.3792 1.69595e-09 -3.76312e-09 -1.91511e-09 2.77297e-09 -6.47279e-09 -3.38872e-09 1.69595e-09 -3.76312e-09 -1.91512e-09 7.73091 5.47488 0.417314 1.69595e-09 -3.76312e-09 -1.91513e-09 2.90554 0.965183 0.102902 1.69595e-09 -3.76312e-09 -1.91512e-09 10.2786 0.731801 0.0259123 1.69594e-09 -3.76312e-09 -1.91511e-09 2.22167 -0.733487 -0.20892 -1.2548e-13 -2.66208e-13 4.32984e-13 7.05519 -47.8815 2.80026 11.1144 -4.84643 -19.9091 0.850784 25.2239 -3.79658 5.9948e-10 1.5323e-10 4.15339e-09 1.11665e-09 2.18602e-10 7.1561e-09 5.99478e-10 1.53231e-10 4.1534e-09 -7.73091 5.47488 -0.417314 5.99482e-10 1.53229e-10 4.15338e-09 -2.90554 0.965183 -0.102902 5.99477e-10 1.53229e-10 4.15339e-09 -10.2786 0.731801 -0.0259123 5.99481e-10 1.53231e-10 4.15338e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2295 -2.72359 9.50191 0.140759 5.33376 1.25534 -35.8878 -27.0473 -56.7397 2.03217e-16 0.0 3.88251e-19 64.6865 -64.6725 90.9678 0.674935 55.4329 -1.872 12.2449 -17.7822 29.5197
--19.1694 72.8911 128.681 183.9 -14.1536 568.956 -12.3947 -4.30733 9.86546 -3.45375 -6.74089 2.11801 -0.667236 4.90667 11.7861 -7.51735 -37.5199 21.3277 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.31711e-14 -2.25223e-13 1.95135e-13 123.019 -45.4968 152.966 -5.49285 -1.82243 9.58071 -19.4721 72.4408 26.3686 1.29603e-09 -3.2507e-09 -1.79596e-09 2.10162e-09 -5.64176e-09 -3.15499e-09 1.29603e-09 -3.25071e-09 -1.79598e-09 7.73091 5.47488 0.417314 1.29602e-09 -3.2507e-09 -1.79598e-09 2.90554 0.965183 0.102902 1.29603e-09 -3.2507e-09 -1.79597e-09 10.2786 0.731801 0.0259123 1.29602e-09 -3.2507e-09 -1.79596e-09 2.22167 -0.733487 -0.20892 -3.31941e-14 -2.25223e-13 1.9493e-13 6.67132 -47.5368 2.59102 11.1216 -4.85119 -19.9228 0.856141 25.2989 -3.80943 1.25328e-09 -7.54128e-10 1.17592e-09 2.18694e-09 -1.31519e-09 2.0021e-09 1.25328e-09 -7.54127e-10 1.17593e-09 -7.73091 5.47488 -0.417314 1.25328e-09 -7.54129e-10 1.17591e-09 -2.90554 0.965183 -0.102902 1.25327e-09 -7.54129e-10 1.17591e-09 -10.2786 0.731801 -0.0259123 1.25328e-09 -7.54128e-10 1.17591e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2825 -2.71141 9.34433 0.140466 5.35187 1.25297 -35.55 -26.8289 -56.6072 2.03217e-16 0.0 3.88251e-19 64.6775 -64.784 90.8643 0.677141 55.4996 -1.87856 12.2981 -17.9711 29.4407
--19.1505 72.9132 128.866 184.168 -14.1695 569.452 -12.3418 -4.01399 9.74302 -3.50391 -6.80655 2.0725 -0.580257 4.78663 11.8976 -7.71833 -37.3292 21.4873 -0.0 0.0 0.0 -0.0 0.0 0.0 7.31449e-14 -1.97279e-13 -6.41216e-14 122.941 -45.5221 152.518 -5.44124 -1.80042 9.48881 -19.5293 72.4757 26.4286 8.50381e-10 -2.62529e-09 -1.63806e-09 1.35502e-09 -4.62213e-09 -2.85137e-09 8.50382e-10 -2.62529e-09 -1.63808e-09 7.73091 5.47488 0.417314 8.50379e-10 -2.62528e-09 -1.63807e-09 2.90554 0.965183 0.102902 8.50382e-10 -2.62529e-09 -1.63806e-09 10.2786 0.731801 0.0259123 8.50371e-10 -2.62528e-09 -1.63805e-09 2.22167 -0.733487 -0.20892 7.31056e-14 -1.97259e-13 -6.42933e-14 6.21722 -47.2556 2.353 11.112 -4.84495 -19.9042 0.867893 25.4663 -3.83801 2.02038e-09 -1.76645e-09 -1.99047e-09 3.44923e-09 -3.0282e-09 -3.48054e-09 2.02038e-09 -1.76645e-09 -1.99046e-09 -7.73091 5.47488 -0.417314 2.02038e-09 -1.76645e-09 -1.99048e-09 -2.90554 0.965183 -0.102902 2.02038e-09 -1.76645e-09 -1.99047e-09 -10.2786 0.731801 -0.0259123 2.02039e-09 -1.76645e-09 -1.99048e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.326 -2.6975 9.16074 0.140193 5.36847 1.25075 -35.1986 -26.616 -56.4559 2.03217e-16 0.0 3.88251e-19 64.6281 -64.936 90.7016 0.679009 55.561 -1.88476 12.3612 -18.1616 29.3822
--19.242 72.8913 128.772 183.886 -14.3185 569.251 -12.3082 -3.78492 9.65899 -3.53245 -6.82654 2.04237 -0.468573 4.66378 11.9947 -7.99707 -37.1443 21.5834 -0.0 0.0 0.0 -0.0 0.0 0.0 1.55082e-13 -1.86076e-13 -2.44803e-13 122.885 -45.5663 152.091 -5.38395 -1.77616 9.38684 -19.6115 72.5255 26.5149 4.82318e-10 -2.03142e-09 -1.44998e-09 7.41317e-10 -3.6394e-09 -2.50222e-09 4.82318e-10 -2.03143e-09 -1.45e-09 7.73091 5.47488 0.417314 4.82316e-10 -2.03142e-09 -1.44999e-09 2.90554 0.965183 0.102902 4.82319e-10 -2.03142e-09 -1.44999e-09 10.2786 0.731801 0.0259123 4.82308e-10 -2.03142e-09 -1.44998e-09 2.22167 -0.733487 -0.20892 1.55032e-13 -1.86049e-13 -2.44952e-13 5.63689 -46.9106 2.02814 11.0947 -4.83371 -19.8711 0.873037 25.5401 -3.85062 2.59315e-09 -2.48095e-09 -4.23955e-09 4.39393e-09 -4.23697e-09 -7.37551e-09 2.59315e-09 -2.48095e-09 -4.23954e-09 -7.73091 5.47488 -0.417314 2.59315e-09 -2.48095e-09 -4.23956e-09 -2.90554 0.965183 -0.102902 2.59314e-09 -2.48095e-09 -4.23956e-09 -10.2786 0.731801 -0.0259123 2.59315e-09 -2.48095e-09 -4.23956e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3423 -2.70707 9.00784 0.140075 5.37877 1.2498 -34.9292 -26.4876 -56.3081 2.03217e-16 0.0 3.88251e-19 64.6258 -65.1114 90.5952 0.680534 55.6171 -1.88954 12.4219 -18.3056 29.3655
--19.3145 72.864 128.693 183.774 -14.5124 569.146 -12.3 -3.65174 9.61203 -3.52554 -6.76826 2.03013 -0.313864 4.49806 12.0817 -8.39031 -36.9452 21.6088 -0.0 0.0 0.0 -0.0 0.0 0.0 2.0803e-13 -1.89326e-13 -3.24917e-13 122.83 -45.6344 151.698 -5.31622 -1.74769 9.26633 -19.6398 72.5418 26.5444 1.4072e-10 -1.29954e-09 -1.15298e-09 1.77891e-10 -2.39396e-09 -1.96968e-09 1.4072e-10 -1.29954e-09 -1.153e-09 7.73091 5.47488 0.417314 1.40717e-10 -1.29954e-09 -1.15299e-09 2.90554 0.965183 0.102902 1.40721e-10 -1.29954e-09 -1.15299e-09 10.2786 0.731801 0.0259123 1.40709e-10 -1.29954e-09 -1.15298e-09 2.22167 -0.733487 -0.20892 2.07975e-13 -1.89309e-13 -3.25058e-13 4.94765 -46.4697 1.65601 11.0737 -4.81982 -19.831 0.866928 25.4586 -3.8365 2.94789e-09 -2.82673e-09 -5.37421e-09 4.984e-09 -4.82123e-09 -9.34214e-09 2.94788e-09 -2.82673e-09 -5.37421e-09 -7.73091 5.47488 -0.417314 2.94789e-09 -2.82673e-09 -5.37422e-09 -2.90554 0.965183 -0.102902 2.94788e-09 -2.82673e-09 -5.37422e-09 -10.2786 0.731801 -0.0259123 2.94789e-09 -2.82673e-09 -5.37422e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.3273 -2.7591 8.91464 0.140159 5.38177 1.25055 -34.7577 -26.4709 -56.1546 2.03217e-16 0.0 3.88251e-19 64.7405 -65.3175 90.6052 0.681504 55.6697 -1.89249 12.4844 -18.3846 29.4159
--19.3542 72.8298 128.635 183.746 -14.756 569.061 -12.3077 -3.56052 9.57444 -3.4945 -6.66679 2.02479 -0.125789 4.2685 12.1647 -8.85984 -36.704 21.594 -0.0 0.0 0.0 -0.0 0.0 0.0 2.50589e-13 -2.06137e-13 -3.56126e-13 122.783 -45.6917 151.318 -5.23986 -1.71574 9.13062 -19.6591 72.5523 26.5645 -2.12177e-10 -4.21925e-10 -7.69496e-10 -4.00229e-10 -8.85462e-10 -1.28888e-09 -2.12177e-10 -4.21927e-10 -7.69518e-10 7.73091 5.47488 0.417314 -2.1218e-10 -4.21924e-10 -7.69506e-10 2.90554 0.965183 0.102902 -2.12175e-10 -4.21918e-10 -7.69503e-10 10.2786 0.731801 0.0259123 -2.12187e-10 -4.21923e-10 -7.69497e-10 2.22167 -0.733487 -0.20892 2.50533e-13 -2.06143e-13 -3.56266e-13 4.17219 -45.9996 1.25176 11.0434 -4.79982 -19.7735 0.857013 25.3248 -3.81341 3.22923e-09 -3.00643e-09 -5.95181e-09 5.45826e-09 -5.12483e-09 -1.03457e-08 3.22921e-09 -3.00643e-09 -5.9518e-09 -7.73091 5.47488 -0.417314 3.22923e-09 -3.00643e-09 -5.95181e-09 -2.90554 0.965183 -0.102902 3.22922e-09 -3.00643e-09 -5.95181e-09 -10.2786 0.731801 -0.0259123 3.22923e-09 -3.00643e-09 -5.95182e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2902 -2.83608 8.84628 0.14037 5.37994 1.25235 -34.6356 -26.522 -55.9874 2.03217e-16 0.0 3.88251e-19 64.9113 -65.5595 90.6619 0.681976 55.7184 -1.89421 12.5532 -18.426 29.5154
--19.334 72.8125 128.779 183.948 -14.7714 569.406 -12.3266 -3.48097 9.56943 -3.46174 -6.56919 2.02897 0.0614409 4.08088 12.2295 -9.34886 -36.4868 21.534 -0.0 0.0 0.0 -0.0 0.0 0.0 2.79181e-13 -2.42329e-13 -3.49166e-13 122.783 -45.7535 150.938 -5.16415 -1.68418 8.99627 -19.8152 72.6452 26.7281 -4.33038e-10 2.14113e-10 -4.59878e-10 -7.58407e-10 2.1172e-10 -7.43625e-10 -4.33037e-10 2.14113e-10 -4.59901e-10 7.73091 5.47488 0.417314 -4.3304e-10 2.14113e-10 -4.59888e-10 2.90554 0.965183 0.102902 -4.33034e-10 2.14124e-10 -4.59886e-10 10.2786 0.731801 0.0259123 -4.33047e-10 2.14115e-10 -4.59883e-10 2.22167 -0.733487 -0.20892 2.79129e-13 -2.42358e-13 -3.4931e-13 3.26962 -45.5191 0.725942 10.9993 -4.77093 -19.6895 0.847931 25.2008 -3.79207 3.38199e-09 -3.02761e-09 -5.99785e-09 5.72097e-09 -5.16048e-09 -1.04287e-08 3.38197e-09 -3.0276e-09 -5.99784e-09 -7.73091 5.47488 -0.417314 3.38199e-09 -3.02761e-09 -5.99784e-09 -2.90554 0.965183 -0.102902 3.38198e-09 -3.02761e-09 -5.99785e-09 -10.2786 0.731801 -0.0259123 3.38199e-09 -3.02761e-09 -5.99785e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.2327 -2.90857 8.76364 0.140655 5.37367 1.25477 -34.5608 -26.613 -55.8295 2.03217e-16 0.0 3.88251e-19 65.0305 -65.8176 90.6862 0.682354 55.7591 -1.89516 12.6165 -18.45 29.6205
--19.4222 72.7978 128.839 183.738 -14.7425 569.605 -12.3523 -3.38277 9.62025 -3.44969 -6.52254 2.04528 0.212994 4.0409 12.2614 -9.8008 -36.3595 21.4237 -0.0 0.0 0.0 -0.0 0.0 0.0 2.90231e-13 -3.0372e-13 -3.14776e-13 122.871 -45.8345 150.545 -5.09847 -1.65689 8.87984 -20.2631 72.9077 27.1972 -3.78527e-10 2.2126e-10 -3.84485e-10 -6.62007e-10 2.23208e-10 -6.17699e-10 -3.78525e-10 2.21262e-10 -3.84507e-10 7.73091 5.47488 0.417314 -3.78529e-10 2.2126e-10 -3.84494e-10 2.90554 0.965183 0.102902 -3.78522e-10 2.21272e-10 -3.84493e-10 10.2786 0.731801 0.0259123 -3.78536e-10 2.21263e-10 -3.84491e-10 2.22167 -0.733487 -0.20892 2.9019e-13 -3.03766e-13 -3.14925e-13 2.20254 -45.0449 -0.00843921 10.9367 -4.73035 -19.57 0.844137 25.1487 -3.78311 3.35099e-09 -2.89782e-09 -5.53785e-09 5.6764e-09 -4.94085e-09 -9.63372e-09 3.35096e-09 -2.89781e-09 -5.53784e-09 -7.73091 5.47488 -0.417314 3.35099e-09 -2.89782e-09 -5.53784e-09 -2.90554 0.965183 -0.102902 3.35098e-09 -2.89782e-09 -5.53784e-09 -10.2786 0.731801 -0.0259123 3.35099e-09 -2.89782e-09 -5.53785e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.1567 -2.94714 8.62761 0.140963 5.36335 1.25735 -34.5315 -26.716 -55.7043 2.03217e-16 0.0 3.88251e-19 64.9866 -66.072 90.5952 0.683044 55.7876 -1.8958 12.6622 -18.4769 29.6876
--19.4974 72.7899 128.797 183.665 -14.9796 569.599 -12.3889 -3.25379 9.75518 -3.46469 -6.53975 2.08077 0.326109 4.20734 12.2402 -10.2469 -36.3367 21.2115 -0.0 0.0 0.0 -0.0 0.0 0.0 2.82431e-13 -4.39773e-13 -2.39386e-13 123.033 -46.0124 150.149 -5.04171 -1.63347 8.77916 -21.065 73.3528 28.0353 2.02976e-10 -1.08272e-09 -8.01044e-10 3.01069e-10 -2.02966e-09 -1.36824e-09 2.02979e-10 -1.08272e-09 -8.01063e-10 7.73091 5.47488 0.417314 2.02974e-10 -1.08272e-09 -8.01053e-10 2.90554 0.965183 0.102902 2.02982e-10 -1.08271e-09 -8.01052e-10 10.2786 0.731801 0.0259123 2.02968e-10 -1.08272e-09 -8.01048e-10 2.22167 -0.733487 -0.20892 2.82416e-13 -4.39824e-13 -2.39544e-13 0.949478 -44.5319 -1.01737 10.8447 -4.67112 -19.3946 0.845906 25.1717 -3.78711 3.09504e-09 -2.54568e-09 -4.28071e-09 5.25893e-09 -4.34552e-09 -7.45689e-09 3.09502e-09 -2.54567e-09 -4.2807e-09 -7.73091 5.47488 -0.417314 3.09504e-09 -2.54568e-09 -4.2807e-09 -2.90554 0.965183 -0.102902 3.09504e-09 -2.54568e-09 -4.2807e-09 -10.2786 0.731801 -0.0259123 3.09504e-09 -2.54568e-09 -4.28071e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 14.0497 -2.93045 8.41518 0.141299 5.34817 1.26014 -34.5551 -26.8282 -55.6212 2.03217e-16 0.0 3.88251e-19 64.6935 -66.3184 90.3218 0.684429 55.8035 -1.89649 12.6858 -18.5165 29.698
--19.5655 72.7822 128.795 183.628 -15.2613 569.67 -12.4378 -3.11164 9.95443 -3.49458 -6.5956 2.13195 0.417419 4.51371 12.1795 -10.7024 -36.3836 20.9164 -0.0 0.0 0.0 -0.0 0.0 0.0 2.57806e-13 -6.31414e-13 -1.2275e-13 123.255 -46.2544 149.75 -4.99011 -1.61233 8.6876 -22.1922 73.9322 29.2098 1.16389e-09 -3.29829e-09 -1.55238e-09 1.88917e-09 -5.85428e-09 -2.71674e-09 1.1639e-09 -3.29829e-09 -1.55239e-09 7.73091 5.47488 0.417314 1.16389e-09 -3.29829e-09 -1.55239e-09 2.90554 0.965183 0.102902 1.1639e-09 -3.29828e-09 -1.55238e-09 10.2786 0.731801 0.0259123 1.16389e-09 -3.29829e-09 -1.55238e-09 2.22167 -0.733487 -0.20892 2.5783e-13 -6.31464e-13 -1.2292e-13 -0.44971 -43.9796 -2.22907 10.7286 -4.59661 -19.1741 0.851138 25.2413 -3.79915 2.65241e-09 -1.99164e-09 -2.31212e-09 4.53299e-09 -3.40899e-09 -4.04726e-09 2.65239e-09 -1.99163e-09 -2.31211e-09 -7.73091 5.47488 -0.417314 2.65241e-09 -1.99164e-09 -2.31212e-09 -2.90554 0.965183 -0.102902 2.6524e-09 -1.99164e-09 -2.31212e-09 -10.2786 0.731801 -0.0259123 2.65241e-09 -1.99164e-09 -2.31213e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.9156 -2.87857 8.15143 0.141686 5.32823 1.26331 -34.6299 -26.9634 -55.567 2.03217e-16 0.0 3.88251e-19 64.2228 -66.5661 89.9181 0.686198 55.8088 -1.89689 12.694 -18.5567 29.6773
--19.6885 72.7667 128.772 183.381 -15.4374 569.734 -12.4902 -2.97065 10.1692 -3.53401 -6.6799 2.18558 0.48074 4.87759 12.1146 -11.0878 -36.493 20.638 -0.0 0.0 0.0 -0.0 0.0 0.0 2.1778e-13 -7.81661e-13 4.42296e-15 123.572 -46.4092 149.324 -4.94919 -1.59564 8.61499 -23.7001 74.6387 30.7761 2.04876e-09 -5.19005e-09 -2.17648e-09 3.35632e-09 -9.11811e-09 -3.84353e-09 2.04877e-09 -5.19005e-09 -2.17649e-09 7.73091 5.47488 0.417314 2.04876e-09 -5.19005e-09 -2.17649e-09 2.90554 0.965183 0.102902 2.04877e-09 -5.19005e-09 -2.17648e-09 10.2786 0.731801 0.0259123 2.04876e-09 -5.19005e-09 -2.17647e-09 2.22167 -0.733487 -0.20892 2.17835e-13 -7.81706e-13 4.23776e-15 -1.94951 -43.4723 -3.53021 10.6081 -4.5196 -18.9464 0.860722 25.3712 -3.82154 2.08705e-09 -1.38094e-09 -2.22784e-10 3.59788e-09 -2.37635e-09 -4.26715e-10 2.08705e-09 -1.38094e-09 -2.22767e-10 -7.73091 5.47488 -0.417314 2.08705e-09 -1.38094e-09 -2.22783e-10 -2.90554 0.965183 -0.102902 2.08704e-09 -1.38094e-09 -2.22785e-10 -10.2786 0.731801 -0.0259123 2.08705e-09 -1.38094e-09 -2.22793e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.7805 -2.82421 7.86934 0.142099 5.30527 1.26667 -34.741 -27.1182 -55.5313 2.03217e-16 0.0 3.88251e-19 63.7001 -66.8162 89.4799 0.687718 55.8031 -1.89648 12.6919 -18.5847 29.6484
--19.8298 72.7478 128.728 183.101 -15.5247 569.786 -12.5366 -2.8451 10.3508 -3.57772 -6.78249 2.22845 0.508827 5.21633 12.0808 -11.3227 -36.6584 20.4765 -0.0 0.0 0.0 -0.0 0.0 0.0 1.63774e-13 -7.9353e-13 1.11419e-13 124.028 -46.3259 148.849 -4.92446 -1.58555 8.57116 -25.6729 75.4627 32.8182 2.40211e-09 -5.52264e-09 -2.21134e-09 3.95652e-09 -9.68862e-09 -3.92892e-09 2.40212e-09 -5.52264e-09 -2.21135e-09 7.73091 5.47488 0.417314 2.40211e-09 -5.52264e-09 -2.21135e-09 2.90554 0.965183 0.102902 2.40212e-09 -5.52264e-09 -2.21135e-09 10.2786 0.731801 0.0259123 2.40211e-09 -5.52264e-09 -2.21133e-09 2.22167 -0.733487 -0.20892 1.63834e-13 -7.93566e-13 1.1122e-13 -3.5208 -43.0984 -4.8187 10.5035 -4.45308 -18.7492 0.875655 25.5752 -3.85669 1.46296e-09 -8.58855e-10 1.3966e-09 2.55291e-09 -1.49269e-09 2.38285e-09 1.46296e-09 -8.58854e-10 1.39662e-09 -7.73091 5.47488 -0.417314 1.46296e-09 -8.58855e-10 1.3966e-09 -2.90554 0.965183 -0.102902 1.46295e-09 -8.58855e-10 1.3966e-09 -10.2786 0.731801 -0.0259123 1.46296e-09 -8.58858e-10 1.39659e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.6698 -2.80016 7.60183 0.142514 5.28107 1.27005 -34.8733 -27.2892 -55.5032 2.03217e-16 0.0 3.88251e-19 63.2549 -67.0712 89.1079 0.688358 55.7859 -1.89472 12.6848 -18.5878 29.6341
--19.9092 72.7351 128.714 182.97 -15.6066 569.903 -12.5722 -2.73284 10.4842 -3.63477 -6.92581 2.2543 0.491014 5.56071 12.0944 -11.342 -36.9444 20.4867 -0.0 0.0 0.0 -0.0 0.0 0.0 8.19622e-14 -5.59767e-13 2.00574e-13 124.692 -45.9015 148.322 -4.93177 -1.58847 8.58417 -28.4929 76.4721 35.7253 1.7939e-09 -2.94224e-09 -1.17938e-09 2.98972e-09 -5.22016e-09 -2.12824e-09 1.7939e-09 -2.94224e-09 -1.17938e-09 7.73091 5.47488 0.417314 1.7939e-09 -2.94225e-09 -1.17938e-09 2.90554 0.965183 0.102902 1.79391e-09 -2.94224e-09 -1.17938e-09 10.2786 0.731801 0.0259123 1.7939e-09 -2.94224e-09 -1.17937e-09 2.22167 -0.733487 -0.20892 8.19821e-14 -5.59787e-13 2.0036e-13 -5.20164 -42.9548 -6.11291 10.4191 -4.39988 -18.59 0.902816 25.9421 -3.92017 7.37036e-10 -4.79006e-10 2.50765e-09 1.32375e-09 -8.50806e-10 4.31548e-09 7.37038e-10 -4.79006e-10 2.50766e-09 -7.73091 5.47488 -0.417314 7.37036e-10 -4.79006e-10 2.50765e-09 -2.90554 0.965183 -0.102902 7.37028e-10 -4.79007e-10 2.50765e-09 -10.2786 0.731801 -0.0259123 7.37038e-10 -4.79008e-10 2.50764e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.595 -2.81359 7.34489 0.14295 5.2542 1.27361 -35.0517 -27.4939 -55.492 2.03217e-16 0.0 3.88251e-19 62.9117 -67.3482 88.8069 0.687832 55.7543 -1.89118 12.677 -18.5565 29.6527
--19.9859 72.7232 128.721 182.801 -15.7761 570.05 -12.6025 -2.6282 10.5961 -3.70448 -7.10691 2.27111 0.433316 5.93704 12.1346 -11.201 -37.3323 20.6078 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.36792e-14 -1.59228e-13 2.84759e-13 125.537 -45.2393 147.762 -4.9634 -1.60131 8.64028 -32.4135 77.6108 39.7484 5.699e-10 1.55081e-09 5.54883e-10 1.02081e-09 2.55758e-09 9.1265e-10 5.69902e-10 1.55081e-09 5.54881e-10 7.73091 5.47488 0.417314 5.69898e-10 1.5508e-09 5.54886e-10 2.90554 0.965183 0.102902 5.69908e-10 1.55081e-09 5.5488e-10 10.2786 0.731801 0.0259123 5.69897e-10 1.55081e-09 5.54892e-10 2.22167 -0.733487 -0.20892 -2.37294e-14 -1.59225e-13 2.84529e-13 -7.01582 -42.9665 -7.46775 10.3446 -4.3534 -18.4495 0.940706 26.4361 -4.00647 -1.04791e-10 -1.58958e-10 3.38569e-09 -1.08948e-10 -3.10837e-10 5.84733e-09 -1.04791e-10 -1.58958e-10 3.3857e-09 -7.73091 5.47488 -0.417314 -1.0479e-10 -1.58958e-10 3.38569e-09 -2.90554 0.965183 -0.102902 -1.04796e-10 -1.58958e-10 3.38569e-09 -10.2786 0.731801 -0.0259123 -1.04787e-10 -1.58959e-10 3.38568e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.5406 -2.84759 7.08519 0.143414 5.22436 1.27738 -35.2748 -27.7281 -55.5002 2.03217e-16 0.0 3.88251e-19 62.6054 -67.6409 88.5315 0.686526 55.7095 -1.88626 12.6648 -18.4995 29.6878
--20.0897 72.7076 128.697 182.548 -16.0434 570.063 -12.6329 -2.54011 10.7001 -3.76707 -7.2775 2.28696 0.353175 6.25593 12.1802 -11.0006 -37.6915 20.7663 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.25022e-13 2.25906e-13 3.49066e-13 126.46 -44.4976 147.185 -4.98955 -1.61198 8.68668 -37.1954 78.6922 44.6339 -5.61608e-10 5.6607e-09 2.19026e-09 -7.9874e-10 9.6642e-09 3.77763e-09 -5.61608e-10 5.6607e-09 2.19026e-09 7.73091 5.47488 0.417314 -5.61611e-10 5.66069e-09 2.19027e-09 2.90554 0.965183 0.102902 -5.61602e-10 5.66071e-09 2.19026e-09 10.2786 0.731801 0.0259123 -5.6161e-10 5.66071e-09 2.19027e-09 2.22167 -0.733487 -0.20892 -1.25144e-13 2.25931e-13 3.48823e-13 -8.90947 -42.9687 -8.83376 10.2788 -4.31254 -18.3253 0.976505 26.884 -4.08565 -9.55003e-10 1.6012e-10 3.91058e-09 -1.56345e-09 2.31126e-10 6.76969e-09 -9.55005e-10 1.6012e-10 3.9106e-09 -7.73091 5.47488 -0.417314 -9.55001e-10 1.60121e-10 3.91059e-09 -2.90554 0.965183 -0.102902 -9.55005e-10 1.6012e-10 3.91059e-09 -10.2786 0.731801 -0.0259123 -9.54998e-10 1.60121e-10 3.91058e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.4906 -2.899 6.84166 0.143856 5.19495 1.28095 -35.4885 -27.9557 -55.5062 2.03217e-16 0.0 3.88251e-19 62.3377 -67.9172 88.313 0.684818 55.6572 -1.88065 12.6411 -18.4317 29.7109
--20.1225 72.7042 128.722 182.567 -16.3887 570.178 -12.6688 -2.47746 10.81 -3.80271 -7.38928 2.30988 0.268792 6.42813 12.2092 -10.8452 -37.8919 20.8854 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.93936e-13 4.13453e-13 3.78585e-13 127.351 -43.8326 146.602 -4.98049 -1.60842 8.67051 -42.2018 79.5636 49.7311 -8.92346e-10 7.09164e-09 2.92559e-09 -1.31748e-09 1.21193e-08 5.05058e-09 -8.92347e-10 7.09164e-09 2.92559e-09 7.73091 5.47488 0.417314 -8.92349e-10 7.09162e-09 2.9256e-09 2.90554 0.965183 0.102902 -8.92341e-10 7.09165e-09 2.92559e-09 10.2786 0.731801 0.0259123 -8.92348e-10 7.09165e-09 2.9256e-09 2.22167 -0.733487 -0.20892 -1.94104e-13 4.1349e-13 3.78337e-13 -10.8078 -42.8005 -10.1474 10.2201 -4.27618 -18.2148 0.995395 27.113 -4.1265 -1.70608e-09 5.37062e-10 3.9622e-09 -2.85799e-09 8.78994e-10 6.87382e-09 -1.70609e-09 5.37062e-10 3.96221e-09 -7.73091 5.47488 -0.417314 -1.70608e-09 5.37062e-10 3.9622e-09 -2.90554 0.965183 -0.102902 -1.70608e-09 5.37062e-10 3.96221e-09 -10.2786 0.731801 -0.0259123 -1.70608e-09 5.37064e-10 3.9622e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.4292 -2.96464 6.63323 0.144224 5.16934 1.28391 -35.638 -28.1407 -55.4872 2.03217e-16 0.0 3.88251e-19 62.1132 -68.1452 88.1859 0.683081 55.6031 -1.87503 12.599 -18.3677 29.6933
--20.1598 72.7109 128.766 182.529 -16.5366 570.446 -12.7084 -2.4593 10.9285 -3.786 -7.39717 2.34547 0.139905 6.3547 12.2238 -10.7359 -37.8723 20.9768 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.19066e-13 2.75883e-13 3.5652e-13 128.144 -43.2743 146.024 -4.91659 -1.58267 8.55701 -46.6041 80.1665 54.2027 1.40134e-10 4.03109e-09 2.20482e-09 3.82208e-10 6.77274e-09 3.74266e-09 1.40134e-10 4.03109e-09 2.20482e-09 7.73091 5.47488 0.417314 1.40131e-10 4.03107e-09 2.20483e-09 2.90554 0.965183 0.102902 1.40139e-10 4.03109e-09 2.20482e-09 10.2786 0.731801 0.0259123 1.40132e-10 4.03109e-09 2.20482e-09 2.22167 -0.733487 -0.20892 -2.19244e-13 2.75917e-13 3.5628e-13 -12.658 -42.3572 -11.3554 10.177 -4.24943 -18.134 0.982288 26.9507 -4.09767 -2.45494e-09 1.11205e-09 3.24895e-09 -4.16676e-09 1.87805e-09 5.659e-09 -2.45494e-09 1.11205e-09 3.24897e-09 -7.73091 5.47488 -0.417314 -2.45493e-09 1.11205e-09 3.24896e-09 -2.90554 0.965183 -0.102902 -2.45494e-09 1.11205e-09 3.24896e-09 -10.2786 0.731801 -0.0259123 -2.45493e-09 1.11205e-09 3.24895e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.3572 -3.0631 6.48673 0.144489 5.14974 1.28602 -35.6909 -28.2638 -55.4276 2.03217e-16 0.0 3.88251e-19 62.0112 -68.3004 88.2521 0.681401 55.5485 -1.8695 12.5292 -18.3038 29.6195
--20.2601 72.7125 128.763 182.375 -16.5584 570.589 -12.7495 -2.47527 11.0486 -3.73438 -7.33766 2.38825 -0.0278205 6.10835 12.2328 -10.6275 -37.7111 21.0695 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.16699e-13 -6.33256e-14 2.95096e-13 128.91 -42.7427 145.441 -4.81743 -1.54272 8.38125 -50.636 80.6147 58.2918 2.03356e-09 -1.89643e-09 5.69365e-10 3.4827e-09 -3.55631e-09 8.12875e-10 2.03356e-09 -1.89643e-09 5.69366e-10 7.73091 5.47488 0.417314 2.03356e-09 -1.89644e-09 5.69373e-10 2.90554 0.965183 0.102902 2.03356e-09 -1.89643e-09 5.69367e-10 10.2786 0.731801 0.0259123 2.03356e-09 -1.89642e-09 5.69376e-10 2.22167 -0.733487 -0.20892 -2.16865e-13 -6.33016e-14 2.94872e-13 -14.4901 -41.7501 -12.4906 10.1475 -4.23115 -18.0787 0.948971 26.5314 -4.02359 -3.21705e-09 1.8122e-09 1.92144e-09 -5.51245e-09 3.10036e-09 3.38491e-09 -3.21705e-09 1.8122e-09 1.92145e-09 -7.73091 5.47488 -0.417314 -3.21705e-09 1.8122e-09 1.92144e-09 -2.90554 0.965183 -0.102902 -3.21705e-09 1.8122e-09 1.92144e-09 -10.2786 0.731801 -0.0259123 -3.21705e-09 1.8122e-09 1.92144e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.2812 -3.18962 6.38483 0.144681 5.1339 1.28755 -35.6822 -28.3472 -55.3418 2.03217e-16 0.0 3.88251e-19 62.0093 -68.4053 88.469 0.67959 55.4906 -1.86374 12.4381 -18.2345 29.5075
--20.3671 72.7168 128.752 182.193 -16.6202 570.726 -12.7972 -2.49018 11.1693 -3.69213 -7.28485 2.4297 -0.147208 5.85736 12.2246 -10.5567 -37.4883 21.1111 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.00172e-13 -4.09838e-13 2.22937e-13 129.733 -42.2272 144.837 -4.71218 -1.50039 8.19519 -55.1363 81.0213 62.8506 3.89913e-09 -7.8311e-09 -1.13572e-09 6.53256e-09 -1.38945e-08 -2.23314e-09 3.89913e-09 -7.8311e-09 -1.13572e-09 7.73091 5.47488 0.417314 3.89913e-09 -7.83111e-09 -1.13571e-09 2.90554 0.965183 0.102902 3.89913e-09 -7.8311e-09 -1.13572e-09 10.2786 0.731801 0.0259123 3.89912e-09 -7.8311e-09 -1.13571e-09 2.22167 -0.733487 -0.20892 -2.00317e-13 -4.09827e-13 2.2273e-13 -16.3518 -41.1426 -13.6168 10.1142 -4.21078 -18.0161 0.918955 26.1421 -3.95545 -3.76276e-09 2.37677e-09 5.22761e-10 -6.48617e-09 4.08998e-09 9.83415e-10 -3.76276e-09 2.37677e-09 5.22768e-10 -7.73091 5.47488 -0.417314 -3.76276e-09 2.37677e-09 5.22762e-10 -2.90554 0.965183 -0.102902 -3.76277e-09 2.37677e-09 5.22765e-10 -10.2786 0.731801 -0.0259123 -3.76277e-09 2.37677e-09 5.22758e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.1946 -3.30604 6.28016 0.14484 5.11858 1.28881 -35.6581 -28.4171 -55.2523 2.03217e-16 0.0 3.88251e-19 61.9574 -68.4983 88.6513 0.677598 55.4282 -1.85775 12.3426 -18.1718 29.379
--20.4422 72.72 128.716 182.175 -16.8667 570.787 -12.8567 -2.46889 11.2896 -3.7033 -7.31282 2.46127 -0.131235 5.77 12.1869 -10.5587 -37.284 21.0497 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.82825e-13 -5.6932e-13 1.68669e-13 130.698 -41.7169 144.2 -4.63031 -1.46758 8.05072 -61.3074 81.4443 69.0945 4.84803e-09 -1.09131e-08 -2.06539e-09 8.08035e-09 -1.92687e-08 -3.88974e-09 4.84804e-09 -1.09131e-08 -2.06539e-09 7.73091 5.47488 0.417314 4.84803e-09 -1.09131e-08 -2.06539e-09 2.90554 0.965183 0.102902 4.84804e-09 -1.09131e-08 -2.06539e-09 10.2786 0.731801 0.0259123 4.84803e-09 -1.09131e-08 -2.06538e-09 2.22167 -0.733487 -0.20892 -1.82951e-13 -5.6932e-13 1.6847e-13 -18.3043 -40.6939 -14.8056 10.0598 -4.17775 -17.9136 0.913155 26.0704 -3.94278 -3.86243e-09 2.54501e-09 -4.03969e-10 -6.67899e-09 4.39096e-09 -6.13608e-10 -3.86243e-09 2.54502e-09 -4.03962e-10 -7.73091 5.47488 -0.417314 -3.86243e-09 2.54502e-09 -4.03969e-10 -2.90554 0.965183 -0.102902 -3.86244e-09 2.54502e-09 -4.03967e-10 -10.2786 0.731801 -0.0259123 -3.86243e-09 2.54501e-09 -4.03975e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 13.0904 -3.37418 6.12531 0.145006 5.10054 1.2901 -35.6651 -28.4997 -55.1818 2.03217e-16 0.0 3.88251e-19 61.7025 -68.6187 88.6109 0.675377 55.3606 -1.85157 12.2593 -18.1279 29.2559
--20.5269 72.7236 128.636 182.146 -17.2014 570.772 -12.9392 -2.39261 11.4048 -3.78292 -7.46616 2.47767 0.069163 5.92978 12.1076 -10.6353 -37.11 20.8544 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.67736e-13 -4.21086e-13 1.41161e-13 131.873 -41.1794 143.537 -4.56092 -1.43991 7.92844 -70.2251 81.8302 78.1077 4.39999e-09 -9.67079e-09 -1.82962e-09 7.3379e-09 -1.71158e-08 -3.45724e-09 4.4e-09 -9.67078e-09 -1.82962e-09 7.73091 5.47488 0.417314 4.39999e-09 -9.6708e-09 -1.82962e-09 2.90554 0.965183 0.102902 4.4e-09 -9.67079e-09 -1.82962e-09 10.2786 0.731801 0.0259123 4.39999e-09 -9.67079e-09 -1.82961e-09 2.22167 -0.733487 -0.20892 -1.67848e-13 -4.21092e-13 1.40957e-13 -20.4253 -40.5117 -16.1265 9.97311 -4.12531 -17.7505 0.943464 26.4764 -4.01336 -3.24682e-09 2.07295e-09 -6.42763e-10 -5.62105e-09 3.58029e-09 -1.03953e-09 -3.24682e-09 2.07295e-09 -6.42755e-10 -7.73091 5.47488 -0.417314 -3.24682e-09 2.07295e-09 -6.42764e-10 -2.90554 0.965183 -0.102902 -3.24683e-09 2.07295e-09 -6.42765e-10 -10.2786 0.731801 -0.0259123 -3.24682e-09 2.07295e-09 -6.42773e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.9609 -3.36856 5.89289 0.145188 5.07808 1.29151 -35.7183 -28.6037 -55.1376 2.03217e-16 0.0 3.88251e-19 61.1437 -68.7648 88.257 0.672906 55.2858 -1.84486 12.1795 -18.1036 29.12
--20.6587 72.7268 128.589 181.916 -17.4721 570.801 -13.039 -2.28328 11.5167 -3.90634 -7.69708 2.48447 0.399882 6.23427 11.9963 -10.7681 -36.926 20.5597 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.47953e-13 -9.17343e-14 1.24734e-13 133.198 -40.6298 142.854 -4.49463 -1.41357 7.81174 -81.1967 82.0036 89.1889 3.11012e-09 -5.86567e-09 -9.33989e-10 5.213e-09 -1.05005e-08 -1.83805e-09 3.11013e-09 -5.86566e-09 -9.33992e-10 7.73091 5.47488 0.417314 3.11012e-09 -5.86568e-09 -9.33991e-10 2.90554 0.965183 0.102902 3.11012e-09 -5.86567e-09 -9.3399e-10 10.2786 0.731801 0.0259123 3.11012e-09 -5.86567e-09 -9.33986e-10 2.22167 -0.733487 -0.20892 -1.48047e-13 -9.17448e-14 1.24517e-13 -22.6835 -40.4821 -17.5375 9.86525 -4.06027 -17.5483 0.998852 27.1788 -4.13732 -2.10774e-09 1.15779e-09 -5.06999e-10 -3.65072e-09 2.00161e-09 -8.30735e-10 -2.10776e-09 1.1578e-09 -5.06989e-10 -7.73091 5.47488 -0.417314 -2.10774e-09 1.15779e-09 -5.07002e-10 -2.90554 0.965183 -0.102902 -2.10775e-09 1.15779e-09 -5.07005e-10 -10.2786 0.731801 -0.0259123 -2.10774e-09 1.15779e-09 -5.07014e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.8124 -3.31452 5.61314 0.145367 5.05323 1.29286 -35.7921 -28.7147 -55.1072 2.03217e-16 0.0 3.88251e-19 60.3753 -68.9183 87.6958 0.670225 55.205 -1.83774 12.0987 -18.0933 28.9677
--20.7919 72.7294 128.57 181.632 -17.5842 570.873 -13.1359 -2.16693 11.635 -4.05799 -7.94112 2.48955 0.792962 6.57271 11.8729 -10.9617 -36.7327 20.2126 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.21759e-13 2.42139e-13 1.11192e-13 134.569 -40.1274 142.13 -4.46345 -1.40137 7.75675 -92.4447 81.8671 100.549 1.64273e-09 -1.48798e-09 1.23109e-10 2.79821e-09 -2.89089e-09 7.03472e-11 1.64273e-09 -1.48796e-09 1.23102e-10 7.73091 5.47488 0.417314 1.64273e-09 -1.48798e-09 1.23104e-10 2.90554 0.965183 0.102902 1.64273e-09 -1.48798e-09 1.23103e-10 10.2786 0.731801 0.0259123 1.64273e-09 -1.48798e-09 1.23106e-10 2.22167 -0.733487 -0.20892 -1.21835e-13 2.42125e-13 1.10958e-13 -24.973 -40.4338 -18.9392 9.75226 -3.99242 -17.3373 1.06374 27.9528 -4.27642 -9.07099e-10 2.00591e-10 -2.47617e-10 -1.5714e-09 3.48994e-10 -4.09842e-10 -9.07121e-10 2.00598e-10 -2.47605e-10 -7.73091 5.47488 -0.417314 -9.07097e-10 2.00592e-10 -2.47622e-10 -2.90554 0.965183 -0.102902 -9.07103e-10 2.00591e-10 -2.47627e-10 -10.2786 0.731801 -0.0259123 -9.07094e-10 2.00595e-10 -2.47637e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.6592 -3.25011 5.32505 0.145536 5.02825 1.29411 -35.8719 -28.824 -55.0842 2.03217e-16 0.0 3.88251e-19 59.5353 -69.0934 87.032 0.667368 55.1213 -1.83087 12.0392 -18.0996 28.8421
--20.9058 72.7358 128.564 181.424 -17.6166 571.001 -13.2093 -2.06956 11.7688 -4.22221 -8.13382 2.50071 1.17921 6.83408 11.7569 -11.2213 -36.5316 19.8593 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.74389e-14 4.0394e-13 9.23355e-14 135.881 -39.7298 141.343 -4.49945 -1.41612 7.81962 -102.073 81.4789 110.279 6.62115e-10 1.47208e-09 8.43273e-10 1.18607e-09 2.24506e-09 1.37047e-09 6.6212e-10 1.47211e-09 8.43264e-10 7.73091 5.47488 0.417314 6.62115e-10 1.47208e-09 8.43267e-10 2.90554 0.965183 0.102902 6.6212e-10 1.47208e-09 8.43266e-10 10.2786 0.731801 0.0259123 6.62116e-10 1.47209e-09 8.43267e-10 2.22167 -0.733487 -0.20892 -8.74973e-14 4.03921e-13 9.2087e-14 -27.1667 -40.2035 -20.2196 9.65044 -3.93164 -17.1475 1.11839 28.5738 -4.38982 -1.06786e-10 -3.9759e-10 -1.15556e-10 -1.86525e-10 -6.83508e-10 -1.99478e-10 -1.06812e-10 -3.97582e-10 -1.15543e-10 -7.73091 5.47488 -0.417314 -1.06783e-10 -3.97589e-10 -1.15562e-10 -2.90554 0.965183 -0.102902 -1.06789e-10 -3.9759e-10 -1.15569e-10 -10.2786 0.731801 -0.0259123 -1.06779e-10 -3.97585e-10 -1.15578e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.5148 -3.21351 5.06754 0.145687 5.00543 1.29523 -35.9427 -28.9233 -55.0619 2.03217e-16 0.0 3.88251e-19 58.7629 -69.3059 86.3717 0.664361 55.0381 -1.82491 12.0233 -18.1254 28.7867
--20.9923 72.7425 128.559 181.313 -17.6434 571.144 -13.2562 -2.00531 11.9414 -4.42909 -8.25433 2.52261 1.61143 7.00787 11.6476 -11.6363 -36.3055 19.4637 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.91552e-14 3.18093e-13 5.66649e-14 137.162 -39.4241 140.475 -4.66192 -1.48177 8.10499 -109.787 80.9482 118.084 3.17686e-10 2.4436e-09 1.01436e-09 6.15142e-10 3.94887e-09 1.69218e-09 3.17689e-10 2.44362e-09 1.01434e-09 7.73091 5.47488 0.417314 3.17685e-10 2.4436e-09 1.01435e-09 2.90554 0.965183 0.102902 3.1769e-10 2.4436e-09 1.01435e-09 10.2786 0.731801 0.0259123 3.17687e-10 2.4436e-09 1.01435e-09 2.22167 -0.733487 -0.20892 -3.91933e-14 3.18068e-13 5.64005e-14 -29.2106 -39.749 -21.3671 9.56496 -3.88105 -16.9883 1.15561 28.9895 -4.46634 2.1011e-10 -5.10882e-10 -1.20441e-10 3.60136e-10 -8.78973e-10 -2.14448e-10 2.10087e-10 -5.10874e-10 -1.20429e-10 -7.73091 5.47488 -0.417314 2.10113e-10 -5.1088e-10 -1.20448e-10 -2.90554 0.965183 -0.102902 2.10107e-10 -5.10881e-10 -1.20453e-10 -10.2786 0.731801 -0.0259123 2.10116e-10 -5.10878e-10 -1.20462e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.3747 -3.21809 4.85148 0.14582 4.98452 1.29622 -36.007 -29.0173 -55.0384 2.03217e-16 0.0 3.88251e-19 58.0654 -69.5776 85.7015 0.660913 54.9497 -1.82001 12.0715 -18.1812 28.8332
--21.1131 72.7473 128.527 181.158 -17.7389 571.2 -13.2864 -1.95789 12.1409 -4.67555 -8.33825 2.55021 2.10243 7.14682 11.5363 -12.1727 -36.0584 19.0183 -0.0 0.0 0.0 -0.0 0.0 0.0 2.03841e-14 8.82772e-14 1.16569e-14 138.445 -39.1836 139.54 -4.91558 -1.58439 8.55309 -116.179 80.3152 124.562 2.64393e-10 2.50141e-09 9.28589e-10 5.20323e-10 4.08137e-09 1.55774e-09 2.64392e-10 2.50143e-09 9.28568e-10 7.73091 5.47488 0.417314 2.6439e-10 2.50141e-09 9.28584e-10 2.90554 0.965183 0.102902 2.64395e-10 2.50141e-09 9.28585e-10 10.2786 0.731801 0.0259123 2.64391e-10 2.50141e-09 9.28586e-10 2.22167 -0.733487 -0.20892 2.03683e-14 8.8244e-14 1.13742e-14 -31.1636 -39.1643 -22.4273 9.48701 -3.83528 -16.8431 1.18505 29.3173 -4.52689 2.76574e-10 -3.59489e-10 -1.47536e-10 4.73581e-10 -6.18181e-10 -2.61983e-10 2.76557e-10 -3.59482e-10 -1.47525e-10 -7.73091 5.47488 -0.417314 2.76575e-10 -3.59487e-10 -1.47542e-10 -2.90554 0.965183 -0.102902 2.76568e-10 -3.59488e-10 -1.47544e-10 -10.2786 0.731801 -0.0259123 2.76576e-10 -3.59487e-10 -1.47553e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.2341 -3.24247 4.65592 0.145938 4.96457 1.29709 -36.0704 -29.1084 -55.0172 2.03217e-16 0.0 3.88251e-19 57.3682 -69.8932 84.9675 0.657103 54.8566 -1.81583 12.1673 -18.2621 28.952
--21.2235 72.7522 128.512 181.066 -18.0204 571.247 -13.2997 -1.90763 12.3239 -4.89618 -8.4058 2.57675 2.52188 7.23468 11.4309 -12.6537 -35.8253 18.6111 -0.0 0.0 0.0 -0.0 0.0 0.0 8.00742e-14 -1.93224e-13 -2.24196e-14 139.622 -39.0433 138.566 -5.15195 -1.68022 8.97337 -121.332 79.6354 129.794 4.24873e-10 2.12395e-09 8.44127e-10 7.88696e-10 3.40353e-09 1.40827e-09 4.2487e-10 2.12396e-09 8.441e-10 7.73091 5.47488 0.417314 4.24868e-10 2.12396e-09 8.44123e-10 2.90554 0.965183 0.102902 4.24874e-10 2.12396e-09 8.44126e-10 10.2786 0.731801 0.0259123 4.24869e-10 2.12396e-09 8.44127e-10 2.22167 -0.733487 -0.20892 8.00772e-14 -1.93262e-13 -2.27158e-14 -33.0606 -38.4973 -23.37 9.41203 -3.79156 -16.7034 1.20941 29.5872 -4.57693 1.04811e-10 -6.14685e-11 -2.61237e-10 1.73566e-10 -1.03613e-10 -4.53352e-10 1.04801e-10 -6.14621e-11 -2.61227e-10 -7.73091 5.47488 -0.417314 1.04811e-10 -6.14657e-11 -2.61241e-10 -2.90554 0.965183 -0.102902 1.04802e-10 -6.14665e-11 -2.61241e-10 -10.2786 0.731801 -0.0259123 1.04809e-10 -6.14685e-11 -2.61249e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.1052 -3.27285 4.47206 0.14604 4.94687 1.29783 -36.1236 -29.1834 -54.9998 2.03217e-16 0.0 3.88251e-19 56.6939 -70.2153 84.2231 0.653499 54.7712 -1.81223 12.2774 -18.348 29.0939
--21.3533 72.7578 128.534 180.841 -18.2014 571.328 -13.2956 -1.83488 12.447 -5.02556 -8.47719 2.59547 2.73931 7.25515 11.3392 -12.9055 -35.6426 18.3281 -0.0 0.0 0.0 -0.0 0.0 0.0 1.2881e-13 -4.34127e-13 -2.52953e-14 140.579 -39.0383 137.576 -5.26489 -1.726 9.1752 -125.398 78.9573 133.933 7.21766e-10 1.78967e-09 1.01913e-09 1.30734e-09 2.67631e-09 1.68487e-09 7.21762e-10 1.78968e-09 1.0191e-09 7.73091 5.47488 0.417314 7.21761e-10 1.78967e-09 1.01913e-09 2.90554 0.965183 0.102902 7.21767e-10 1.78967e-09 1.01913e-09 10.2786 0.731801 0.0259123 7.21761e-10 1.78968e-09 1.01914e-09 2.22167 -0.733487 -0.20892 1.28823e-13 -4.34164e-13 -2.55935e-14 -34.9427 -37.7955 -24.1689 9.3354 -3.74713 -16.5609 1.23174 29.8293 -4.62214 -2.92974e-10 2.65125e-10 -5.2594e-10 -5.20152e-10 4.62246e-10 -8.99823e-10 -2.92978e-10 2.6513e-10 -5.2593e-10 -7.73091 5.47488 -0.417314 -2.92974e-10 2.65128e-10 -5.25943e-10 -2.90554 0.965183 -0.102902 -2.92984e-10 2.65127e-10 -5.25941e-10 -10.2786 0.731801 -0.0259123 -2.92977e-10 2.65123e-10 -5.25949e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.0008 -3.2954 4.29113 0.146123 4.93266 1.29844 -36.1572 -29.2296 -54.9879 2.03217e-16 0.0 3.88251e-19 56.0741 -70.5076 83.5307 0.650666 54.706 -1.80909 12.368 -18.4192 29.2099
--21.4176 72.7674 128.536 180.831 -18.4367 571.451 -13.2482 -1.72751 12.5043 -5.0499 -8.58454 2.60539 2.64735 7.1901 11.2578 -12.8034 -35.5192 18.2164 -0.0 0.0 0.0 -0.0 0.0 0.0 1.74843e-13 -6.77571e-13 4.11418e-14 141.263 -39.2313 136.603 -5.2021 -1.70002 9.0634 -128.692 78.2924 137.292 1.39175e-09 1.33346e-09 1.78886e-09 2.50335e-09 1.4396e-09 2.93627e-09 1.39174e-09 1.33347e-09 1.78884e-09 7.73091 5.47488 0.417314 1.39174e-09 1.33346e-09 1.78886e-09 2.90554 0.965183 0.102902 1.39175e-09 1.33346e-09 1.78886e-09 10.2786 0.731801 0.0259123 1.39174e-09 1.33346e-09 1.78887e-09 2.22167 -0.733487 -0.20892 1.74857e-13 -6.77593e-13 4.08638e-14 -36.8373 -37.0525 -24.8109 9.24554 -3.69542 -16.3938 1.25382 30.0637 -4.66621 -1.18738e-09 7.16404e-10 -1.13447e-09 -2.07939e-09 1.24746e-09 -1.92757e-09 -1.18738e-09 7.16407e-10 -1.13446e-09 -7.73091 5.47488 -0.417314 -1.18738e-09 7.16406e-10 -1.13447e-09 -2.90554 0.965183 -0.102902 -1.18739e-09 7.16406e-10 -1.13447e-09 -10.2786 0.731801 -0.0259123 -1.18738e-09 7.16403e-10 -1.13448e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.9365 -3.30892 4.10562 0.146157 4.92415 1.29866 -36.1534 -29.2188 -54.987 2.03217e-16 0.0 3.88251e-19 55.5414 -70.7679 82.915 0.648854 54.6695 -1.80636 12.428 -18.4696 29.284
--21.4996 72.7753 128.497 180.809 -18.6396 571.516 -13.1663 -1.59827 12.5172 -5.00292 -8.70817 2.60984 2.33921 7.05273 11.1846 -12.4692 -35.4374 18.2202 -0.0 0.0 0.0 -0.0 0.0 0.0 2.20357e-13 -9.50191e-13 1.55179e-13 141.726 -39.5803 135.612 -5.0283 -1.62876 8.75442 -131.369 77.6591 140.03 2.3903e-09 5.97712e-10 2.92682e-09 4.28455e-09 -4.91447e-10 4.78352e-09 2.39031e-09 5.97736e-10 2.92681e-09 7.73091 5.47488 0.417314 2.3903e-09 5.97714e-10 2.92682e-09 2.90554 0.965183 0.102902 2.39031e-09 5.97714e-10 2.92683e-09 10.2786 0.731801 0.0259123 2.3903e-09 5.97716e-10 2.92683e-09 2.22167 -0.733487 -0.20892 2.20366e-13 -9.5019e-13 1.54937e-13 -38.7223 -36.2542 -25.3186 9.14825 -3.63982 -16.2133 1.27339 30.2704 -4.70518 -2.49362e-09 1.3128e-09 -1.99393e-09 -4.35565e-09 2.28601e-09 -3.37842e-09 -2.49363e-09 1.3128e-09 -1.99392e-09 -7.73091 5.47488 -0.417314 -2.49362e-09 1.3128e-09 -1.99393e-09 -2.90554 0.965183 -0.102902 -2.49363e-09 1.3128e-09 -1.99393e-09 -10.2786 0.731801 -0.0259123 -2.49362e-09 1.3128e-09 -1.99394e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.9015 -3.31996 3.92196 0.146153 4.92005 1.29859 -36.1222 -29.1659 -54.9946 2.03217e-16 0.0 3.88251e-19 55.0767 -71.0143 82.346 0.647715 54.6534 -1.80412 12.4758 -18.5101 29.3432
--21.6142 72.7807 128.462 180.681 -18.6549 571.553 -13.1008 -1.46479 12.4828 -4.89046 -8.79058 2.60853 1.98547 6.87373 11.1288 -12.1 -35.3946 18.2708 -0.0 0.0 0.0 -0.0 0.0 0.0 2.45151e-13 -1.13495e-12 2.47349e-13 142.015 -39.9623 134.529 -4.81402 -1.54151 8.37501 -133.392 77.1132 142.103 3.21831e-09 7.21243e-11 3.84856e-09 5.75911e-09 -1.94292e-09 6.2762e-09 3.21831e-09 7.21554e-11 3.84855e-09 7.73091 5.47488 0.417314 3.21831e-09 7.21224e-11 3.84856e-09 2.90554 0.965183 0.102902 3.21831e-09 7.21227e-11 3.84856e-09 10.2786 0.731801 0.0259123 3.2183e-09 7.2124e-11 3.84857e-09 2.22167 -0.733487 -0.20892 2.45146e-13 -1.13492e-12 2.47139e-13 -40.5694 -35.4348 -25.7211 9.06526 -3.59254 -16.0596 1.28755 30.419 -4.7333 -3.66645e-09 1.82274e-09 -2.74014e-09 -6.39873e-09 3.17425e-09 -4.63711e-09 -3.66645e-09 1.82274e-09 -2.74013e-09 -7.73091 5.47488 -0.417314 -3.66645e-09 1.82274e-09 -2.74014e-09 -2.90554 0.965183 -0.102902 -3.66646e-09 1.82274e-09 -2.74014e-09 -10.2786 0.731801 -0.0259123 -3.66645e-09 1.82274e-09 -2.74015e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.869 -3.32628 3.7522 0.146172 4.91637 1.29872 -36.0962 -29.1232 -54.9997 2.03217e-16 0.0 3.88251e-19 54.6403 -71.2412 81.8117 0.646917 54.6446 -1.80234 12.5221 -18.5465 29.403
--21.7083 72.7832 128.426 180.528 -18.8153 571.542 -13.1028 -1.34472 12.3986 -4.71839 -8.77432 2.60117 1.75703 6.68387 11.0996 -11.8924 -35.3882 18.2997 -0.0 0.0 0.0 -0.0 0.0 0.0 2.29024e-13 -1.1148e-12 2.48183e-13 142.184 -40.2511 133.288 -4.63096 -1.46784 8.0519 -134.738 76.711 143.485 3.37662e-09 2.46383e-10 3.96962e-09 6.03522e-09 -1.74091e-09 6.46389e-09 3.37663e-09 2.46417e-10 3.96961e-09 7.73091 5.47488 0.417314 3.37662e-09 2.46379e-10 3.96962e-09 2.90554 0.965183 0.102902 3.37662e-09 2.46379e-10 3.96962e-09 10.2786 0.731801 0.0259123 3.37661e-09 2.46382e-10 3.96963e-09 2.22167 -0.733487 -0.20892 2.28991e-13 -1.11477e-12 2.47984e-13 -42.3499 -34.6271 -26.0465 9.01856 -3.56592 -15.9734 1.29333 30.4793 -4.74473 -4.16059e-09 2.01463e-09 -3.00891e-09 -7.2584e-09 3.50858e-09 -5.08838e-09 -4.1606e-09 2.01463e-09 -3.0089e-09 -7.73091 5.47488 -0.417314 -4.16059e-09 2.01463e-09 -3.00891e-09 -2.90554 0.965183 -0.102902 -4.1606e-09 2.01463e-09 -3.00891e-09 -10.2786 0.731801 -0.0259123 -4.16059e-09 2.01463e-09 -3.00892e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.8121 -3.32568 3.60842 0.146275 4.90912 1.29957 -36.1081 -29.1426 -54.9916 2.03217e-16 0.0 3.88251e-19 54.1928 -71.4426 81.2998 0.646132 54.6296 -1.80101 12.5775 -18.5847 29.4784
--21.7576 72.7845 128.386 180.533 -19.023 571.491 -13.2283 -1.23835 12.206 -4.41963 -8.59754 2.57858 1.70927 6.46076 11.1258 -11.9171 -35.4278 18.333 -0.0 0.0 0.0 -0.0 0.0 0.0 1.35924e-13 -7.31373e-13 9.36241e-14 142.148 -40.3361 131.825 -4.47943 -1.40833 7.78425 -135.371 76.5092 144.135 2.30195e-09 2.6805e-09 2.65562e-09 4.10823e-09 3.11631e-09 4.31579e-09 2.30196e-09 2.68053e-09 2.65562e-09 7.73091 5.47488 0.417314 2.30195e-09 2.6805e-09 2.65562e-09 2.90554 0.965183 0.102902 2.30196e-09 2.6805e-09 2.65562e-09 10.2786 0.731801 0.0259123 2.30194e-09 2.6805e-09 2.65563e-09 2.22167 -0.733487 -0.20892 1.35839e-13 -7.31335e-13 9.33973e-14 -44.0487 -33.8709 -26.2481 9.0343 -3.57476 -16.0026 1.28434 30.3865 -4.72709 -3.68765e-09 1.72434e-09 -2.41205e-09 -6.42707e-09 3.00243e-09 -4.06915e-09 -3.68766e-09 1.72434e-09 -2.41204e-09 -7.73091 5.47488 -0.417314 -3.68765e-09 1.72434e-09 -2.41205e-09 -2.90554 0.965183 -0.102902 -3.68767e-09 1.72434e-09 -2.41205e-09 -10.2786 0.731801 -0.0259123 -3.68765e-09 1.72435e-09 -2.41206e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.7076 -3.30587 3.49605 0.146532 4.89478 1.3017 -36.1869 -29.277 -54.9556 2.03217e-16 0.0 3.88251e-19 53.68 -71.6126 80.7756 0.645189 54.6008 -1.80015 12.6537 -18.6288 29.5883
--21.8191 72.7897 128.374 180.436 -19.0095 571.529 -13.435 -1.13754 11.9258 -4.01367 -8.3064 2.54404 1.74852 6.19831 11.1938 -12.0629 -35.5114 18.3925 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.31532e-14 -8.94699e-14 -1.641e-13 141.919 -40.2946 130.204 -4.32749 -1.34966 7.51603 -135.467 76.4783 144.234 4.0391e-10 6.63684e-09 3.77787e-10 7.09407e-10 1.11064e-08 5.97893e-10 4.03919e-10 6.63685e-09 3.77784e-10 7.73091 5.47488 0.417314 4.0391e-10 6.63683e-09 3.77788e-10 2.90554 0.965183 0.102902 4.03915e-10 6.63683e-09 3.7779e-10 10.2786 0.731801 0.0259123 4.03897e-10 6.63685e-09 3.77798e-10 2.22167 -0.733487 -0.20892 -1.3311e-14 -8.94374e-14 -1.64379e-13 -45.6928 -33.1375 -26.3346 9.09408 -3.60867 -16.1132 1.26417 30.1755 -4.68717 -2.58611e-09 1.10952e-09 -1.24081e-09 -4.49627e-09 1.93071e-09 -2.07392e-09 -2.58611e-09 1.10952e-09 -1.2408e-09 -7.73091 5.47488 -0.417314 -2.58611e-09 1.10952e-09 -1.24081e-09 -2.90554 0.965183 -0.102902 -2.58612e-09 1.10952e-09 -1.24081e-09 -10.2786 0.731801 -0.0259123 -2.5861e-09 1.10952e-09 -1.24082e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.5753 -3.27196 3.40791 0.146895 4.8763 1.30471 -36.3082 -29.486 -54.9021 2.03217e-16 0.0 3.88251e-19 53.1421 -71.7559 80.2609 0.644288 54.5666 -1.79974 12.7423 -18.6748 29.7196
--21.9066 72.7943 128.387 180.289 -18.9326 571.622 -13.6283 -1.04755 11.6738 -3.63645 -8.00537 2.51587 1.82148 5.95173 11.249 -12.2541 -35.6188 18.4036 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.52841e-13 5.33152e-13 -4.20033e-13 141.694 -40.2847 128.548 -4.19981 -1.30079 7.29105 -135.277 76.5404 144.038 -1.35731e-09 9.15859e-09 -1.78996e-09 -2.44928e-09 1.66173e-08 -2.94495e-09 -1.35731e-09 9.1586e-09 -1.78997e-09 7.73091 5.47488 0.417314 -1.35731e-09 9.15859e-09 -1.78996e-09 2.90554 0.965183 0.102902 -1.35731e-09 9.15859e-09 -1.78996e-09 10.2786 0.731801 0.0259123 -1.35733e-09 9.15861e-09 -1.78995e-09 2.22167 -0.733487 -0.20892 -1.53064e-13 5.33177e-13 -4.20362e-13 -47.3111 -32.3583 -26.4142 9.15318 -3.64228 -16.2228 1.24447 29.9661 -4.64776 -1.25099e-09 4.21227e-10 -1.50191e-10 -2.16441e-09 7.31996e-10 -2.23701e-10 -1.251e-09 4.21228e-10 -1.50183e-10 -7.73091 5.47488 -0.417314 -1.25099e-09 4.21228e-10 -1.5019e-10 -2.90554 0.965183 -0.102902 -1.25101e-09 4.21229e-10 -1.50185e-10 -10.2786 0.731801 -0.0259123 -1.25099e-09 4.21228e-10 -1.5019e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.453 -3.24775 3.3372 0.147245 4.8594 1.30761 -36.4247 -29.6813 -54.8565 2.03217e-16 0.0 3.88251e-19 52.6816 -71.884 79.829 0.643663 54.5383 -1.79977 12.8233 -18.7159 29.8401
--22.0097 72.8011 128.398 180.139 -18.9639 571.701 -13.7141 -0.973798 11.5658 -3.4245 -7.79892 2.51225 1.87377 5.776 11.2367 -12.4157 -35.7299 18.291 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.17772e-13 8.58739e-13 -5.6922e-13 141.649 -40.4709 126.961 -4.12129 -1.27071 7.15309 -135.038 76.6169 143.793 -2.02152e-09 7.28897e-09 -2.77371e-09 -3.65584e-09 1.40367e-08 -4.56791e-09 -2.02151e-09 7.28897e-09 -2.77371e-09 7.73091 5.47488 0.417314 -2.02152e-09 7.28896e-09 -2.77371e-09 2.90554 0.965183 0.102902 -2.02152e-09 7.28896e-09 -2.77371e-09 10.2786 0.731801 0.0259123 -2.02154e-09 7.28899e-09 -2.7737e-09 2.22167 -0.733487 -0.20892 -2.18028e-13 8.58758e-13 -5.69568e-13 -48.9255 -31.466 -26.5927 9.1672 -3.65035 -16.2487 1.23626 29.8778 -4.63122 -7.73499e-11 -8.94515e-11 2.04825e-10 -1.2994e-10 -1.55135e-10 3.60451e-10 -7.73547e-11 -8.94487e-11 2.04831e-10 -7.73091 5.47488 -0.417314 -7.735e-11 -8.94497e-11 2.04825e-10 -2.90554 0.965183 -0.102902 -7.73688e-11 -8.94487e-11 2.04831e-10 -10.2786 0.731801 -0.0259123 -7.73501e-11 -8.94503e-11 2.04828e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.3786 -3.25708 3.27708 0.14746 4.84979 1.30939 -36.4893 -29.7742 -54.8432 2.03217e-16 0.0 3.88251e-19 52.4015 -72.0086 79.5543 0.643546 54.5272 -1.80023 12.8767 -18.7454 29.9173
--22.0415 72.8079 128.417 180.216 -19.1679 571.814 -13.618 -0.920925 11.6858 -3.46446 -7.72108 2.54985 1.88236 5.71113 11.1285 -12.5456 -35.8677 17.9992 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.63441e-13 7.25902e-13 -5.73444e-13 141.86 -40.9489 125.486 -4.11482 -1.26805 7.14189 -134.809 76.6887 143.558 -8.11198e-10 -3.13854e-09 -1.8088e-09 -1.53387e-09 -4.08287e-09 -3.03959e-09 -8.11192e-10 -3.13854e-09 -1.8088e-09 7.73091 5.47488 0.417314 -8.11199e-10 -3.13854e-09 -1.8088e-09 2.90554 0.965183 0.102902 -8.11192e-10 -3.13854e-09 -1.8088e-09 10.2786 0.731801 0.0259123 -8.11209e-10 -3.13852e-09 -1.80879e-09 2.22167 -0.733487 -0.20892 -1.63676e-13 7.2592e-13 -5.7376e-13 -50.5795 -30.4072 -26.9695 9.10905 -3.61751 -16.1405 1.24638 29.9868 -4.65164 1.09303e-09 -3.83037e-10 -7.49281e-10 1.86548e-09 -6.59444e-10 -1.31532e-09 1.09302e-09 -3.83034e-10 -7.49274e-10 -7.73091 5.47488 -0.417314 1.09303e-09 -3.83035e-10 -7.49281e-10 -2.90554 0.965183 -0.102902 1.09301e-09 -3.83033e-10 -7.49275e-10 -10.2786 0.731801 -0.0259123 1.09303e-09 -3.83035e-10 -7.49278e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.3869 -3.31221 3.22594 0.147462 4.85139 1.30941 -36.4704 -29.7073 -54.8764 2.03217e-16 0.0 3.88251e-19 52.3814 -72.1349 79.4881 0.644115 54.5401 -1.80135 12.8919 -18.762 29.9324
--22.0898 72.8168 128.454 180.218 -19.2813 572.008 -13.4073 -0.885125 11.9542 -3.66694 -7.71407 2.61498 1.87889 5.71927 10.958 -12.6797 -36.0325 17.5788 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.37341e-14 3.11884e-13 -4.92092e-13 142.194 -41.6138 124.028 -4.16195 -1.28599 7.22471 -134.458 76.7968 143.197 1.58773e-09 -1.9421e-08 3.72585e-10 2.69693e-09 -3.27646e-08 4.54049e-10 1.58773e-09 -1.9421e-08 3.72585e-10 7.73091 5.47488 0.417314 1.58773e-09 -1.9421e-08 3.72586e-10 2.90554 0.965183 0.102902 1.58774e-09 -1.9421e-08 3.72589e-10 10.2786 0.731801 0.0259123 1.58772e-09 -1.94209e-08 3.72593e-10 2.22167 -0.733487 -0.20892 -3.3914e-14 3.11901e-13 -4.92343e-13 -52.2354 -29.233 -27.4624 9.00723 -3.56001 -15.9517 1.26782 30.2147 -4.69452 2.38298e-09 -5.84279e-10 -2.53023e-09 4.04615e-09 -9.996e-10 -4.42148e-09 2.38297e-09 -5.84276e-10 -2.53022e-09 -7.73091 5.47488 -0.417314 2.38298e-09 -5.84277e-10 -2.53023e-09 -2.90554 0.965183 -0.102902 2.38296e-09 -5.84275e-10 -2.53022e-09 -10.2786 0.731801 -0.0259123 2.38297e-09 -5.84277e-10 -2.53023e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.4493 -3.39848 3.18736 0.14733 4.86035 1.30834 -36.3993 -29.5395 -54.9404 2.03217e-16 0.0 3.88251e-19 52.5552 -72.2566 79.5871 0.64521 54.5698 -1.80306 12.8811 -18.7692 29.906
--22.1597 72.8183 128.46 180.243 -19.2771 572.047 -13.2009 -0.859229 12.2417 -3.90455 -7.74471 2.68018 1.89048 5.73852 10.7638 -12.7991 -36.1706 17.1147 -0.0 0.0 0.0 -0.0 0.0 0.0 1.04123e-13 -1.53124e-13 -3.66609e-13 142.511 -42.3274 122.473 -4.22564 -1.31033 7.33673 -133.942 76.9518 142.667 3.9403e-09 -3.42109e-08 2.59911e-09 6.85445e-09 -5.89841e-08 4.03187e-09 3.9403e-09 -3.42109e-08 2.59911e-09 7.73091 5.47488 0.417314 3.9403e-09 -3.42109e-08 2.59911e-09 2.90554 0.965183 0.102902 3.94031e-09 -3.42109e-08 2.59911e-09 10.2786 0.731801 0.0259123 3.9403e-09 -3.42109e-08 2.59911e-09 2.22167 -0.733487 -0.20892 1.04004e-13 -1.53105e-13 -3.66795e-13 -53.7995 -28.0333 -27.9072 8.90109 -3.50013 -15.7558 1.29027 30.4488 -4.73887 3.3444e-09 -6.88447e-10 -4.20932e-09 5.66261e-09 -1.17189e-09 -7.34401e-09 3.34439e-09 -6.88444e-10 -4.20931e-09 -7.73091 5.47488 -0.417314 3.3444e-09 -6.88444e-10 -4.20932e-09 -2.90554 0.965183 -0.102902 3.34439e-09 -6.88443e-10 -4.20932e-09 -10.2786 0.731801 -0.0259123 3.34439e-09 -6.88444e-10 -4.20932e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.5089 -3.49932 3.16227 0.14718 4.87077 1.30712 -36.3237 -29.3549 -55.0145 2.03217e-16 0.0 3.88251e-19 52.8067 -72.3688 79.7819 0.646554 54.6064 -1.80489 12.8587 -18.7679 29.8649
--22.2391 72.8164 128.446 180.274 -19.264 572.006 -13.1176 -0.836062 12.4189 -4.05002 -7.77986 2.71795 1.94348 5.70689 10.5844 -12.8821 -36.2287 16.6936 -0.0 0.0 0.0 -0.0 0.0 0.0 1.82904e-13 -4.38926e-13 -2.38442e-13 142.68 -42.9417 120.725 -4.26901 -1.3269 7.41311 -133.211 77.164 141.917 5.01156e-09 -4.01609e-08 3.69944e-09 8.75652e-09 -6.97172e-08 5.81273e-09 5.01156e-09 -4.01609e-08 3.69944e-09 7.73091 5.47488 0.417314 5.01156e-09 -4.01609e-08 3.69944e-09 2.90554 0.965183 0.102902 5.01157e-09 -4.01609e-08 3.69944e-09 10.2786 0.731801 0.0259123 5.01156e-09 -4.01609e-08 3.69944e-09 2.22167 -0.733487 -0.20892 1.82822e-13 -4.38908e-13 -2.38591e-13 -55.1947 -26.8944 -28.1453 8.83054 -3.46036 -15.626 1.30273 30.5767 -4.76325 3.52919e-09 -6.90809e-10 -4.85785e-09 5.96539e-09 -1.1726e-09 -8.46886e-09 3.52918e-09 -6.90805e-10 -4.85784e-09 -7.73091 5.47488 -0.417314 3.52919e-09 -6.90806e-10 -4.85785e-09 -2.90554 0.965183 -0.102902 3.52918e-09 -6.90805e-10 -4.85785e-09 -10.2786 0.731801 -0.0259123 3.52918e-09 -6.90806e-10 -4.85786e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.5085 -3.59815 3.15165 0.147128 4.87671 1.30671 -36.2914 -29.2374 -55.0774 2.03217e-16 0.0 3.88251e-19 53.0168 -72.4665 80.0007 0.647868 54.6399 -1.80636 12.8392 -18.7589 29.8357
--22.3351 72.8137 128.459 180.111 -19.1102 572.07 -13.2183 -0.833813 12.4455 -4.07849 -7.83609 2.71667 2.08371 5.6485 10.4318 -12.931 -36.1871 16.3368 -0.0 0.0 0.0 -0.0 0.0 0.0 1.75307e-13 -4.84125e-13 -8.89313e-14 142.673 -43.4086 118.743 -4.28938 -1.33467 7.44905 -132.165 77.4521 140.845 4.18328e-09 -3.27582e-08 3.15707e-09 7.31748e-09 -5.70517e-08 4.97682e-09 4.18329e-09 -3.27582e-08 3.15707e-09 7.73091 5.47488 0.417314 4.18329e-09 -3.27582e-08 3.15707e-09 2.90554 0.965183 0.102902 4.1833e-09 -3.27582e-08 3.15707e-09 10.2786 0.731801 0.0259123 4.18329e-09 -3.27582e-08 3.15707e-09 2.22167 -0.733487 -0.20892 1.75233e-13 -4.84107e-13 -8.90866e-14 -56.3504 -25.8089 -28.0732 8.81584 -3.45204 -15.5991 1.30206 30.569 -4.76182 2.39364e-09 -5.15704e-10 -4.0334e-09 4.02808e-09 -8.7297e-10 -7.01914e-09 2.39364e-09 -5.15701e-10 -4.03339e-09 -7.73091 5.47488 -0.417314 2.39364e-09 -5.15702e-10 -4.0334e-09 -2.90554 0.965183 -0.102902 2.39364e-09 -5.15701e-10 -4.0334e-09 -10.2786 0.731801 -0.0259123 2.39364e-09 -5.15702e-10 -4.03341e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.4115 -3.7035 3.16045 0.147197 4.87582 1.3073 -36.3161 -29.2071 -55.1249 2.03217e-16 0.0 3.88251e-19 53.15 -72.5511 80.2469 0.648826 54.6612 -1.80691 12.8221 -18.7409 29.8187
--22.3495 72.8184 128.5 180.198 -19.1816 572.289 -13.4299 -0.849578 12.3925 -4.05485 -7.92263 2.69244 2.28401 5.58285 10.2849 -12.9519 -36.0757 16.0005 -0.0 0.0 0.0 -0.0 0.0 0.0 1.20311e-13 -4.11493e-13 9.41246e-14 142.557 -43.7832 116.588 -4.30406 -1.34027 7.47497 -130.808 77.8006 139.456 2.21042e-09 -1.67725e-08 1.66476e-09 3.86904e-09 -2.94136e-08 2.63347e-09 2.21042e-09 -1.67725e-08 1.66477e-09 7.73091 5.47488 0.417314 2.21042e-09 -1.67725e-08 1.66477e-09 2.90554 0.965183 0.102902 2.21043e-09 -1.67725e-08 1.66476e-09 10.2786 0.731801 0.0259123 2.21043e-09 -1.67725e-08 1.66477e-09 2.22167 -0.733487 -0.20892 1.20229e-13 -4.11476e-13 9.39382e-14 -57.3455 -24.7339 -27.8056 8.8327 -3.46145 -15.6302 1.29404 30.4855 -4.74597 3.1816e-10 -1.90457e-10 -2.2962e-09 4.92587e-10 -3.17575e-10 -3.97117e-09 3.18157e-10 -1.90452e-10 -2.29619e-09 -7.73091 5.47488 -0.417314 3.18161e-10 -1.90454e-10 -2.2962e-09 -2.90554 0.965183 -0.102902 3.18152e-10 -1.90453e-10 -2.2962e-09 -10.2786 0.731801 -0.0259123 3.18157e-10 -1.90455e-10 -2.29621e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.2558 -3.81988 3.18662 0.147328 4.87152 1.30841 -36.3722 -29.2199 -55.1677 2.03217e-16 0.0 3.88251e-19 53.2715 -72.6238 80.552 0.649659 54.6778 -1.80695 12.8013 -18.7138 29.802
--22.3924 72.8159 128.532 180.094 -19.1733 572.461 -13.6692 -0.844556 12.2971 -3.98661 -7.99529 2.6593 2.46018 5.44081 10.1328 -12.9277 -35.9174 15.6742 -0.0 0.0 0.0 -0.0 0.0 0.0 5.01129e-14 -2.67101e-13 2.59588e-13 142.359 -44.0727 114.35 -4.30624 -1.34112 7.47883 -129.253 78.1685 137.865 -8.22459e-11 1.21963e-09 -1.3492e-10 -1.44788e-10 1.71447e-09 -2.04752e-10 -8.22489e-11 1.21964e-09 -1.34917e-10 7.73091 5.47488 0.417314 -8.22444e-11 1.21965e-09 -1.34913e-10 2.90554 0.965183 0.102902 -8.22387e-11 1.21964e-09 -1.34918e-10 10.2786 0.731801 0.0259123 -8.22474e-11 1.21964e-09 -1.34912e-10 2.22167 -0.733487 -0.20892 5.00114e-14 -2.67084e-13 2.59364e-13 -58.328 -23.7027 -27.5072 8.85447 -3.47368 -15.6703 1.2808 30.3477 -4.71983 -1.75924e-09 1.35191e-10 -2.21531e-10 -3.0381e-09 2.37315e-10 -3.40717e-10 -1.75924e-09 1.35196e-10 -2.21521e-10 -7.73091 5.47488 -0.417314 -1.75924e-09 1.35193e-10 -2.21534e-10 -2.90554 0.965183 -0.102902 -1.75925e-09 1.35194e-10 -2.21534e-10 -10.2786 0.731801 -0.0259123 -1.75924e-09 1.35191e-10 -2.2154e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.0956 -3.92471 3.22054 0.147512 4.86656 1.30996 -36.4488 -29.2631 -55.2066 2.03217e-16 0.0 3.88251e-19 53.4123 -72.6802 80.8843 0.650921 54.7046 -1.80741 12.7822 -18.681 29.794
--22.4647 72.8076 128.534 179.955 -19.0492 572.516 -13.8531 -0.779887 12.1968 -3.88112 -8.00989 2.6313 2.52711 5.1531 9.96498 -12.8419 -35.7348 15.3469 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.09232e-15 -9.70162e-14 3.56322e-13 142.105 -44.296 112.112 -4.28912 -1.33463 7.44859 -127.643 78.5176 136.222 -1.86994e-09 1.46418e-08 -1.59942e-09 -3.28001e-09 2.485e-08 -2.5253e-09 -1.86995e-09 1.46418e-08 -1.59941e-09 7.73091 5.47488 0.417314 -1.86994e-09 1.46418e-08 -1.59941e-09 2.90554 0.965183 0.102902 -1.86994e-09 1.46418e-08 -1.59941e-09 10.2786 0.731801 0.0259123 -1.86995e-09 1.46418e-08 -1.59941e-09 2.22167 -0.733487 -0.20892 -3.2194e-15 -9.69984e-14 3.56073e-13 -59.432 -22.7548 -27.3357 8.85456 -3.47381 -15.6703 1.26444 30.1771 -4.68753 -2.90053e-09 3.11494e-10 1.61531e-09 -4.96099e-09 5.3543e-10 2.85646e-09 -2.90053e-09 3.115e-10 1.61532e-09 -7.73091 5.47488 -0.417314 -2.90053e-09 3.11496e-10 1.61531e-09 -2.90554 0.965183 -0.102902 -2.90054e-09 3.11497e-10 1.61531e-09 -10.2786 0.731801 -0.0259123 -2.90053e-09 3.11494e-10 1.6153e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.9854 -3.99541 3.25258 0.14774 4.86369 1.31192 -36.5349 -29.3238 -55.2425 2.03217e-16 0.0 3.88251e-19 53.6022 -72.716 81.2108 0.653172 54.7564 -1.80923 12.7705 -18.6457 29.8032
--22.4956 72.7933 128.493 180.084 -19.1018 572.439 -13.9385 -0.622983 12.092 -3.70974 -7.92111 2.61396 2.41028 4.62564 9.77843 -12.6678 -35.5085 15.0291 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.37507e-14 1.49972e-13 3.5001e-13 141.787 -44.4099 109.91 -4.24337 -1.31735 7.3679 -126.143 78.8165 134.693 -3.07823e-09 2.23279e-08 -2.68888e-09 -5.4084e-09 3.78909e-08 -4.27087e-09 -3.07824e-09 2.23279e-08 -2.68887e-09 7.73091 5.47488 0.417314 -3.07823e-09 2.23279e-08 -2.68887e-09 2.90554 0.965183 0.102902 -3.07823e-09 2.23279e-08 -2.68887e-09 10.2786 0.731801 0.0259123 -3.07824e-09 2.23279e-08 -2.68886e-09 2.22167 -0.733487 -0.20892 -3.39173e-14 1.49993e-13 3.49755e-13 -60.7796 -21.9923 -27.3817 8.81481 -3.45175 -15.5968 1.24576 29.9793 -4.65028 -2.55139e-09 2.62761e-10 3.35623e-09 -4.31702e-09 4.45837e-10 5.85163e-09 -2.55139e-09 2.62767e-10 3.35624e-09 -7.73091 5.47488 -0.417314 -2.55139e-09 2.62763e-10 3.35623e-09 -2.90554 0.965183 -0.102902 -2.5514e-09 2.62763e-10 3.35623e-09 -10.2786 0.731801 -0.0259123 -2.55139e-09 2.6276e-10 3.35622e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.9589 -4.01467 3.2802 0.148038 4.86389 1.3145 -36.6349 -29.4103 -55.2738 2.03217e-16 0.0 3.88251e-19 53.8691 -72.7251 81.5207 0.65686 54.8444 -1.81302 12.7713 -18.605 29.8428
--22.5376 72.7753 128.442 180.048 -19.0795 572.397 -13.9762 -0.401818 11.9659 -3.47865 -7.76371 2.59921 2.16913 3.92003 9.58023 -12.4204 -35.2348 14.7233 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.80228e-14 4.77268e-13 2.7482e-13 141.413 -44.4191 107.718 -4.17505 -1.29157 7.24755 -124.642 79.093 133.162 -4.09849e-09 2.75896e-08 -3.70217e-09 -7.21446e-09 4.66412e-08 -5.91059e-09 -4.09849e-09 2.75896e-08 -3.70217e-09 7.73091 5.47488 0.417314 -4.09849e-09 2.75895e-08 -3.70216e-09 2.90554 0.965183 0.102902 -4.09849e-09 2.75896e-08 -3.70217e-09 10.2786 0.731801 0.0259123 -4.0985e-09 2.75896e-08 -3.70216e-09 2.22167 -0.733487 -0.20892 -5.82423e-14 4.77294e-13 2.74565e-13 -62.2619 -21.3659 -27.5368 8.75301 -3.41744 -15.4827 1.22382 29.7429 -4.60601 -1.31349e-09 8.07753e-11 5.2096e-09 -2.13831e-09 1.26078e-10 9.01917e-09 -1.31349e-09 8.07822e-11 5.20961e-09 -7.73091 5.47488 -0.417314 -1.31349e-09 8.07771e-11 5.2096e-09 -2.90554 0.965183 -0.102902 -1.3135e-09 8.07763e-11 5.2096e-09 -10.2786 0.731801 -0.0259123 -1.31349e-09 8.07733e-11 5.2096e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.9807 -3.99829 3.30851 0.148402 4.86562 1.31766 -36.7524 -29.5256 -55.3012 2.03217e-16 0.0 3.88251e-19 54.1884 -72.7113 81.8299 0.661612 54.9583 -1.81819 12.7803 -18.5585 29.9046
--22.5493 72.7475 128.44 180.091 -18.9423 572.477 -14.023 -0.16842 11.8307 -3.24735 -7.61356 2.58077 1.92043 3.20069 9.37402 -12.1463 -34.9601 14.4055 -0.0 0.0 0.0 -0.0 0.0 0.0 -7.62835e-14 7.67093e-13 1.82335e-13 141.027 -44.4187 105.496 -4.10041 -1.26328 7.11625 -122.854 79.3961 131.343 -4.80468e-09 3.05666e-08 -4.5048e-09 -8.47336e-09 5.14776e-08 -7.22154e-09 -4.80467e-09 3.05666e-08 -4.5048e-09 7.73091 5.47488 0.417314 -4.80467e-09 3.05666e-08 -4.50479e-09 2.90554 0.965183 0.102902 -4.80467e-09 3.05666e-08 -4.5048e-09 10.2786 0.731801 0.0259123 -4.80469e-09 3.05666e-08 -4.50478e-09 2.22167 -0.733487 -0.20892 -7.65533e-14 7.67125e-13 1.82084e-13 -63.6625 -20.6916 -27.6605 8.69652 -3.38611 -15.3786 1.19817 29.4637 -4.55399 1.71924e-11 -1.32993e-10 6.69987e-09 1.91343e-10 -2.47403e-10 1.15579e-08 1.71854e-11 -1.32986e-10 6.69989e-09 -7.73091 5.47488 -0.417314 1.71906e-11 -1.32992e-10 6.69987e-09 -2.90554 0.965183 -0.102902 1.71794e-11 -1.32993e-10 6.69988e-09 -10.2786 0.731801 -0.0259123 1.71899e-11 -1.32996e-10 6.69988e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.0011 -3.9734 3.33938 0.148776 4.86781 1.32093 -36.8749 -29.6491 -55.3276 2.03217e-16 0.0 3.88251e-19 54.5109 -72.6857 82.1462 0.666756 55.0808 -1.82385 12.7891 -18.5128 29.9652
--22.5702 72.7265 128.481 180.005 -18.9312 572.596 -14.1368 0.0250487 11.6982 -3.07536 -7.54656 2.55232 1.78339 2.63243 9.16195 -11.8929 -34.7302 14.0517 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.8908e-14 9.01668e-13 1.24141e-13 140.653 -44.4952 103.184 -4.0358 -1.23851 7.00266 -120.425 79.7673 128.873 -5.07074e-09 3.13989e-08 -4.96227e-09 -8.96023e-09 5.27769e-08 -7.98084e-09 -5.07073e-09 3.13989e-08 -4.96227e-09 7.73091 5.47488 0.417314 -5.07073e-09 3.13989e-08 -4.96226e-09 2.90554 0.965183 0.102902 -5.07073e-09 3.13989e-08 -4.96226e-09 10.2786 0.731801 0.0259123 -5.07074e-09 3.13989e-08 -4.96225e-09 2.22167 -0.733487 -0.20892 -8.92091e-14 9.01705e-13 1.23893e-13 -64.7706 -19.7837 -27.6194 8.67295 -3.37304 -15.3353 1.16843 29.1379 -4.49349 6.44675e-10 -2.77074e-10 7.35148e-09 1.28813e-09 -4.98164e-10 1.26667e-08 6.44667e-10 -2.77067e-10 7.3515e-09 -7.73091 5.47488 -0.417314 6.44673e-10 -2.77073e-10 7.35149e-09 -2.90554 0.965183 -0.102902 6.44662e-10 -2.77075e-10 7.35149e-09 -10.2786 0.731801 -0.0259123 6.44672e-10 -2.77077e-10 7.35149e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.9706 -3.96709 3.37467 0.149108 4.86943 1.32382 -36.9898 -29.7602 -55.356 2.03217e-16 0.0 3.88251e-19 54.7887 -72.6592 82.4782 0.671594 55.1949 -1.82909 12.7895 -18.4744 30.0013
--22.586 72.7014 128.416 179.99 -18.7315 572.544 -14.374 0.165531 11.562 -2.96922 -7.59301 2.50859 1.82483 2.27871 8.94722 -11.6969 -34.5488 13.6499 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.04604e-13 8.28935e-13 1.17631e-13 140.253 -44.642 100.705 -3.98386 -1.21786 6.91127 -116.841 80.2388 125.234 -4.73874e-09 2.91249e-08 -4.94349e-09 -8.3976e-09 4.89484e-08 -7.97791e-09 -4.73873e-09 2.91249e-08 -4.94349e-09 7.73091 5.47488 0.417314 -4.73873e-09 2.91249e-08 -4.94348e-09 2.90554 0.965183 0.102902 -4.73873e-09 2.91249e-08 -4.94349e-09 10.2786 0.731801 0.0259123 -4.73874e-09 2.91249e-08 -4.94348e-09 2.22167 -0.733487 -0.20892 -1.04913e-13 8.28977e-13 1.17381e-13 -65.512 -18.5364 -27.3623 8.69442 -3.38489 -15.3748 1.13152 28.7281 -4.41787 2.26414e-10 -3.18142e-10 6.85704e-09 5.53558e-10 -5.67217e-10 1.18234e-08 2.26406e-10 -3.18136e-10 6.85706e-09 -7.73091 5.47488 -0.417314 2.26412e-10 -3.18142e-10 6.85705e-09 -2.90554 0.965183 -0.102902 2.26402e-10 -3.18143e-10 6.85705e-09 -10.2786 0.731801 -0.0259123 2.26413e-10 -3.18145e-10 6.85705e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.8461 -3.97895 3.40657 0.14939 4.86811 1.32626 -37.1047 -29.8652 -55.3876 2.03217e-16 0.0 3.88251e-19 54.9145 -72.6254 82.7722 0.675583 55.285 -1.83273 12.7671 -18.4374 29.9897
--22.5898 72.6807 128.367 179.989 -18.6789 572.545 -14.6904 0.280511 11.4188 -2.90053 -7.70908 2.45413 1.97151 2.04547 8.72687 -11.5253 -34.3937 13.2146 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.20304e-13 6.18593e-13 1.3408e-13 139.808 -44.7965 98.0846 -3.93648 -1.19847 6.82785 -112.131 80.7423 120.458 -3.91734e-09 2.40031e-08 -4.55194e-09 -6.97788e-09 4.03549e-08 -7.38199e-09 -3.91734e-09 2.40031e-08 -4.55195e-09 7.73091 5.47488 0.417314 -3.91734e-09 2.40031e-08 -4.55194e-09 2.90554 0.965183 0.102902 -3.91734e-09 2.40031e-08 -4.55194e-09 10.2786 0.731801 0.0259123 -3.91735e-09 2.40031e-08 -4.55193e-09 2.22167 -0.733487 -0.20892 -1.20604e-13 6.18641e-13 1.33829e-13 -66.0228 -17.0606 -26.9826 8.74462 -3.41264 -15.4674 1.08957 28.2485 -4.33025 -7.6964e-10 -3.12403e-10 5.53038e-09 -1.19786e-09 -5.52645e-10 9.55822e-09 -7.69647e-10 -3.12399e-10 5.5304e-09 -7.73091 5.47488 -0.417314 -7.69641e-10 -3.12404e-10 5.53038e-09 -2.90554 0.965183 -0.102902 -7.69651e-10 -3.12404e-10 5.53039e-09 -10.2786 0.731801 -0.0259123 -7.69638e-10 -3.12406e-10 5.53038e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.6638 -3.99705 3.43686 0.149648 4.86512 1.32848 -37.2228 -29.971 -55.4208 2.03217e-16 0.0 3.88251e-19 54.945 -72.5818 83.0415 0.679198 55.3639 -1.83554 12.7306 -18.401 29.9485
--22.6568 72.6705 128.37 179.684 -18.5789 572.742 -14.993 0.378522 11.2853 -2.87641 -7.85949 2.39727 2.13357 1.86139 8.49326 -11.3221 -34.2725 12.7597 -0.0 0.0 0.0 -0.0 0.0 0.0 -1.18714e-13 3.35496e-13 1.55897e-13 139.361 -44.9633 95.3904 -3.89394 -1.18112 6.75296 -106.865 81.1779 115.126 -2.88041e-09 1.80028e-08 -4.00496e-09 -5.18112e-09 3.03033e-08 -6.53996e-09 -2.88041e-09 1.80028e-08 -4.00497e-09 7.73091 5.47488 0.417314 -2.88041e-09 1.80028e-08 -4.00496e-09 2.90554 0.965183 0.102902 -2.8804e-09 1.80028e-08 -4.00496e-09 10.2786 0.731801 0.0259123 -2.88041e-09 1.80028e-08 -4.00495e-09 2.22167 -0.733487 -0.20892 -1.18996e-13 3.35549e-13 1.55645e-13 -66.4077 -15.4969 -26.563 8.80856 -3.44811 -15.5854 1.04932 27.7721 -4.24422 -1.92372e-09 -2.92686e-10 3.82774e-09 -3.23037e-09 -5.13605e-10 6.64818e-09 -1.92373e-09 -2.92684e-10 3.82776e-09 -7.73091 5.47488 -0.417314 -1.92373e-09 -2.92687e-10 3.82775e-09 -2.90554 0.965183 -0.102902 -1.92373e-09 -2.92687e-10 3.82775e-09 -10.2786 0.731801 -0.0259123 -1.92372e-09 -2.92687e-10 3.82774e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.494 -4.03131 3.48178 0.14988 4.86479 1.33048 -37.3245 -30.0584 -55.4537 2.03217e-16 0.0 3.88251e-19 55.0776 -72.5441 83.3962 0.68328 55.4571 -1.83957 12.7059 -18.3786 29.9163
--22.6752 72.6581 128.374 179.636 -18.5177 572.933 -15.1888 0.468094 11.1778 -2.90377 -8.00896 2.3464 2.22 1.65495 8.23896 -11.0315 -34.1932 12.2987 -0.0 0.0 0.0 -0.0 0.0 0.0 -8.25426e-14 4.44996e-14 1.65488e-13 138.95 -45.1607 92.683 -3.85651 -1.16659 6.68719 -101.931 81.4866 110.135 -1.90177e-09 1.30937e-08 -3.51987e-09 -3.48734e-09 2.21007e-08 -5.79866e-09 -1.90177e-09 1.30937e-08 -3.51988e-09 7.73091 5.47488 0.417314 -1.90177e-09 1.30937e-08 -3.51987e-09 2.90554 0.965183 0.102902 -1.90176e-09 1.30937e-08 -3.51987e-09 10.2786 0.731801 0.0259123 -1.90177e-09 1.30937e-08 -3.51986e-09 2.22167 -0.733487 -0.20892 -8.28023e-14 4.45542e-14 1.6524e-13 -66.7595 -13.9902 -26.1754 8.87136 -3.48313 -15.7013 1.01656 27.3724 -4.17273 -2.81608e-09 -2.91816e-10 2.20539e-09 -4.80822e-09 -5.09255e-10 3.87043e-09 -2.81608e-09 -2.91815e-10 2.20541e-09 -7.73091 5.47488 -0.417314 -2.81608e-09 -2.91818e-10 2.20539e-09 -2.90554 0.965183 -0.102902 -2.81608e-09 -2.91817e-10 2.2054e-09 -10.2786 0.731801 -0.0259123 -2.81607e-09 -2.91816e-10 2.20539e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.4068 -4.09161 3.55756 0.150082 4.87147 1.33227 -37.3903 -30.108 -55.4841 2.03217e-16 0.0 3.88251e-19 55.5101 -72.5273 83.9468 0.68871 55.59 -1.84693 12.7187 -18.3842 29.9317
--22.6224 72.614 128.339 179.919 -18.3839 572.946 -15.2508 0.532678 11.1054 -3.01792 -8.16268 2.30142 2.21026 1.39053 7.95655 -10.613 -34.1317 11.8324 -0.0 0.0 0.0 -0.0 0.0 0.0 3.08566e-14 -3.29985e-13 1.67675e-13 138.571 -45.4057 89.8859 -3.83049 -1.15765 6.64163 -97.7193 81.6864 105.878 -8.62189e-10 9.76186e-09 -3.29487e-09 -1.70875e-09 1.65983e-08 -5.50461e-09 -8.62189e-10 9.76187e-09 -3.29488e-09 7.73091 5.47488 0.417314 -8.62191e-10 9.76187e-09 -3.29487e-09 2.90554 0.965183 0.102902 -8.62182e-10 9.76187e-09 -3.29487e-09 10.2786 0.731801 0.0259123 -8.62193e-10 9.76187e-09 -3.29486e-09 2.22167 -0.733487 -0.20892 3.06251e-14 -3.29932e-13 1.67435e-13 -67.0812 -12.6179 -25.8123 8.92667 -3.51405 -15.8036 0.998831 27.1455 -4.13264 -3.54263e-09 -2.89998e-10 4.84184e-10 -6.10032e-09 -5.06666e-10 9.17794e-10 -3.54263e-09 -2.89999e-10 4.84197e-10 -7.73091 5.47488 -0.417314 -3.54263e-09 -2.9e-10 4.84183e-10 -2.90554 0.965183 -0.102902 -3.54263e-09 -2.89999e-10 4.84187e-10 -10.2786 0.731801 -0.0259123 -3.54262e-09 -2.89998e-10 4.84177e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.4209 -4.20069 3.68915 0.15027 4.88574 1.334 -37.4319 -30.126 -55.5191 2.03217e-16 0.0 3.88251e-19 56.3682 -72.5405 84.7935 0.695695 55.7669 -1.85827 12.7858 -18.413 30.032
--22.5878 72.5726 128.37 180.062 -18.3592 573.086 -15.2294 0.573934 11.0578 -3.20404 -8.33459 2.25864 2.15088 1.11168 7.65184 -10.1059 -34.0924 11.3537 -0.0 0.0 0.0 -0.0 0.0 0.0 1.99583e-13 -7.91585e-13 1.68669e-13 138.182 -45.6647 86.9488 -3.8137 -1.15303 6.61234 -93.9239 81.822 102.043 3.20301e-10 6.96991e-09 -3.1673e-09 3.05395e-10 1.20425e-08 -5.38814e-09 3.20304e-10 6.96991e-09 -3.16731e-09 7.73091 5.47488 0.417314 3.203e-10 6.96991e-09 -3.16731e-09 2.90554 0.965183 0.102902 3.20306e-10 6.96991e-09 -3.1673e-09 10.2786 0.731801 0.0259123 3.20294e-10 6.96991e-09 -3.1673e-09 2.22167 -0.733487 -0.20892 1.99387e-13 -7.91537e-13 1.68442e-13 -67.3303 -11.289 -25.4407 8.98321 -3.54571 -15.9083 0.990046 27.0269 -4.11192 -4.25796e-09 -2.79242e-10 -1.47895e-09 -7.37736e-09 -4.90523e-10 -2.45272e-09 -4.25796e-09 -2.79242e-10 -1.47894e-09 -7.73091 5.47488 -0.417314 -4.25796e-09 -2.79243e-10 -1.47895e-09 -2.90554 0.965183 -0.102902 -4.25797e-09 -2.79243e-10 -1.47895e-09 -10.2786 0.731801 -0.0259123 -4.25795e-09 -2.79241e-10 -1.47896e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.4995 -4.34649 3.86108 0.150439 4.90547 1.33561 -37.454 -30.1189 -55.557 2.03217e-16 0.0 3.88251e-19 57.5261 -72.5698 85.8579 0.703895 55.9749 -1.87257 12.8903 -18.4602 30.1879
--22.5757 72.5203 128.363 180.129 -18.2497 573.174 -15.1487 0.627737 11.0223 -3.39368 -8.50258 2.22105 2.05135 0.865693 7.33729 -9.577 -34.1265 10.8635 -0.0 0.0 0.0 -0.0 0.0 0.0 3.44106e-13 -1.16751e-12 1.52965e-13 137.764 -45.9052 83.9766 -3.79367 -1.14747 6.57729 -90.5653 81.9092 98.6501 1.31592e-09 4.40199e-09 -2.81323e-09 2.01952e-09 7.83323e-09 -4.87187e-09 1.31592e-09 4.40199e-09 -2.81324e-09 7.73091 5.47488 0.417314 1.31592e-09 4.40199e-09 -2.81323e-09 2.90554 0.965183 0.102902 1.31592e-09 4.40199e-09 -2.81323e-09 10.2786 0.731801 0.0259123 1.31591e-09 4.40199e-09 -2.81322e-09 2.22167 -0.733487 -0.20892 3.43949e-13 -1.16747e-12 1.52752e-13 -67.5234 -9.90036 -25.0892 9.0487 -3.5827 -16.0294 0.975626 26.8485 -4.08024 -4.63029e-09 -3.10081e-10 -3.17364e-09 -8.05629e-09 -5.46402e-10 -5.36773e-09 -4.63029e-09 -3.10081e-10 -3.17363e-09 -7.73091 5.47488 -0.417314 -4.63029e-09 -3.10081e-10 -3.17364e-09 -2.90554 0.965183 -0.102902 -4.6303e-09 -3.10081e-10 -3.17363e-09 -10.2786 0.731801 -0.0259123 -4.63028e-09 -3.10079e-10 -3.17364e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.6291 -4.48682 4.02892 0.150554 4.93096 1.3368 -37.4264 -30.068 -55.5831 2.03217e-16 0.0 3.88251e-19 58.803 -72.5967 86.9811 0.713417 56.2144 -1.88937 13.0079 -18.5396 30.3371
--22.5583 72.473 128.352 180.174 -18.2565 573.333 -15.0323 0.729994 10.9862 -3.51828 -8.64452 2.19165 1.92244 0.700006 7.02523 -9.09498 -34.2854 10.3613 -0.0 0.0 0.0 -0.0 0.0 0.0 3.84894e-13 -1.28496e-12 1.05058e-13 137.306 -46.1176 81.0885 -3.75788 -1.13566 6.51447 -87.6347 81.9609 95.6903 1.79487e-09 1.74225e-09 -1.90869e-09 2.89806e-09 3.37038e-09 -3.37841e-09 1.79488e-09 1.74224e-09 -1.9087e-09 7.73091 5.47488 0.417314 1.79487e-09 1.74224e-09 -1.90869e-09 2.90554 0.965183 0.102902 1.79488e-09 1.74224e-09 -1.90869e-09 10.2786 0.731801 0.0259123 1.79486e-09 1.74224e-09 -1.90868e-09 2.22167 -0.733487 -0.20892 3.84776e-13 -1.28493e-12 1.04859e-13 -67.6764 -8.3497 -24.791 9.13078 -3.62957 -16.1811 0.94196 26.4421 -4.00789 -4.32783e-09 -4.33048e-10 -4.0895e-09 -7.55406e-09 -7.59879e-10 -6.95386e-09 -4.32783e-09 -4.33049e-10 -4.0895e-09 -7.73091 5.47488 -0.417314 -4.32783e-09 -4.33048e-10 -4.08951e-09 -2.90554 0.965183 -0.102902 -4.32784e-09 -4.33049e-10 -4.0895e-09 -10.2786 0.731801 -0.0259123 -4.32782e-09 -4.33046e-10 -4.08951e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 10.7953 -4.57956 4.14814 0.150579 4.96249 1.33728 -37.319 -29.9545 -55.5827 2.03217e-16 0.0 3.88251e-19 60.0132 -72.6062 87.999 0.724373 56.4856 -1.90824 13.1143 -18.6651 30.4177
--22.5642 72.3874 128.122 180.227 -18.4452 573.056 -14.8553 0.929404 10.8913 -3.4982 -8.75418 2.16211 1.71046 0.588116 6.74187 -8.67585 -34.5817 9.90248 -0.0 0.0 0.0 -0.0 0.0 0.0 2.50247e-13 -9.74968e-13 -1.93815e-15 136.673 -46.2962 78.2213 -3.698 -1.11434 6.40929 -85.5595 81.9839 93.5945 1.41298e-09 -1.46404e-09 8.37905e-11 2.3967e-09 -2.18332e-09 3.24041e-11 1.41299e-09 -1.46404e-09 8.37794e-11 7.73091 5.47488 0.417314 1.41298e-09 -1.46404e-09 8.37864e-11 2.90554 0.965183 0.102902 1.41298e-09 -1.46404e-09 8.37909e-11 10.2786 0.731801 0.0259123 1.41297e-09 -1.46404e-09 8.38006e-11 2.22167 -0.733487 -0.20892 2.50174e-13 -9.74936e-13 -2.12335e-15 -67.82 -6.60129 -24.5554 9.23136 -3.68725 -16.3675 0.883826 25.7081 -3.87892 -2.8965e-09 -8.35729e-10 -3.882e-09 -5.07948e-09 -1.45484e-09 -6.62687e-09 -2.8965e-09 -8.35729e-10 -3.882e-09 -7.73091 5.47488 -0.417314 -2.8965e-09 -8.35728e-10 -3.882e-09 -2.90554 0.965183 -0.102902 -2.89651e-09 -8.35729e-10 -3.882e-09 -10.2786 0.731801 -0.0259123 -2.89649e-09 -8.35726e-10 -3.88201e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.0204 -4.59855 4.19598 0.150474 5.00304 1.33671 -37.0971 -29.748 -55.5474 2.03217e-16 0.0 3.88251e-19 61.1118 -72.5861 88.8529 0.737522 56.8024 -1.93005 13.1977 -18.8507 30.3949
--22.4905 72.2933 128.077 180.521 -18.5102 573.125 -14.6147 1.19394 10.7629 -3.39038 -8.84348 2.13389 1.42995 0.517971 6.47288 -8.2891 -34.9891 9.46618 -0.0 0.0 0.0 -0.0 0.0 0.0 -5.86472e-16 -3.70648e-13 -1.5217e-13 135.91 -46.4528 75.3252 -3.62227 -1.08694 6.2764 -84.2597 81.993 92.282 4.31539e-10 -4.92491e-09 2.84108e-09 9.34929e-10 -8.28204e-09 4.79057e-09 4.31541e-10 -4.92491e-09 2.84106e-09 7.73091 5.47488 0.417314 4.31537e-10 -4.92491e-09 2.84107e-09 2.90554 0.965183 0.102902 4.31543e-10 -4.92491e-09 2.84108e-09 10.2786 0.731801 0.0259123 4.3153e-10 -4.92491e-09 2.84109e-09 2.22167 -0.733487 -0.20892 -6.09566e-16 -3.7062e-13 -1.52341e-13 -67.9341 -4.7141 -24.3725 9.34613 -3.75328 -16.5809 0.813426 24.7541 -3.71451 -6.35122e-10 -1.43313e-09 -2.89281e-09 -1.15543e-09 -2.48528e-09 -4.96969e-09 -6.35122e-10 -1.43313e-09 -2.8928e-09 -7.73091 5.47488 -0.417314 -6.35121e-10 -1.43313e-09 -2.89281e-09 -2.90554 0.965183 -0.102902 -6.35129e-10 -1.43313e-09 -2.89281e-09 -10.2786 0.731801 -0.0259123 -6.35113e-10 -1.43313e-09 -2.89282e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.3029 -4.57129 4.19976 0.150271 5.05147 1.33535 -36.7862 -29.4671 -55.4882 2.03217e-16 0.0 3.88251e-19 62.1924 -72.5489 89.6312 0.752828 57.1601 -1.95497 13.2723 -19.0861 30.3079
--22.4332 72.2099 128.046 180.736 -18.6035 573.195 -14.3684 1.43809 10.7132 -3.33092 -8.91747 2.12461 1.19568 0.5589 6.16971 -7.93783 -35.5001 8.93515 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.50719e-13 2.47637e-13 -2.97034e-13 135.266 -46.6449 72.5416 -3.5431 -1.05822 6.13765 -82.9336 81.9984 90.9428 -5.70996e-10 -7.83623e-09 5.39618e-09 -5.77196e-10 -1.34514e-08 9.2082e-09 -5.70997e-10 -7.83623e-09 5.39616e-09 7.73091 5.47488 0.417314 -5.71e-10 -7.83622e-09 5.39617e-09 2.90554 0.965183 0.102902 -5.70991e-10 -7.83622e-09 5.39618e-09 10.2786 0.731801 0.0259123 -5.71003e-10 -7.83622e-09 5.39619e-09 2.22167 -0.733487 -0.20892 -2.50701e-13 2.4766e-13 -2.97192e-13 -67.9555 -2.72912 -24.2489 9.47336 -3.82719 -16.8178 0.742773 23.7229 -3.54031 1.65874e-09 -1.86694e-09 -1.64091e-09 2.8301e-09 -3.23197e-09 -2.85963e-09 1.65874e-09 -1.86694e-09 -1.6409e-09 -7.73091 5.47488 -0.417314 1.65874e-09 -1.86694e-09 -1.6409e-09 -2.90554 0.965183 -0.102902 1.65873e-09 -1.86694e-09 -1.64091e-09 -10.2786 0.731801 -0.0259123 1.65875e-09 -1.86694e-09 -1.64092e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.5922 -4.53617 4.19005 0.150041 5.10196 1.33374 -36.4468 -29.1665 -55.4193 2.03217e-16 0.0 3.88251e-19 63.277 -72.5187 90.3906 0.769116 57.531 -1.98138 13.3515 -19.3489 30.2059
--22.3722 72.1464 127.99 180.959 -18.6549 573.294 -14.1763 1.57597 10.8547 -3.45591 -8.98121 2.15193 1.12425 0.780407 5.78384 -7.63038 -36.105 8.1889 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.83262e-13 5.99526e-13 -3.87928e-13 134.981 -46.9561 70.0036 -3.47299 -1.03298 6.01487 -80.7728 81.9982 88.7607 -1.01617e-09 -9.39384e-09 6.78212e-09 -1.2296e-09 -1.62169e-08 1.15974e-08 -1.01617e-09 -9.39384e-09 6.7821e-09 7.73091 5.47488 0.417314 -1.01618e-09 -9.39384e-09 6.78211e-09 2.90554 0.965183 0.102902 -1.01616e-09 -9.39384e-09 6.78212e-09 10.2786 0.731801 0.0259123 -1.01618e-09 -9.39383e-09 6.78213e-09 2.22167 -0.733487 -0.20892 -3.83228e-13 5.99544e-13 -3.88077e-13 -67.8195 -0.687817 -24.189 9.61131 -3.90846 -17.0746 0.680375 22.7574 -3.37983 3.18752e-09 -1.77883e-09 -6.45277e-10 5.48911e-09 -3.07567e-09 -1.17403e-09 3.18752e-09 -1.77884e-09 -6.45265e-10 -7.73091 5.47488 -0.417314 3.18752e-09 -1.77884e-09 -6.45271e-10 -2.90554 0.965183 -0.102902 3.18751e-09 -1.77883e-09 -6.45273e-10 -10.2786 0.731801 -0.0259123 3.18753e-09 -1.77883e-09 -6.4529e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.8375 -4.5316 4.19739 0.149852 5.14867 1.33247 -36.1387 -28.9007 -55.3535 2.03217e-16 0.0 3.88251e-19 64.3916 -72.5188 91.1915 0.785042 57.8875 -2.00754 13.45 -19.6165 30.1377
--22.2828 72.0508 127.912 181.284 -18.8001 573.41 -14.0276 1.51767 11.3314 -3.89612 -9.02917 2.24678 1.34216 1.31323 5.25792 -7.44133 -36.8861 7.05376 -0.0 0.0 0.0 -0.0 0.0 0.0 -3.4348e-13 5.70592e-13 -4.20951e-13 135.272 -47.5646 67.8501 -3.42105 -1.01445 5.92398 -76.9775 81.9698 84.928 -5.37608e-10 -9.1641e-09 6.63788e-09 -4.27765e-10 -1.57784e-08 1.13171e-08 -5.3761e-10 -9.1641e-09 6.63786e-09 7.73091 5.47488 0.417314 -5.37612e-10 -9.1641e-09 6.63787e-09 2.90554 0.965183 0.102902 -5.376e-10 -9.1641e-09 6.63788e-09 10.2786 0.731801 0.0259123 -5.37612e-10 -9.1641e-09 6.63789e-09 2.22167 -0.733487 -0.20892 -3.43473e-13 5.70606e-13 -4.21095e-13 -67.3829 1.57808 -24.2209 9.76604 -4.00086 -17.3628 0.623802 21.8552 -3.23141 3.92409e-09 -6.39023e-10 1.45258e-10 6.77498e-09 -1.09812e-09 1.78998e-10 3.92409e-09 -6.39023e-10 1.45271e-10 -7.73091 5.47488 -0.417314 3.92409e-09 -6.39023e-10 1.45264e-10 -2.90554 0.965183 -0.102902 3.92409e-09 -6.39023e-10 1.4526e-10 -10.2786 0.731801 -0.0259123 3.9241e-09 -6.39021e-10 1.45244e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.0516 -4.59965 4.2431 0.149613 5.19546 1.33079 -35.821 -28.6112 -55.2995 2.03217e-16 0.0 3.88251e-19 65.6962 -72.5623 92.1723 0.800407 58.2316 -2.03407 13.5785 -19.897 30.1157
--22.2334 71.9457 127.84 181.459 -18.8838 573.47 -13.8957 1.33184 12.0454 -4.54735 -9.06089 2.39104 1.76828 2.08395 4.63303 -7.37767 -37.8109 5.61987 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.01569e-13 3.23584e-13 -4.19005e-13 135.913 -48.4349 65.9395 -3.37875 -0.99945 5.84998 -72.2366 81.883 80.1397 4.85477e-10 -7.64895e-09 5.51356e-09 1.22566e-09 -1.30579e-08 9.33099e-09 4.85478e-10 -7.64895e-09 5.51356e-09 7.73091 5.47488 0.417314 4.85474e-10 -7.64895e-09 5.51356e-09 2.90554 0.965183 0.102902 4.85487e-10 -7.64895e-09 5.51356e-09 10.2786 0.731801 0.0259123 4.85473e-10 -7.64895e-09 5.51357e-09 2.22167 -0.733487 -0.20892 -2.01619e-13 3.23592e-13 -4.19147e-13 -66.7084 4.02574 -24.3474 9.93584 -4.10315 -17.6802 0.569775 20.9536 -3.08478 4.23197e-09 1.21664e-09 9.44296e-10 7.32015e-09 2.11938e-09 1.55874e-09 4.23196e-09 1.21664e-09 9.44308e-10 -7.73091 5.47488 -0.417314 4.23197e-09 1.21664e-09 9.443e-10 -2.90554 0.965183 -0.102902 4.23197e-09 1.21664e-09 9.44297e-10 -10.2786 0.731801 -0.0259123 4.23198e-09 1.21665e-09 9.44281e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.2529 -4.70922 4.30652 0.149326 5.24364 1.3287 -35.4808 -28.2934 -55.2493 2.03217e-16 0.0 3.88251e-19 67.1349 -72.6323 93.2692 0.815912 58.5749 -2.06157 13.7274 -20.1975 30.1144
--22.1815 71.8538 127.769 181.646 -19.0109 573.496 -13.8224 1.16964 12.7453 -5.19318 -9.08911 2.52871 2.20077 2.8551 4.00787 -7.32439 -38.7019 4.17486 -0.0 0.0 0.0 -0.0 0.0 0.0 -2.80348e-14 -6.10236e-15 -3.7369e-13 136.495 -49.3168 63.9955 -3.3321 -0.983094 5.7683 -67.948 81.7524 75.8071 1.51314e-09 -5.44766e-09 3.80888e-09 2.84499e-09 -9.16439e-09 6.35896e-09 1.51315e-09 -5.44766e-09 3.80888e-09 7.73091 5.47488 0.417314 1.51314e-09 -5.44766e-09 3.80888e-09 2.90554 0.965183 0.102902 1.51316e-09 -5.44766e-09 3.80888e-09 10.2786 0.731801 0.0259123 1.51314e-09 -5.44766e-09 3.80889e-09 2.22167 -0.733487 -0.20892 -2.81408e-14 -6.09915e-15 -3.73834e-13 -66.0463 6.29986 -24.5143 10.1075 -4.20744 -18.0026 0.521993 20.1055 -2.94863 3.89955e-09 2.84803e-09 1.4765e-09 6.75514e-09 4.94672e-09 2.48902e-09 3.89954e-09 2.84803e-09 1.47651e-09 -7.73091 5.47488 -0.417314 3.89956e-09 2.84803e-09 1.4765e-09 -2.90554 0.965183 -0.102902 3.89955e-09 2.84803e-09 1.4765e-09 -10.2786 0.731801 -0.0259123 3.89956e-09 2.84804e-09 1.47648e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.3991 -4.78896 4.3552 0.14919 5.28352 1.32785 -35.219 -28.0819 -55.1867 2.03217e-16 0.0 3.88251e-19 68.4068 -72.7093 94.2372 0.831334 58.9043 -2.08803 13.8813 -20.4943 30.1261
--22.19 71.7721 127.712 181.558 -18.8833 573.592 -13.8583 1.18056 13.1798 -5.61721 -9.12664 2.6038 2.42294 3.38815 3.48069 -7.12399 -39.3935 3.03218 -0.0 0.0 0.0 -0.0 0.0 0.0 1.06617e-13 -2.8307e-13 -2.76609e-13 136.635 -49.9235 61.7549 -3.26703 -0.960508 5.65437 -65.3584 81.6478 73.19 2.00546e-09 -3.15946e-09 1.92353e-09 3.54458e-09 -5.20702e-09 3.12067e-09 2.00546e-09 -3.15947e-09 1.92353e-09 7.73091 5.47488 0.417314 2.00546e-09 -3.15946e-09 1.92353e-09 2.90554 0.965183 0.102902 2.00547e-09 -3.15947e-09 1.92353e-09 10.2786 0.731801 0.0259123 2.00545e-09 -3.15947e-09 1.92354e-09 2.22167 -0.733487 -0.20892 1.06487e-13 -2.8307e-13 -2.76758e-13 -65.6607 8.05033 -24.6419 10.2682 -4.306 -18.3055 0.483118 19.364 -2.83116 2.71523e-09 3.31501e-09 1.46653e-09 4.71051e-09 5.7538e-09 2.49367e-09 2.71522e-09 3.31502e-09 1.46654e-09 -7.73091 5.47488 -0.417314 2.71523e-09 3.31501e-09 1.46653e-09 -2.90554 0.965183 -0.102902 2.71523e-09 3.31501e-09 1.46653e-09 -10.2786 0.731801 -0.0259123 2.71524e-09 3.31502e-09 1.46651e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.4477 -4.76754 4.35661 0.149403 5.30541 1.32989 -35.1357 -28.1109 -55.0931 2.03217e-16 0.0 3.88251e-19 69.2026 -72.7792 94.822 0.846314 59.2065 -2.11132 14.0245 -20.7634 30.1428
--22.209 71.6715 127.597 181.351 -18.6376 573.528 -14.0734 1.46391 13.1961 -5.69215 -9.17876 2.58012 2.29373 3.54529 3.10776 -6.62633 -39.7889 2.40569 -0.0 0.0 0.0 -0.0 0.0 0.0 1.81236e-13 -4.80116e-13 -9.64363e-14 136.163 -50.0984 59.136 -3.17274 -0.928056 5.48939 -65.2595 81.6432 73.09 1.65525e-09 -7.09075e-10 -2.67698e-10 2.79515e-09 -1.10564e-09 -5.73242e-10 1.65526e-09 -7.09075e-10 -2.67697e-10 7.73091 5.47488 0.417314 1.65525e-09 -7.09076e-10 -2.67699e-10 2.90554 0.965183 0.102902 1.65526e-09 -7.09078e-10 -2.67696e-10 10.2786 0.731801 0.0259123 1.65525e-09 -7.09079e-10 -2.67689e-10 2.22167 -0.733487 -0.20892 1.81133e-13 -4.80118e-13 -9.65983e-14 -65.7296 8.97635 -24.6579 10.4128 -4.39606 -18.5778 0.454209 18.7924 -2.74131 1.66239e-10 1.94082e-09 5.93252e-10 2.95707e-10 3.36639e-09 1.02464e-09 1.66225e-10 1.94083e-09 5.93262e-10 -7.73091 5.47488 -0.417314 1.66241e-10 1.94082e-09 5.93252e-10 -2.90554 0.965183 -0.102902 1.66233e-10 1.94082e-09 5.93249e-10 -10.2786 0.731801 -0.0259123 1.66245e-10 1.94083e-09 5.93239e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.3405 -4.58579 4.28312 0.15017 5.29866 1.33651 -35.3345 -28.5236 -54.95 2.03217e-16 0.0 3.88251e-19 69.2316 -72.8448 94.7868 0.860032 59.4653 -2.12904 14.1511 -20.9889 30.167
--22.2282 71.5638 127.414 181.159 -18.6333 573.339 -14.4137 1.91149 12.9709 -5.5679 -9.23766 2.49782 1.95745 3.48962 2.82184 -5.92955 -40.0126 2.08776 -0.0 0.0 0.0 -0.0 0.0 0.0 2.35349e-13 -6.67048e-13 1.49026e-13 135.387 -49.9957 56.3489 -3.05994 -0.889435 5.29234 -66.6886 81.7035 74.5344 8.3121e-10 2.12351e-09 -2.87746e-09 1.21302e-09 3.57383e-09 -4.94204e-09 8.31216e-10 2.12351e-09 -2.87746e-09 7.73091 5.47488 0.417314 8.31209e-10 2.12351e-09 -2.87746e-09 2.90554 0.965183 0.102902 8.31214e-10 2.12351e-09 -2.87746e-09 10.2786 0.731801 0.0259123 8.31205e-10 2.12351e-09 -2.87745e-09 2.22167 -0.733487 -0.20892 2.35301e-13 -6.67048e-13 1.48846e-13 -66.0701 9.36644 -24.5973 10.5492 -4.48224 -18.8349 0.431108 18.3396 -2.67023 -3.42458e-09 -5.68077e-10 -8.8055e-10 -5.92773e-09 -9.90207e-10 -1.46693e-09 -3.42459e-09 -5.68074e-10 -8.8054e-10 -7.73091 5.47488 -0.417314 -3.42458e-09 -5.68077e-10 -8.8055e-10 -2.90554 0.965183 -0.102902 -3.42459e-09 -5.68077e-10 -8.80551e-10 -10.2786 0.731801 -0.0259123 -3.42458e-09 -5.68075e-10 -8.80559e-10 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 12.1229 -4.30078 4.16123 0.15132 5.27222 1.34626 -35.7233 -29.2017 -54.7785 2.03217e-16 0.0 3.88251e-19 68.7483 -72.9138 94.3379 0.872709 59.6938 -2.14289 14.2705 -21.1878 30.2006
--22.259 71.4852 127.337 180.965 -18.7087 573.482 -14.7504 2.35984 12.7464 -5.44383 -9.29655 2.41549 1.62061 3.43384 2.53596 -5.236 -40.2355 1.76778 -0.0 0.0 0.0 -0.0 0.0 0.0 2.89461e-13 -8.53979e-13 3.94488e-13 134.644 -49.7863 53.5637 -2.94686 -0.85078 5.0953 -68.138 81.7584 75.999 7.16901e-12 4.9561e-09 -5.48722e-09 -3.69115e-10 8.25331e-09 -9.31083e-09 7.17454e-12 4.9561e-09 -5.48723e-09 7.73091 5.47488 0.417314 7.16738e-12 4.9561e-09 -5.48723e-09 2.90554 0.965183 0.102902 7.16851e-12 4.9561e-09 -5.48722e-09 10.2786 0.731801 0.0259123 7.16241e-12 4.9561e-09 -5.48721e-09 2.22167 -0.733487 -0.20892 2.89469e-13 -8.53979e-13 3.94289e-13 -66.4114 9.75697 -24.5378 10.6848 -4.56806 -19.0921 0.409187 17.8868 -2.59969 -7.01539e-09 -3.07698e-09 -2.35435e-09 -1.21512e-08 -5.34681e-09 -3.9585e-09 -7.0154e-09 -3.07697e-09 -2.35434e-09 -7.73091 5.47488 -0.417314 -7.01539e-09 -3.07698e-09 -2.35435e-09 -2.90554 0.965183 -0.102902 -7.01541e-09 -3.07698e-09 -2.35435e-09 -10.2786 0.731801 -0.0259123 -7.0154e-09 -3.07698e-09 -2.35436e-09 -2.22167 -0.733487 0.20892 -2.03217e-16 0.0 -3.88251e-19 11.9066 -4.01567 4.03954 0.152478 5.24579 1.356 -36.1095 -29.8844 -54.614 2.03217e-16 0.0 3.88251e-19 68.2613 -72.9818 93.8851 0.885606 59.9224 -2.15697 14.3902 -21.3868 30.2347

File diff suppressed because it is too large
+ 0 - 225
public/vr/assets/plane.dae


BIN
public/vr/assets/sky1.jpg


BIN
public/vr/assets/sky3.jpg


+ 9 - 14
public/vr/index.vwf.yaml

@@ -23,22 +23,17 @@ children:
   myLight:
     extends: http://vwf.example.com/aframe/alight.vwf
     properties:
-      type: "hemisphere"
+      type: "directional"
       position: "0 20 0"
-  bvhtest:
-    extends: http://vwf.example.com/aframe/aentity.vwf
-    properties:
-      position: "0 0 -20"
-      scale: "0.3 0.3 0.3"
-    children:
-      avatarbvh:
-        extends: http://vwf.example.com/aframe/app-avatarbvh-component.vwf
   model:
     extends: http://vwf.example.com/aframe/agltfmodel.vwf
     properties:
-      src: "#mon"
-      position: "20 6.1 -15"
-      rotation: "0 90 0"
+      src: "#av"
+      position: "0 0 -4"
     children:
-      envmap:
-        extends: http://vwf.example.com/aframe/app-envmap-component.vwf
+      animation-mixer:
+        extends: http://vwf.example.com/aframe/anim-mixer-component.vwf
+        properties:
+          clip: "*"
+          duration: 3
+          crossFadeDuration: 0.5

BIN
public/vr/webimg.jpg


+ 25 - 10
public/web/lib/app.css

@@ -1,17 +1,32 @@
-.exp-card-wide.mdl-card {
-  width: 512px;
+.numClients {
+    font-weight: bold;
 }
-.exp-card-wide > .mdl-card__title {
-  color: #FFF;
-  height: 176px;
-  background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url('images/default.jpg') center / cover;
+
+.world-card__16-9-media {
+background-repeat: no-repeat;
+height: 176px;
+background: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url('images/default.jpg') center / cover;
+
 }
-.exp-card-wide > .mdl-card__menu {
-  color: #fff;
+
+.world-card {
+  background-color: white;
 }
 
-.numClients {
+.world-link a:link {
+  color: #446BA1;
+}
 
-    font-weight: bold;
+.world-link a:hover { 
+  background: #E7E7E7;
+}
 
+.world-link a:active {
+  color: #446BA1;
+  background: #E7E7E7;
 }
+.world-link a:visited {
+  color: #446BA1;
+  background: #E7E7E7;
+}
+

+ 188 - 58
public/web/lib/app.js

@@ -39,92 +39,220 @@ function parseAppInstancesData(data) {
             parsed[name] = {};
             parsed[name][prop] = jsonObj[prop];
         }
-        
+
     }
     //console.log(parsed);
 
+    document.querySelector("#main")._emptyLists();
+
     for (var prop in parsed) {
-       var name = prop;
-        let element = document.getElementById(name);
+        var name = prop;
+        let element = document.getElementById(name + 'List');
         if (element) {
-            var list = document.getElementById(name + 'List');
-
-                var topList = list.parentNode;
-                topList.removeChild(list);
-                var list = document.createElement('ol');
-                list.setAttribute("id", name + 'List');
-                topList.appendChild(list);
-            
-            var newListProps = parsed[prop];
-             for (var propEntry in newListProps) {
-
-            let entry = document.createElement('li');
-            entry.setAttribute("class", "instance");
-            let node = document.createElement("A");
-            let textLink = document.createTextNode(newListProps[propEntry].instance);
-            node.setAttribute("href", 'http://' + newListProps[propEntry].instance);
-            node.setAttribute("target", "_blank");
-            node.setAttribute("onclick", "refresh();");
-
-            node.appendChild(textLink);
-
-            let numClientsEl = document.createElement('span');
-            numClientsEl.setAttribute("class", "numClients");
-            let numClients = document.createTextNode('Users online: ' + newListProps[propEntry].clients);
-
-            entry.appendChild(node);
-            entry.appendChild(document.createElement('br'));
-            entry.appendChild(numClientsEl).appendChild(numClients);
-
-            list.appendChild(entry);
-            
-         }
+            element._setListData(parsed[prop]);
         }
         //needToUpdate = true
     }
     // console.log(data)
+}
 
+function getAllAppInstances() {
+
+    let allInatances = httpGetJson('allinstances.json')
+        .then(res => {
+            parseAppInstancesData(res);
+        });
 }
 
-function parseWebAppData(data) {
+function parseWebAppDataForCell(data) {
+
+    document.querySelector("#main").$cell({
+        $cell: true,
+        $type: "div",
+        id: "main",
+        _jsonData: {},
+        _emptyLists: function () {
+            Object.entries(this._jsonData).forEach(function (element) {
+                //console.log(element);
+                document.getElementById(element[0] + 'List')._setListData({});
+            });
+        },
+        $init: function () {
+            this._jsonData = JSON.parse(data);
+        },
+        _makeWorldCard: function (m) {
+            return {
+                $cell: true,
+                $type: "div",
+                class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-4",
+                $components: [
+                    this._worldCardDef(m)
+                ]
+            }
 
-    let jsonObj = JSON.parse(data);
-    for (var prop in jsonObj) {
-        let main = document.getElementById('main');
-        let app = document.createElement("DIV");
-        app.setAttribute("class", "mdl-cell mdl-cell--4-col exp-card-wide mdl-card mdl-shadow--2dp");
-        var appCard = '<div class="mdl-card__title"><h2 id="' + prop + 'Title" class="mdl-card__title-text">' + jsonObj[prop].title + '</h2></div><div id="' + prop + 'Text" class="mdl-card__supporting-text">' + jsonObj[prop].text + '</div><div id="' + prop + '"  class="mdl-card__actions mdl-card--border"> <a href="/' + prop + '" onclick="refresh();" target="_blank" class="mdl-button mdl-button--colored mdl-js-button mdl-js-ripple-effect">Start new</a><hr/><p/><span class="mdl-color-text--grey-500">...or connect to:</span><ol id="' + prop + 'List"></ol></div>';
-        app.innerHTML = appCard;
-        if (jsonObj[prop].imgUrl !== "") {
-            app.firstChild.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url(' + jsonObj[prop].imgUrl + ')';
+        },
+        $update: function () {
+            this.$components = [
+                // siteHeader,
+                {
+                    $type: "div",
+                    class: "mdc-layout-grid",
+                    $components: [
+                        {
+                            $type: "div",
+                            class: "mdc-layout-grid__inner",
+                            $components: Object.entries(this._jsonData).map(this._makeWorldCard)
+                        }
+                    ]
+
+                },
+
+
+            ]
+        },
+        _worldCardDef: function (desc) {
+
+            return {
+                $cell: true,
+                $type: "div",
+                class: "mdc-card world-card",
+                $components: [
+                    {
+                        $type: "section",
+                        class: "mdc-card__media world-card__16-9-media",
+                        $init: function () {
+                            if (desc[1].imgUrl !== "") {
+                                this.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5) ), url(' + desc[1].imgUrl + ')';
+                            }
+                        }
+                    },
+                    {
+                        $type: "section",
+                        class: "mdc-card__primary",
+                        $components: [
+                            {
+                                $type: "h1",
+                                class: "mdc-card__title mdc-card__title--large",
+                                $text: desc[1].title
+                            },
+                            {
+                                $type: "h2",
+                                class: "mdc-card__subtitle mdc-theme--text-secondary-on-background",
+                                $text: desc[1].text
+                            }
+                        ]
+                    },
+                    {
+                        $type: "section",
+                        class: "mdc-card__actions",
+                        $components: [
+                            {
+                                $type: "a",
+                                class: "mdc-button mdc-button--compact mdc-card__action mdc-button--raised",
+                                $text: "Start new",
+                                target: "_blank",
+                                href: "/" + desc[0],
+                                onclick: function (e) {
+                                    refresh();
+                                }
+                            }
+
+
+                        ]
+                    },
+
+                    {
+                        $type: "section",
+                        class: "mdc-card__actions",
+                        $components: [
+
+                            {
+                                $type: "ul",
+                                _listData: {},
+                                _setListData: function (data) {
+                                    this._listData = data;
+                                },
+                                class: "mdc-list mdc-list--two-line",
+                                id: desc[0] + 'List',
+                                $update: function () {
+                                    var connectText = {}
+
+                                    if (Object.entries(this._listData).length !== 0) {
+                                        connectText = {
+                                            // $type: "span",
+                                            // class: "mdc-theme--text-secondary",
+                                            // $text: "...or connect to:"
+                                        }
+                                    }
+                                    this.$components = [
+                                        {
+                                            $type: "hr",
+                                            class: "mdc-list-divider"
+                                        }
+                                    ].concat(Object.entries(this._listData).map(this._worldListItem))
+                                    //     [connectText]
+                                    // }].concat(Object.entries(this._listData).map(this._worldListItem))
+
+
+                                },
+                                _worldListItem: function (m) {
+                                    return {
+                                        $type: "li",
+                                        class: "mdc-list-item",
+                                        $components: [
+                                            {
+                                                $type: "span",
+                                                class: "world-link mdc-list-item__text",
+                                                $components: [
+                                                    {
+                                                        $type: "a",
+                                                        $text: m[1].instance,
+                                                        target: "_blank",
+                                                        href: "http://" + m[1].instance,
+                                                        onclick: function (e) {
+                                                            refresh();
+                                                        }
+                                                    },
+                                                    {
+                                                        $type: "span",
+                                                        class: "mdc-list-item__text__secondary",
+                                                        $text: "Users online: " + m[1].clients
+                                                    }
+                                                ]
+                                            }
+
+
+
+                                        ]
+
+                                    }
+                                }
+                            }
+                        ]
+                    }
+                ]
+            }
         }
 
-        main.appendChild(app);
-    }
-    //console.log(data);
-    // getAllAppInstances();
 
-}
+    })
+
 
-function getAllAppInstances() {
 
-    let allInatances = httpGetJson('allinstances.json')
-        .then(res => {
-            parseAppInstancesData(res);
-        });
 }
 
 function getAppDetails() {
+
     let appDetails = httpGetJson('webapps.json')
         .then(res => {
-            parseWebAppData(res)
+            parseWebAppDataForCell(res)
         })
         .then(res => refresh());
 }
 
 
 function refresh() {
-   // socket.emit('getWebAppUpdate', "");
+    // socket.emit('getWebAppUpdate', "");
 }
 
 
@@ -159,4 +287,6 @@ async function httpGetJson(url) {
     } else {
         throw Error('Bad Url Format');
     }
-}
+}
+
+

+ 578 - 0
public/web/lib/cell.js

@@ -0,0 +1,578 @@
+/*
+ *   {cell}
+ *
+ *   - Membrane: "The cell membrane (also known as the plasma membrane or cytoplasmic membrane) is a biological membrane that separates the interior of all cells from the outside environment"
+ *   - Gene: "The transmission of genes to an organism's offspring is the basis of the inheritance of phenotypic traits. These genes make up different DNA sequences called genotypes. Genotypes along with environmental and developmental factors determine what the phenotypes will be."
+ *   - Genotype: "Genotype is an organism's full hereditary information."
+ *   - Phenotype: "Phenotype is an organism's actual observed properties, such as morphology, development, or behavior."
+ *   - Nucleus: "The nucleus maintains the integrity of genes and controls the activities of the cell by regulating gene expression—the nucleus is, therefore, the control center of the cell."
+ */
+(function($root) {
+  var Membrane = {
+    /*
+     *  [Membrane] The Shell
+     *
+     *  "The cell membrane (also known as the plasma membrane or cytoplasmic membrane) is a biological membrane that separates the interior of all cells from the outside environment"
+     *    - https://en.wikipedia.org/wiki/Cell_membrane
+     *
+     *  The Membrane module determines how a cell is inserted into the DOM. There are two ways: Replacing an existing node with cell (inject), or Creating an additional cell node (add).
+     *   - inject(): attempts to inject cell into an existing host node
+     *   - add(): creates a new cell node and adds it to the DOM without touching other nodes
+     */
+    inject: function($host, gene, namespace, replace) {
+      /*
+       *  Membrane.inject() : Inject cell into an existing node
+       *
+       *  @param {Object} $host - existing host node to inject into
+       *  @param {Object} gene - gene object
+       *  @param {String} namespace - for handling namespaced elements such as SVG https://developer.mozilla.org/en-US/docs/Web/API/Document/createElementNS
+       *  @param {Boolean} replace - if true, create a node and replace it with the host node. Used for manual instantiation
+       */
+      var $node = null;
+      var $replacement;
+      if (replace && $host) {
+        // 1. Inject into an existing node ($host) by explicit instantiation
+        $replacement = Phenotype.$type(gene, namespace);
+        if (gene.hasOwnProperty('$cell')) {
+          $node = $host;
+          if ($node.parentNode) $node.parentNode.replaceChild($replacement, $node);
+        }
+        $node = $replacement;
+      } else if (gene.$type && (gene.$type === 'head' || gene.$type === 'body') && $root.document.getElementsByTagName(gene.$type)) {
+        // 2. Inject into existing 'head' or 'body' nodes
+        $node = $root.document.getElementsByTagName(gene.$type)[0];
+      } else if (gene.id && $root.document.getElementById(gene.id)) {
+        // 3. Inject into an existing nodes by ID
+        $node = $root.document.getElementById(gene.id);
+        if ($node.nodeName.toLowerCase() !== (gene.$type || 'div')) {
+          $replacement = Phenotype.$type(gene, namespace);
+          $node.parentNode.replaceChild($replacement, $node);
+          $node = $replacement;
+        }
+      }
+      if ($node && !$node.Meta) $node.Meta = {};
+      return $node;
+    },
+    add: function($parent, gene, index, namespace) {
+      /*
+       *  Membrane.add() : Adds a new cell node into the DOM tree
+       *
+       *  @param $parent - The parent node to which the new cell node will be added
+       *  @param gene - gene object
+       *  @param index - the position within the parent's childNodes array to which this cell node will be added. Not used in the initial render but used for subsequent renders based on the diff logic
+       *  @param namespace - namespace URL for namespaced elements such as SVG
+       */
+      var $node = Phenotype.$type(gene, namespace);
+      if (index !== null && index !== undefined && $parent.childNodes && $parent.childNodes[index]) {
+        // Index is specified, so insert into that position
+        $parent.insertBefore($node, $parent.childNodes[index]);
+      } else {
+        // No index, simply apppend to the end
+        $parent.appendChild($node);
+      }
+      return $node;
+    },
+    build: function($parent, gene, index, namespace, replace) {
+      /*
+       * Membrane.build() : The main builder function that interfaces with Membrane.inject() and Membrane.add().
+       */
+      // 1. Attempt to inject into an existing node
+      var $existing = Membrane.inject($parent, gene, namespace, replace);
+      if ($existing) return $existing;
+      // 2. If it's not an injection into an existing node, we create a node
+      else return Membrane.add($parent, gene, index, namespace);
+    },
+  };
+  var Genotype = {
+    /*
+     *  [Genotype] Internal Storage of Genes
+     *
+     *  "Genotype is an organism's full hereditary information."
+     *    - https://en.wikipedia.org/wiki/Genotype
+     *
+     *   The Genotype module is an internal storage for all the variables required to construct a cell node (attributes, $variables, and _variables)
+     *   When you set a variable on a cell (for example: this._index=1), it's actually stored under the node's Genotype instead of directly on the node itself.
+     *
+     *   - set(): a low-level function to simply set a key/value pair on the Genotype object, used by update() and build()
+     *   - update(): updates a key/value pair from the genotype and schedules a phenotype (view) update event to be processed on the next tick
+     *   - build(): builds a fresh genotype object from a gene object
+     */
+    set: function($node, key, val) {
+      if (['$init'].indexOf(key) === -1) {
+        $node.Genotype[key] = Nucleus.bind($node, val);
+      } else {
+        val.snapshot = val; // snapshot of $init
+        $node.Genotype[key] = val;
+      }
+    },
+    update: function($node, key, val) {
+      Nucleus.queue($node, key, 'w');
+      Genotype.set($node, key, val);
+    },
+    build: function($node, gene, inheritance) {
+      $node.Genotype = {};
+      $node.Inheritance = inheritance;
+      for (var key in gene) {
+        Genotype.set($node, key, gene[key]);
+      }
+    },
+  };
+  var Gene = {
+    /*
+     *  [Gene] Gene manipulation/diff functions
+     *
+     *  "The transmission of genes to an organism's offspring is the basis of the inheritance of phenotypic traits. These genes make up different DNA sequences called genotypes. Genotypes along with environmental and developmental factors determine what the phenotypes will be."
+     *    - https://en.wikipedia.org/wiki/Gene
+     *
+     *  The Gene module is a collection of utility functions used for comparing gene objects to determine if a node needs to be replaced or left alone when there's an update.
+     *   - freeze(): stringifies a Javascript object snapshot for comparison
+     *   - LCS(): Longest Common Subsequence algorithm https://en.wikipedia.org/wiki/Longest_common_subsequence_problem
+     *   - diff(): A diff algorithm that returns what have been added (+), and removed (-)
+     */
+    freeze: function(gene) {
+      var cache = [];
+      var res = JSON.stringify(gene, function(key, val) {
+        if (typeof val === 'function') { return val.toString(); }
+        if (typeof val === 'object' && val !== null) {
+          if (cache.indexOf(val) !== -1) { return '[Circular]'; }
+          cache.push(val);
+        }
+        return val;
+      });
+      cache = null;
+      return res;
+    },
+    LCS: function(a, b) {
+      var m = a.length, n = b.length, C = [], i, j, af = [], bf = [];
+      for (i = 0; i < m; i++) af.push(Gene.freeze(a[i]));
+      for (j = 0; j < n; j++) bf.push(Gene.freeze(b[j]));
+      for (i = 0; i <= m; i++) C.push([0]);
+      for (j = 0; j < n; j++) C[0].push(0);
+      for (i = 0; i < m; i++) for (j = 0; j < n; j++) C[i+1][j+1] = af[i] === bf[j] ? C[i][j]+1 : Math.max(C[i+1][j], C[i][j+1]);
+      return (function bt(i, j) {
+        if (i*j === 0) { return []; }
+        if (af[i-1] === bf[j-1]) { return bt(i-1, j-1).concat([{ item: a[i-1], _old: i-1, _new: j-1 }]); }
+        return C[i][j-1] > C[i-1][j] ? bt(i, j-1) : bt(i-1, j);
+      }(m, n));
+    },
+    diff: function(_old, _new) {
+      var lcs = Gene.LCS(_old, _new);
+      var old_common = lcs.map(function(i) { return i._old; });
+      var minus = _old.map(function(item, index) {
+        return { item: item, index: index };
+      }).filter(function(item, index) {
+        return old_common.indexOf(index) === -1;
+      });
+      var new_common = lcs.map(function(i) { return i._new; });
+      var plus = _new.map(function(item, index) {
+        return { item: item, index: index };
+      }).filter(function(item, index) {
+        return new_common.indexOf(index) === -1;
+      });
+      return { '-': minus, '+': plus };
+    },
+  };
+  var Phenotype = {
+    /*
+     *  [Phenotype] Actual observed properties of a cell
+     *
+     *  "Phenotype is an organism's actual observed properties, such as morphology, development, or behavior."
+     *    - https://en.wikipedia.org/wiki/Phenotype
+     *
+     *  The Phenotype module manages a cell's actual observed properties, such as textContent ($text), nodeType ($type), innerHTML ($html), childNodes ($components), and DOM attributes
+     *
+     *   - build(): Build phenotype from genotype
+     *   - set(): Sets a key/value pair of phenotype
+     *   - $type(): translates the "$type" attribute to nodeType
+     *   - $text(): translates the "$type" attribute to textContent
+     *   - $html(): translates the "$type" attribute to innerHTML
+     *   - $components(): translates the "$components" attribute to childNodes
+     *   - $init(): executes the "$init" callback function after the element has been rendered
+     *   - $update(): executes the "$update" callback function when needed (called by Nucleus on every tick)
+     */
+    build: function($node, genotype) {
+      Phenotype.$init($node);
+      for (var key in genotype) {
+        if (genotype[key] !== null && genotype[key] !== undefined) {
+          Phenotype.set($node, key, genotype[key]);
+        }
+      }
+    },
+    multiline: function(fn) { return /\/\*!?(?:@preserve)?[ \t]*(?:\r\n|\n)([\s\S]*?)(?:\r\n|\n)[ \t]*\*\//.exec(fn.toString())[1]; },
+    get: function(key) {
+      return Object.getOwnPropertyDescriptor($root.HTMLElement.prototype, key) || Object.getOwnPropertyDescriptor($root.Element.prototype, key);
+    },
+    set: function($node, key, val) {
+      if (key[0] === '$') {
+        if (key === '$type') {
+          // recreate and rebind the node if it's different from the old one
+          var tag = $node.tagName ? $node.tagName.toLowerCase() : 'text';
+          if (val.toLowerCase() !== tag) {
+            var fragment = Phenotype.$type({ $type: 'fragment' });
+            var replacement = fragment.$build($node.Genotype, $node.Inheritance, null, $node.Meta.namespace);
+            $node.parentNode.replaceChild(replacement, $node);
+            $node = replacement;
+          }
+        } else if (key === '$text') {
+          if (typeof val === 'function') val = Phenotype.multiline(val);
+          $node.textContent = val;
+        } else if (key === '$html') {
+          if (typeof val === 'function') val = Phenotype.multiline(val);
+          $node.innerHTML = val;
+        } else if (key === '$components') {
+          Phenotype.$components($node, val);
+        }
+      } else if (key[0] === '_') {
+        // "_" variables don't directly alter the phenotype, so do nothing
+      } else if (key === 'value') {
+        $node[key] = val;
+      } else if (key === 'style' && typeof val === 'object') {
+        var CSSStyleDeclaration = Phenotype.get(key).get.call($node);
+        for (var attr in val) { CSSStyleDeclaration[attr] = val[attr]; }
+      } else if (typeof val === 'number' || typeof val === 'string' || typeof val === 'boolean') {
+        if ($node.setAttribute) $node.setAttribute(key, val);
+      } else if (typeof val === 'function') {
+        // For natively supported HTMLElement.prototype methods such as onclick()
+        var prop = Phenotype.get(key);
+        if (prop) prop.set.call($node, val);
+      }
+    },
+    $type: function(model, namespace) {
+      var meta = {};
+      var $node;
+      if (model.$type === 'text') {
+        if (model.$text && typeof model.$text === 'function') model.$text = Phenotype.multiline(model.$text);
+        $node = $root.document.createTextNode(model.$text);
+      } else if (model.$type === 'svg') {
+        $node = $root.document.createElementNS('http://www.w3.org/2000/svg', model.$type);
+        meta.namespace = $node.namespaceURI;
+      } else if (namespace) {
+        $node = $root.document.createElementNS(namespace, model.$type);
+        meta.namespace = $node.namespaceURI;
+      } else if (model.$type === 'fragment') {
+        $node = $root.document.createDocumentFragment();
+      } else {
+        $node = $root.document.createElement(model.$type || 'div');
+      }
+      $node.Meta = meta;
+      return $node;
+    },
+    $components: function($parent, components) {
+      if (!components) components = [];
+      var old = [].map.call($parent.childNodes, function($node) {
+        return $node.Genotype;
+      }).filter(function(item) {
+        return item; // only compare with Cells (that have Genotype), not additional elements created by another javascript library
+      });
+      if (old.length > 0) {
+        // If childNodes already exist, try to insert into a correct position.
+        var diff = Gene.diff(old, components);
+        diff['-'].forEach(function(item) { $parent.childNodes[item.index].Kill = true; });
+        [].filter.call($parent.childNodes, function($node) {
+          return $node.Kill;
+        }).forEach(function($node) {
+          $parent.removeChild($node);
+        });
+        diff['+'].forEach(function(item) {
+          var inheritance = $parent.Inheritance;
+          for (var key in $parent.Genotype) {
+            if (key[0] === '_') inheritance = inheritance.concat([key]);
+          }
+          $parent.$build(item.item, inheritance, item.index, $parent.Meta.namespace);
+          $parent.$components[item.index] = $parent.childNodes[item.index].Genotype;
+        });
+      } else {
+        // first time construction => no childNodes => build a fragment and insert at once
+        var $fragment = Phenotype.$type({ $type: 'fragment' });
+        var inheritance = $parent.Inheritance;
+        for (var key in $parent.Genotype) {
+          if (key[0] === '_') inheritance = inheritance.concat([key]);
+        }
+        while ($parent.firstChild) { $parent.removeChild($parent.firstChild); } // remove empty text nodes
+        components.forEach(function(component) {
+          $fragment.$build(component, inheritance, null, $parent.Meta.namespace);
+        });
+        $parent.appendChild($fragment);
+        $parent.$components = [].map.call($parent.childNodes, function($node) { return $node.Genotype; });
+      }
+    },
+    $init: function($node) {
+      Nucleus.tick.call($root, function() {
+        if ($node.Genotype && $node.Genotype.$init) Nucleus.bind($node, $node.Genotype.$init)();
+      });
+    },
+    $update: function($node) {
+      if ($node.parentNode && !$node.Meta.$updated && $node.$update) {
+        $node.Meta.$updated = true;
+        $node.$update();
+        for (var key in $node.Dirty) { Phenotype.set($node, key, $node.Genotype[key]); }
+        $node.Meta.$updated = false;
+        $node.Dirty = null;
+      }
+    },
+  };
+  var Nucleus = {
+    /*
+     *  [Nucleus] Handles the cell cycle
+     *
+     *  "The nucleus maintains the integrity of genes and controls the activities of the cell by regulating gene expression—the nucleus is, therefore, the control center of the cell."
+     *    - https://en.wikipedia.org/wiki/Cell_nucleus
+     *
+     *  The Nucleus module creates a proxy that lets Cell interface with the outside world. Its main job is to automatically trigger phenotype updates based on genotype updates
+     *
+     *   - set(): Starts listening to a single attribute.
+     *   - build(): Starts listening to all attributes defined on the gene
+     *   - bind(): Creates a wrapper function that executes the original function, and then automatically updates the Phenotype if necessary.
+     *   - queue(): A function that queues up all potential genotype mutation events so that they can be batch-processed in a single tick.
+     */
+    tick: $root.requestAnimationFrame || $root.webkitRequestAnimationFrame || $root.mozRequestAnimationFrame || $root.msRequestAnimationFrame || function(cb) { return $root.setTimeout(cb, 1000/60); },
+    set: function($node, key) {
+      // Object.defineProperty is used for overriding the default getter and setter behaviors.
+      try {
+        Object.defineProperty($node, key, {
+          configurable: true,
+          get: function() {
+            // 1. get() overrides the node's getter to create an illusion that users are directly accessing the attribute on the node (In reality they are accessing the genotype via nucleus)
+            // 2. get() also queues up the accessed variable so it can potentially trigger a phenotype update in case there's been a mutation
+            if (key[0] === '$' || key[0] === '_') {
+              if (key in $node.Genotype) {
+                Nucleus.queue($node, key, 'r');
+                return $node.Genotype[key];
+              } else if (key[0] === '_') {
+                // Context Inheritance: If a _variable cannot be found on the current node, propagate upwards until we find a node with the attribute.
+                var $current = $node;
+                while ($current = $current.parentNode) { // eslint-disable-line no-cond-assign
+                  if ($current && $current.Genotype && (key in $current.Genotype)) {
+                    Nucleus.queue($current, key, 'r');
+                    return $current.Genotype[key];
+                  }
+                }
+              } else {
+                return null;
+              }
+            } else {
+              // DOM Attributes.
+              if (key === 'value') {
+                // The "value" attribute needs a special treatment.
+                return Object.getOwnPropertyDescriptor(Object.getPrototypeOf($node), key).get.call($node);
+              } else if (key === 'style') {
+                return Phenotype.get(key).get.call($node);
+              } else if (key in $node.Genotype) {
+                // Otherwise utilize Genotype
+                return $node.Genotype[key];
+              } else {
+                // If the key doesn't exist on the Genotype, it means we're dealing with native DOM attributes we didn't explicitly define on the gene.
+                // For example, there are many DOM attributes such as "tagName" that come with the node by default.
+                // These are not something we directly define on a gene object, but we still need to be able to access them..
+                // In this case we just use the native HTMLElement.prototype accessor
+                return Phenotype.get(key).get.call($node);
+              }
+            }
+          },
+          set: function(val) {
+            // set() overrides the node's setter to create an illusion that users are directly setting an attribute on the node (In reality it's proxied to set the genotype value instead)
+            // set() also queues up the mutated variable so it can trigger a phenotype update once the current call stack becomes empty
+
+            // 0. Context Inheritance: If a _variable cannot be found on the current node, cell propagates upwards until it finds a node with the attribute.
+            var $current = $node;
+            if (!(key in $node.Genotype) && key[0] === '_') {
+              while ($current = $current.parentNode) { // eslint-disable-line no-cond-assign
+                if ($current && $current.Genotype && (key in $current.Genotype)) {
+                  break;
+                }
+              }
+            }
+            // 1. Set genotype by default
+            Genotype.update($current, key, val);
+            // 2. DOM attribute handling (anything that doesn't start with $ or _)
+            if (key[0] !== '$' && key[0] !== '_') {
+              if (key === 'value') {
+                return Object.getOwnPropertyDescriptor(Object.getPrototypeOf($node), key).set.call($node, val);
+              } else if (key === 'style' && typeof val === 'object') {
+                Phenotype.get(key).set.call($node, val);
+              } else if (typeof val === 'number' || typeof val === 'string' || typeof val === 'boolean') {
+                $node.setAttribute(key, val);
+              } else if (typeof val === 'function') {
+                Phenotype.get(key).set.call($node, val);
+              }
+            }
+          },
+        });
+      } catch (e) { /** native element edge case handling for electron **/ }
+    },
+    build: function($node) {
+      // 1. The special attributes "$type", "$text", "$html", "$components" are tracked by default even if not manually defined
+      ['$type', '$text', '$html', '$components'].forEach(function(key) {
+        if (!(key in $node.Genotype)) Nucleus.set($node, key);
+      });
+      // 2. Used for context inheritance. We want to track not just the attributes directly defined on the current node but all the attributes inherited from ancestors.
+      if ($node.Inheritance) {
+        $node.Inheritance.forEach(function(key) {
+          Nucleus.set($node, key);
+        });
+      }
+      // 3. Track all keys defined on the gene object
+      for (var key in $node.Genotype) {
+        Nucleus.set($node, key);
+      }
+    },
+    _queue: [],
+    bind: function($node, v) {
+      // Binding an attribute to the nucleus.
+      // 1. No difference if the attribute is just a regular variable
+      // 2. If the attribute is a function, we create a wrapper function that first executes the original function, and then triggers a phenotype update depending on the queue condition
+      if (typeof v === 'function') {
+        var fun = function() {
+          // In the following code, everything inside Nucleus.tick.call is executed AFTER the last line--v.apply($node, arguments)--because it gets added to the event loop and waits until the next render cycle.
+
+          // 1. Schedule phenotype update by wrapping them in a single tick (requestAnimationFrame)
+          Nucleus.tick.call($root, function() {
+            // At this point, Nucleus._queue contains all the nodes that have been touched since the last tick.
+            // We process each node one by one to determine whether to update phenotype and whether to auto-trigger $update().
+
+            // Note: If we're in a middle of multiple nested function calls (fnA calls fnB calls fnC), the queue will be processed from the first function (fnA) only,
+            // This is because the Nucleus._queue will have been drained empty by the time the second function (fnB)'s Nucleus.tick.call reaches this point.
+            Nucleus._queue.forEach(function($node) {
+              var needs_update = false;
+              /*
+               *  At this point, $node.Dirty looks something like this:
+               *  { "_index": 1, "_items": [0,1,2]  }
+               *
+               *  We go through each and compare with the latest version of the Genotype.
+               *  If there's been a change we set the Phenotype and mark it as "needs_update"
+               */
+              for (var key in $node.Dirty) {
+                if (Gene.freeze($node.Genotype[key]) !== $node.Dirty[key]) { // Update phenotype if the new value is different from old (Dirty)
+                  Phenotype.set($node, key, $node.Genotype[key]);
+                  if (key[0] === '_') { needs_update = true; } // If any of the _ variables have changed, need to call $update
+                }
+              }
+              if (needs_update && '$update' in $node.Genotype && (typeof $node.Genotype.$update === 'function')) {
+                Phenotype.$update($node);
+              } else { $node.Dirty = null; }
+            });
+
+            // Remove the $node from the queue
+            var index = Nucleus._queue.indexOf($node);
+            if (index !== -1) Nucleus._queue.splice(index, 1);
+          });
+
+          // 2. Run the actual function, which will modify the queue
+          return v.apply($node, arguments);
+        };
+        fun.snapshot = v;
+        return fun;
+      } else {
+        return v;
+      }
+    },
+    queue: function($node, key, mode) {
+      var val = $node.Genotype[key];
+      if (mode === 'r') {
+        /*
+         * Read mode access => the key was queued as a result of a "get()", which doesn't normally mutate the variable.
+         *
+         * But we still need to take into account the cases where its descendants get mutated, which happens when we're dealing with an array or an object. For example:
+         *  - this._items.push(item);
+         *  - this._module.name="cell";
+         *
+         * In these cases we didn't directly mutate the variables (Direct mutations would have been something like: this._items=[1,2]; or this._module={name: "cell"};)
+         * but each variable's value *did* change as a result of each expression. To make sure we don't miss these types, we queue them up with a "r" (read) type.
+         * But we only need to do this for objects and arrays. (not string, number, etc. because they can't have descendants)
+         */
+        if (typeof val !== 'object' && !Array.isArray(val)) return;
+      }
+      if (Nucleus._queue.indexOf($node) === -1) { Nucleus._queue.push($node); }
+      if (!$node.Dirty) $node.Dirty = {};
+      if (!(key in $node.Dirty)) {
+        /*
+         * Caches the original gene under $node.Dirty when a key is touched.
+         *
+         * {
+         *   Dirty: {
+         *     "_index": 1,
+         *     "_items": [0,1,2]
+         *   }
+         * }
+         *
+         */
+        $node.Dirty[key] = Gene.freeze($node.Genotype[key]); // stores the original value under "Dirty"
+      }
+    },
+  };
+  var God = {
+    /*
+     * The Creator
+     * The only purpose of this module is to create cells and get out of the way.
+     */
+    detect: function($context) {
+      // takes a context, returns all the objects containing thew '$cell' key
+      if ($context === undefined) $context = this;
+      return Object.keys($context).filter(function(k) {
+        try {
+          if (/webkitStorageInfo|webkitIndexedDB/.test(k) || $context[k] instanceof $root.Element) return false; // Only look for plain javascript object
+          return $context[k] && Object.prototype.hasOwnProperty.call($context[k], '$cell');
+        } catch (e) { return false; }
+      }).map(function(k) {
+        return $context[k];
+      });
+    },
+    plan: function($context) {
+      // Prepare the DOM for cell creation by adding prototype methods to nodes.
+      // As a result, all HTML elements become autonomous.
+      if ($context === undefined) $context = $root;
+      else $root = $context;
+      $context.DocumentFragment.prototype.$build = $context.Element.prototype.$build = function(gene, inheritance, index, namespace, replace) {
+        var $node = Membrane.build(this, gene, index, namespace, replace);
+        Genotype.build($node, gene, inheritance || [], index);
+        Nucleus.build($node);
+        Phenotype.build($node, $node.Genotype);
+        return $node;
+      };
+      $context.DocumentFragment.prototype.$cell = $context.Element.prototype.$cell = function(gene, options) {
+        return this.$build(gene, [], null, (options && options.namespace) || null, true);
+      };
+      $context.DocumentFragment.prototype.$snapshot = $context.Element.prototype.$snapshot = function() {
+        var json = JSON.stringify(this.Genotype, function(k, v) {
+          if (typeof v === 'function' && v.snapshot) { return '(' + v.snapshot.toString() + ')'; }
+          return v;
+        });
+        return JSON.parse(json, function(k, v) {
+          if (typeof v === 'string' && v.indexOf('function') >= 0) { return eval(v); }
+          return v;
+        });
+      };
+      if ($root.NodeList && !$root.NodeList.prototype.forEach) $root.NodeList.prototype.forEach = Array.prototype.forEach; // NodeList.forEach override polyfill
+    },
+    create: function($context) {
+      // Automatic cell generation based on declarative rules
+      return God.detect($context).map(function(gene) {
+        return $context.document.body.$build(gene, []);
+      });
+    },
+  };
+
+  // For testing
+  if (typeof exports !== 'undefined') {
+    var x = {
+      Phenotype: Phenotype,
+      Genotype: Genotype,
+      Nucleus: Nucleus,
+      Gene: Gene,
+      Membrane: Membrane,
+      God: God,
+      plan: God.plan.bind(God),
+      create: God.create.bind(God),
+    };
+    if (typeof module !== 'undefined' && module.exports) { exports = module.exports = x; }
+    exports = x;
+  } else {
+    God.plan(this);
+    if (this.addEventListener) {
+      // Let there be Cell
+      this.addEventListener('load', function() {
+        God.create(this);
+      });
+    }
+  }
+}(this));

File diff suppressed because it is too large
+ 30 - 0
public/web/lib/he.js


+ 14484 - 0
public/web/lib/mdc/dist/material-components-web.css

@@ -0,0 +1,14484 @@
+/*!
+ Material Components for the web
+ Copyright (c) 2017 Google Inc.
+ License: Apache-2.0
+*/
+.mdc-animation-deceleration-curve {
+  -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+          animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+
+.mdc-animation-standard-curve {
+  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+          animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+
+.mdc-animation-acceleration-curve {
+  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
+          animation-timing-function: cubic-bezier(0.4, 0, 1, 1); }
+
+.mdc-animation-sharp-curve {
+  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
+          animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1); }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@-webkit-keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@-webkit-keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@-webkit-keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+.mdc-button {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87);
+  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  display: inline-block;
+  position: relative;
+  min-width: 64px;
+  height: 36px;
+  padding: 0 16px;
+  border: none;
+  border-radius: 2px;
+  outline: none;
+  background: transparent;
+  font-size: 14px;
+  font-weight: 500;
+  letter-spacing: .04em;
+  line-height: 36px;
+  text-align: center;
+  text-decoration: none;
+  text-transform: uppercase;
+  overflow: hidden;
+  vertical-align: middle;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-appearance: none; }
+  .mdc-button:not(.mdc-ripple-upgraded):hover::before, .mdc-button:not(.mdc-ripple-upgraded):focus::before, .mdc-button:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-button::before {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-button.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-button.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-button.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-button.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-button::after {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-button.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-button:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-button.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-button.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-button.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-button:not(.mdc-ripple-upgraded) {
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0.18); }
+  .mdc-button--theme-dark,
+  .mdc-theme--dark .mdc-button {
+    --mdc-ripple-surface-width: 0;
+    --mdc-ripple-surface-height: 0;
+    --mdc-ripple-fg-size: 0;
+    --mdc-ripple-left: 0;
+    --mdc-ripple-top: 0;
+    --mdc-ripple-fg-scale: 1;
+    --mdc-ripple-fg-translate-end: 0;
+    --mdc-ripple-fg-translate-start: 0;
+    will-change: transform, opacity;
+    -webkit-tap-highlight-color: transparent;
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-button--theme-dark:not(.mdc-ripple-upgraded):hover::before, .mdc-button--theme-dark:not(.mdc-ripple-upgraded):focus::before, .mdc-button--theme-dark:not(.mdc-ripple-upgraded):active::after,
+    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):hover::before,
+    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):focus::before,
+    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):active::after {
+      -webkit-transition-duration: 85ms;
+              transition-duration: 85ms;
+      opacity: .6; }
+    .mdc-button--theme-dark::before,
+    .mdc-theme--dark .mdc-button::before {
+      background-color: rgba(255, 255, 255, 0.14);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded::before,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded::before {
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--background-focused::before,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--background-focused::before {
+      opacity: .99999; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--background-active-fill::before,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--background-active-fill::before {
+      -webkit-transition-duration: 120ms;
+              transition-duration: 120ms;
+      opacity: 1; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--unbounded::before,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--unbounded::before {
+      /* @alternate */
+      top: calc(50% - 50%);
+      top: var(--mdc-ripple-top, calc(50% - 50%));
+      /* @alternate */
+      left: calc(50% - 50%);
+      left: var(--mdc-ripple-left, calc(50% - 50%));
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button--theme-dark::after,
+    .mdc-theme--dark .mdc-button::after {
+      background-color: rgba(255, 255, 255, 0.14);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded::after,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-button--theme-dark:not(.mdc-ripple-upgraded--unbounded)::after,
+    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--unbounded::after,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--foreground-activation::after,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-button--theme-dark.mdc-ripple-upgraded--foreground-deactivation::after,
+    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+    .mdc-button--theme-dark:not(.mdc-ripple-upgraded),
+    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded) {
+      -webkit-tap-highlight-color: rgba(255, 255, 255, 0.18); }
+  .mdc-button.mdc-button--primary {
+    --mdc-ripple-surface-width: 0;
+    --mdc-ripple-surface-height: 0;
+    --mdc-ripple-fg-size: 0;
+    --mdc-ripple-left: 0;
+    --mdc-ripple-top: 0;
+    --mdc-ripple-fg-scale: 1;
+    --mdc-ripple-fg-translate-end: 0;
+    --mdc-ripple-fg-translate-start: 0;
+    will-change: transform, opacity;
+    -webkit-tap-highlight-color: transparent; }
+    .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):hover::before, .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):focus::before, .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):active::after {
+      -webkit-transition-duration: 85ms;
+              transition-duration: 85ms;
+      opacity: .6; }
+    .mdc-button.mdc-button--primary::before {
+      /* @alternate */
+      background-color: rgba(63, 81, 181, 0.12);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+      @supports (background-color: color(green a(10%))) {
+        .mdc-button.mdc-button--primary::before {
+          background-color: color(var(--mdc-theme-primary, #3f51b5) a(12%)); } }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded::before {
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--background-focused::before {
+      opacity: .99999; }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--background-active-fill::before {
+      -webkit-transition-duration: 120ms;
+              transition-duration: 120ms;
+      opacity: 1; }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--unbounded::before {
+      /* @alternate */
+      top: calc(50% - 50%);
+      top: var(--mdc-ripple-top, calc(50% - 50%));
+      /* @alternate */
+      left: calc(50% - 50%);
+      left: var(--mdc-ripple-left, calc(50% - 50%));
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button.mdc-button--primary::after {
+      /* @alternate */
+      background-color: rgba(63, 81, 181, 0.12);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+      @supports (background-color: color(green a(10%))) {
+        .mdc-button.mdc-button--primary::after {
+          background-color: color(var(--mdc-theme-primary, #3f51b5) a(12%)); } }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-button.mdc-button--accent {
+    --mdc-ripple-surface-width: 0;
+    --mdc-ripple-surface-height: 0;
+    --mdc-ripple-fg-size: 0;
+    --mdc-ripple-left: 0;
+    --mdc-ripple-top: 0;
+    --mdc-ripple-fg-scale: 1;
+    --mdc-ripple-fg-translate-end: 0;
+    --mdc-ripple-fg-translate-start: 0;
+    will-change: transform, opacity;
+    -webkit-tap-highlight-color: transparent; }
+    .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):hover::before, .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):focus::before, .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):active::after {
+      -webkit-transition-duration: 85ms;
+              transition-duration: 85ms;
+      opacity: .6; }
+    .mdc-button.mdc-button--accent::before {
+      /* @alternate */
+      background-color: rgba(255, 64, 129, 0.12);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+      @supports (background-color: color(green a(10%))) {
+        .mdc-button.mdc-button--accent::before {
+          background-color: color(var(--mdc-theme-accent, #ff4081) a(12%)); } }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded::before {
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--background-focused::before {
+      opacity: .99999; }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--background-active-fill::before {
+      -webkit-transition-duration: 120ms;
+              transition-duration: 120ms;
+      opacity: 1; }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--unbounded::before {
+      /* @alternate */
+      top: calc(50% - 50%);
+      top: var(--mdc-ripple-top, calc(50% - 50%));
+      /* @alternate */
+      left: calc(50% - 50%);
+      left: var(--mdc-ripple-left, calc(50% - 50%));
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-button.mdc-button--accent::after {
+      /* @alternate */
+      background-color: rgba(255, 64, 129, 0.12);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+      @supports (background-color: color(green a(10%))) {
+        .mdc-button.mdc-button--accent::after {
+          background-color: color(var(--mdc-theme-accent, #ff4081) a(12%)); } }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-button:active {
+    outline: none; }
+  .mdc-button:hover {
+    cursor: pointer; }
+  .mdc-button::-moz-focus-inner {
+    padding: 0;
+    border: 0; }
+  .mdc-button--dense {
+    height: 32px;
+    font-size: .8125rem;
+    line-height: 32px; }
+  .mdc-button--raised {
+    -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+    -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+    will-change: box-shadow;
+    min-width: 88px; }
+    .mdc-button--raised:active {
+      -webkit-box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
+              box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }
+    .mdc-button--raised.mdc-button--primary {
+      --mdc-ripple-surface-width: 0;
+      --mdc-ripple-surface-height: 0;
+      --mdc-ripple-fg-size: 0;
+      --mdc-ripple-left: 0;
+      --mdc-ripple-top: 0;
+      --mdc-ripple-fg-scale: 1;
+      --mdc-ripple-fg-translate-end: 0;
+      --mdc-ripple-fg-translate-start: 0;
+      will-change: transform, opacity;
+      -webkit-tap-highlight-color: transparent; }
+      .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):hover::before, .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):focus::before, .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):active::after {
+        -webkit-transition-duration: 85ms;
+                transition-duration: 85ms;
+        opacity: .6; }
+      .mdc-button--raised.mdc-button--primary::before {
+        background-color: rgba(255, 255, 255, 0.14);
+        position: absolute;
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        -webkit-transition: opacity 250ms linear;
+        transition: opacity 250ms linear;
+        border-radius: 50%;
+        opacity: 0;
+        pointer-events: none;
+        content: ""; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded::before {
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        /* @alternate */
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--background-focused::before {
+        opacity: .99999; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--background-active-fill::before {
+        -webkit-transition-duration: 120ms;
+                transition-duration: 120ms;
+        opacity: 1; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--unbounded::before {
+        /* @alternate */
+        top: calc(50% - 50%);
+        top: var(--mdc-ripple-top, calc(50% - 50%));
+        /* @alternate */
+        left: calc(50% - 50%);
+        left: var(--mdc-ripple-left, calc(50% - 50%));
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+      .mdc-button--raised.mdc-button--primary::after {
+        background-color: rgba(255, 255, 255, 0.14);
+        position: absolute;
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        -webkit-transition: opacity 250ms linear;
+        transition: opacity 250ms linear;
+        border-radius: 50%;
+        opacity: 0;
+        pointer-events: none;
+        content: ""; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded::after {
+        top: 0;
+        left: 0;
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform-origin: center center;
+                transform-origin: center center;
+        opacity: 0; }
+      .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded--unbounded)::after {
+        -webkit-transform-origin: center center;
+                transform-origin: center center; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--unbounded::after {
+        /* @alternate */
+        top: 0;
+        top: var(--mdc-ripple-top, 0);
+        /* @alternate */
+        left: 0;
+        left: var(--mdc-ripple-left, 0);
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform-origin: center center;
+                transform-origin: center center; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--foreground-activation::after {
+        -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+                animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--foreground-deactivation::after {
+        -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+                transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+        -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+                animation: 83ms mdc-ripple-fg-opacity-out; }
+    .mdc-button--raised.mdc-button--accent {
+      --mdc-ripple-surface-width: 0;
+      --mdc-ripple-surface-height: 0;
+      --mdc-ripple-fg-size: 0;
+      --mdc-ripple-left: 0;
+      --mdc-ripple-top: 0;
+      --mdc-ripple-fg-scale: 1;
+      --mdc-ripple-fg-translate-end: 0;
+      --mdc-ripple-fg-translate-start: 0;
+      will-change: transform, opacity;
+      -webkit-tap-highlight-color: transparent; }
+      .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):hover::before, .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):focus::before, .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):active::after {
+        -webkit-transition-duration: 85ms;
+                transition-duration: 85ms;
+        opacity: .6; }
+      .mdc-button--raised.mdc-button--accent::before {
+        background-color: rgba(255, 255, 255, 0.14);
+        position: absolute;
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        -webkit-transition: opacity 250ms linear;
+        transition: opacity 250ms linear;
+        border-radius: 50%;
+        opacity: 0;
+        pointer-events: none;
+        content: ""; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded::before {
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        /* @alternate */
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--background-focused::before {
+        opacity: .99999; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--background-active-fill::before {
+        -webkit-transition-duration: 120ms;
+                transition-duration: 120ms;
+        opacity: 1; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--unbounded::before {
+        /* @alternate */
+        top: calc(50% - 50%);
+        top: var(--mdc-ripple-top, calc(50% - 50%));
+        /* @alternate */
+        left: calc(50% - 50%);
+        left: var(--mdc-ripple-left, calc(50% - 50%));
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+      .mdc-button--raised.mdc-button--accent::after {
+        background-color: rgba(255, 255, 255, 0.14);
+        position: absolute;
+        top: calc(50% - 100%);
+        left: calc(50% - 100%);
+        width: 200%;
+        height: 200%;
+        -webkit-transition: opacity 250ms linear;
+        transition: opacity 250ms linear;
+        border-radius: 50%;
+        opacity: 0;
+        pointer-events: none;
+        content: ""; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded::after {
+        top: 0;
+        left: 0;
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform-origin: center center;
+                transform-origin: center center;
+        opacity: 0; }
+      .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded--unbounded)::after {
+        -webkit-transform-origin: center center;
+                transform-origin: center center; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--unbounded::after {
+        /* @alternate */
+        top: 0;
+        top: var(--mdc-ripple-top, 0);
+        /* @alternate */
+        left: 0;
+        left: var(--mdc-ripple-left, 0);
+        /* @alternate */
+        width: 100%;
+        width: var(--mdc-ripple-fg-size, 100%);
+        /* @alternate */
+        height: 100%;
+        height: var(--mdc-ripple-fg-size, 100%);
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transform-origin: center center;
+                transform-origin: center center; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--foreground-activation::after {
+        -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+                animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--foreground-deactivation::after {
+        -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+                transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+        -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+                animation: 83ms mdc-ripple-fg-opacity-out; }
+    .mdc-button--theme-dark .mdc-button--raised,
+    .mdc-theme--dark .mdc-button--raised {
+      /* @alternate */
+      background-color: #3f51b5;
+      background-color: var(--mdc-theme-primary, #3f51b5);
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-primary, white); }
+      .mdc-button--theme-dark .mdc-button--raised::before,
+      .mdc-theme--dark .mdc-button--raised::before {
+        color: black; }
+  .mdc-button--primary {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+    .mdc-button--theme-dark .mdc-button--primary,
+    .mdc-theme--dark .mdc-button--primary {
+      /* @alternate */
+      color: #3f51b5;
+      color: var(--mdc-theme-primary, #3f51b5); }
+    .mdc-button--primary.mdc-button--raised {
+      /* @alternate */
+      background-color: #3f51b5;
+      background-color: var(--mdc-theme-primary, #3f51b5);
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-primary, white); }
+      .mdc-button--primary.mdc-button--raised::before {
+        color: black; }
+  .mdc-button--accent {
+    /* @alternate */
+    color: #ff4081;
+    color: var(--mdc-theme-accent, #ff4081); }
+    .mdc-button--theme-dark .mdc-button--accent,
+    .mdc-theme--dark .mdc-button--accent {
+      /* @alternate */
+      color: #ff4081;
+      color: var(--mdc-theme-accent, #ff4081); }
+    .mdc-button--accent.mdc-button--raised {
+      /* @alternate */
+      background-color: #ff4081;
+      background-color: var(--mdc-theme-accent, #ff4081);
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-accent, white); }
+      .mdc-button--accent.mdc-button--raised::before {
+        color: black; }
+  .mdc-button--compact {
+    padding: 0 8px; }
+  fieldset:disabled .mdc-button, .mdc-button:disabled {
+    color: rgba(0, 0, 0, 0.26);
+    cursor: default;
+    pointer-events: none; }
+    .mdc-button--theme-dark fieldset:disabled .mdc-button,
+    .mdc-theme--dark fieldset:disabled .mdc-button, .mdc-button--theme-dark .mdc-button:disabled,
+    .mdc-theme--dark .mdc-button:disabled {
+      color: rgba(255, 255, 255, 0.3); }
+  fieldset:disabled .mdc-button--raised, .mdc-button--raised:disabled {
+    -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+    background-color: rgba(0, 0, 0, 0.12);
+    pointer-events: none; }
+    .mdc-button--theme-dark fieldset:disabled .mdc-button--raised,
+    .mdc-theme--dark fieldset:disabled .mdc-button--raised, .mdc-button--theme-dark .mdc-button--raised:disabled,
+    .mdc-theme--dark .mdc-button--raised:disabled {
+      background-color: rgba(255, 255, 255, 0.12); }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+.mdc-card {
+  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-orient: vertical;
+  -webkit-box-direction: normal;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-box-pack: end;
+      -ms-flex-pack: end;
+          justify-content: flex-end;
+  padding: 0;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  border-radius: 2px;
+  overflow: hidden; }
+  .mdc-card__primary {
+    padding: 16px; }
+    .mdc-card__primary .mdc-card__title--large {
+      padding-top: 8px; }
+    .mdc-card__primary:last-child {
+      padding-bottom: 24px; }
+  .mdc-card__supporting-text {
+    padding: 8px 16px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+    .mdc-card--theme-dark .mdc-card__supporting-text,
+    .mdc-theme--dark .mdc-card__supporting-text {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-card__primary + .mdc-card__supporting-text {
+      margin-top: -8px;
+      padding-top: 0; }
+    .mdc-card__supporting-text:last-child {
+      padding-bottom: 24px; }
+  .mdc-card__actions {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    padding: 8px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+    .mdc-card--theme-dark .mdc-card__actions,
+    .mdc-theme--dark .mdc-card__actions {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-card__actions .mdc-card__action {
+      margin: 0 8px 0 0; }
+      [dir="rtl"] .mdc-card__actions .mdc-card__action, .mdc-card__actions .mdc-card__action[dir="rtl"] {
+        margin: 0 0 0 8px; }
+    .mdc-card__actions .mdc-card__action:last-child {
+      margin-left: 0;
+      margin-right: 0; }
+      [dir="rtl"] .mdc-card__actions .mdc-card__action:last-child, .mdc-card__actions .mdc-card__action:last-child[dir="rtl"] {
+        margin-left: 0;
+        margin-right: 0; }
+    .mdc-card__actions--vertical {
+      -webkit-box-orient: vertical;
+      -webkit-box-direction: normal;
+          -ms-flex-flow: column;
+              flex-flow: column;
+      -webkit-box-align: start;
+          -ms-flex-align: start;
+              align-items: flex-start; }
+      .mdc-card__actions--vertical .mdc-card__action {
+        margin: 0 0 4px; }
+      .mdc-card__actions--vertical .mdc-card__action:last-child {
+        margin-bottom: 0; }
+  .mdc-card__media {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column;
+    -webkit-box-pack: end;
+        -ms-flex-pack: end;
+            justify-content: flex-end;
+    padding: 16px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+  .mdc-card__media-item {
+    display: inline-block;
+    width: auto;
+    height: 80px;
+    margin: 16px 0 0;
+    padding: 0; }
+    .mdc-card__media-item--1dot5x {
+      width: auto;
+      height: 120px; }
+    .mdc-card__media-item--2x {
+      width: auto;
+      height: 160px; }
+    .mdc-card__media-item--3x {
+      width: auto;
+      height: 240px; }
+  .mdc-card__title {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 500;
+    letter-spacing: 0.04em;
+    line-height: 1.5rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+    margin: -.063rem 0; }
+    .mdc-card--theme-dark .mdc-card__title,
+    .mdc-theme--dark .mdc-card__title {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-card__title--large {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 1.5rem;
+    font-weight: 400;
+    letter-spacing: normal;
+    line-height: 2rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    margin: 0; }
+  .mdc-card__subtitle {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+    margin: -.063rem 0; }
+    .mdc-card--theme-dark .mdc-card__subtitle,
+    .mdc-theme--dark .mdc-card__subtitle {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-card__horizontal-block {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -webkit-box-align: start;
+        -ms-flex-align: start;
+            align-items: flex-start;
+    -webkit-box-pack: justify;
+        -ms-flex-pack: justify;
+            justify-content: space-between;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    padding: 0;
+    padding-left: 0;
+    padding-right: 16px; }
+    [dir="rtl"] .mdc-card__horizontal-block, .mdc-card__horizontal-block[dir="rtl"] {
+      padding-left: 16px;
+      padding-right: 0; }
+    .mdc-card__horizontal-block .mdc-card__actions--vertical {
+      margin: 16px; }
+    .mdc-card__horizontal-block .mdc-card__media-item {
+      margin-left: 16px;
+      margin-right: 0; }
+      [dir="rtl"] .mdc-card__horizontal-block .mdc-card__media-item, .mdc-card__horizontal-block .mdc-card__media-item[dir="rtl"] {
+        margin-left: 0;
+        margin-right: 16px; }
+    .mdc-card__horizontal-block .mdc-card__media-item--3x {
+      margin-bottom: 16px; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/* Manual calculation done on SVG */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* Manual calculation done on SVG */
+@-webkit-keyframes mdc-checkbox-fade-in-background {
+  0% {
+    border-color: rgba(0, 0, 0, 0.54);
+    background-color: transparent; }
+  50% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); } }
+@keyframes mdc-checkbox-fade-in-background {
+  0% {
+    border-color: rgba(0, 0, 0, 0.54);
+    background-color: transparent; }
+  50% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); } }
+
+@-webkit-keyframes mdc-checkbox-fade-out-background {
+  0%,
+  80% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  100% {
+    border-color: rgba(0, 0, 0, 0.54);
+    background-color: transparent; } }
+
+@keyframes mdc-checkbox-fade-out-background {
+  0%,
+  80% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  100% {
+    border-color: rgba(0, 0, 0, 0.54);
+    background-color: transparent; } }
+
+@-webkit-keyframes mdc-checkbox-fade-in-background-dark {
+  0% {
+    border-color: white;
+    background-color: transparent; }
+  50% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); } }
+
+@keyframes mdc-checkbox-fade-in-background-dark {
+  0% {
+    border-color: white;
+    background-color: transparent; }
+  50% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); } }
+
+@-webkit-keyframes mdc-checkbox-fade-out-background-dark {
+  0%,
+  80% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  100% {
+    border-color: white;
+    background-color: transparent; } }
+
+@keyframes mdc-checkbox-fade-out-background-dark {
+  0%,
+  80% {
+    /* @alternate */
+    border-color: #3f51b5;
+    border-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  100% {
+    border-color: white;
+    background-color: transparent; } }
+
+@-webkit-keyframes mdc-checkbox-unchecked-checked-checkmark-path {
+  0%,
+  50% {
+    stroke-dashoffset: 29.78334; }
+  50% {
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  100% {
+    stroke-dashoffset: 0; } }
+
+@keyframes mdc-checkbox-unchecked-checked-checkmark-path {
+  0%,
+  50% {
+    stroke-dashoffset: 29.78334; }
+  50% {
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  100% {
+    stroke-dashoffset: 0; } }
+
+@-webkit-keyframes mdc-checkbox-unchecked-indeterminate-mixedmark {
+  0%,
+  68.2% {
+    -webkit-transform: scaleX(0);
+            transform: scaleX(0); }
+  68.2% {
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0, 1); }
+  100% {
+    -webkit-transform: scaleX(1);
+            transform: scaleX(1); } }
+
+@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark {
+  0%,
+  68.2% {
+    -webkit-transform: scaleX(0);
+            transform: scaleX(0); }
+  68.2% {
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0, 1); }
+  100% {
+    -webkit-transform: scaleX(1);
+            transform: scaleX(1); } }
+
+@-webkit-keyframes mdc-checkbox-checked-unchecked-checkmark-path {
+  from {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
+    opacity: 1;
+    stroke-dashoffset: 0; }
+  to {
+    opacity: 0;
+    stroke-dashoffset: -29.78334; } }
+
+@keyframes mdc-checkbox-checked-unchecked-checkmark-path {
+  from {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
+    opacity: 1;
+    stroke-dashoffset: 0; }
+  to {
+    opacity: 0;
+    stroke-dashoffset: -29.78334; } }
+
+@-webkit-keyframes mdc-checkbox-checked-indeterminate-checkmark {
+  from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1;
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  to {
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg);
+    opacity: 0; } }
+
+@keyframes mdc-checkbox-checked-indeterminate-checkmark {
+  from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1;
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  to {
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg);
+    opacity: 0; } }
+
+@-webkit-keyframes mdc-checkbox-indeterminate-checked-checkmark {
+  from {
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg);
+    opacity: 0;
+    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
+  to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+    opacity: 1; } }
+
+@keyframes mdc-checkbox-indeterminate-checked-checkmark {
+  from {
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg);
+    opacity: 0;
+    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
+  to {
+    -webkit-transform: rotate(360deg);
+            transform: rotate(360deg);
+    opacity: 1; } }
+
+@-webkit-keyframes mdc-checkbox-checked-indeterminate-mixedmark {
+  from {
+    -webkit-transform: rotate(-45deg);
+            transform: rotate(-45deg);
+    opacity: 0;
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  to {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1; } }
+
+@keyframes mdc-checkbox-checked-indeterminate-mixedmark {
+  from {
+    -webkit-transform: rotate(-45deg);
+            transform: rotate(-45deg);
+    opacity: 0;
+    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+  to {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1; } }
+
+@-webkit-keyframes mdc-checkbox-indeterminate-checked-mixedmark {
+  from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1;
+    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
+  to {
+    -webkit-transform: rotate(315deg);
+            transform: rotate(315deg);
+    opacity: 0; } }
+
+@keyframes mdc-checkbox-indeterminate-checked-mixedmark {
+  from {
+    -webkit-transform: rotate(0deg);
+            transform: rotate(0deg);
+    opacity: 1;
+    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
+            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
+  to {
+    -webkit-transform: rotate(315deg);
+            transform: rotate(315deg);
+    opacity: 0; } }
+
+@-webkit-keyframes mdc-checkbox-indeterminate-unchecked-mixedmark {
+  0% {
+    -webkit-transform: scaleX(1);
+            transform: scaleX(1);
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  32.8%,
+  100% {
+    -webkit-transform: scaleX(0);
+            transform: scaleX(0);
+    opacity: 0; } }
+
+@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark {
+  0% {
+    -webkit-transform: scaleX(1);
+            transform: scaleX(1);
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  32.8%,
+  100% {
+    -webkit-transform: scaleX(0);
+            transform: scaleX(0);
+    opacity: 0; } }
+
+.mdc-checkbox {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  display: inline-block;
+  position: relative;
+  -webkit-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-box-flex: 0;
+      -ms-flex: 0 0 18px;
+          flex: 0 0 18px;
+  width: 18px;
+  height: 18px;
+  padding: 11px;
+  line-height: 0;
+  white-space: nowrap;
+  cursor: pointer;
+  vertical-align: bottom; }
+  .mdc-checkbox:not(.mdc-ripple-upgraded):hover::before, .mdc-checkbox:not(.mdc-ripple-upgraded):focus::before, .mdc-checkbox:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-checkbox::before {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-checkbox::before {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-checkbox.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-checkbox.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-checkbox.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-checkbox.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-checkbox::after {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-checkbox::after {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-checkbox.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-checkbox:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-checkbox.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-checkbox.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-checkbox.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-checkbox::before, .mdc-checkbox::after {
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%; }
+  .mdc-checkbox.mdc-ripple-upgraded--unbounded .mdc-checkbox__background::before {
+    content: none; }
+  .mdc-checkbox__background {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    left: 11px;
+    right: initial;
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    top: 11px;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    pointer-events: none;
+    width: 45%;
+    height: 45%;
+    -webkit-transition: background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border: 2px solid rgba(0, 0, 0, 0.54);
+    border-radius: 2px;
+    background-color: transparent;
+    will-change: background-color, border-color; }
+    [dir="rtl"] .mdc-checkbox .mdc-checkbox__background,
+    .mdc-checkbox[dir="rtl"] .mdc-checkbox__background {
+      left: initial;
+      right: 11px; }
+    .mdc-checkbox--theme-dark .mdc-checkbox__background,
+    .mdc-theme--dark .mdc-checkbox__background {
+      border-color: white; }
+    .mdc-checkbox__background::before {
+      position: absolute;
+      top: 0;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      -webkit-transform: scale(0, 0);
+              transform: scale(0, 0);
+      -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      border-radius: 50%;
+      content: "";
+      opacity: 0;
+      pointer-events: none;
+      will-change: opacity, transform;
+      /* @alternate */
+      background: #3f51b5;
+      background: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-checkbox__native-control {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+    cursor: inherit;
+    opacity: 0; }
+  .mdc-checkbox__checkmark {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    opacity: 0;
+    fill: white; }
+    .mdc-checkbox__checkmark__path {
+      -webkit-transition: stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      stroke: white !important;
+      stroke-width: 3.12px;
+      stroke-dashoffset: 29.78334;
+      stroke-dasharray: 29.78334; }
+  .mdc-checkbox__mixedmark {
+    width: 100%;
+    height: 2px;
+    -webkit-transform: scaleX(0) rotate(0deg);
+            transform: scaleX(0) rotate(0deg);
+    -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    background-color: white;
+    opacity: 0; }
+
+.mdc-checkbox__native-control:focus ~ .mdc-checkbox__background::before {
+  -webkit-transform: scale(2.75, 2.75);
+          transform: scale(2.75, 2.75);
+  -webkit-transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  opacity: .26; }
+
+.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background {
+  -webkit-transition: border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  /* @alternate */
+  border-color: #3f51b5;
+  border-color: var(--mdc-theme-primary, #3f51b5);
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark {
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: 1; }
+    .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark__path {
+      stroke-dashoffset: 0; }
+  .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__mixedmark {
+    -webkit-transform: scaleX(1) rotate(-45deg);
+            transform: scaleX(1) rotate(-45deg); }
+
+.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
+  /* @alternate */
+  border-color: #3f51b5;
+  border-color: var(--mdc-theme-primary, #3f51b5);
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark {
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg);
+    -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    opacity: 0; }
+    .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark__path {
+      stroke-dashoffset: 0; }
+  .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__mixedmark {
+    -webkit-transform: scaleX(1) rotate(0deg);
+            transform: scaleX(1) rotate(0deg);
+    opacity: 1; }
+
+.mdc-checkbox__native-control:disabled,
+fieldset:disabled .mdc-checkbox__native-control,
+[aria-disabled="true"] .mdc-checkbox__native-control {
+  cursor: default; }
+  .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background,
+  fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background,
+  [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background {
+    border-color: rgba(0, 0, 0, 0.26); }
+    .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background,
+    .mdc-theme--dark .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background {
+      border-color: rgba(255, 255, 255, 0.3); }
+  .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background, .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background,
+  fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
+  fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
+  [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
+  [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
+    border-color: transparent;
+    background-color: rgba(0, 0, 0, 0.26); }
+    .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background,
+    .mdc-theme--dark .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background,
+    .mdc-theme--dark .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
+    [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
+    .mdc-theme--dark
+    [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
+      background-color: rgba(255, 255, 255, 0.3); }
+
+.mdc-checkbox--disabled {
+  cursor: default;
+  pointer-events: none; }
+
+.mdc-checkbox--upgraded .mdc-checkbox__background,
+.mdc-checkbox--upgraded .mdc-checkbox__checkmark,
+.mdc-checkbox--upgraded .mdc-checkbox__checkmark__path,
+.mdc-checkbox--upgraded .mdc-checkbox__mixedmark {
+  -webkit-transition: none !important;
+  transition: none !important; }
+
+.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background, .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background {
+  -webkit-animation: mdc-checkbox-fade-in-background 180ms linear;
+          animation: mdc-checkbox-fade-in-background 180ms linear; }
+  .mdc-checkbox--theme-dark .mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,
+  .mdc-theme--dark .mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,
+  .mdc-theme--dark .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background {
+    -webkit-animation-name: mdc-checkbox-fade-in-background-dark;
+            animation-name: mdc-checkbox-fade-in-background-dark; }
+
+.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background, .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background {
+  -webkit-animation: mdc-checkbox-fade-out-background 180ms linear;
+          animation: mdc-checkbox-fade-out-background 180ms linear; }
+  .mdc-checkbox--theme-dark .mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,
+  .mdc-theme--dark .mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background,
+  .mdc-theme--dark .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background {
+    -webkit-animation-name: mdc-checkbox-fade-out-background-dark;
+            animation-name: mdc-checkbox-fade-out-background-dark; }
+
+.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark__path {
+  -webkit-animation: 180ms linear 0s mdc-checkbox-unchecked-checked-checkmark-path;
+          animation: 180ms linear 0s mdc-checkbox-unchecked-checked-checkmark-path;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark {
+  -webkit-animation: 90ms linear 0s mdc-checkbox-unchecked-indeterminate-mixedmark;
+          animation: 90ms linear 0s mdc-checkbox-unchecked-indeterminate-mixedmark;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark__path {
+  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-unchecked-checkmark-path;
+          animation: 90ms linear 0s mdc-checkbox-checked-unchecked-checkmark-path;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark {
+  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-checkmark;
+          animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-checkmark;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark {
+  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-mixedmark;
+          animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-mixedmark;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark {
+  -webkit-animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-checkmark;
+          animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-checkmark;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark {
+  -webkit-animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-mixedmark;
+          animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-mixedmark;
+  -webkit-transition: none;
+  transition: none; }
+
+.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark {
+  -webkit-animation: 300ms linear 0s mdc-checkbox-indeterminate-unchecked-mixedmark;
+          animation: 300ms linear 0s mdc-checkbox-indeterminate-unchecked-mixedmark;
+  -webkit-transition: none;
+  transition: none; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+:root {
+  --mdc-dialog-dark-theme-bg-color: #303030; }
+
+.mdc-dialog {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  position: fixed;
+  top: 0;
+  left: 0;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 100%;
+  height: 100%;
+  visibility: hidden;
+  z-index: 2; }
+  .mdc-dialog__backdrop {
+    position: fixed;
+    top: 0;
+    left: 0;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    width: 100%;
+    height: 100%;
+    /* @alternate */
+    background-color: rgba(0, 0, 0, 0.87);
+    background-color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+    opacity: 0;
+    z-index: -1; }
+  .mdc-dialog__surface {
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column;
+    -webkit-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
+    width: calc(100% - 30px);
+    min-width: 640px;
+    max-width: 865px;
+    -webkit-transform: translateY(150px) scale(0.8);
+            transform: translateY(150px) scale(0.8);
+    border-radius: 2px;
+    /* @alternate */
+    background-color: #fff;
+    background-color: var(--mdc-theme-background, #fff);
+    opacity: 0; }
+    .mdc-dialog--theme-dark .mdc-dialog__surface,
+    .mdc-theme--dark .mdc-dialog__surface {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white);
+      background-color: #303030;
+      background-color: var(--mdc-dialog-dark-theme-bg-color, #303030); }
+    [dir="rtl"] .mdc-dialog .mdc-dialog__surface,
+    .mdc-dialog[dir="rtl"] .mdc-dialog__surface {
+      text-align: right; }
+  .mdc-dialog__header {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    padding: 24px 24px 0; }
+    .mdc-dialog__header__empty {
+      padding: 0; }
+    [dir="rtl"] .mdc-dialog .mdc-dialog__header,
+    .mdc-dialog[dir="rtl"] .mdc-dialog__header {
+      text-align: right; }
+    .mdc-dialog__header__title {
+      -webkit-box-flex: 1;
+          -ms-flex: 1;
+              flex: 1;
+      margin: 0;
+      font-family: Roboto, sans-serif;
+      -moz-osx-font-smoothing: grayscale;
+      -webkit-font-smoothing: antialiased;
+      font-size: 1.25rem;
+      font-weight: 500;
+      letter-spacing: 0.02em;
+      line-height: 2rem;
+      text-decoration: inherit;
+      text-transform: inherit; }
+  .mdc-dialog__body {
+    margin-top: 20px;
+    padding: 0 24px 24px;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.54);
+    color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54));
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit; }
+    .mdc-dialog--theme-dark.mdc-dialog__body,
+    .mdc-theme--dark .mdc-dialog__body {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.7);
+      color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+    .mdc-dialog__body--scrollable {
+      max-height: 195px;
+      border-top: 1px solid rgba(0, 0, 0, 0.1);
+      border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+      overflow-y: scroll;
+      overflow-x: auto;
+      -webkit-overflow-scrolling: touch; }
+  .mdc-dialog__footer {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -ms-flex-wrap: wrap;
+        flex-wrap: wrap;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: end;
+        -ms-flex-pack: end;
+            justify-content: flex-end;
+    padding: 8px; }
+    .mdc-dialog__footer__button {
+      margin-left: 0;
+      margin-right: 8px; }
+      [dir="rtl"] .mdc-dialog__footer__button, .mdc-dialog__footer__button[dir="rtl"] {
+        margin-left: 8px;
+        margin-right: 0; }
+      .mdc-dialog__footer__button:last-child {
+        margin-left: 0;
+        margin-right: 0; }
+        [dir="rtl"] .mdc-dialog__footer__button:last-child, .mdc-dialog__footer__button:last-child[dir="rtl"] {
+          margin-left: 0;
+          margin-right: 0; }
+    .mdc-dialog__footer__action {
+      /* @alternate */
+      color: #ff4081;
+      color: var(--mdc-theme-accent, #ff4081); }
+  @media (max-width: 640px) {
+    .mdc-dialog {
+      min-width: 280px; }
+      .mdc-dialog__surface {
+        min-width: 280px; }
+      .mdc-dialog__body {
+        line-height: 24px; } }
+  .mdc-dialog--animating {
+    visibility: visible; }
+    .mdc-dialog--animating .mdc-dialog__backdrop {
+      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+    .mdc-dialog--animating .mdc-dialog--open .mdc-dialog__surface {
+      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+    .mdc-dialog--animating .mdc-dialog__surface {
+      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-dialog--open {
+    visibility: visible; }
+    .mdc-dialog--open .mdc-dialog__backdrop {
+      opacity: .3; }
+    .mdc-dialog--open .mdc-dialog__surface {
+      -webkit-transform: translateY(0) scale(1);
+              transform: translateY(0) scale(1);
+      opacity: 1; }
+
+.mdc-dialog-scroll-lock {
+  height: 100vh;
+  overflow: hidden; }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+:root {
+  --mdc-persistent-drawer-dark-theme-bg-color: #212121; }
+
+.mdc-persistent-drawer {
+  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
+  /* stylelint-disable selector-no-qualifying-type */
+  /* stylelint-enable selector-no-qualifying-type */
+  /* TODO(sgomes): Revisit when we have interactive lists. */
+  width: 0; }
+  .mdc-persistent-drawer__toolbar-spacer {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: relative;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -ms-flex-negative: 0;
+        flex-shrink: 0;
+    -webkit-box-align: flex-center;
+        -ms-flex-align: flex-center;
+            align-items: flex-center;
+    height: 56px;
+    padding: 16px;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    /* TODO(sgomes): replace with global breakpoints when we have them */ }
+    .mdc-persistent-drawer__toolbar-spacer--theme-dark .mdc-persistent-drawer__toolbar-spacer,
+    .mdc-theme--dark .mdc-persistent-drawer__toolbar-spacer {
+      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
+    @media (min-width: 600px) {
+      .mdc-persistent-drawer__toolbar-spacer {
+        height: 64px; } }
+  .mdc-persistent-drawer__header {
+    position: relative; }
+  .mdc-persistent-drawer__header::before {
+    display: block;
+    padding-top: 56.25%;
+    content: ""; }
+  .mdc-persistent-drawer__header-content {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    -webkit-box-align: end;
+        -ms-flex-align: end;
+            align-items: flex-end;
+    padding: 16px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+  .mdc-persistent-drawer .mdc-list-group,
+  .mdc-persistent-drawer .mdc-list {
+    padding-right: 0;
+    padding-left: 0; }
+  .mdc-persistent-drawer .mdc-list-item {
+    position: relative;
+    padding: 0 16px;
+    outline: none;
+    color: inherit;
+    text-decoration: none;
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 500;
+    letter-spacing: 0.04em;
+    line-height: 1.5rem;
+    text-decoration: inherit;
+    text-transform: inherit; }
+    .mdc-persistent-drawer .mdc-list-item.mdc-ripple-upgraded {
+      left: 0; }
+  .mdc-persistent-drawer .mdc-list-item__start-detail {
+    color: rgba(0, 0, 0, 0.54); }
+    .mdc-persistent-drawer .mdc-list-item__start-detail--theme-dark .mdc-persistent-drawer .mdc-list-item__start-detail,
+    .mdc-theme--dark .mdc-persistent-drawer .mdc-list-item__start-detail {
+      color: rgba(255, 255, 255, 0.54); }
+  .mdc-persistent-drawer--selected.mdc-list-item,
+  .mdc-persistent-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-persistent-drawer .mdc-list-item::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border-radius: inherit;
+    background: currentColor;
+    content: "";
+    opacity: 0; }
+  .mdc-persistent-drawer .mdc-list-item:focus::before {
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .12; }
+  .mdc-persistent-drawer .mdc-list-item:active::before {
+    /*
+      Slightly darker value for visual distinction.
+      This allows a full base that has distinct modes.
+      Progressive enhancement with ripples will provide complete button spec alignment.
+    */
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .18; }
+  .mdc-persistent-drawer .mdc-list-item:active:focus::before {
+    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  .mdc-persistent-drawer__drawer {
+    /* @alternate */
+    background: #fff;
+    background: var(--mdc-theme-background, #fff);
+    border-left: 0;
+    border-right: 1px solid #e4e4e4;
+    left: 0;
+    right: initial;
+    height: 100%;
+    -webkit-transform: translateX(-107%);
+            transform: translateX(-107%);
+    -webkit-transform: translateX(calc(-100% - 20px));
+            transform: translateX(calc(-100% - 20px));
+    will-change: transform;
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    width: 240px;
+    overflow: hidden;
+    -ms-touch-action: none;
+        touch-action: none; }
+    [dir="rtl"] .mdc-persistent-drawer__drawer, .mdc-persistent-drawer__drawer[dir="rtl"] {
+      border-left: 1px solid #e4e4e4;
+      border-right: 0; }
+    [dir="rtl"] .mdc-persistent-drawer__drawer, .mdc-persistent-drawer__drawer[dir="rtl"] {
+      left: initial;
+      right: 0; }
+    .mdc-persistent-drawer__drawer--theme-dark,
+    .mdc-theme--dark .mdc-persistent-drawer__drawer {
+      background-color: #212121;
+      background-color: var(--mdc-persistent-drawer-dark-theme-bg-color, #212121);
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white);
+      border-left: 0;
+      border-right: 1px solid rgba(255, 255, 255, 0.12); }
+      [dir="rtl"] .mdc-persistent-drawer__drawer--theme-dark, .mdc-persistent-drawer__drawer--theme-dark[dir="rtl"], [dir="rtl"]
+      .mdc-theme--dark .mdc-persistent-drawer__drawer,
+      .mdc-theme--dark .mdc-persistent-drawer__drawer[dir="rtl"] {
+        border-left: 1px solid rgba(255, 255, 255, 0.12);
+        border-right: 0; }
+    [dir="rtl"] .mdc-persistent-drawer .mdc-persistent-drawer__drawer,
+    .mdc-persistent-drawer[dir="rtl"] .mdc-persistent-drawer__drawer {
+      -webkit-transform: translateX(107%);
+              transform: translateX(107%);
+      -webkit-transform: translateX(calc(100% + 20px));
+              transform: translateX(calc(100% + 20px)); }
+  .mdc-persistent-drawer--animating .mdc-persistent-drawer__drawer {
+    -webkit-transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1); }
+  .mdc-persistent-drawer--animating.mdc-persistent-drawer--open .mdc-persistent-drawer__drawer {
+    -webkit-transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-persistent-drawer--open {
+    width: 240px;
+    pointer-events: auto; }
+    .mdc-persistent-drawer--open .mdc-persistent-drawer__drawer {
+      -webkit-transform: none;
+              transform: none; }
+    [dir="rtl"] .mdc-persistent-drawer--open .mdc-persistent-drawer__drawer, .mdc-persistent-drawer--open[dir="rtl"] .mdc-persistent-drawer__drawer {
+      -webkit-transform: none;
+              transform: none; }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+:root {
+  --mdc-permanent-drawer-dark-theme-bg-color: #212121; }
+
+.mdc-permanent-drawer {
+  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
+  /* stylelint-disable selector-no-qualifying-type */
+  /* stylelint-enable selector-no-qualifying-type */
+  /* TODO(sgomes): Revisit when we have interactive lists. */
+  /* @alternate */
+  background: #fff;
+  background: var(--mdc-theme-background, #fff);
+  border-left: 0;
+  border-right: 1px solid #e4e4e4;
+  left: 0;
+  right: initial;
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-box-orient: vertical;
+  -webkit-box-direction: normal;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-box-flex: 0;
+      -ms-flex: 0 0 auto;
+          flex: 0 0 auto;
+  width: 240px;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  overflow: hidden; }
+  .mdc-permanent-drawer__toolbar-spacer {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: relative;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -ms-flex-negative: 0;
+        flex-shrink: 0;
+    -webkit-box-align: flex-center;
+        -ms-flex-align: flex-center;
+            align-items: flex-center;
+    height: 56px;
+    padding: 16px;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    /* TODO(sgomes): replace with global breakpoints when we have them */ }
+    .mdc-permanent-drawer__toolbar-spacer--theme-dark .mdc-permanent-drawer__toolbar-spacer,
+    .mdc-theme--dark .mdc-permanent-drawer__toolbar-spacer {
+      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
+    @media (min-width: 600px) {
+      .mdc-permanent-drawer__toolbar-spacer {
+        height: 64px; } }
+  .mdc-permanent-drawer__header {
+    position: relative; }
+  .mdc-permanent-drawer__header::before {
+    display: block;
+    padding-top: 56.25%;
+    content: ""; }
+  .mdc-permanent-drawer__header-content {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    -webkit-box-align: end;
+        -ms-flex-align: end;
+            align-items: flex-end;
+    padding: 16px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+  .mdc-permanent-drawer .mdc-list-group,
+  .mdc-permanent-drawer .mdc-list {
+    padding-right: 0;
+    padding-left: 0; }
+  .mdc-permanent-drawer .mdc-list-item {
+    position: relative;
+    padding: 0 16px;
+    outline: none;
+    color: inherit;
+    text-decoration: none;
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 500;
+    letter-spacing: 0.04em;
+    line-height: 1.5rem;
+    text-decoration: inherit;
+    text-transform: inherit; }
+    .mdc-permanent-drawer .mdc-list-item.mdc-ripple-upgraded {
+      left: 0; }
+  .mdc-permanent-drawer .mdc-list-item__start-detail {
+    color: rgba(0, 0, 0, 0.54); }
+    .mdc-permanent-drawer .mdc-list-item__start-detail--theme-dark .mdc-permanent-drawer .mdc-list-item__start-detail,
+    .mdc-theme--dark .mdc-permanent-drawer .mdc-list-item__start-detail {
+      color: rgba(255, 255, 255, 0.54); }
+  .mdc-permanent-drawer--selected.mdc-list-item,
+  .mdc-permanent-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-permanent-drawer .mdc-list-item::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border-radius: inherit;
+    background: currentColor;
+    content: "";
+    opacity: 0; }
+  .mdc-permanent-drawer .mdc-list-item:focus::before {
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .12; }
+  .mdc-permanent-drawer .mdc-list-item:active::before {
+    /*
+      Slightly darker value for visual distinction.
+      This allows a full base that has distinct modes.
+      Progressive enhancement with ripples will provide complete button spec alignment.
+    */
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .18; }
+  .mdc-permanent-drawer .mdc-list-item:active:focus::before {
+    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  [dir="rtl"] .mdc-permanent-drawer, .mdc-permanent-drawer[dir="rtl"] {
+    border-left: 1px solid #e4e4e4;
+    border-right: 0; }
+  [dir="rtl"] .mdc-permanent-drawer, .mdc-permanent-drawer[dir="rtl"] {
+    left: initial;
+    right: 0; }
+  .mdc-permanent-drawer--theme-dark,
+  .mdc-theme--dark .mdc-permanent-drawer {
+    background-color: #212121;
+    background-color: var(--mdc-permanent-drawer-dark-theme-bg-color, #212121);
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white);
+    border-left: 0;
+    border-right: 1px solid rgba(255, 255, 255, 0.12); }
+    [dir="rtl"] .mdc-permanent-drawer--theme-dark, .mdc-permanent-drawer--theme-dark[dir="rtl"], [dir="rtl"]
+    .mdc-theme--dark .mdc-permanent-drawer,
+    .mdc-theme--dark .mdc-permanent-drawer[dir="rtl"] {
+      border-left: 1px solid rgba(255, 255, 255, 0.12);
+      border-right: 0; }
+  .mdc-permanent-drawer--floating {
+    background: none;
+    border-left: 0;
+    border-right: none; }
+    [dir="rtl"] .mdc-permanent-drawer--floating, .mdc-permanent-drawer--floating[dir="rtl"] {
+      border-left: none;
+      border-right: 0; }
+    .mdc-permanent-drawer--floating--theme-dark,
+    .mdc-theme--dark .mdc-permanent-drawer--floating {
+      background: none;
+      border-left: 0;
+      border-right: none; }
+      [dir="rtl"] .mdc-permanent-drawer--floating--theme-dark, .mdc-permanent-drawer--floating--theme-dark[dir="rtl"], [dir="rtl"]
+      .mdc-theme--dark .mdc-permanent-drawer--floating,
+      .mdc-theme--dark .mdc-permanent-drawer--floating[dir="rtl"] {
+        border-left: none;
+        border-right: 0; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+.mdc-temporary-drawer {
+  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
+  /* stylelint-disable selector-no-qualifying-type */
+  /* stylelint-enable selector-no-qualifying-type */
+  /* TODO(sgomes): Revisit when we have interactive lists. */
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  overflow: hidden;
+  pointer-events: none;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  contain: strict;
+  z-index: 5;
+  /* Shaded background */ }
+  .mdc-temporary-drawer__toolbar-spacer {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: relative;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: row;
+            flex-direction: row;
+    -ms-flex-negative: 0;
+        flex-shrink: 0;
+    -webkit-box-align: flex-center;
+        -ms-flex-align: flex-center;
+            align-items: flex-center;
+    height: 56px;
+    padding: 16px;
+    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    /* TODO(sgomes): replace with global breakpoints when we have them */ }
+    .mdc-temporary-drawer__toolbar-spacer--theme-dark .mdc-temporary-drawer__toolbar-spacer,
+    .mdc-theme--dark .mdc-temporary-drawer__toolbar-spacer {
+      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
+    @media (min-width: 600px) {
+      .mdc-temporary-drawer__toolbar-spacer {
+        height: 64px; } }
+  .mdc-temporary-drawer__header {
+    position: relative; }
+  .mdc-temporary-drawer__header::before {
+    display: block;
+    padding-top: 56.25%;
+    content: ""; }
+  .mdc-temporary-drawer__header-content {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    -webkit-box-align: end;
+        -ms-flex-align: end;
+            align-items: flex-end;
+    padding: 16px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+  .mdc-temporary-drawer .mdc-list-group,
+  .mdc-temporary-drawer .mdc-list {
+    padding-right: 0;
+    padding-left: 0; }
+  .mdc-temporary-drawer .mdc-list-item {
+    position: relative;
+    padding: 0 16px;
+    outline: none;
+    color: inherit;
+    text-decoration: none;
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 500;
+    letter-spacing: 0.04em;
+    line-height: 1.5rem;
+    text-decoration: inherit;
+    text-transform: inherit; }
+    .mdc-temporary-drawer .mdc-list-item.mdc-ripple-upgraded {
+      left: 0; }
+  .mdc-temporary-drawer .mdc-list-item__start-detail {
+    color: rgba(0, 0, 0, 0.54); }
+    .mdc-temporary-drawer .mdc-list-item__start-detail--theme-dark .mdc-temporary-drawer .mdc-list-item__start-detail,
+    .mdc-theme--dark .mdc-temporary-drawer .mdc-list-item__start-detail {
+      color: rgba(255, 255, 255, 0.54); }
+  .mdc-temporary-drawer--selected.mdc-list-item,
+  .mdc-temporary-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-temporary-drawer .mdc-list-item::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border-radius: inherit;
+    background: currentColor;
+    content: "";
+    opacity: 0; }
+  .mdc-temporary-drawer .mdc-list-item:focus::before {
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .12; }
+  .mdc-temporary-drawer .mdc-list-item:active::before {
+    /*
+      Slightly darker value for visual distinction.
+      This allows a full base that has distinct modes.
+      Progressive enhancement with ripples will provide complete button spec alignment.
+    */
+    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    opacity: .18; }
+  .mdc-temporary-drawer .mdc-list-item:active:focus::before {
+    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  .mdc-temporary-drawer::before {
+    display: block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background: rgba(0, 0, 0, 0.6);
+    content: "";
+    opacity: 0;
+    opacity: var(--mdc-temporary-drawer-opacity, 0);
+    will-change: opacity;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+  .mdc-temporary-drawer__drawer {
+    /* @alternate */
+    background: #fff;
+    background: var(--mdc-theme-background, #fff);
+    -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
+    left: 0;
+    right: initial;
+    height: 100%;
+    -webkit-transform: translateX(-107%);
+            transform: translateX(-107%);
+    -webkit-transform: translateX(calc(-100% - 20px));
+            transform: translateX(calc(-100% - 20px));
+    will-change: transform;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: absolute;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column;
+    width: calc(100% - 56px);
+    max-width: 280px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    overflow: hidden;
+    -ms-touch-action: none;
+        touch-action: none;
+    /* TODO(sgomes): replace with global breakpoints when we have them */ }
+    [dir="rtl"] .mdc-temporary-drawer__drawer, .mdc-temporary-drawer__drawer[dir="rtl"] {
+      left: initial;
+      right: 0; }
+    .mdc-temporary-drawer--theme-dark .mdc-temporary-drawer__drawer,
+    .mdc-theme--dark .mdc-temporary-drawer__drawer {
+      background: #303030;
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+    [dir="rtl"] .mdc-temporary-drawer .mdc-temporary-drawer__drawer,
+    .mdc-temporary-drawer[dir="rtl"] .mdc-temporary-drawer__drawer {
+      -webkit-transform: translateX(107%);
+              transform: translateX(107%);
+      -webkit-transform: translateX(calc(100% + 20px));
+              transform: translateX(calc(100% + 20px)); }
+    @media (min-width: 600px) {
+      .mdc-temporary-drawer__drawer {
+        width: calc(100% - 64px);
+        max-width: 320px; } }
+  .mdc-temporary-drawer__content {
+    -webkit-box-flex: 1;
+        -ms-flex-positive: 1;
+            flex-grow: 1;
+    margin: 0;
+    overflow-x: hidden;
+    overflow-y: auto;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    -webkit-overflow-scrolling: touch;
+    -ms-touch-action: pan-y;
+        touch-action: pan-y; }
+  .mdc-temporary-drawer__footer {
+    -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+    -ms-flex-negative: 0;
+        flex-shrink: 0; }
+  .mdc-temporary-drawer--animating::before {
+    -webkit-transition: opacity 0.3s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 0.3s 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-temporary-drawer--animating.mdc-temporary-drawer--open .mdc-temporary-drawer__drawer {
+    -webkit-transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-temporary-drawer--animating .mdc-temporary-drawer__drawer {
+    -webkit-transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1); }
+  .mdc-temporary-drawer--open {
+    pointer-events: auto; }
+    .mdc-temporary-drawer--open::before {
+      opacity: 1;
+      opacity: var(--mdc-temporary-drawer-opacity, 1); }
+    .mdc-temporary-drawer--open .mdc-temporary-drawer__drawer {
+      -webkit-transform: none;
+              transform: none; }
+    [dir="rtl"] .mdc-temporary-drawer--open .mdc-temporary-drawer__drawer, .mdc-temporary-drawer--open[dir="rtl"] .mdc-temporary-drawer__drawer {
+      -webkit-transform: none;
+              transform: none; }
+
+.mdc-drawer-scroll-lock {
+  height: 100vh;
+  overflow: hidden; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+.mdc-elevation--z0 {
+  -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z1 {
+  -webkit-box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z2 {
+  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z3 {
+  -webkit-box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z4 {
+  -webkit-box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z5 {
+  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z6 {
+  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z7 {
+  -webkit-box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z8 {
+  -webkit-box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z9 {
+  -webkit-box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z10 {
+  -webkit-box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z11 {
+  -webkit-box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z12 {
+  -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z13 {
+  -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z14 {
+  -webkit-box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z15 {
+  -webkit-box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z16 {
+  -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z17 {
+  -webkit-box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z18 {
+  -webkit-box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z19 {
+  -webkit-box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z20 {
+  -webkit-box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z21 {
+  -webkit-box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z22 {
+  -webkit-box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z23 {
+  -webkit-box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation--z24 {
+  -webkit-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); }
+
+.mdc-elevation-transition {
+  -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  will-change: box-shadow; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+.mdc-fab {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  position: relative;
+  -webkit-box-pack: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 56px;
+  height: 56px;
+  padding: 0;
+  -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  border: none;
+  border-radius: 50%;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  fill: currentColor;
+  -moz-appearance: none;
+  -webkit-appearance: none;
+  overflow: hidden;
+  /* @alternate */
+  background-color: #ff4081;
+  background-color: var(--mdc-theme-accent, #ff4081);
+  /* @alternate */
+  color: white;
+  color: var(--mdc-theme-text-primary-on-accent, white);
+  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }
+  .mdc-fab:not(.mdc-ripple-upgraded):hover::before, .mdc-fab:not(.mdc-ripple-upgraded):focus::before, .mdc-fab:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-fab::before {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-fab.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-fab.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-fab.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-fab.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-fab::after {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-fab.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-fab:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-fab.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-fab.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-fab.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-fab:not(.mdc-ripple-upgraded) {
+    -webkit-tap-highlight-color: rgba(0, 0, 0, 0.18); }
+  .mdc-fab--mini {
+    width: 40px;
+    height: 40px; }
+  .mdc-fab--plain {
+    background-color: white;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+    .mdc-fab--plain::before {
+      background-color: rgba(0, 0, 0, 0.06);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-fab--plain.mdc-ripple-upgraded::before {
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-fab--plain.mdc-ripple-upgraded--background-focused::before {
+      opacity: .99999; }
+    .mdc-fab--plain.mdc-ripple-upgraded--background-active-fill::before {
+      -webkit-transition-duration: 120ms;
+              transition-duration: 120ms;
+      opacity: 1; }
+    .mdc-fab--plain.mdc-ripple-upgraded--unbounded::before {
+      /* @alternate */
+      top: calc(50% - 50%);
+      top: var(--mdc-ripple-top, calc(50% - 50%));
+      /* @alternate */
+      left: calc(50% - 50%);
+      left: var(--mdc-ripple-left, calc(50% - 50%));
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+    .mdc-fab--plain::after {
+      background-color: rgba(0, 0, 0, 0.06);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-fab--plain.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-fab--plain:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-fab--plain.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-fab--plain.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-fab--plain.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-fab:active, .mdc-fab:focus {
+    outline: none; }
+  .mdc-fab:active {
+    -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }
+  .mdc-fab:hover {
+    cursor: pointer; }
+  .mdc-fab::-moz-focus-inner {
+    padding: 0;
+    border: 0; }
+  .mdc-fab > svg {
+    width: 100%; }
+  fieldset:disabled .mdc-fab, .mdc-fab:disabled {
+    background-color: rgba(0, 0, 0, 0.12);
+    color: rgba(0, 0, 0, 0.26);
+    cursor: default;
+    pointer-events: none; }
+
+.mdc-fab__icon {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 100%; }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* stylelint-disable selector-max-type */
+.mdc-form-field {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.875rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.25rem;
+  text-decoration: inherit;
+  text-transform: inherit;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87);
+  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  vertical-align: middle; }
+  .mdc-form-field--theme-dark,
+  .mdc-theme--dark .mdc-form-field {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-form-field > label {
+    -webkit-box-ordinal-group: 1;
+        -ms-flex-order: 0;
+            order: 0;
+    margin-right: auto;
+    padding-left: 4px; }
+  [dir="rtl"] .mdc-form-field > label, .mdc-form-field[dir="rtl"] > label {
+    margin-left: auto;
+    padding-right: 4px; }
+
+.mdc-form-field--align-end > label {
+  -webkit-box-ordinal-group: 0;
+      -ms-flex-order: -1;
+          order: -1;
+  margin-left: auto;
+  padding-right: 4px; }
+
+[dir="rtl"] .mdc-form-field--align-end > label, .mdc-form-field--align-end[dir="rtl"] > label {
+  margin-right: auto;
+  padding-left: 4px; }
+
+/* stylelint-enable selector-max-type */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+.mdc-grid-list .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 1); }
+
+.mdc-grid-list .mdc-grid-tile {
+  margin: 2px 0;
+  padding: 0 2px; }
+  .mdc-grid-list .mdc-grid-tile__secondary {
+    left: 2px;
+    width: calc(100% - 4px); }
+
+.mdc-grid-list .mdc-grid-list__tiles {
+  margin: 2px auto; }
+
+.mdc-grid-list__tiles {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-orient: horizontal;
+  -webkit-box-direction: normal;
+      -ms-flex-flow: row wrap;
+          flex-flow: row wrap;
+  margin: 0;
+  padding: 0; }
+
+.mdc-grid-list--tile-gutter-1 .mdc-grid-tile {
+  margin: 0.5px 0;
+  padding: 0 0.5px; }
+  .mdc-grid-list--tile-gutter-1 .mdc-grid-tile__secondary {
+    left: 0.5px;
+    width: calc(100% - 1px); }
+
+.mdc-grid-list--tile-gutter-1 .mdc-grid-list__tiles {
+  margin: 0.5px auto; }
+
+.mdc-grid-list--tile-aspect-16x9 .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 1.77778); }
+
+.mdc-grid-list--tile-aspect-3x2 .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 1.5); }
+
+.mdc-grid-list--tile-aspect-2x3 .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 0.66667); }
+
+.mdc-grid-list--tile-aspect-4x3 .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 1.33333); }
+
+.mdc-grid-list--tile-aspect-3x4 .mdc-grid-tile__primary {
+  padding-bottom: calc(100% / 0.75); }
+
+.mdc-grid-list--twoline-caption .mdc-grid-tile__secondary {
+  height: 68px; }
+
+.mdc-grid-list--header-caption .mdc-grid-tile__secondary {
+  top: 0;
+  bottom: auto; }
+
+.mdc-grid-list--with-icon-align-start .mdc-grid-tile__secondary {
+  padding-left: 56px;
+  padding-right: 8px; }
+  [dir="rtl"] .mdc-grid-list .mdc-grid-list--with-icon-align-start .mdc-grid-tile__secondary,
+  .mdc-grid-list[dir="rtl"] .mdc-grid-list--with-icon-align-start .mdc-grid-tile__secondary {
+    padding-left: 8px;
+    padding-right: 56px; }
+
+.mdc-grid-list--with-icon-align-start .mdc-grid-tile__icon {
+  left: 16px;
+  right: initial;
+  font-size: 24px; }
+  [dir="rtl"] .mdc-grid-list .mdc-grid-list--with-icon-align-start .mdc-grid-tile__icon,
+  .mdc-grid-list[dir="rtl"] .mdc-grid-list--with-icon-align-start .mdc-grid-tile__icon {
+    left: initial;
+    right: 16px; }
+
+.mdc-grid-list--with-icon-align-end .mdc-grid-tile__secondary {
+  padding-left: 16px;
+  padding-right: 56px; }
+  [dir="rtl"] .mdc-grid-list .mdc-grid-list--with-icon-align-end .mdc-grid-tile__secondary,
+  .mdc-grid-list[dir="rtl"] .mdc-grid-list--with-icon-align-end .mdc-grid-tile__secondary {
+    padding-left: 56px;
+    padding-right: 16px; }
+
+.mdc-grid-list--with-icon-align-end .mdc-grid-tile__icon {
+  left: initial;
+  right: 16px;
+  font-size: 24px; }
+  [dir="rtl"] .mdc-grid-list .mdc-grid-list--with-icon-align-end .mdc-grid-tile__icon,
+  .mdc-grid-list[dir="rtl"] .mdc-grid-list--with-icon-align-end .mdc-grid-tile__icon {
+    left: 16px;
+    right: initial; }
+
+.mdc-grid-tile {
+  display: block;
+  position: relative;
+  width: var(--mdc-grid-list-tile-width, 200px); }
+  .mdc-grid-tile__primary {
+    position: relative;
+    height: 0;
+    /* @alternate */
+    background-color: #fff;
+    background-color: var(--mdc-theme-background, #fff);
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)); }
+    .mdc-grid-tile__primary-content {
+      position: absolute;
+      top: 0;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      background-repeat: no-repeat;
+      background-position: center;
+      background-size: cover; }
+  .mdc-grid-tile__secondary {
+    position: absolute;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    bottom: 0;
+    height: 48px;
+    padding: 16px;
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-primary, white); }
+  .mdc-grid-tile__title {
+    display: block;
+    margin: 0;
+    padding: 0;
+    font-size: 1rem;
+    font-weight: 500;
+    line-height: 1rem;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden; }
+  .mdc-grid-tile__support-text {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+    display: block;
+    margin: 0;
+    margin-top: 4px;
+    padding: 0; }
+  .mdc-grid-tile__icon {
+    position: absolute;
+    top: calc(50% - 24px / 2);
+    font-size: 0; }
+
+/** postcss-bem-linter: define icon-toggle */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+.mdc-icon-toggle {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.54);
+  color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54));
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  will-change: initial;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  position: relative;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: center;
+      -ms-flex-pack: center;
+          justify-content: center;
+  width: 48px;
+  height: 48px;
+  padding: 12px;
+  outline: none;
+  font-size: 1.5rem;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none; }
+  .mdc-icon-toggle:not(.mdc-ripple-upgraded):hover::before, .mdc-icon-toggle:not(.mdc-ripple-upgraded):focus::before, .mdc-icon-toggle:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-icon-toggle::before {
+    background-color: rgba(0, 0, 0, 0.062);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-icon-toggle.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-icon-toggle.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-icon-toggle.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle::after {
+    background-color: rgba(0, 0, 0, 0.062);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-icon-toggle.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-icon-toggle:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-icon-toggle.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle::before,
+  .mdc-theme--dark .mdc-icon-toggle::before {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded::before,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--background-focused::before,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--background-active-fill::before,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--unbounded::before,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle::after,
+  .mdc-theme--dark .mdc-icon-toggle::after {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded::after,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle:not(.mdc-ripple-upgraded--unbounded)::after,
+  .mdc-theme--dark .mdc-icon-toggle:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--unbounded::after,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--foreground-activation::after,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle.mdc-ripple-upgraded--foreground-deactivation::after,
+  .mdc-theme--dark .mdc-icon-toggle.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-icon-toggle::after {
+    position: absolute;
+    border-radius: 50%;
+    content: "";
+    opacity: 0;
+    pointer-events: none; }
+  .mdc-icon-toggle--theme-dark,
+  .mdc-theme--dark .mdc-icon-toggle {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+
+.mdc-icon-toggle--primary {
+  /* @alternate */
+  color: #3f51b5;
+  color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-icon-toggle--primary::before {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-icon-toggle--primary::before {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--primary::after {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-icon-toggle--primary::after {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-icon-toggle--primary:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-icon-toggle--primary.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+
+.mdc-icon-toggle--accent {
+  /* @alternate */
+  color: #ff4081;
+  color: var(--mdc-theme-accent, #ff4081); }
+  .mdc-icon-toggle--accent::before {
+    /* @alternate */
+    background-color: rgba(255, 64, 129, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-icon-toggle--accent::before {
+        background-color: color(var(--mdc-theme-accent, #ff4081) a(14%)); } }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-icon-toggle--accent::after {
+    /* @alternate */
+    background-color: rgba(255, 64, 129, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-icon-toggle--accent::after {
+        background-color: color(var(--mdc-theme-accent, #ff4081) a(14%)); } }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-icon-toggle--accent:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-icon-toggle--accent.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+
+.mdc-icon-toggle--disabled {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38);
+  color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38));
+  pointer-events: none; }
+  .mdc-icon-toggle--theme-dark.mdc-icon-toggle--disabled,
+  .mdc-theme--dark .mdc-icon-toggle--disabled {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.5);
+    color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)); }
+
+/** postcss-bem-linter: end */
+:root {
+  --mdc-layout-grid-margin-desktop: 24px;
+  --mdc-layout-grid-gutter-desktop: 24px;
+  --mdc-layout-grid-column-width-desktop: 72px;
+  --mdc-layout-grid-margin-tablet: 16px;
+  --mdc-layout-grid-gutter-tablet: 16px;
+  --mdc-layout-grid-column-width-tablet: 72px;
+  --mdc-layout-grid-margin-phone: 16px;
+  --mdc-layout-grid-gutter-phone: 16px;
+  --mdc-layout-grid-column-width-phone: 72px; }
+
+@media (min-width: 840px) {
+  .mdc-layout-grid {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 0 auto;
+    padding: 24px;
+    padding: var(--mdc-layout-grid-margin-desktop, 24px); } }
+
+@media (min-width: 480px) and (max-width: 839px) {
+  .mdc-layout-grid {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 0 auto;
+    padding: 16px;
+    padding: var(--mdc-layout-grid-margin-tablet, 16px); } }
+
+@media (max-width: 479px) {
+  .mdc-layout-grid {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 0 auto;
+    padding: 16px;
+    padding: var(--mdc-layout-grid-margin-phone, 16px); } }
+
+@media (min-width: 840px) {
+  .mdc-layout-grid__inner {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+            flex-flow: row wrap;
+    -webkit-box-align: stretch;
+        -ms-flex-align: stretch;
+            align-items: stretch;
+    margin: -12px;
+    margin: calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2 * -1); }
+    @supports (display: grid) {
+      .mdc-layout-grid__inner {
+        display: grid;
+        grid-gap: 24px;
+        grid-gap: var(--mdc-layout-grid-gutter-desktop, 24px);
+        margin: 0;
+        grid-template-columns: repeat(12, minmax(0, 1fr)); } } }
+
+@media (min-width: 480px) and (max-width: 839px) {
+  .mdc-layout-grid__inner {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+            flex-flow: row wrap;
+    -webkit-box-align: stretch;
+        -ms-flex-align: stretch;
+            align-items: stretch;
+    margin: -8px;
+    margin: calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2 * -1); }
+    @supports (display: grid) {
+      .mdc-layout-grid__inner {
+        display: grid;
+        grid-gap: 16px;
+        grid-gap: var(--mdc-layout-grid-gutter-tablet, 16px);
+        margin: 0;
+        grid-template-columns: repeat(8, minmax(0, 1fr)); } } }
+
+@media (max-width: 479px) {
+  .mdc-layout-grid__inner {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: horizontal;
+    -webkit-box-direction: normal;
+        -ms-flex-flow: row wrap;
+            flex-flow: row wrap;
+    -webkit-box-align: stretch;
+        -ms-flex-align: stretch;
+            align-items: stretch;
+    margin: -8px;
+    margin: calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2 * -1); }
+    @supports (display: grid) {
+      .mdc-layout-grid__inner {
+        display: grid;
+        grid-gap: 16px;
+        grid-gap: var(--mdc-layout-grid-gutter-phone, 16px);
+        margin: 0;
+        grid-template-columns: repeat(4, minmax(0, 1fr)); } } }
+
+@media (min-width: 840px) {
+  .mdc-layout-grid__cell {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 12px;
+    margin: calc(var(--mdc-layout-grid-gutter-desktop, 24px) / 2);
+    width: calc(33.33333% - 24px);
+    width: calc(33.33333% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        margin: 0; } }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        width: auto;
+        grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-desktop {
+      width: calc(8.33333% - 24px);
+      width: calc(8.33333% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-desktop {
+          width: auto;
+          grid-column-end: span 1; } }
+    .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-desktop {
+      width: calc(16.66667% - 24px);
+      width: calc(16.66667% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-desktop {
+          width: auto;
+          grid-column-end: span 2; } }
+    .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-desktop {
+      width: calc(25% - 24px);
+      width: calc(25% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-desktop {
+          width: auto;
+          grid-column-end: span 3; } }
+    .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-desktop {
+      width: calc(33.33333% - 24px);
+      width: calc(33.33333% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-desktop {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-desktop {
+      width: calc(41.66667% - 24px);
+      width: calc(41.66667% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-desktop {
+          width: auto;
+          grid-column-end: span 5; } }
+    .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-desktop {
+      width: calc(50% - 24px);
+      width: calc(50% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-desktop {
+          width: auto;
+          grid-column-end: span 6; } }
+    .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-desktop {
+      width: calc(58.33333% - 24px);
+      width: calc(58.33333% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-desktop {
+          width: auto;
+          grid-column-end: span 7; } }
+    .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-desktop {
+      width: calc(66.66667% - 24px);
+      width: calc(66.66667% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-desktop {
+          width: auto;
+          grid-column-end: span 8; } }
+    .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-desktop {
+      width: calc(75% - 24px);
+      width: calc(75% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-desktop {
+          width: auto;
+          grid-column-end: span 9; } }
+    .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-desktop {
+      width: calc(83.33333% - 24px);
+      width: calc(83.33333% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-desktop {
+          width: auto;
+          grid-column-end: span 10; } }
+    .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-desktop {
+      width: calc(91.66667% - 24px);
+      width: calc(91.66667% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-desktop {
+          width: auto;
+          grid-column-end: span 11; } }
+    .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-desktop {
+      width: calc(100% - 24px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-desktop, 24px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-desktop {
+          width: auto;
+          grid-column-end: span 12; } } }
+
+@media (min-width: 480px) and (max-width: 839px) {
+  .mdc-layout-grid__cell {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 8px;
+    margin: calc(var(--mdc-layout-grid-gutter-tablet, 16px) / 2);
+    width: calc(50% - 16px);
+    width: calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        margin: 0; } }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        width: auto;
+        grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-tablet {
+      width: calc(12.5% - 16px);
+      width: calc(12.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-tablet {
+          width: auto;
+          grid-column-end: span 1; } }
+    .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-tablet {
+      width: calc(25% - 16px);
+      width: calc(25% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-tablet {
+          width: auto;
+          grid-column-end: span 2; } }
+    .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-tablet {
+      width: calc(37.5% - 16px);
+      width: calc(37.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-tablet {
+          width: auto;
+          grid-column-end: span 3; } }
+    .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-tablet {
+      width: calc(50% - 16px);
+      width: calc(50% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-tablet {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-tablet {
+      width: calc(62.5% - 16px);
+      width: calc(62.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-tablet {
+          width: auto;
+          grid-column-end: span 5; } }
+    .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-tablet {
+      width: calc(75% - 16px);
+      width: calc(75% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-tablet {
+          width: auto;
+          grid-column-end: span 6; } }
+    .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-tablet {
+      width: calc(87.5% - 16px);
+      width: calc(87.5% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-tablet {
+          width: auto;
+          grid-column-end: span 7; } }
+    .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-tablet {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-tablet {
+          width: auto;
+          grid-column-end: span 8; } }
+    .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-tablet {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-tablet {
+          width: auto;
+          grid-column-end: span 8; } }
+    .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-tablet {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-tablet {
+          width: auto;
+          grid-column-end: span 8; } }
+    .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-tablet {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-tablet {
+          width: auto;
+          grid-column-end: span 8; } }
+    .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-tablet {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-tablet, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-tablet {
+          width: auto;
+          grid-column-end: span 8; } } }
+
+@media (max-width: 479px) {
+  .mdc-layout-grid__cell {
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    margin: 8px;
+    margin: calc(var(--mdc-layout-grid-gutter-phone, 16px) / 2);
+    width: calc(100% - 16px);
+    width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        margin: 0; } }
+    @supports (display: grid) {
+      .mdc-layout-grid__cell {
+        width: auto;
+        grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-phone {
+      width: calc(25% - 16px);
+      width: calc(25% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-1, .mdc-layout-grid__cell--span-1-phone {
+          width: auto;
+          grid-column-end: span 1; } }
+    .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-phone {
+      width: calc(50% - 16px);
+      width: calc(50% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-2, .mdc-layout-grid__cell--span-2-phone {
+          width: auto;
+          grid-column-end: span 2; } }
+    .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-phone {
+      width: calc(75% - 16px);
+      width: calc(75% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-3, .mdc-layout-grid__cell--span-3-phone {
+          width: auto;
+          grid-column-end: span 3; } }
+    .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-4, .mdc-layout-grid__cell--span-4-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-5, .mdc-layout-grid__cell--span-5-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-6, .mdc-layout-grid__cell--span-6-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-7, .mdc-layout-grid__cell--span-7-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-8, .mdc-layout-grid__cell--span-8-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-9, .mdc-layout-grid__cell--span-9-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-10, .mdc-layout-grid__cell--span-10-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-11, .mdc-layout-grid__cell--span-11-phone {
+          width: auto;
+          grid-column-end: span 4; } }
+    .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-phone {
+      width: calc(100% - 16px);
+      width: calc(100% - var(--mdc-layout-grid-gutter-phone, 16px)); }
+      @supports (display: grid) {
+        .mdc-layout-grid__cell--span-12, .mdc-layout-grid__cell--span-12-phone {
+          width: auto;
+          grid-column-end: span 4; } } }
+
+.mdc-layout-grid__cell--order-1 {
+  -webkit-box-ordinal-group: 2;
+      -ms-flex-order: 1;
+          order: 1; }
+
+.mdc-layout-grid__cell--order-2 {
+  -webkit-box-ordinal-group: 3;
+      -ms-flex-order: 2;
+          order: 2; }
+
+.mdc-layout-grid__cell--order-3 {
+  -webkit-box-ordinal-group: 4;
+      -ms-flex-order: 3;
+          order: 3; }
+
+.mdc-layout-grid__cell--order-4 {
+  -webkit-box-ordinal-group: 5;
+      -ms-flex-order: 4;
+          order: 4; }
+
+.mdc-layout-grid__cell--order-5 {
+  -webkit-box-ordinal-group: 6;
+      -ms-flex-order: 5;
+          order: 5; }
+
+.mdc-layout-grid__cell--order-6 {
+  -webkit-box-ordinal-group: 7;
+      -ms-flex-order: 6;
+          order: 6; }
+
+.mdc-layout-grid__cell--order-7 {
+  -webkit-box-ordinal-group: 8;
+      -ms-flex-order: 7;
+          order: 7; }
+
+.mdc-layout-grid__cell--order-8 {
+  -webkit-box-ordinal-group: 9;
+      -ms-flex-order: 8;
+          order: 8; }
+
+.mdc-layout-grid__cell--order-9 {
+  -webkit-box-ordinal-group: 10;
+      -ms-flex-order: 9;
+          order: 9; }
+
+.mdc-layout-grid__cell--order-10 {
+  -webkit-box-ordinal-group: 11;
+      -ms-flex-order: 10;
+          order: 10; }
+
+.mdc-layout-grid__cell--order-11 {
+  -webkit-box-ordinal-group: 12;
+      -ms-flex-order: 11;
+          order: 11; }
+
+.mdc-layout-grid__cell--order-12 {
+  -webkit-box-ordinal-group: 13;
+      -ms-flex-order: 12;
+          order: 12; }
+
+.mdc-layout-grid__cell--align-top {
+  -ms-flex-item-align: start;
+      align-self: flex-start; }
+  @supports (display: grid) {
+    .mdc-layout-grid__cell--align-top {
+      -ms-flex-item-align: start;
+          align-self: start; } }
+
+.mdc-layout-grid__cell--align-middle {
+  -ms-flex-item-align: center;
+      align-self: center; }
+
+.mdc-layout-grid__cell--align-bottom {
+  -ms-flex-item-align: end;
+      align-self: flex-end; }
+  @supports (display: grid) {
+    .mdc-layout-grid__cell--align-bottom {
+      -ms-flex-item-align: end;
+          align-self: end; } }
+
+@media (min-width: 840px) {
+  .mdc-layout-grid--fixed-column-width {
+    width: 1176px;
+    width: calc( var(--mdc-layout-grid-column-width-desktop, 72px) * 12 + var(--mdc-layout-grid-gutter-desktop, 24px) * 11 + var(--mdc-layout-grid-margin-desktop, 24px) * 2); } }
+
+@media (min-width: 480px) and (max-width: 839px) {
+  .mdc-layout-grid--fixed-column-width {
+    width: 720px;
+    width: calc( var(--mdc-layout-grid-column-width-tablet, 72px) * 8 + var(--mdc-layout-grid-gutter-tablet, 16px) * 7 + var(--mdc-layout-grid-margin-tablet, 16px) * 2); } }
+
+@media (max-width: 479px) {
+  .mdc-layout-grid--fixed-column-width {
+    width: 368px;
+    width: calc( var(--mdc-layout-grid-column-width-phone, 72px) * 4 + var(--mdc-layout-grid-gutter-phone, 16px) * 3 + var(--mdc-layout-grid-margin-phone, 16px) * 2); } }
+
+.mdc-layout-grid--align-left {
+  margin-right: auto;
+  margin-left: 0; }
+
+.mdc-layout-grid--align-right {
+  margin-right: 0;
+  margin-left: auto; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+@-webkit-keyframes primary-indeterminate-translate {
+  0% {
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  20% {
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+            animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  59.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+            animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+    -webkit-transform: translateX(83.67142%);
+            transform: translateX(83.67142%); }
+  100% {
+    -webkit-transform: translateX(200.61106%);
+            transform: translateX(200.61106%); } }
+@keyframes primary-indeterminate-translate {
+  0% {
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  20% {
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+            animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  59.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+            animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+    -webkit-transform: translateX(83.67142%);
+            transform: translateX(83.67142%); }
+  100% {
+    -webkit-transform: translateX(200.61106%);
+            transform: translateX(200.61106%); } }
+
+@-webkit-keyframes primary-indeterminate-scale {
+  0% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  36.65% {
+    -webkit-animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+            animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  69.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);
+            animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);
+    -webkit-transform: scaleX(0.66148);
+            transform: scaleX(0.66148); }
+  100% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); } }
+
+@keyframes primary-indeterminate-scale {
+  0% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  36.65% {
+    -webkit-animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+            animation-timing-function: cubic-bezier(0.33473, 0.12482, 0.78584, 1);
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  69.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);
+            animation-timing-function: cubic-bezier(0.06, 0.11, 0.6, 1);
+    -webkit-transform: scaleX(0.66148);
+            transform: scaleX(0.66148); }
+  100% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); } }
+
+@-webkit-keyframes secondary-indeterminate-translate {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+            animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  25% {
+    -webkit-animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+            animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+    -webkit-transform: translateX(37.65191%);
+            transform: translateX(37.65191%); }
+  48.35% {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+            animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+    -webkit-transform: translateX(84.38617%);
+            transform: translateX(84.38617%); }
+  100% {
+    -webkit-transform: translateX(160.27778%);
+            transform: translateX(160.27778%); } }
+
+@keyframes secondary-indeterminate-translate {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+            animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  25% {
+    -webkit-animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+            animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+    -webkit-transform: translateX(37.65191%);
+            transform: translateX(37.65191%); }
+  48.35% {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+            animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+    -webkit-transform: translateX(84.38617%);
+            transform: translateX(84.38617%); }
+  100% {
+    -webkit-transform: translateX(160.27778%);
+            transform: translateX(160.27778%); } }
+
+@-webkit-keyframes secondary-indeterminate-scale {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+            animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  19.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+            animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+    -webkit-transform: scaleX(0.4571);
+            transform: scaleX(0.4571); }
+  44.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.25776, -0.00316, 0.21176, 1.38179);
+            animation-timing-function: cubic-bezier(0.25776, -0.00316, 0.21176, 1.38179);
+    -webkit-transform: scaleX(0.72796);
+            transform: scaleX(0.72796); }
+  100% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); } }
+
+@keyframes secondary-indeterminate-scale {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+            animation-timing-function: cubic-bezier(0.20503, 0.05705, 0.57661, 0.45397);
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); }
+  19.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+            animation-timing-function: cubic-bezier(0.15231, 0.19643, 0.64837, 1.00432);
+    -webkit-transform: scaleX(0.4571);
+            transform: scaleX(0.4571); }
+  44.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.25776, -0.00316, 0.21176, 1.38179);
+            animation-timing-function: cubic-bezier(0.25776, -0.00316, 0.21176, 1.38179);
+    -webkit-transform: scaleX(0.72796);
+            transform: scaleX(0.72796); }
+  100% {
+    -webkit-transform: scaleX(0.08);
+            transform: scaleX(0.08); } }
+
+@-webkit-keyframes buffering {
+  to {
+    -webkit-transform: translateX(-10px);
+            transform: translateX(-10px); } }
+
+@keyframes buffering {
+  to {
+    -webkit-transform: translateX(-10px);
+            transform: translateX(-10px); } }
+
+@-webkit-keyframes primary-indeterminate-translate-reverse {
+  0% {
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  20% {
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+            animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  59.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+            animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+    -webkit-transform: translateX(-83.67142%);
+            transform: translateX(-83.67142%); }
+  100% {
+    -webkit-transform: translateX(-200.61106%);
+            transform: translateX(-200.61106%); } }
+
+@keyframes primary-indeterminate-translate-reverse {
+  0% {
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  20% {
+    -webkit-animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+            animation-timing-function: cubic-bezier(0.5, 0, 0.70173, 0.49582);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  59.15% {
+    -webkit-animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+            animation-timing-function: cubic-bezier(0.30244, 0.38135, 0.55, 0.95635);
+    -webkit-transform: translateX(-83.67142%);
+            transform: translateX(-83.67142%); }
+  100% {
+    -webkit-transform: translateX(-200.61106%);
+            transform: translateX(-200.61106%); } }
+
+@-webkit-keyframes secondary-indeterminate-translate-reverse {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+            animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  25% {
+    -webkit-animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+            animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+    -webkit-transform: translateX(-37.65191%);
+            transform: translateX(-37.65191%); }
+  48.35% {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+            animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+    -webkit-transform: translateX(-84.38617%);
+            transform: translateX(-84.38617%); }
+  100% {
+    -webkit-transform: translateX(-160.27778%);
+            transform: translateX(-160.27778%); } }
+
+@keyframes secondary-indeterminate-translate-reverse {
+  0% {
+    -webkit-animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+            animation-timing-function: cubic-bezier(0.15, 0, 0.51506, 0.40969);
+    -webkit-transform: translateX(0);
+            transform: translateX(0); }
+  25% {
+    -webkit-animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+            animation-timing-function: cubic-bezier(0.31033, 0.28406, 0.8, 0.73371);
+    -webkit-transform: translateX(-37.65191%);
+            transform: translateX(-37.65191%); }
+  48.35% {
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+            animation-timing-function: cubic-bezier(0.4, 0.62704, 0.6, 0.90203);
+    -webkit-transform: translateX(-84.38617%);
+            transform: translateX(-84.38617%); }
+  100% {
+    -webkit-transform: translateX(-160.27778%);
+            transform: translateX(-160.27778%); } }
+
+@-webkit-keyframes buffering-reverse {
+  to {
+    -webkit-transform: translateX(10px);
+            transform: translateX(10px); } }
+
+@keyframes buffering-reverse {
+  to {
+    -webkit-transform: translateX(10px);
+            transform: translateX(10px); } }
+
+.mdc-linear-progress {
+  position: relative;
+  width: 100%;
+  height: 4px;
+  -webkit-transform: translateZ(0);
+          transform: translateZ(0);
+  -webkit-transition: opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+  transition: opacity 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+  overflow: hidden; }
+  .mdc-linear-progress__bar {
+    -webkit-animation: none;
+            animation: none;
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    -webkit-transform-origin: top left;
+            transform-origin: top left;
+    -webkit-transition: -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1); }
+  .mdc-linear-progress__bar-inner {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    -webkit-animation: none;
+            animation: none;
+    display: inline-block;
+    position: absolute;
+    width: 100%;
+    height: 100%; }
+  .mdc-linear-progress--accent .mdc-linear-progress__bar-inner {
+    /* @alternate */
+    background-color: #ff4081;
+    background-color: var(--mdc-theme-accent, #ff4081); }
+  .mdc-linear-progress__buffering-dots {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    background-image: url("data:image/svg+xml,%3Csvg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' x='0px' y='0px' enable-background='new 0 0 5 2' xml:space='preserve' viewBox='0 0 5 2' preserveAspectRatio='none slice'%3E%3Ccircle cx='1' cy='1' r='1' fill='%23e6e6e6'/%3E%3C/svg%3E");
+    background-repeat: repeat-x;
+    background-size: 10px 4px;
+    -webkit-animation: buffering 250ms infinite linear;
+            animation: buffering 250ms infinite linear; }
+  .mdc-linear-progress__buffer {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    -webkit-transform-origin: top left;
+            transform-origin: top left;
+    -webkit-transition: -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 250ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    background-color: #e6e6e6; }
+  .mdc-linear-progress__secondary-bar {
+    visibility: hidden; }
+  .mdc-linear-progress--indeterminate .mdc-linear-progress__bar {
+    -webkit-transition: none;
+    transition: none; }
+  .mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar {
+    -webkit-animation: primary-indeterminate-translate 2s infinite linear;
+            animation: primary-indeterminate-translate 2s infinite linear;
+    left: -145.166611%; }
+    .mdc-linear-progress--indeterminate .mdc-linear-progress__primary-bar > .mdc-linear-progress__bar-inner {
+      -webkit-animation: primary-indeterminate-scale 2s infinite linear;
+              animation: primary-indeterminate-scale 2s infinite linear; }
+  .mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar {
+    -webkit-animation: secondary-indeterminate-translate 2s infinite linear;
+            animation: secondary-indeterminate-translate 2s infinite linear;
+    left: -54.888891%;
+    visibility: visible; }
+    .mdc-linear-progress--indeterminate .mdc-linear-progress__secondary-bar > .mdc-linear-progress__bar-inner {
+      -webkit-animation: secondary-indeterminate-scale 2s infinite linear;
+              animation: secondary-indeterminate-scale 2s infinite linear; }
+  .mdc-linear-progress--reversed .mdc-linear-progress__bar,
+  .mdc-linear-progress--reversed .mdc-linear-progress__buffer {
+    right: 0;
+    -webkit-transform-origin: center right;
+            transform-origin: center right; }
+  .mdc-linear-progress--reversed .mdc-linear-progress__primary-bar {
+    -webkit-animation-name: primary-indeterminate-translate-reverse;
+            animation-name: primary-indeterminate-translate-reverse; }
+  .mdc-linear-progress--reversed .mdc-linear-progress__secondary-bar {
+    -webkit-animation-name: secondary-indeterminate-translate-reverse;
+            animation-name: secondary-indeterminate-translate-reverse; }
+  .mdc-linear-progress--reversed .mdc-linear-progress__buffering-dots {
+    -webkit-animation: buffering-reverse 250ms infinite linear;
+            animation: buffering-reverse 250ms infinite linear; }
+  .mdc-linear-progress--closed {
+    opacity: 0; }
+
+.mdc-linear-progress--indeterminate.mdc-linear-progress--reversed .mdc-linear-progress__primary-bar {
+  right: -145.166611%;
+  left: auto; }
+
+.mdc-linear-progress--indeterminate.mdc-linear-progress--reversed .mdc-linear-progress__secondary-bar {
+  right: -54.888891%;
+  left: auto; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+.mdc-list {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.75rem;
+  text-decoration: inherit;
+  text-transform: inherit;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87);
+  color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));
+  margin: 0;
+  padding: 8px 16px 0;
+  line-height: 1.5rem;
+  list-style-type: none; }
+  .mdc-list--theme-dark,
+  .mdc-theme--dark .mdc-list {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+
+.mdc-list--dense {
+  padding-top: 4px;
+  font-size: .812rem; }
+
+.mdc-list-item {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  height: 48px; }
+  .mdc-list-item__start-detail {
+    width: 24px;
+    height: 24px;
+    margin-left: 0;
+    margin-right: 32px; }
+    [dir="rtl"] .mdc-list-item .mdc-list-item__start-detail,
+    .mdc-list-item[dir="rtl"] .mdc-list-item__start-detail {
+      margin-left: 32px;
+      margin-right: 0; }
+  .mdc-list-item__end-detail {
+    width: 24px;
+    height: 24px;
+    margin-left: auto;
+    margin-right: 0; }
+    [dir="rtl"] .mdc-list-item .mdc-list-item__end-detail,
+    .mdc-list-item[dir="rtl"] .mdc-list-item__end-detail {
+      margin-left: 0;
+      margin-right: auto; }
+  .mdc-list-item__text {
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column; }
+    .mdc-list-item__text__secondary {
+      font-family: Roboto, sans-serif;
+      -moz-osx-font-smoothing: grayscale;
+      -webkit-font-smoothing: antialiased;
+      font-size: 0.875rem;
+      font-weight: 400;
+      letter-spacing: 0.04em;
+      line-height: 1.25rem;
+      text-decoration: inherit;
+      text-transform: inherit;
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.54);
+      color: var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)); }
+      .mdc-list-item__text__secondary--theme-dark,
+      .mdc-theme--dark .mdc-list-item__text__secondary {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.7);
+        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+      .mdc-list--dense .mdc-list-item__text__secondary {
+        font-size: inherit; }
+  .mdc-list--dense .mdc-list-item {
+    height: 40px; }
+    .mdc-list--dense .mdc-list-item__start-detail {
+      width: 20px;
+      height: 20px;
+      margin-left: 0;
+      margin-right: 36px; }
+      [dir="rtl"] .mdc-list-item .mdc-list--dense .mdc-list-item__start-detail,
+      .mdc-list-item[dir="rtl"] .mdc-list--dense .mdc-list-item__start-detail {
+        margin-left: 36px;
+        margin-right: 0; }
+    .mdc-list--dense .mdc-list-item__end-detail {
+      width: 20px;
+      height: 20px; }
+  .mdc-list--avatar-list .mdc-list-item {
+    height: 56px; }
+    .mdc-list--avatar-list .mdc-list-item__start-detail {
+      width: 40px;
+      height: 40px;
+      margin-left: 0;
+      margin-right: 16px;
+      border-radius: 50%; }
+      [dir="rtl"] .mdc-list-item .mdc-list--avatar-list .mdc-list-item__start-detail,
+      .mdc-list-item[dir="rtl"] .mdc-list--avatar-list .mdc-list-item__start-detail {
+        margin-left: 16px;
+        margin-right: 0; }
+  .mdc-list-item .mdc-list--avatar-list.mdc-list--dense .mdc-list__item {
+    height: 48px; }
+    .mdc-list-item .mdc-list--avatar-list.mdc-list--dense .mdc-list__item__start-detail {
+      width: 36px;
+      height: 36px;
+      margin-left: 0;
+      margin-right: 20px; }
+      [dir="rtl"] .mdc-list-item .mdc-list-item .mdc-list--avatar-list.mdc-list--dense .mdc-list__item__start-detail,
+      .mdc-list-item[dir="rtl"] .mdc-list-item .mdc-list--avatar-list.mdc-list--dense .mdc-list__item__start-detail {
+        margin-left: 20px;
+        margin-right: 0; }
+  .mdc-list--two-line .mdc-list-item {
+    height: 72px; }
+  .mdc-list--two-line.mdc-list--dense .mdc-list-item {
+    height: 60px; }
+
+a.mdc-list-item {
+  color: inherit;
+  text-decoration: none; }
+
+.mdc-list-item.mdc-ripple-upgraded {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  left: -16px;
+  right: initial;
+  position: relative;
+  width: 100%;
+  padding: 0 16px;
+  overflow: hidden; }
+  .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):hover::before, .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):focus::before, .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-list-item.mdc-ripple-upgraded::before {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-list-item.mdc-ripple-upgraded::after {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  [dir="rtl"] .mdc-list-item.mdc-ripple-upgraded, .mdc-list-item.mdc-ripple-upgraded[dir="rtl"] {
+    left: initial;
+    right: -16px; }
+  .mdc-list-item.mdc-ripple-upgraded:focus {
+    outline: none; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded::before,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded::before {
+    background-color: rgba(255, 255, 255, 0.12);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::before,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded::after {
+    background-color: rgba(255, 255, 255, 0.12);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-list--theme-dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after,
+  .mdc-theme--dark .mdc-list-item.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+
+.mdc-list-divider {
+  height: 0;
+  margin: 0;
+  border: none;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.12); }
+  .mdc-list--theme-dark .mdc-list-divider,
+  .mdc-theme--dark .mdc-list-divider {
+    border-bottom-color: rgba(255, 255, 255, 0.2); }
+
+.mdc-list-divider--inset {
+  margin-left: 56px;
+  margin-right: 0;
+  width: calc(100% - 56px); }
+  [dir="rtl"] .mdc-list-group .mdc-list-divider--inset,
+  .mdc-list-group[dir="rtl"] .mdc-list-divider--inset {
+    margin-left: 0;
+    margin-right: 56px; }
+
+.mdc-list-group {
+  padding: 0 16px; }
+  .mdc-list-group__subheader {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 500;
+    letter-spacing: 0.04em;
+    line-height: 1.5rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87));
+    margin: 0.75rem 0; }
+    .mdc-list-group__subheader--theme-dark,
+    .mdc-theme--dark .mdc-list-group__subheader {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-list-group .mdc-list {
+    padding: 0; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* postcss-bem-linter: define simple-menu */
+.mdc-simple-menu {
+  display: none;
+  position: absolute;
+  min-width: 170px;
+  max-width: calc(100vw - 32px);
+  max-height: calc(100vh - 32px);
+  margin: 0;
+  padding: 0;
+  -webkit-transform: scale(0);
+          transform: scale(0);
+  -webkit-transform-origin: top left;
+          transform-origin: top left;
+  border-radius: 2px;
+  background-color: white;
+  white-space: nowrap;
+  opacity: 0;
+  overflow: hidden;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  will-change: transform, opacity;
+  z-index: 4;
+  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+  /* stylelint-disable plugin/selector-bem-pattern */
+  /* stylelint-enable plugin/selector-bem-pattern */
+  /* stylelint-disable plugin/selector-bem-pattern */
+  /* stylelint-disable selector-no-qualifying-type */
+  /* stylelint-enable selector-no-qualifying-type */
+  /* TODO(sgomes): Revisit when we have interactive lists. */
+  /* stylelint-enable plugin/selector-bem-pattern */ }
+  .mdc-simple-menu--theme-dark,
+  .mdc-theme--dark .mdc-simple-menu {
+    background-color: #424242; }
+  .mdc-simple-menu:focus {
+    outline: none; }
+  .mdc-simple-menu--open {
+    display: inline-block;
+    -webkit-transform: scale(1);
+            transform: scale(1);
+    opacity: 1; }
+  .mdc-simple-menu--animating {
+    display: inline-block;
+    -webkit-transition: opacity 0.2s cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 0.2s cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-simple-menu__items {
+    overflow-x: hidden;
+    overflow-y: auto;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    will-change: transform;
+    /* stylelint-disable plugin/selector-bem-pattern, selector-no-universal */
+    /* stylelint-enable plugin/selector-bem-pattern, selector-no-universal */ }
+    .mdc-simple-menu__items > * {
+      opacity: 0; }
+    .mdc-simple-menu__items > .mdc-list-item {
+      cursor: pointer; }
+    .mdc-simple-menu--animating .mdc-simple-menu__items {
+      overflow-y: hidden; }
+      .mdc-simple-menu--animating .mdc-simple-menu__items > * {
+        -webkit-transition-duration: 0.3s;
+                transition-duration: 0.3s;
+        -webkit-transition-property: opacity;
+        transition-property: opacity;
+        -webkit-transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
+                transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }
+    .mdc-simple-menu--open .mdc-simple-menu__items > * {
+      opacity: 1;
+      will-change: opacity; }
+  [dir="rtl"] .mdc-simple-menu {
+    -webkit-transform-origin: top right;
+            transform-origin: top right; }
+  .mdc-simple-menu--open-from-top-left {
+    -webkit-transform-origin: top left !important;
+            transform-origin: top left !important; }
+  .mdc-simple-menu--open-from-top-right {
+    -webkit-transform-origin: top right !important;
+            transform-origin: top right !important; }
+  .mdc-simple-menu--open-from-bottom-left {
+    -webkit-transform-origin: bottom left !important;
+            transform-origin: bottom left !important; }
+  .mdc-simple-menu--open-from-bottom-right {
+    -webkit-transform-origin: bottom right !important;
+            transform-origin: bottom right !important; }
+  .mdc-simple-menu .mdc-list-group,
+  .mdc-simple-menu .mdc-list {
+    padding: 8px 0; }
+  .mdc-simple-menu .mdc-list-item {
+    position: relative;
+    padding: 0 16px;
+    outline: none;
+    color: inherit;
+    text-decoration: none;
+    -webkit-user-select: none;
+       -moz-user-select: none;
+        -ms-user-select: none;
+            user-select: none;
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 1rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.75rem;
+    text-decoration: inherit;
+    text-transform: inherit; }
+    .mdc-simple-menu--theme-dark.mdc-simple-menu .mdc-list-item,
+    .mdc-theme--dark .mdc-simple-menu .mdc-list-item {
+      color: white; }
+  .mdc-simple-menu--theme-dark.mdc-simple-menu .mdc-list-divider,
+  .mdc-theme--dark .mdc-simple-menu .mdc-list-divider {
+    border-color: rgba(255, 255, 255, 0.12); }
+  .mdc-simple-menu .mdc-list-item__start-detail {
+    color: rgba(0, 0, 0, 0.54); }
+    .mdc-simple-menu--theme-dark.mdc-simple-menu .mdc-list-item__start-detail,
+    .mdc-theme--dark .mdc-simple-menu .mdc-list-item__start-detail {
+      color: rgba(255, 255, 255, 0.54); }
+  .mdc-simple-menu--selected.mdc-list-item,
+  .mdc-simple-menu--selected.mdc-list-item .mdc-list-item__start-detail {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-simple-menu .mdc-list-item::before {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: opacity 120ms cubic-bezier(0, 0, 0.2, 1);
+    transition: opacity 120ms cubic-bezier(0, 0, 0.2, 1);
+    border-radius: inherit;
+    background: currentColor;
+    content: "";
+    opacity: 0; }
+  .mdc-simple-menu .mdc-list-item:focus::before {
+    opacity: .12; }
+  .mdc-simple-menu .mdc-list-item:active::before {
+    /*
+      Slightly darker value for visual distinction.
+      This allows a full base that has distinct modes.
+      Progressive enhancement with ripples will provide complete button spec alignment.
+    */
+    opacity: .18; }
+  .mdc-simple-menu .mdc-list-item[aria-disabled="true"] {
+    cursor: default;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.38);
+    color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)); }
+    .mdc-select--theme-dark .mdc-simple-menu .mdc-list-item[aria-disabled="true"],
+    .mdc-theme--dark .mdc-simple-menu .mdc-list-item[aria-disabled="true"] {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.5);
+      color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-simple-menu .mdc-list-item[aria-disabled="true"]:focus::before, .mdc-simple-menu .mdc-list-item[aria-disabled="true"]:active::before {
+    opacity: 0; }
+
+/* postcss-bem-linter: end */
+.mdc-menu-anchor {
+  position: relative;
+  overflow: visible; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+.mdc-radio {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  display: inline-block;
+  position: relative;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-box-flex: 0;
+      -ms-flex: 0 0 auto;
+          flex: 0 0 auto;
+  width: 40px;
+  height: 40px;
+  padding: 10px;
+  cursor: pointer;
+  will-change: opacity, transform, border-color, background-color, color; }
+  .mdc-radio:not(.mdc-ripple-upgraded):hover::before, .mdc-radio:not(.mdc-ripple-upgraded):focus::before, .mdc-radio:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-radio::before {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-radio::before {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-radio.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-radio.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-radio.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-radio.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-radio::after {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.14);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-radio::after {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
+  .mdc-radio.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-radio:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-radio.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-radio.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-radio.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-radio::before, .mdc-radio::after {
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%; }
+  .mdc-radio.mdc-ripple-upgraded .mdc-radio__background::before {
+    content: none; }
+  .mdc-radio__background {
+    display: inline-block;
+    position: absolute;
+    left: 10px;
+    width: 50%;
+    height: 50%;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+    .mdc-radio__background::before {
+      /* @alternate */
+      background-color: #3f51b5;
+      background-color: var(--mdc-theme-primary, #3f51b5);
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      -webkit-transform: scale(0, 0);
+              transform: scale(0, 0);
+      -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+      border-radius: 50%;
+      content: "";
+      opacity: 0;
+      pointer-events: none; }
+  .mdc-radio__outer-circle {
+    /* @alternate */
+    border-color: rgba(0, 0, 0, 0.54);
+    border-color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54));
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: border-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border-width: 2px;
+    border-style: solid;
+    border-radius: 50%;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+    .mdc-radio--theme-dark .mdc-radio__outer-circle,
+    .mdc-theme--dark .mdc-radio__outer-circle {
+      /* @alternate */
+      border-color: rgba(255, 255, 255, 0.7);
+      border-color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  .mdc-radio__inner-circle {
+    /* @alternate */
+    background-color: rgba(0, 0, 0, 0.54);
+    background-color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54));
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transform: scale(0, 0);
+            transform: scale(0, 0);
+    -webkit-transition: background-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: background-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), background-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), background-color 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    border-radius: 50%;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+    .mdc-radio--theme-dark .mdc-radio__inner-circle,
+    .mdc-theme--dark .mdc-radio__inner-circle {
+      /* @alternate */
+      background-color: rgba(255, 255, 255, 0.7);
+      background-color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  .mdc-radio__native-control {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+    cursor: inherit;
+    opacity: 0;
+    z-index: 1; }
+
+.mdc-radio__native-control:checked + .mdc-radio__background,
+.mdc-radio__native-control:disabled + .mdc-radio__background {
+  -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle,
+  .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle {
+    -webkit-transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: border-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+  .mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle,
+  .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle {
+    -webkit-transition: background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+
+.mdc-radio--disabled {
+  cursor: default;
+  pointer-events: none; }
+
+.mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__outer-circle {
+  /* @alternate */
+  border-color: #3f51b5;
+  border-color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-radio__native-control:checked + .mdc-radio__background .mdc-radio__inner-circle {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5);
+  -webkit-transform: scale(0.5);
+          transform: scale(0.5);
+  -webkit-transition: background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
+
+.mdc-radio__native-control:disabled + .mdc-radio__background,
+fieldset:disabled .mdc-radio__native-control + .mdc-radio__background,
+[aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background {
+  cursor: default; }
+  .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle,
+  fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle,
+  [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle {
+    border-color: rgba(0, 0, 0, 0.26); }
+    .mdc-radio--theme-dark .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle,
+    .mdc-theme--dark .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__outer-circle, .mdc-radio--theme-dark
+    fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle,
+    .mdc-theme--dark
+    fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle, .mdc-radio--theme-dark
+    [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle,
+    .mdc-theme--dark
+    [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__outer-circle {
+      border-color: rgba(255, 255, 255, 0.3); }
+  .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle,
+  fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle,
+  [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle {
+    background-color: rgba(0, 0, 0, 0.26); }
+    .mdc-radio--theme-dark .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle,
+    .mdc-theme--dark .mdc-radio__native-control:disabled + .mdc-radio__background .mdc-radio__inner-circle, .mdc-radio--theme-dark
+    fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle,
+    .mdc-theme--dark
+    fieldset:disabled .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle, .mdc-radio--theme-dark
+    [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle,
+    .mdc-theme--dark
+    [aria-disabled="true"] .mdc-radio__native-control + .mdc-radio__background .mdc-radio__inner-circle {
+      background-color: rgba(255, 255, 255, 0.3); }
+
+.mdc-radio__native-control:focus + .mdc-radio__background::before {
+  -webkit-transform: scale(2, 2);
+          transform: scale(2, 2);
+  -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
+  opacity: .26; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+.mdc-ripple-surface {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent;
+  position: relative;
+  outline: none;
+  overflow: hidden; }
+  .mdc-ripple-surface:not(.mdc-ripple-upgraded):hover::before, .mdc-ripple-surface:not(.mdc-ripple-upgraded):focus::before, .mdc-ripple-surface:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-ripple-surface::before {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-ripple-surface.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-ripple-surface.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-ripple-surface.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface::after {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-ripple-surface.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-ripple-surface:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-ripple-surface.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-ripple-surface[data-mdc-ripple-is-unbounded] {
+    overflow: visible; }
+  .mdc-ripple-surface--primary::before, .mdc-ripple-surface--primary::after {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-ripple-surface--primary::before {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-ripple-surface--primary::before {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(16%)); } }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface--primary::after {
+    /* @alternate */
+    background-color: rgba(63, 81, 181, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-ripple-surface--primary::after {
+        background-color: color(var(--mdc-theme-primary, #3f51b5) a(16%)); } }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-ripple-surface--primary:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-ripple-surface--primary.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-ripple-surface--accent::before, .mdc-ripple-surface--accent::after {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-ripple-surface--accent::before {
+    /* @alternate */
+    background-color: rgba(255, 64, 129, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-ripple-surface--accent::before {
+        background-color: color(var(--mdc-theme-accent, #ff4081) a(16%)); } }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-ripple-surface--accent::after {
+    /* @alternate */
+    background-color: rgba(255, 64, 129, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+    @supports (background-color: color(green a(10%))) {
+      .mdc-ripple-surface--accent::after {
+        background-color: color(var(--mdc-theme-accent, #ff4081) a(16%)); } }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-ripple-surface--accent:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-ripple-surface--accent.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+.mdc-select {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.75rem;
+  text-decoration: inherit;
+  text-transform: inherit;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87);
+  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+  padding-left: 0;
+  padding-right: 24px;
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  max-width: calc(100% - 24px);
+  height: 32px;
+  -webkit-transition: border-bottom-color 150ms 0ms cubic-bezier(0.4, 0, 0.6, 1), background-color 150ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+  transition: border-bottom-color 150ms 0ms cubic-bezier(0.4, 0, 0.6, 1), background-color 150ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+  border: none;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+  border-radius: 0;
+  background: none;
+  background-repeat: no-repeat;
+  background-position: right center;
+  background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%230%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.54%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E);
+  font-family: Roboto, sans-serif;
+  font-size: .936rem;
+  cursor: pointer; }
+  [dir="rtl"] .mdc-select, .mdc-select[dir="rtl"] {
+    padding-left: 24px;
+    padding-right: 0; }
+  .mdc-select::-ms-expand {
+    display: none; }
+  .mdc-select:focus {
+    /* @alternate */
+    border-bottom-color: #3f51b5;
+    border-bottom-color: var(--mdc-theme-primary, #3f51b5);
+    outline: none;
+    background-color: rgba(0, 0, 0, 0.06); }
+  [dir="rtl"] .mdc-select, .mdc-select[dir="rtl"] {
+    background-position: left center; }
+  .mdc-select--theme-dark,
+  .mdc-theme--dark .mdc-select {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white);
+    background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23ffffff%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.54%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E);
+    border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
+    .mdc-select--theme-dark:focus,
+    .mdc-theme--dark .mdc-select:focus {
+      /* @alternate */
+      border-bottom-color: #3f51b5;
+      border-bottom-color: var(--mdc-theme-primary, #3f51b5);
+      background-color: rgba(255, 255, 255, 0.09); }
+  .mdc-select__menu {
+    position: fixed;
+    top: 0;
+    left: 0;
+    max-height: 100%;
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    overflow-y: scroll;
+    z-index: 4; }
+  .mdc-select__selected-text {
+    -webkit-transition: opacity 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    transition: opacity 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 125ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
+    white-space: nowrap;
+    overflow: hidden; }
+
+.mdc-select--open .mdc-select__selected-text {
+  -webkit-transform: translateY(8px);
+          transform: translateY(8px);
+  -webkit-transition: opacity 125ms 125ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 125ms 125ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 125ms 125ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 125ms 125ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 125ms 125ms cubic-bezier(0, 0, 0.2, 1), transform 125ms 125ms cubic-bezier(0, 0, 0.2, 1);
+  transition: opacity 125ms 125ms cubic-bezier(0, 0, 0.2, 1), transform 125ms 125ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 125ms 125ms cubic-bezier(0, 0, 0.2, 1);
+  opacity: 0; }
+
+.mdc-select--disabled,
+.mdc-select[disabled] {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38);
+  color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38));
+  background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%230%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.38%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E);
+  border-bottom-style: dotted;
+  cursor: default;
+  pointer-events: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none; }
+
+.mdc-select--theme-dark.mdc-select--disabled,
+.mdc-theme--dark .mdc-select--disabled {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5);
+  color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5));
+  background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23ffffff%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.38%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E);
+  border-bottom: 1px dotted rgba(255, 255, 255, 0.38); }
+
+.mdc-select--theme-dark.mdc-select[disabled],
+.mdc-theme--dark .mdc-select[disabled] {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5);
+  color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5));
+  background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2210px%22%20height%3D%225px%22%20viewBox%3D%227%2010%2010%205%22%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%3E%0A%20%20%20%20%3Cpolygon%20id%3D%22Shape%22%20stroke%3D%22none%22%20fill%3D%22%23ffffff%22%20fill-rule%3D%22evenodd%22%20opacity%3D%220.38%22%20points%3D%227%2010%2012%2015%2017%2010%22%3E%3C%2Fpolygon%3E%0A%3C%2Fsvg%3E);
+  border-bottom: 1px dotted rgba(255, 255, 255, 0.38); }
+
+.mdc-select__menu .mdc-list-item {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.75rem;
+  text-decoration: inherit;
+  text-transform: inherit;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.54);
+  color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+  .mdc-select__menu .mdc-list-item[aria-selected="true"] {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+  .mdc-select--theme-dark .mdc-select__menu .mdc-list-item,
+  .mdc-theme--dark .mdc-select__menu .mdc-list-item {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.7);
+    color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+    .mdc-select--theme-dark .mdc-select__menu .mdc-list-item[aria-selected="true"],
+    .mdc-theme--dark .mdc-select__menu .mdc-list-item[aria-selected="true"] {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+
+.mdc-select__menu .mdc-list-group,
+.mdc-select__menu .mdc-list-group > .mdc-list-item:first-child {
+  margin-top: 12px; }
+
+.mdc-select__menu .mdc-list-group {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38);
+  color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+  font-weight: normal; }
+  .mdc-select__menu .mdc-list-group .mdc-list-item {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+
+.mdc-select--theme-dark .mdc-select__menu .mdc-list-group,
+.mdc-theme--dark .mdc-select__menu .mdc-list-group {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5);
+  color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-select--theme-dark .mdc-select__menu .mdc-list-group .mdc-list-item,
+  .mdc-theme--dark .mdc-select__menu .mdc-list-group .mdc-list-item {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+
+.mdc-multi-select {
+  -webkit-appearance: none;
+     -moz-appearance: none;
+          appearance: none;
+  width: 250px;
+  padding: 0;
+  border: 1px solid;
+  /* @alternate */
+  border-color: rgba(0, 0, 0, 0.38);
+  border-color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+  outline: none; }
+  .mdc-multi-select--theme-dark,
+  .mdc-theme--dark .mdc-multi-select {
+    /* @alternate */
+    border-color: rgba(255, 255, 255, 0.5);
+    border-color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-multi-select .mdc-list-group {
+    margin: 16px 0 0;
+    padding: 0 0 0 16px;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.38);
+    color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+    font-weight: normal; }
+    .mdc-multi-select .mdc-list-group--theme-dark,
+    .mdc-theme--dark .mdc-multi-select .mdc-list-group {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.5);
+      color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+    .mdc-multi-select .mdc-list-group:last-child {
+      margin-bottom: 16px; }
+    .mdc-multi-select .mdc-list-group .mdc-list-divider {
+      margin-left: -16px; }
+  .mdc-multi-select .mdc-list-item {
+    margin: 0 0 0 -16px;
+    padding: 0 16px;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+    .mdc-multi-select .mdc-list-item--theme-dark,
+    .mdc-theme--dark .mdc-multi-select .mdc-list-item {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-multi-select .mdc-list-item:first-child {
+      margin-top: 12px; }
+    .mdc-multi-select .mdc-list-item:last-child {
+      margin-bottom: 8px; }
+  .mdc-multi-select .mdc-list-item:checked {
+    background-color: rgba(0, 0, 0, 0.12);
+    /* @alternate */
+    background-color: #fff;
+    background-color: var(--mdc-theme-background, #fff); }
+    .mdc-multi-select .mdc-list-item:checked--theme-dark,
+    .mdc-theme--dark .mdc-multi-select .mdc-list-item:checked {
+      /* @alternate */
+      background-color: white;
+      background-color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-multi-select .mdc-list-divider {
+    margin-bottom: 8px;
+    padding-top: 8px;
+    font-size: 0; }
+
+.mdc-multi-select:focus .mdc-list-item:checked {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-multi-select:focus .mdc-list-item:checked--theme-dark,
+  .mdc-theme--dark .mdc-multi-select:focus .mdc-list-item:checked {
+    /* @alternate */
+    background-color: white;
+    background-color: var(--mdc-theme-text-primary-on-dark, white); }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+@-webkit-keyframes mdc-slider-emphasize {
+  0% {
+    -webkit-animation-timing-function: ease-out;
+            animation-timing-function: ease-out; }
+  50% {
+    -webkit-animation-timing-function: ease-in;
+            animation-timing-function: ease-in;
+    -webkit-transform: scale(0.85);
+            transform: scale(0.85); }
+  100% {
+    -webkit-transform: scale(0.571);
+            transform: scale(0.571); } }
+@keyframes mdc-slider-emphasize {
+  0% {
+    -webkit-animation-timing-function: ease-out;
+            animation-timing-function: ease-out; }
+  50% {
+    -webkit-animation-timing-function: ease-in;
+            animation-timing-function: ease-in;
+    -webkit-transform: scale(0.85);
+            transform: scale(0.85); }
+  100% {
+    -webkit-transform: scale(0.571);
+            transform: scale(0.571); } }
+
+.mdc-slider {
+  position: relative;
+  width: 100%;
+  height: 48px;
+  cursor: pointer;
+  -ms-touch-action: pan-x;
+      touch-action: pan-x;
+  -webkit-tap-highlight-color: transparent; }
+  .mdc-slider:focus {
+    outline: none; }
+  .mdc-slider__track-container {
+    position: absolute;
+    top: 50%;
+    width: 100%;
+    height: 2px;
+    background-color: #bdbdbd;
+    overflow: hidden; }
+    .mdc-slider--theme-dark .mdc-slider__track-container,
+    .mdc-theme--dark .mdc-slider__track-container {
+      background-color: #5c5c5c; }
+  .mdc-slider__track {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    -webkit-transform-origin: left top;
+            transform-origin: left top;
+    will-change: transform; }
+    [dir="rtl"] .mdc-slider .mdc-slider__track,
+    .mdc-slider[dir="rtl"] .mdc-slider__track {
+      -webkit-transform-origin: right top;
+              transform-origin: right top; }
+  .mdc-slider__track-marker-container {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    margin-right: 0;
+    margin-left: -1px;
+    visibility: hidden; }
+    [dir="rtl"] .mdc-slider .mdc-slider__track-marker-container,
+    .mdc-slider[dir="rtl"] .mdc-slider__track-marker-container {
+      margin-right: -1px;
+      margin-left: 0; }
+    .mdc-slider__track-marker-container::after {
+      display: block;
+      width: 2px;
+      height: 2px;
+      background-color: #5c5c5c;
+      content: ""; }
+      .mdc-slider--theme-dark.mdc-slider__track-marker-container::after,
+      .mdc-theme--dark .mdc-slider__track-marker-container::after {
+        background-color: #bdbdbd; }
+  .mdc-slider__track-marker {
+    -webkit-box-flex: 1;
+        -ms-flex: 1;
+            flex: 1; }
+    .mdc-slider__track-marker::after {
+      display: block;
+      width: 2px;
+      height: 2px;
+      background-color: #5c5c5c;
+      content: ""; }
+      .mdc-slider--theme-dark.mdc-slider__track-marker::after,
+      .mdc-theme--dark .mdc-slider__track-marker::after {
+        background-color: #bdbdbd; }
+    .mdc-slider__track-marker:first-child::after {
+      width: 3px; }
+  .mdc-slider__thumb-container {
+    position: absolute;
+    top: 15px;
+    left: 0;
+    width: 21px;
+    height: 100%;
+    will-change: transform;
+    -webkit-user-select: none;
+       -moz-user-select: none;
+        -ms-user-select: none;
+            user-select: none; }
+  .mdc-slider__thumb {
+    /* @alternate */
+    fill: #3f51b5;
+    fill: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    stroke: #3f51b5;
+    stroke: var(--mdc-theme-primary, #3f51b5);
+    position: absolute;
+    top: 0;
+    left: 0;
+    -webkit-transform: scale(0.571);
+            transform: scale(0.571);
+    -webkit-transition: fill 100ms ease-out, stroke 100ms ease-out, -webkit-transform 100ms ease-out;
+    transition: fill 100ms ease-out, stroke 100ms ease-out, -webkit-transform 100ms ease-out;
+    transition: transform 100ms ease-out, fill 100ms ease-out, stroke 100ms ease-out;
+    transition: transform 100ms ease-out, fill 100ms ease-out, stroke 100ms ease-out, -webkit-transform 100ms ease-out;
+    stroke-width: 3.5; }
+  .mdc-slider__focus-ring {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    width: 21px;
+    height: 21px;
+    -webkit-transition: opacity 266.67ms ease-out, background-color 266.67ms ease-out, -webkit-transform 266.67ms ease-out;
+    transition: opacity 266.67ms ease-out, background-color 266.67ms ease-out, -webkit-transform 266.67ms ease-out;
+    transition: transform 266.67ms ease-out, opacity 266.67ms ease-out, background-color 266.67ms ease-out;
+    transition: transform 266.67ms ease-out, opacity 266.67ms ease-out, background-color 266.67ms ease-out, -webkit-transform 266.67ms ease-out;
+    border-radius: 50%;
+    opacity: 0; }
+  .mdc-slider__pin {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-primary, white);
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: absolute;
+    top: 0;
+    left: 0;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    width: 26px;
+    height: 26px;
+    margin-top: -2px;
+    margin-left: -2px;
+    -webkit-transform: rotate(-45deg) scale(0) translate(0, 0);
+            transform: rotate(-45deg) scale(0) translate(0, 0);
+    -webkit-transition: -webkit-transform 100ms ease-out;
+    transition: -webkit-transform 100ms ease-out;
+    transition: transform 100ms ease-out;
+    transition: transform 100ms ease-out, -webkit-transform 100ms ease-out;
+    border-radius: 50% 50% 50% 0%;
+    /**
+     * Ensuring that the pin is higher than the thumb in the stacking order
+     * removes some rendering jank observed in Chrome.
+     */
+    z-index: 1; }
+  .mdc-slider__pin-value-marker {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.75rem;
+    font-weight: 400;
+    letter-spacing: 0.08em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    -webkit-transform: rotate(45deg);
+            transform: rotate(45deg); }
+
+.mdc-slider--active .mdc-slider__thumb {
+  -webkit-transform: scale3d(1, 1, 1);
+          transform: scale3d(1, 1, 1); }
+
+.mdc-slider--focus .mdc-slider__thumb {
+  -webkit-animation: mdc-slider-emphasize 266.67ms linear;
+          animation: mdc-slider-emphasize 266.67ms linear; }
+
+.mdc-slider--focus .mdc-slider__focus-ring {
+  -webkit-transform: scale3d(1.55, 1.55, 1.55);
+          transform: scale3d(1.55, 1.55, 1.55);
+  opacity: .25; }
+
+.mdc-slider--disabled {
+  cursor: auto; }
+  .mdc-slider--disabled .mdc-slider__track {
+    background-color: #bdbdbd; }
+    .mdc-slider--theme-dark.mdc-slider--disabled .mdc-slider__track,
+    .mdc-theme--dark .mdc-slider--disabled .mdc-slider__track {
+      background-color: #5c5c5c; }
+  .mdc-slider--disabled .mdc-slider__thumb {
+    fill: #bdbdbd !important;
+    stroke: white !important;
+    stroke: var(--mdc-slider-bg-color-behind-component, white) !important; }
+    .mdc-slider--theme-dark.mdc-slider--disabled .mdc-slider__thumb,
+    .mdc-theme--dark .mdc-slider--disabled .mdc-slider__thumb {
+      fill: #5c5c5c !important;
+      stroke: #333 !important;
+      stroke: var(--mdc-slider-bg-color-behind-component, #333) !important; }
+
+.mdc-slider--off .mdc-slider__track {
+  opacity: 0; }
+
+.mdc-slider--off .mdc-slider__thumb {
+  fill: white;
+  fill: var(--mdc-slider-bg-color-behind-component, white);
+  stroke: #bdbdbd; }
+  .mdc-slider--theme-dark.mdc-slider--off .mdc-slider__thumb,
+  .mdc-theme--dark .mdc-slider--off .mdc-slider__thumb {
+    fill: #333;
+    fill: var(--mdc-slider-bg-color-behind-component, #333);
+    stroke: #5c5c5c; }
+
+.mdc-slider--off .mdc-slider__pin {
+  background-color: #bdbdbd; }
+  .mdc-slider--theme-dark.mdc-slider--off .mdc-slider__pin,
+  .mdc-theme--dark .mdc-slider--off .mdc-slider__pin {
+    background-color: #5c5c5c; }
+
+.mdc-slider--off.mdc-slider--focus .mdc-slider__thumb {
+  fill: #dedede; }
+  .mdc-slider--theme-dark.mdc-slider--off.mdc-slider--focus .mdc-slider__thumb,
+  .mdc-theme--dark .mdc-slider--off.mdc-slider--focus .mdc-slider__thumb {
+    fill: #82848c;
+    stroke: #82848c; }
+
+.mdc-slider--off.mdc-slider--active.mdc-slider--focus .mdc-slider__thumb {
+  stroke: #8c8c8c; }
+  .mdc-slider--theme-dark.mdc-slider--off.mdc-slider--active.mdc-slider--focus .mdc-slider__thumb,
+  .mdc-theme--dark .mdc-slider--off.mdc-slider--active.mdc-slider--focus .mdc-slider__thumb {
+    stroke: #5c5c5c; }
+
+.mdc-slider--off .mdc-slider__focus-ring {
+  background-color: #bdbdbd; }
+
+.mdc-slider--in-transit .mdc-slider__thumb {
+  -webkit-transition-delay: 140ms;
+          transition-delay: 140ms; }
+
+.mdc-slider--in-transit .mdc-slider__thumb-container,
+.mdc-slider--in-transit .mdc-slider__track,
+.mdc-slider:focus:not(.mdc-slider--active) .mdc-slider__thumb-container,
+.mdc-slider:focus:not(.mdc-slider--active) .mdc-slider__track {
+  -webkit-transition: -webkit-transform 80ms ease;
+  transition: -webkit-transform 80ms ease;
+  transition: transform 80ms ease;
+  transition: transform 80ms ease, -webkit-transform 80ms ease; }
+
+.mdc-slider--discrete.mdc-slider--active .mdc-slider__thumb {
+  -webkit-transform: scale(calc(12 / 21));
+          transform: scale(calc(12 / 21)); }
+
+.mdc-slider--discrete.mdc-slider--active .mdc-slider__pin {
+  -webkit-transform: rotate(-45deg) scale(1) translate(19px, -20px);
+          transform: rotate(-45deg) scale(1) translate(19px, -20px); }
+
+.mdc-slider--discrete.mdc-slider--focus .mdc-slider__thumb {
+  -webkit-animation: none;
+          animation: none; }
+
+.mdc-slider--discrete.mdc-slider--focus .mdc-slider__focus-ring {
+  -webkit-transform: none;
+          transform: none;
+  opacity: 0; }
+
+.mdc-slider--discrete.mdc-slider--display-markers .mdc-slider__track-marker-container {
+  visibility: visible; }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* postcss-bem-linter: define snackbar */
+.mdc-snackbar {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  position: fixed;
+  bottom: 0;
+  left: 50%;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-pack: start;
+      -ms-flex-pack: start;
+          justify-content: flex-start;
+  padding-right: 24px;
+  padding-left: 24px;
+  -webkit-transform: translate(-50%, 100%);
+          transform: translate(-50%, 100%);
+  -webkit-transition: -webkit-transform 0.25s 0ms cubic-bezier(0.4, 0, 1, 1);
+  transition: -webkit-transform 0.25s 0ms cubic-bezier(0.4, 0, 1, 1);
+  transition: transform 0.25s 0ms cubic-bezier(0.4, 0, 1, 1);
+  transition: transform 0.25s 0ms cubic-bezier(0.4, 0, 1, 1), -webkit-transform 0.25s 0ms cubic-bezier(0.4, 0, 1, 1);
+  background-color: #323232;
+  will-change: transform;
+  pointer-events: none;
+  /* stylelint-disable plugin/selector-bem-pattern */
+  /* stylelint-enable plugin/selector-bem-pattern */ }
+  .mdc-snackbar--theme-dark .mdc-snackbar,
+  .mdc-theme--dark .mdc-snackbar {
+    background-color: #fafafa; }
+  @media (max-width: 599px) {
+    .mdc-snackbar {
+      left: 0;
+      width: calc(100% - 48px);
+      -webkit-transform: translate(0, 100%);
+              transform: translate(0, 100%); } }
+  @media (min-width: 600px) {
+    .mdc-snackbar {
+      min-width: 288px;
+      max-width: 568px;
+      border-radius: 2px; } }
+  @media (min-width: 600px) {
+    .mdc-snackbar--align-start {
+      bottom: 24px;
+      left: 24px;
+      right: initial;
+      -webkit-transform: translate(0, 200%);
+              transform: translate(0, 200%); }
+      [dir="rtl"] .mdc-snackbar--align-start, .mdc-snackbar--align-start[dir="rtl"] {
+        left: initial;
+        right: 24px; } }
+  @media (max-width: 599px) {
+    .mdc-snackbar--align-start {
+      bottom: 0;
+      left: 0;
+      width: calc(100% - 48px);
+      -webkit-transform: translate(0, 100%);
+              transform: translate(0, 100%); } }
+  .mdc-snackbar--active {
+    -webkit-transform: translate(0);
+            transform: translate(0);
+    pointer-events: auto;
+    -webkit-transition: -webkit-transform 0.25s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: -webkit-transform 0.25s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.25s 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 0.25s 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.25s 0ms cubic-bezier(0, 0, 0.2, 1); }
+    .mdc-snackbar--active:not(.mdc-snackbar--align-start) {
+      -webkit-transform: translate(-50%, 0);
+              transform: translate(-50%, 0); }
+      @media (max-width: 599px) {
+        .mdc-snackbar--active:not(.mdc-snackbar--align-start) {
+          bottom: 0;
+          left: 0;
+          width: calc(100% - 48px);
+          -webkit-transform: translate(0);
+                  transform: translate(0); } }
+  .mdc-snackbar--action-on-bottom {
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column; }
+  .mdc-snackbar--action-on-bottom .mdc-snackbar__text {
+    margin-right: inherit; }
+  .mdc-snackbar--action-on-bottom .mdc-snackbar__action-wrapper {
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+        -ms-flex-direction: column;
+            flex-direction: column;
+    -webkit-box-pack: start;
+        -ms-flex-pack: start;
+            justify-content: flex-start;
+    margin-top: -12px;
+    margin-bottom: 8px;
+    margin-left: auto;
+    margin-right: 0; }
+    [dir="rtl"] .mdc-snackbar--action-on-bottom .mdc-snackbar__action-wrapper, .mdc-snackbar--action-on-bottom .mdc-snackbar__action-wrapper[dir="rtl"] {
+      margin-left: 0;
+      margin-right: auto; }
+  .mdc-snackbar__text {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 0.875rem;
+    font-weight: 400;
+    letter-spacing: 0.04em;
+    line-height: 1.25rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    margin-left: 0;
+    margin-right: auto;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    height: 48px;
+    -webkit-transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    color: white;
+    opacity: 0; }
+    [dir="rtl"] .mdc-snackbar .mdc-snackbar__text,
+    .mdc-snackbar[dir="rtl"] .mdc-snackbar__text {
+      margin-left: auto;
+      margin-right: 0; }
+    .mdc-snackbar--theme-dark .mdc-snackbar__text,
+    .mdc-theme--dark .mdc-snackbar__text {
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.87);
+      color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+  .mdc-snackbar--multiline .mdc-snackbar__text {
+    height: 80px; }
+  .mdc-snackbar--multiline.mdc-snackbar--action-on-bottom .mdc-snackbar__text {
+    margin: 0; }
+  .mdc-snackbar__action-button {
+    /* @alternate */
+    color: #ff4081;
+    color: var(--mdc-theme-accent, #ff4081);
+    margin-left: 0;
+    margin-right: -16px;
+    min-width: auto;
+    height: inherit;
+    -webkit-transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    opacity: 0;
+    visibility: hidden; }
+    .mdc-snackbar--theme-dark .mdc-snackbar__action-button,
+    .mdc-theme--dark .mdc-snackbar__action-button {
+      /* @alternate */
+      color: #3f51b5;
+      color: var(--mdc-theme-primary, #3f51b5); }
+    [dir="rtl"] .mdc-snackbar .mdc-snackbar__action-button,
+    .mdc-snackbar[dir="rtl"] .mdc-snackbar__action-button {
+      margin-left: -16px;
+      margin-right: 0; }
+    .mdc-snackbar__action-button::-moz-focus-inner {
+      border: 0; }
+    .mdc-snackbar__action-button:not([aria-hidden]) {
+      visibility: inherit; }
+  .mdc-snackbar--active .mdc-snackbar__text,
+  .mdc-snackbar--active .mdc-snackbar__action-button:not([aria-hidden]) {
+    -webkit-transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    transition: opacity 0.3s 0ms cubic-bezier(0.4, 0, 1, 1);
+    opacity: 1; }
+
+/* postcss-bem-linter: end */
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+.mdc-switch {
+  display: inline-block;
+  position: relative; }
+  .mdc-switch__native-control {
+    display: inline-block;
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 34px;
+    height: 14px;
+    cursor: pointer;
+    opacity: 0;
+    z-index: 2; }
+  .mdc-switch__background {
+    display: block;
+    position: relative;
+    width: 34px;
+    height: 14px;
+    border-radius: 7px;
+    outline: none;
+    background-color: transparent;
+    cursor: pointer;
+    -webkit-user-select: none;
+       -moz-user-select: none;
+        -ms-user-select: none;
+            user-select: none; }
+    .mdc-switch--theme-dark .mdc-switch__background,
+    .mdc-theme--dark .mdc-switch__background {
+      background-color: transparent; }
+    .mdc-switch__background::before {
+      display: block;
+      position: absolute;
+      top: 0;
+      right: 0;
+      bottom: 0;
+      left: 0;
+      -webkit-transition: opacity 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: opacity 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      border-radius: 7px;
+      background-color: #000;
+      content: "";
+      opacity: .38; }
+      .mdc-switch--theme-dark .mdc-switch__background::before,
+      .mdc-theme--dark .mdc-switch__background::before {
+        background-color: #fff;
+        opacity: .3; }
+    .mdc-switch__background .mdc-switch__knob {
+      display: block;
+      position: absolute;
+      top: -3px;
+      left: 0;
+      width: 20px;
+      height: 20px;
+      -webkit-transform: translateX(0);
+              transform: translateX(0);
+      -webkit-transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+      border-radius: 10px;
+      background-color: #fafafa;
+      -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+              box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
+      z-index: 1; }
+      .mdc-switch--theme-dark .mdc-switch__background .mdc-switch__knob,
+      .mdc-theme--dark .mdc-switch__background .mdc-switch__knob {
+        background-color: #bdbdbd; }
+      .mdc-switch__background .mdc-switch__knob::before {
+        position: absolute;
+        top: -14px;
+        left: -14px;
+        width: 48px;
+        height: 48px;
+        -webkit-transform: scale(0);
+                transform: scale(0);
+        -webkit-transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+        transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+        transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+        transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+        border-radius: 24px;
+        background-color: transparent;
+        content: "";
+        opacity: .2; }
+
+.mdc-switch__native-control:focus ~ .mdc-switch__background .mdc-switch__knob::before {
+  position: absolute;
+  width: 48px;
+  height: 48px;
+  -webkit-transform: scale(1);
+          transform: scale(1);
+  -webkit-transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  border-radius: 24px;
+  background-color: #9e9e9e; }
+  .mdc-switch--theme-dark .mdc-switch__native-control:focus ~ .mdc-switch__background .mdc-switch__knob::before,
+  .mdc-theme--dark .mdc-switch__native-control:focus ~ .mdc-switch__background .mdc-switch__knob::before {
+    background-color: #f1f1f1;
+    opacity: .14; }
+
+.mdc-switch__native-control:checked ~ .mdc-switch__background::before {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5);
+  opacity: .5; }
+
+.mdc-switch__native-control:checked ~ .mdc-switch__background .mdc-switch__knob {
+  -webkit-transform: translateX(14px);
+          transform: translateX(14px);
+  -webkit-transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 90ms cubic-bezier(0.4, 0, 0.2, 1), background-color 90ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 90ms cubic-bezier(0.4, 0, 0.2, 1);
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-switch__native-control:checked ~ .mdc-switch__background .mdc-switch__knob::before {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    opacity: .15; }
+    .mdc-switch--theme-dark .mdc-switch__native-control:checked ~ .mdc-switch__background .mdc-switch__knob::before,
+    .mdc-theme--dark .mdc-switch__native-control:checked ~ .mdc-switch__background .mdc-switch__knob::before {
+      /* @alternate */
+      background-color: #3f51b5;
+      background-color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-switch__native-control:disabled {
+  cursor: initial; }
+
+.mdc-switch__native-control:disabled ~ .mdc-switch__background::before {
+  background-color: #000;
+  opacity: .12; }
+  .mdc-switch--theme-dark .mdc-switch__native-control:disabled ~ .mdc-switch__background::before,
+  .mdc-theme--dark .mdc-switch__native-control:disabled ~ .mdc-switch__background::before {
+    background-color: #fff;
+    opacity: .1; }
+
+.mdc-switch__native-control:disabled ~ .mdc-switch__background .mdc-switch__knob {
+  background-color: #bdbdbd; }
+  .mdc-switch--theme-dark .mdc-switch__native-control:disabled ~ .mdc-switch__background .mdc-switch__knob,
+  .mdc-theme--dark .mdc-switch__native-control:disabled ~ .mdc-switch__background .mdc-switch__knob {
+    background-color: #424242; }
+
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+.mdc-tab {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.875rem;
+  font-weight: 500;
+  letter-spacing: 0.04em;
+  line-height: 1.5rem;
+  text-decoration: inherit;
+  text-transform: inherit;
+  display: table-cell;
+  position: relative;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  min-width: 160px;
+  min-height: 48px;
+  padding: 0 24px;
+  text-align: center;
+  text-decoration: none;
+  white-space: nowrap;
+  cursor: pointer;
+  overflow: hidden;
+  vertical-align: middle;
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.54);
+  color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+  .mdc-tab:hover {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+  .mdc-tab:focus {
+    /* @alternate */
+    outline-color: rgba(0, 0, 0, 0.54);
+    outline-color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+  .mdc-tab-bar--theme-dark .mdc-tab,
+  .mdc-theme--dark .mdc-tab {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.7);
+    color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+    .mdc-tab-bar--theme-dark .mdc-tab:hover,
+    .mdc-theme--dark .mdc-tab:hover {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-tab-bar--theme-dark .mdc-tab:focus,
+    .mdc-theme--dark .mdc-tab:focus {
+      /* @alternate */
+      outline-color: rgba(255, 255, 255, 0.7);
+      outline-color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  @media screen and (max-width: 600px) {
+    .mdc-tab {
+      min-width: 72px;
+      padding: 0 12px; } }
+  .mdc-tab__icon {
+    display: block;
+    margin: 0 auto;
+    width: 24px;
+    height: 24px; }
+    .mdc-tab-bar--icons-with-text .mdc-tab__icon {
+      margin-top: 4px; }
+  .mdc-tab__icon-text {
+    display: block;
+    margin: 0 auto; }
+  .mdc-tab__icon + .mdc-tab__icon-text {
+    padding-top: 6px; }
+
+.mdc-tab--active {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87);
+  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+  .mdc-tab-bar--theme-dark .mdc-tab--active,
+  .mdc-theme--dark .mdc-tab--active {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-tab--active::before {
+    bottom: 0; }
+
+.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab {
+  position: relative; }
+  .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+    display: none;
+    position: absolute;
+    top: 46px;
+    left: 0;
+    width: calc(100% - 4px);
+    height: 2px;
+    content: "";
+    pointer-events: none;
+    /* @alternate */
+    background-color: rgba(0, 0, 0, 0.87);
+    background-color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+    .mdc-tab-bar--theme-dark.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after,
+    .mdc-theme--dark .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+      /* @alternate */
+      background-color: white;
+      background-color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-toolbar .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+      /* @alternate */
+      background-color: white;
+      background-color: var(--mdc-theme-text-primary-on-primary, white); }
+  .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab--active::after, .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:active::after, .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:hover::after {
+    display: block; }
+  .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:not(.mdc-tab--active):hover::after {
+    opacity: .38; }
+  .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab--active, .mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab:not(.mdc-tab--active):active::after {
+    opacity: .87; }
+
+.mdc-tab-bar--icons-with-text:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+  top: 70px; }
+
+.mdc-tab.mdc-ripple-upgraded {
+  --mdc-ripple-surface-width: 0;
+  --mdc-ripple-surface-height: 0;
+  --mdc-ripple-fg-size: 0;
+  --mdc-ripple-left: 0;
+  --mdc-ripple-top: 0;
+  --mdc-ripple-fg-scale: 1;
+  --mdc-ripple-fg-translate-end: 0;
+  --mdc-ripple-fg-translate-start: 0;
+  will-change: transform, opacity;
+  -webkit-tap-highlight-color: transparent; }
+  .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):hover::before, .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):focus::before, .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):active::after {
+    -webkit-transition-duration: 85ms;
+            transition-duration: 85ms;
+    opacity: .6; }
+  .mdc-tab.mdc-ripple-upgraded::after {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-tab.mdc-ripple-upgraded::before {
+    background-color: rgba(0, 0, 0, 0.06);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded::before,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded::before {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::before,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded::after {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-tab-bar--theme-dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after,
+  .mdc-theme--dark .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded::before {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::before {
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-focused::before {
+    opacity: .99999; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--background-active-fill::before {
+    -webkit-transition-duration: 120ms;
+            transition-duration: 120ms;
+    opacity: 1; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::before {
+    /* @alternate */
+    top: calc(50% - 50%);
+    top: var(--mdc-ripple-top, calc(50% - 50%));
+    /* @alternate */
+    left: calc(50% - 50%);
+    left: var(--mdc-ripple-left, calc(50% - 50%));
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
+            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded::after {
+    background-color: rgba(255, 255, 255, 0.16);
+    position: absolute;
+    top: calc(50% - 100%);
+    left: calc(50% - 100%);
+    width: 200%;
+    height: 200%;
+    -webkit-transition: opacity 250ms linear;
+    transition: opacity 250ms linear;
+    border-radius: 50%;
+    opacity: 0;
+    pointer-events: none;
+    content: ""; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+    top: 0;
+    left: 0;
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center;
+    opacity: 0; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+    /* @alternate */
+    top: 0;
+    top: var(--mdc-ripple-top, 0);
+    /* @alternate */
+    left: 0;
+    left: var(--mdc-ripple-left, 0);
+    /* @alternate */
+    width: 100%;
+    width: var(--mdc-ripple-fg-size, 100%);
+    /* @alternate */
+    height: 100%;
+    height: var(--mdc-ripple-fg-size, 100%);
+    -webkit-transform: scale(0);
+            transform: scale(0);
+    -webkit-transform-origin: center center;
+            transform-origin: center center; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+  .mdc-toolbar .mdc-tab.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+            animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-tab.mdc-ripple-upgraded:focus {
+    outline: none; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+.mdc-tab-bar {
+  display: table;
+  position: relative;
+  height: 48px;
+  margin: 0 auto;
+  text-transform: uppercase; }
+  .mdc-tab-bar__indicator {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 2px;
+    /* @alternate */
+    background-color: rgba(0, 0, 0, 0.87);
+    background-color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+    -webkit-transform-origin: left top;
+            transform-origin: left top;
+    -webkit-transition: -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    transition: transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+    will-change: transform;
+    visibility: hidden; }
+    .mdc-tab-bar--theme-dark .mdc-tab-bar__indicator,
+    .mdc-theme--dark .mdc-tab-bar__indicator {
+      /* @alternate */
+      background-color: white;
+      background-color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-toolbar .mdc-tab-bar .mdc-tab {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.7);
+    color: var(--mdc-theme-text-secondary-on-primary, rgba(255, 255, 255, 0.7)); }
+    .mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab,
+    .mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.7);
+      color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  .mdc-toolbar .mdc-tab-bar .mdc-tab--active,
+  .mdc-toolbar .mdc-tab-bar .mdc-tab:hover {
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-primary, white); }
+    .mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab--active,
+    .mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab--active, .mdc-tab-bar--theme-dark
+    .mdc-toolbar .mdc-tab-bar .mdc-tab:hover,
+    .mdc-theme--dark
+    .mdc-toolbar .mdc-tab-bar .mdc-tab:hover {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+  .mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator {
+    /* @alternate */
+    background-color: white;
+    background-color: var(--mdc-theme-text-primary-on-primary, white); }
+    .mdc-tab-bar--theme-dark .mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator,
+    .mdc-theme--dark .mdc-toolbar .mdc-tab-bar .mdc-tab-bar__indicator {
+      /* @alternate */
+      background-color: white;
+      background-color: var(--mdc-theme-text-primary-on-dark, white); }
+
+.mdc-tab-bar--icons-with-text {
+  height: 72px; }
+
+.mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,
+.mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-tab-bar--theme-dark .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,
+  .mdc-theme--dark .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator, .mdc-tab-bar--theme-dark
+  .mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator,
+  .mdc-theme--dark
+  .mdc-toolbar .mdc-tab-bar--indicator-primary .mdc-tab-bar__indicator {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-tab-bar--indicator-primary.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after,
+.mdc-toolbar .mdc-tab-bar--indicator-primary.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,
+.mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator {
+  /* @alternate */
+  background-color: #ff4081;
+  background-color: var(--mdc-theme-accent, #ff4081); }
+  .mdc-tab-bar--theme-dark .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,
+  .mdc-theme--dark .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator, .mdc-tab-bar--theme-dark
+  .mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator,
+  .mdc-theme--dark
+  .mdc-toolbar .mdc-tab-bar--indicator-accent .mdc-tab-bar__indicator {
+    /* @alternate */
+    background-color: #ff4081;
+    background-color: var(--mdc-theme-accent, #ff4081); }
+
+.mdc-tab-bar--indicator-accent.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after,
+.mdc-toolbar .mdc-tab-bar--indicator-accent.mdc-tab-bar:not(.mdc-tab-bar-upgraded) .mdc-tab::after {
+  /* @alternate */
+  background-color: #ff4081;
+  background-color: var(--mdc-theme-accent, #ff4081); }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+.mdc-tab-bar-scroller {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+      -ms-flex-align: center;
+          align-items: center;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  width: 100%;
+  background-color: inherit;
+  overflow: hidden; }
+  .mdc-tab-bar-scroller__scroll-frame {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: relative;
+    -webkit-box-flex: 1;
+        -ms-flex: 1;
+            flex: 1;
+    -webkit-box-pack: start;
+        -ms-flex-pack: start;
+            justify-content: flex-start;
+    overflow: hidden; }
+    .mdc-tab-bar-scroller__scroll-frame__tabs {
+      -webkit-transition: -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      transition: transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 240ms 0ms cubic-bezier(0, 0, 0.2, 1);
+      will-change: transform; }
+  .mdc-tab-bar-scroller__indicator {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    width: 48px;
+    cursor: pointer;
+    visibility: hidden;
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.54);
+    color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+    .mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator,
+    .mdc-theme--dark .mdc-tab-bar-scroller__indicator {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.7);
+      color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+    .mdc-tab-bar-scroller__indicator:hover {
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.87);
+      color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
+      .mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator:hover,
+      .mdc-theme--dark .mdc-tab-bar-scroller__indicator:hover {
+        /* @alternate */
+        color: white;
+        color: var(--mdc-theme-text-primary-on-dark, white); }
+    .mdc-tab-bar-scroller__indicator__inner {
+      color: inherit;
+      text-decoration: inherit;
+      cursor: inherit; }
+      .mdc-tab-bar-scroller__indicator__inner:focus {
+        outline-color: inherit; }
+      [dir="rtl"] .mdc-tab-bar-scroller .mdc-tab-bar-scroller__indicator__inner,
+      .mdc-tab-bar-scroller[dir="rtl"] .mdc-tab-bar-scroller__indicator__inner {
+        -webkit-transform: rotate(180deg);
+                transform: rotate(180deg); }
+    .mdc-tab-bar-scroller__indicator__inner:hover {
+      color: inherit; }
+      .mdc-tab-bar--theme-dark .mdc-tab-bar-scroller__indicator__inner:hover,
+      .mdc-theme--dark .mdc-tab-bar-scroller__indicator__inner:hover {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.7);
+        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  .mdc-tab-bar-scroller__indicator--enabled {
+    visibility: visible; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
+@keyframes mdc-ripple-fg-radius-in {
+  from {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
+    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
+  to {
+    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
+
+@keyframes mdc-ripple-fg-opacity-in {
+  from {
+    opacity: 0;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 1; } }
+
+@keyframes mdc-ripple-fg-opacity-out {
+  from {
+    opacity: 1;
+    -webkit-animation-timing-function: linear;
+            animation-timing-function: linear; }
+  to {
+    opacity: 0; } }
+
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+.mdc-textfield {
+  display: inline-block;
+  margin-bottom: 8px;
+  will-change: opacity, transform, color; }
+  .mdc-textfield__input {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.87);
+    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 1rem;
+    letter-spacing: 0.04em;
+    width: 100%;
+    padding: 0 0 8px;
+    border: none;
+    background: none;
+    font-size: inherit;
+    -webkit-appearance: none;
+       -moz-appearance: none;
+            appearance: none; }
+    .mdc-textfield__input::-webkit-input-placeholder {
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.38);
+      color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+      -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      opacity: 1; }
+    .mdc-textfield__input:-ms-input-placeholder {
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.38);
+      color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+      -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      opacity: 1; }
+    .mdc-textfield__input::placeholder {
+      /* @alternate */
+      color: rgba(0, 0, 0, 0.38);
+      color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+      -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      opacity: 1; }
+    .mdc-textfield__input:focus {
+      outline: none; }
+      .mdc-textfield__input:focus::-webkit-input-placeholder {
+        /* @alternate */
+        color: rgba(0, 0, 0, 0.54);
+        color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+      .mdc-textfield__input:focus:-ms-input-placeholder {
+        /* @alternate */
+        color: rgba(0, 0, 0, 0.54);
+        color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+      .mdc-textfield__input:focus::placeholder {
+        /* @alternate */
+        color: rgba(0, 0, 0, 0.54);
+        color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
+    .mdc-textfield__input:invalid {
+      -webkit-box-shadow: none;
+              box-shadow: none; }
+    .mdc-textfield__input--theme-dark,
+    .mdc-theme--dark .mdc-textfield__input {
+      /* @alternate */
+      color: white;
+      color: var(--mdc-theme-text-primary-on-dark, white); }
+      .mdc-textfield__input--theme-dark::-webkit-input-placeholder,
+      .mdc-theme--dark .mdc-textfield__input::-webkit-input-placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.5);
+        color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+      .mdc-textfield__input--theme-dark:-ms-input-placeholder,
+      .mdc-theme--dark .mdc-textfield__input:-ms-input-placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.5);
+        color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+      .mdc-textfield__input--theme-dark::placeholder,
+      .mdc-theme--dark .mdc-textfield__input::placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.5);
+        color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+      .mdc-textfield__input--theme-dark:focus::-webkit-input-placeholder,
+      .mdc-theme--dark .mdc-textfield__input:focus::-webkit-input-placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.7);
+        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+      .mdc-textfield__input--theme-dark:focus:-ms-input-placeholder,
+      .mdc-theme--dark .mdc-textfield__input:focus:-ms-input-placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.7);
+        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+      .mdc-textfield__input--theme-dark:focus::placeholder,
+      .mdc-theme--dark .mdc-textfield__input:focus::placeholder {
+        /* @alternate */
+        color: rgba(255, 255, 255, 0.7);
+        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+  .mdc-textfield__label {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.38);
+    color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+    position: absolute;
+    bottom: 8px;
+    left: 0;
+    -webkit-transform-origin: left top;
+            transform-origin: left top;
+    -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    cursor: text; }
+    [dir="rtl"] .mdc-textfield .mdc-textfield__label,
+    .mdc-textfield[dir="rtl"] .mdc-textfield__label {
+      right: 0;
+      left: auto;
+      -webkit-transform-origin: right top;
+              transform-origin: right top; }
+    .mdc-textfield--theme-dark .mdc-textfield__label,
+    .mdc-theme--dark .mdc-textfield__label {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.5);
+      color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+    .mdc-textfield__label--float-above {
+      -webkit-transform: translateY(-100%) scale(0.75, 0.75);
+              transform: translateY(-100%) scale(0.75, 0.75);
+      cursor: auto; }
+
+.mdc-textfield__input:-webkit-autofill + .mdc-textfield__label {
+  -webkit-transform: translateY(-100%) scale(0.75, 0.75);
+          transform: translateY(-100%) scale(0.75, 0.75);
+  cursor: auto; }
+
+.mdc-textfield--box {
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  position: relative;
+  height: 56px;
+  border-radius: 4px 4px 0 0;
+  background-color: rgba(0, 0, 0, 0.04);
+  overflow: hidden; }
+  .mdc-textfield--theme-dark.mdc-textfield--box,
+  .mdc-theme--dark .mdc-textfield--box {
+    background-color: rgba(255, 255, 255, 0.1); }
+  .mdc-textfield--box::before, .mdc-textfield--box::after {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border-radius: 50%;
+    background-color: inherit;
+    content: "";
+    opacity: 0;
+    pointer-events: none; }
+  .mdc-textfield--box::before {
+    -webkit-transition: opacity 17ms linear, -webkit-transform 0ms 85ms linear;
+    transition: opacity 17ms linear, -webkit-transform 0ms 85ms linear;
+    transition: opacity 17ms linear, transform 0ms 85ms linear;
+    transition: opacity 17ms linear, transform 0ms 85ms linear, -webkit-transform 0ms 85ms linear; }
+  .mdc-textfield--box:hover::before {
+    -webkit-transition: opacity 83ms linear 17ms, -webkit-transform 250ms cubic-bezier(0, 0, 0.2, 1) 17ms;
+    transition: opacity 83ms linear 17ms, -webkit-transform 250ms cubic-bezier(0, 0, 0.2, 1) 17ms;
+    transition: opacity 83ms linear 17ms, transform 250ms cubic-bezier(0, 0, 0.2, 1) 17ms;
+    transition: opacity 83ms linear 17ms, transform 250ms cubic-bezier(0, 0, 0.2, 1) 17ms, -webkit-transform 250ms cubic-bezier(0, 0, 0.2, 1) 17ms;
+    opacity: 1; }
+  .mdc-textfield--box .mdc-textfield__input {
+    -ms-flex-item-align: end;
+        align-self: flex-end;
+    height: 100%;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    padding: 20px 16px 0; }
+  .mdc-textfield--box .mdc-textfield__label {
+    left: 16px;
+    right: initial;
+    position: absolute;
+    bottom: 20px;
+    color: rgba(0, 0, 0, 0.6);
+    pointer-events: none;
+    will-change: transform; }
+    [dir="rtl"] .mdc-textfield--box .mdc-textfield__label, .mdc-textfield--box .mdc-textfield__label[dir="rtl"] {
+      left: initial;
+      right: 16px; }
+    .mdc-textfield--theme-dark .mdc-textfield--box .mdc-textfield__label,
+    .mdc-theme--dark .mdc-textfield--box .mdc-textfield__label {
+      /* @alternate */
+      color: rgba(255, 255, 255, 0.7);
+      color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
+    .mdc-textfield--box .mdc-textfield__label--float-above {
+      -webkit-transform: translateY(-50%) scale(0.75, 0.75);
+              transform: translateY(-50%) scale(0.75, 0.75); }
+  .mdc-textfield--box.mdc-ripple-upgraded {
+    --mdc-ripple-surface-width: 0;
+    --mdc-ripple-surface-height: 0;
+    --mdc-ripple-fg-size: 0;
+    --mdc-ripple-left: 0;
+    --mdc-ripple-top: 0;
+    --mdc-ripple-fg-scale: 1;
+    --mdc-ripple-fg-translate-end: 0;
+    --mdc-ripple-fg-translate-start: 0;
+    will-change: transform, opacity;
+    -webkit-tap-highlight-color: transparent; }
+    .mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):hover::before, .mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):focus::before, .mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded):active::after {
+      -webkit-transition-duration: 85ms;
+              transition-duration: 85ms;
+      opacity: .6; }
+    .mdc-textfield--box.mdc-ripple-upgraded::after {
+      background-color: rgba(0, 0, 0, 0.04);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+    .mdc-textfield--box.mdc-ripple-upgraded::before {
+      top: calc(50% - var(--mdc-ripple-fg-size, 100%) / 2);
+      left: calc(50% - var(--mdc-ripple-fg-size, 100%) / 2);
+      width: var(--mdc-ripple-fg-size, 100%);
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0.8);
+              transform: scale(0.8); }
+    .mdc-textfield--box.mdc-ripple-upgraded:hover::before {
+      -webkit-transform: scale(calc(var(--mdc-ripple-fg-scale, 1) + .1));
+              transform: scale(calc(var(--mdc-ripple-fg-scale, 1) + .1)); }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded::after {
+      background-color: rgba(255, 255, 255, 0.05);
+      position: absolute;
+      top: calc(50% - 100%);
+      left: calc(50% - 100%);
+      width: 200%;
+      height: 200%;
+      -webkit-transition: opacity 250ms linear;
+      transition: opacity 250ms linear;
+      border-radius: 50%;
+      opacity: 0;
+      pointer-events: none;
+      content: ""; }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded::after {
+      top: 0;
+      left: 0;
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center;
+      opacity: 0; }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded:not(.mdc-ripple-upgraded--unbounded)::after {
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--unbounded::after {
+      /* @alternate */
+      top: 0;
+      top: var(--mdc-ripple-top, 0);
+      /* @alternate */
+      left: 0;
+      left: var(--mdc-ripple-left, 0);
+      /* @alternate */
+      width: 100%;
+      width: var(--mdc-ripple-fg-size, 100%);
+      /* @alternate */
+      height: 100%;
+      height: var(--mdc-ripple-fg-size, 100%);
+      -webkit-transform: scale(0);
+              transform: scale(0);
+      -webkit-transform-origin: center center;
+              transform-origin: center center; }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-activation::after {
+      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
+              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after,
+    .mdc-theme--dark .mdc-textfield--box.mdc-ripple-upgraded.mdc-ripple-upgraded--foreground-deactivation::after {
+      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
+      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
+              animation: 83ms mdc-ripple-fg-opacity-out; }
+  .mdc-textfield--box.mdc-textfield--disabled {
+    border-bottom: none;
+    background-color: rgba(0, 0, 0, 0.02);
+    color: rgba(0, 0, 0, 0.38); }
+    .mdc-textfield--theme-dark.mdc-textfield--box.mdc-textfield--disabled,
+    .mdc-theme--dark .mdc-textfield--box.mdc-textfield--disabled {
+      border-bottom: none;
+      background-color: rgba(255, 255, 255, 0.05); }
+    .mdc-textfield--box.mdc-textfield--disabled .mdc-textfield__label {
+      bottom: 20px; }
+    .mdc-textfield--box.mdc-textfield--disabled .mdc-textfield__input {
+      padding-bottom: 0; }
+  .mdc-textfield--box .mdc-textfield__bottom-line {
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 1px;
+    -webkit-transform: scaleY(1);
+            transform: scaleY(1);
+    -webkit-transform-origin: center bottom;
+            transform-origin: center bottom;
+    -webkit-transition: background-color 33ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: background-color 33ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: background-color 33ms cubic-bezier(0.4, 0, 0.2, 1), transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: background-color 33ms cubic-bezier(0.4, 0, 0.2, 1), transform 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    background-color: rgba(0, 0, 0, 0.42);
+    pointer-events: none; }
+    .mdc-textfield--box .mdc-textfield__bottom-line::after {
+      position: absolute;
+      top: 0;
+      left: 0;
+      width: 100%;
+      height: 100%;
+      -webkit-transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      background-color: #d50000;
+      content: "";
+      opacity: 0; }
+    .mdc-textfield--theme-dark .mdc-textfield--box .mdc-textfield__bottom-line,
+    .mdc-theme--dark .mdc-textfield--box .mdc-textfield__bottom-line {
+      /* @alternate */
+      background-color: rgba(255, 255, 255, 0.5);
+      background-color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+      .mdc-textfield--theme-dark .mdc-textfield--box .mdc-textfield__bottom-line::after,
+      .mdc-theme--dark .mdc-textfield--box .mdc-textfield__bottom-line::after {
+        background-color: #ff6e6e; }
+  .mdc-textfield--box.mdc-textfield--focused .mdc-textfield__bottom-line {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    -webkit-transform: scaleY(2);
+            transform: scaleY(2); }
+  .mdc-textfield--box.mdc-textfield--disabled .mdc-textfield__bottom-line {
+    display: none; }
+  .mdc-textfield--box.mdc-textfield--invalid .mdc-textfield__bottom-line::after {
+    opacity: 1; }
+  .mdc-textfield--box.mdc-textfield--dense {
+    height: 44px; }
+    .mdc-textfield--box.mdc-textfield--dense .mdc-textfield__input {
+      padding: 12px 12px 0; }
+    .mdc-textfield--box.mdc-textfield--dense .mdc-textfield__label {
+      left: 12px;
+      right: initial;
+      bottom: 12px; }
+      [dir="rtl"] .mdc-textfield--box.mdc-textfield--dense .mdc-textfield__label, .mdc-textfield--box.mdc-textfield--dense .mdc-textfield__label[dir="rtl"] {
+        left: initial;
+        right: 12px; }
+      .mdc-textfield--box.mdc-textfield--dense .mdc-textfield__label--float-above {
+        -webkit-transform: translateY(calc(-75% - 2px)) scale(0.923, 0.923);
+                transform: translateY(calc(-75% - 2px)) scale(0.923, 0.923); }
+
+.mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box) {
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  position: relative;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-box-align: end;
+      -ms-flex-align: end;
+          align-items: flex-end;
+  margin-top: 16px; }
+  .mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box):not(.mdc-textfield--multiline) {
+    height: 48px; }
+    .mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box):not(.mdc-textfield--multiline)::after {
+      position: absolute;
+      bottom: 0;
+      left: 0;
+      width: 100%;
+      height: 1px;
+      -webkit-transform: translateY(50%) scaleY(1);
+              transform: translateY(50%) scaleY(1);
+      -webkit-transform-origin: center bottom;
+              transform-origin: center bottom;
+      -webkit-transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1), transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1), transform 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+      background-color: rgba(0, 0, 0, 0.12);
+      content: ""; }
+      .mdc-textfield--theme-dark .mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box):not(.mdc-textfield--multiline)::after,
+      .mdc-theme--dark .mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box):not(.mdc-textfield--multiline)::after {
+        background-color: rgba(255, 255, 255, 0.12); }
+  .mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--box) .mdc-textfield__label {
+    pointer-events: none; }
+
+.mdc-textfield--focused.mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--multiline):not(.mdc-textfield--box)::after {
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5);
+  -webkit-transform: translateY(100%) scaleY(2);
+          transform: translateY(100%) scaleY(2);
+  -webkit-transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1); }
+  .mdc-textfield--theme-dark.mdc-textfield--focused.mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--multiline):not(.mdc-textfield--box)::after,
+  .mdc-theme--dark .mdc-textfield--focused.mdc-textfield--upgraded:not(.mdc-textfield--fullwidth):not(.mdc-textfield--multiline):not(.mdc-textfield--box)::after {
+    /* @alternate */
+    background-color: #3f51b5;
+    background-color: var(--mdc-theme-primary, #3f51b5);
+    -webkit-transform: translateY(100%) scaleY(2);
+            transform: translateY(100%) scaleY(2);
+    -webkit-transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1); }
+
+.mdc-textfield--focused .mdc-textfield__label {
+  /* @alternate */
+  color: #3f51b5;
+  color: var(--mdc-theme-primary, #3f51b5); }
+  .mdc-textfield--theme-dark .mdc-textfield--focused .mdc-textfield__label,
+  .mdc-theme--dark .mdc-textfield--focused .mdc-textfield__label {
+    /* @alternate */
+    color: #3f51b5;
+    color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-textfield--dense {
+  margin-top: 12px;
+  margin-bottom: 4px;
+  font-size: .813rem; }
+  .mdc-textfield--dense .mdc-textfield__label--float-above {
+    -webkit-transform: translateY(calc(-100% - 2px)) scale(0.923, 0.923);
+            transform: translateY(calc(-100% - 2px)) scale(0.923, 0.923); }
+
+.mdc-textfield--invalid:not(.mdc-textfield--focused):not(.mdc-textfield--box)::after, .mdc-textfield--invalid:not(.mdc-textfield--focused):not(.mdc-textfield--box).mdc-textfield--upgraded::after {
+  background-color: #d50000; }
+
+.mdc-textfield--invalid:not(.mdc-textfield--focused):not(.mdc-textfield--box) .mdc-textfield__label {
+  color: #d50000; }
+
+.mdc-textfield--theme-dark.mdc-textfield--invalid:not(.mdc-textfield--focused)::after, .mdc-textfield--theme-dark.mdc-textfield--invalid:not(.mdc-textfield--focused).mdc-textfield--upgraded::after,
+.mdc-theme--dark .mdc-textfield--invalid:not(.mdc-textfield--focused)::after,
+.mdc-theme--dark .mdc-textfield--invalid:not(.mdc-textfield--focused).mdc-textfield--upgraded::after {
+  background-color: #ff6e6e; }
+
+.mdc-textfield--theme-dark.mdc-textfield--invalid:not(.mdc-textfield--focused) .mdc-textfield__label,
+.mdc-theme--dark .mdc-textfield--invalid:not(.mdc-textfield--focused) .mdc-textfield__label {
+  color: #ff6e6e; }
+
+.mdc-textfield--disabled {
+  pointer-events: none;
+  border-bottom: 1px dotted rgba(35, 31, 32, 0.26); }
+  .mdc-textfield--disabled::after {
+    display: none; }
+  .mdc-textfield--disabled .mdc-textfield__input {
+    padding-bottom: 7px; }
+  .mdc-textfield--theme-dark.mdc-textfield--disabled,
+  .mdc-theme--dark .mdc-textfield--disabled {
+    border-bottom: 1px dotted rgba(255, 255, 255, 0.3); }
+  .mdc-textfield--disabled .mdc-textfield__input,
+  .mdc-textfield--disabled .mdc-textfield__label,
+  .mdc-textfield--disabled + .mdc-textfield-helptext {
+    /* @alternate */
+    color: rgba(0, 0, 0, 0.38);
+    color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)); }
+  .mdc-textfield--theme-dark .mdc-textfield--disabled .mdc-textfield__input,
+  .mdc-theme--dark .mdc-textfield--disabled .mdc-textfield__input, .mdc-textfield--theme-dark
+  .mdc-textfield--disabled .mdc-textfield__label,
+  .mdc-theme--dark
+  .mdc-textfield--disabled .mdc-textfield__label {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.5);
+    color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-textfield--theme-dark.mdc-textfield--disabled + .mdc-textfield-helptext,
+  .mdc-theme--dark .mdc-textfield--disabled + .mdc-textfield-helptext {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.5);
+    color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-textfield--disabled .mdc-textfield__label {
+    bottom: 7px;
+    cursor: default; }
+
+.mdc-textfield__input:required + .mdc-textfield__label::after {
+  margin-left: 1px;
+  content: "*"; }
+  .mdc-textfield--focused .mdc-textfield__input:required + .mdc-textfield__label::after {
+    color: #d50000; }
+    .mdc-textfield--theme-dark.mdc-textfield--focused .mdc-textfield__input:required + .mdc-textfield__label::after,
+    .mdc-theme--dark .mdc-textfield--focused .mdc-textfield__input:required + .mdc-textfield__label::after {
+      color: #ff6e6e; }
+
+.mdc-textfield--multiline {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  height: initial;
+  -webkit-transition: none;
+  transition: none; }
+  .mdc-textfield--multiline::after {
+    content: initial; }
+  .mdc-textfield--multiline .mdc-textfield__input {
+    padding: 4px;
+    -webkit-transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+    border: 1px solid rgba(0, 0, 0, 0.12);
+    border-radius: 2px; }
+    .mdc-textfield--theme-dark .mdc-textfield--multiline .mdc-textfield__input,
+    .mdc-theme--dark .mdc-textfield--multiline .mdc-textfield__input {
+      border-color: rgba(255, 255, 255, 0.12); }
+    .mdc-textfield--multiline .mdc-textfield__input:focus {
+      /* @alternate */
+      border-color: #3f51b5;
+      border-color: var(--mdc-theme-primary, #3f51b5); }
+    .mdc-textfield--multiline .mdc-textfield__input:invalid:not(:focus) {
+      border-color: #d50000; }
+    .mdc-textfield--theme-dark .mdc-textfield--multiline .mdc-textfield__input:invalid:not(:focus),
+    .mdc-theme--dark .mdc-textfield--multiline .mdc-textfield__input:invalid:not(:focus) {
+      border-color: #ff6e6e; }
+  .mdc-textfield--multiline .mdc-textfield__label {
+    top: 6px;
+    bottom: initial;
+    left: 4px; }
+    [dir="rtl"] .mdc-textfield--multiline .mdc-textfield--multiline .mdc-textfield__label,
+    .mdc-textfield--multiline[dir="rtl"] .mdc-textfield--multiline .mdc-textfield__label {
+      right: 4px;
+      left: auto; }
+    .mdc-textfield--multiline .mdc-textfield__label--float-above {
+      -webkit-transform: translateY(calc(-100% - 6px)) scale(0.923, 0.923);
+              transform: translateY(calc(-100% - 6px)) scale(0.923, 0.923); }
+  .mdc-textfield--multiline.mdc-textfield--disabled {
+    border-bottom: none; }
+    .mdc-textfield--multiline.mdc-textfield--disabled .mdc-textfield__input {
+      border: 1px dotted rgba(35, 31, 32, 0.26); }
+      .mdc-textfield--theme-dark .mdc-textfield--multiline.mdc-textfield--disabled .mdc-textfield__input,
+      .mdc-theme--dark .mdc-textfield--multiline.mdc-textfield--disabled .mdc-textfield__input {
+        border-color: rgba(255, 255, 255, 0.3); }
+
+.mdc-textfield--fullwidth {
+  display: block;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  margin: 0;
+  border: none;
+  border-bottom: 1px solid rgba(0, 0, 0, 0.12);
+  outline: none; }
+  .mdc-textfield--fullwidth:not(.mdc-textfield--multiline) {
+    height: 56px; }
+  .mdc-textfield--fullwidth.mdc-textfield--multiline {
+    padding: 20px 0 0; }
+  .mdc-textfield--fullwidth.mdc-textfield--dense:not(.mdc-textfield--multiline) {
+    height: 48px; }
+  .mdc-textfield--fullwidth.mdc-textfield--dense.mdc-textfield--multiline {
+    padding: 16px 0 0; }
+  .mdc-textfield--fullwidth.mdc-textfield--disabled, .mdc-textfield--fullwidth.mdc-textfield--disabled.mdc-textfield--multiline {
+    border-bottom: 1px dotted rgba(0, 0, 0, 0.12); }
+  .mdc-textfield--fullwidth--theme-dark,
+  .mdc-theme--dark .mdc-textfield--fullwidth {
+    border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
+    .mdc-textfield--fullwidth--theme-dark.mdc-textfield--disabled, .mdc-textfield--fullwidth--theme-dark.mdc-textfield--disabled.mdc-textfield--multiline,
+    .mdc-theme--dark .mdc-textfield--fullwidth.mdc-textfield--disabled,
+    .mdc-theme--dark .mdc-textfield--fullwidth.mdc-textfield--disabled.mdc-textfield--multiline {
+      border-bottom: 1px dotted rgba(255, 255, 255, 0.12); }
+  .mdc-textfield--fullwidth .mdc-textfield__input {
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    resize: none;
+    border: none !important; }
+
+.mdc-textfield:not(.mdc-textfield--upgraded):not(.mdc-textfield--multiline) .mdc-textfield__input {
+  -webkit-transition: border-bottom-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: border-bottom-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  border-bottom: 1px solid rgba(0, 0, 0, 0.12); }
+
+.mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:focus {
+  /* @alternate */
+  border-color: #3f51b5;
+  border-color: var(--mdc-theme-primary, #3f51b5); }
+
+.mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:disabled {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38);
+  color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38));
+  border-style: dotted;
+  border-color: rgba(35, 31, 32, 0.26); }
+
+.mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:invalid:not(:focus) {
+  border-color: #d50000; }
+
+.mdc-textfield--theme-dark:not(.mdc-textfield--upgraded) .mdc-textfield__input:not(:focus),
+.mdc-theme--dark .mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:not(:focus) {
+  border-color: rgba(255, 255, 255, 0.12); }
+
+.mdc-textfield--theme-dark:not(.mdc-textfield--upgraded) .mdc-textfield__input:disabled,
+.mdc-theme--dark .mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:disabled {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5);
+  color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5));
+  border-color: rgba(255, 255, 255, 0.3); }
+
+.mdc-textfield--theme-dark:not(.mdc-textfield--upgraded) .mdc-textfield__input:invalid:not(:focus),
+.mdc-theme--dark .mdc-textfield:not(.mdc-textfield--upgraded) .mdc-textfield__input:invalid:not(:focus) {
+  border-color: #ff6e6e; }
+
+.mdc-textfield--box:not(.mdc-textfield--upgraded) {
+  height: 36px; }
+  .mdc-textfield--box:not(.mdc-textfield--upgraded)::before, .mdc-textfield--box:not(.mdc-textfield--upgraded)::after {
+    border-radius: 0; }
+  .mdc-textfield--box:not(.mdc-textfield--upgraded) .mdc-textfield__input {
+    padding-top: 0; }
+
+.mdc-textfield-helptext {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38);
+  color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
+  margin: 0;
+  -webkit-transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: opacity 180ms cubic-bezier(0.4, 0, 0.2, 1);
+  font-size: .75rem;
+  opacity: 0;
+  will-change: opacity; }
+  .mdc-textfield-helptext--theme-dark,
+  .mdc-theme--dark .mdc-textfield-helptext {
+    /* @alternate */
+    color: rgba(255, 255, 255, 0.5);
+    color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
+  .mdc-textfield + .mdc-textfield-helptext {
+    margin-bottom: 8px; }
+  .mdc-textfield--dense + .mdc-textfield-helptext {
+    margin-bottom: 4px; }
+  .mdc-textfield--focused + .mdc-textfield-helptext:not(.mdc-textfield-helptext--validation-msg) {
+    opacity: 1; }
+
+.mdc-textfield-helptext--persistent {
+  -webkit-transition: none;
+  transition: none;
+  opacity: 1;
+  will-change: initial; }
+
+.mdc-textfield--invalid + .mdc-textfield-helptext--validation-msg {
+  color: #d50000;
+  opacity: 1; }
+
+.mdc-textfield--theme-dark.mdc-textfield--invalid + .mdc-textfield-helptext--validation-msg,
+.mdc-theme--dark .mdc-textfield--invalid + .mdc-textfield-helptext--validation-msg {
+  color: #ff6e6e; }
+
+.mdc-form-field > .mdc-textfield + label {
+  -ms-flex-item-align: start;
+      align-self: flex-start; }
+
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+:root {
+  --mdc-theme-primary: #3f51b5;
+  --mdc-theme-accent: #ff4081;
+  --mdc-theme-background: #fff;
+  --mdc-theme-text-primary-on-primary: white;
+  --mdc-theme-text-secondary-on-primary: rgba(255, 255, 255, 0.7);
+  --mdc-theme-text-hint-on-primary: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-disabled-on-primary: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-icon-on-primary: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-primary-on-accent: white;
+  --mdc-theme-text-secondary-on-accent: rgba(255, 255, 255, 0.7);
+  --mdc-theme-text-hint-on-accent: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-disabled-on-accent: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-icon-on-accent: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-primary-on-background: rgba(0, 0, 0, 0.87);
+  --mdc-theme-text-secondary-on-background: rgba(0, 0, 0, 0.54);
+  --mdc-theme-text-hint-on-background: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-disabled-on-background: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-icon-on-background: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-primary-on-light: rgba(0, 0, 0, 0.87);
+  --mdc-theme-text-secondary-on-light: rgba(0, 0, 0, 0.54);
+  --mdc-theme-text-hint-on-light: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-disabled-on-light: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-icon-on-light: rgba(0, 0, 0, 0.38);
+  --mdc-theme-text-primary-on-dark: white;
+  --mdc-theme-text-secondary-on-dark: rgba(255, 255, 255, 0.7);
+  --mdc-theme-text-hint-on-dark: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-disabled-on-dark: rgba(255, 255, 255, 0.5);
+  --mdc-theme-text-icon-on-dark: rgba(255, 255, 255, 0.5); }
+
+/* Special case, so that .mdc-theme--background changes background color, not text color. */
+.mdc-theme--background {
+  /* @alternate */
+  background-color: #fff;
+  background-color: var(--mdc-theme-background, #fff); }
+
+.mdc-theme--primary {
+  /* @alternate */
+  color: #3f51b5 !important;
+  color: var(--mdc-theme-primary, #3f51b5) !important; }
+
+.mdc-theme--accent {
+  /* @alternate */
+  color: #ff4081 !important;
+  color: var(--mdc-theme-accent, #ff4081) !important; }
+
+.mdc-theme--text-primary-on-primary {
+  /* @alternate */
+  color: white !important;
+  color: var(--mdc-theme-text-primary-on-primary, white) !important; }
+
+.mdc-theme--text-secondary-on-primary {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.7) !important;
+  color: var(--mdc-theme-text-secondary-on-primary, rgba(255, 255, 255, 0.7)) !important; }
+
+.mdc-theme--text-hint-on-primary {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-hint-on-primary, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-disabled-on-primary {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-disabled-on-primary, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-icon-on-primary {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-icon-on-primary, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-primary-on-accent {
+  /* @alternate */
+  color: white !important;
+  color: var(--mdc-theme-text-primary-on-accent, white) !important; }
+
+.mdc-theme--text-secondary-on-accent {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.7) !important;
+  color: var(--mdc-theme-text-secondary-on-accent, rgba(255, 255, 255, 0.7)) !important; }
+
+.mdc-theme--text-hint-on-accent {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-hint-on-accent, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-disabled-on-accent {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-disabled-on-accent, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-icon-on-accent {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-icon-on-accent, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-primary-on-background {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87) !important;
+  color: var(--mdc-theme-text-primary-on-background, rgba(0, 0, 0, 0.87)) !important; }
+
+.mdc-theme--text-secondary-on-background {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.54) !important;
+  color: var(--mdc-theme-text-secondary-on-background, rgba(0, 0, 0, 0.54)) !important; }
+
+.mdc-theme--text-hint-on-background {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-hint-on-background, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-disabled-on-background {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-disabled-on-background, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-icon-on-background {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-icon-on-background, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-primary-on-light {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.87) !important;
+  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)) !important; }
+
+.mdc-theme--text-secondary-on-light {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.54) !important;
+  color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)) !important; }
+
+.mdc-theme--text-hint-on-light {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-disabled-on-light {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-disabled-on-light, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-icon-on-light {
+  /* @alternate */
+  color: rgba(0, 0, 0, 0.38) !important;
+  color: var(--mdc-theme-text-icon-on-light, rgba(0, 0, 0, 0.38)) !important; }
+
+.mdc-theme--text-primary-on-dark {
+  /* @alternate */
+  color: white !important;
+  color: var(--mdc-theme-text-primary-on-dark, white) !important; }
+
+.mdc-theme--text-secondary-on-dark {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.7) !important;
+  color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)) !important; }
+
+.mdc-theme--text-hint-on-dark {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-disabled-on-dark {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-disabled-on-dark, rgba(255, 255, 255, 0.5)) !important; }
+
+.mdc-theme--text-icon-on-dark {
+  /* @alternate */
+  color: rgba(255, 255, 255, 0.5) !important;
+  color: var(--mdc-theme-text-icon-on-dark, rgba(255, 255, 255, 0.5)) !important; }
+
+/* CSS rules for using primary and accent as background colors. */
+.mdc-theme--primary-bg {
+  /* @alternate */
+  background-color: #3f51b5 !important;
+  background-color: var(--mdc-theme-primary, #3f51b5) !important; }
+
+.mdc-theme--accent-bg {
+  /* @alternate */
+  background-color: #ff4081 !important;
+  background-color: var(--mdc-theme-accent, #ff4081) !important; }
+
+/**
+ * The css property used for elevation. In most cases this should not be changed. It is exposed
+ * as a variable for abstraction / easy use when needing to reference the property directly, for
+ * example in a `will-change` rule.
+ */
+/**
+ * The default duration value for elevation transitions.
+ */
+/**
+ * The default easing value for elevation transitions.
+ */
+/**
+ * Applies the correct css rules to an element to give it the elevation specified by $z-value.
+ * The $z-value must be between 0 and 24.
+ */
+/**
+ * Returns a string that can be used as the value for a `transition` property for elevation.
+ * Calling this function directly is useful in situations where a component needs to transition
+ * more than one property.
+ *
+ * ```scss
+ * .foo {
+ *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
+ *   will-change: $mdc-elevation-property, opacity;
+ * }
+ * ```
+ */
+/**
+ * Applies the correct css rules needed to have an element transition between elevations.
+ * This mixin should be applied to elements whose elevation values will change depending on their
+ * context (e.g. when active or disabled).
+ */
+/**
+ * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
+ *
+ * Usage Example:
+ * ```scss
+ * .mdc-foo {
+ *   position: absolute;
+ *   left: 0;
+ *
+ *   @include mdc-rtl {
+ *     left: auto;
+ *     right: 0;
+ *   }
+ *
+ *   &__bar {
+ *     margin-left: 4px;
+ *     @include mdc-rtl(".mdc-foo") {
+ *       margin-left: auto;
+ *       margin-right: 4px;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--mod {
+ *   padding-left: 4px;
+ *
+ *   @include mdc-rtl {
+ *     padding-left: auto;
+ *     padding-right: 4px;
+ *   }
+ * }
+ * ```
+ *
+ * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
+ * in most cases, it will in some cases lead to false negatives, e.g.
+ *
+ * ```html
+ * <html dir="rtl">
+ *   <!-- ... -->
+ *   <div dir="ltr">
+ *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
+ *   </div>
+ * </html>
+ * ```
+ *
+ * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
+ */
+/**
+ * Takes a base box-model property - e.g. margin / border / padding - along with a default
+ * direction and value, and emits rules which apply the value to the
+ * "<base-property>-<default-direction>" property by default, but flips the direction
+ * when within an RTL context.
+ *
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, left, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 8px;
+ *     margin-left: 0;
+ *   }
+ * }
+ * ```
+ * whereas:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-box(margin, right, 8px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-right: 8px;
+ *
+ *   @include mdc-rtl {
+ *     margin-right: 0;
+ *     margin-left: 8px;
+ *   }
+ * }
+ * ```
+ *
+ * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
+ * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
+ *
+ * Note that this function will always zero out the original value in an RTL context. If you're
+ * trying to flip the values, use mdc-rtl-reflexive-property().
+ */
+/**
+ * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
+ * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
+ * For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   margin-left: auto;
+ *   margin-right: 12px;
+ *
+ *   @include mdc-rtl {
+ *     margin-left: 12px;
+ *     margin-right: auto;
+ *   }
+ * }
+ * ```
+ *
+ * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
+ */
+/**
+ * Takes an argument specifying a horizontal position property (either "left" or "right") as well
+ * as a value, and applies that value to the specified position in a LTR context, and flips it in a
+ * RTL context. For example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   @include mdc-rtl-reflexive-position(left, 0);
+ *   position: absolute;
+ * }
+ * ```
+ * is equivalent to:
+ *
+ * ```scss
+ *  .mdc-foo {
+ *    position: absolute;
+ *    left: 0;
+ *    right: initial;
+ *
+ *    @include mdc-rtl {
+ *      right: 0;
+ *      left: initial;
+ *    }
+ *  }
+ * ```
+ * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
+ */
+/*
+  Precomputed linear color channel values, for use in contrast calculations.
+  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+
+  Algorithm, for c in 0 to 255:
+  f(c) {
+    c = c / 255;
+    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
+  }
+
+  This lookup table is needed since there is no `pow` in SASS.
+*/
+/**
+ * Calculate the luminance for a color.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Calculate the contrast ratio between two colors.
+ * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
+ */
+/**
+ * Determine whether to use dark or light text on top of given color.
+ * Returns "dark" for dark text and "light" for light text.
+ */
+/*
+  Main theme colors.
+  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
+*/
+/* Indigo 500 */
+/* Pink A200 */
+/* White */
+/* Which set of text colors to use for each main theme color (light or dark) */
+/* Text colors according to light vs dark and text type */
+/* Primary text colors for each of the theme colors */
+/**
+ * Applies the correct theme color style to the specified property.
+ * $property is typically color or background-color, but can be any CSS property that accepts color values.
+ * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
+ */
+/**
+ * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
+ * Should provide the $root-selector option if applied to anything other than the root selector.
+ * When used with a modifier class, provide a second argument of `true` for the $compound parameter
+ * to specify that this should be attached as a compound class.
+ *
+ * Usage example:
+ *
+ * ```scss
+ * .mdc-foo {
+ *   color: black;
+ *
+ *   @include mdc-theme-dark {
+ *     color: white;
+ *   }
+ *
+ *   &__bar {
+ *     background: black;
+ *
+ *     @include mdc-theme-dark(".mdc-foo") {
+ *       background: white;
+ *     }
+ *   }
+ * }
+ *
+ * .mdc-foo--disabled {
+ *   opacity: .38;
+ *
+ *   @include mdc-theme-dark(".mdc-foo", true) {
+ *     opacity: .5;
+ *   }
+ * }
+ * ```
+ */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/**
+ * Applies styles to the different types of icons that can exist in toolbars.
+ * Both .mdc-toolbar__icon and .mdc-toolbar__icon--menu share all styles except for
+ * horizontal padding.
+ */
+.mdc-toolbar {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  position: relative;
+  -webkit-box-orient: vertical;
+  -webkit-box-direction: normal;
+      -ms-flex-direction: column;
+          flex-direction: column;
+  -webkit-box-pack: justify;
+      -ms-flex-pack: justify;
+          justify-content: space-between;
+  width: 100%;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  /* @alternate */
+  background-color: #3f51b5;
+  background-color: var(--mdc-theme-primary, #3f51b5);
+  /* @alternate */
+  color: white;
+  color: var(--mdc-theme-text-primary-on-primary, white); }
+  .mdc-toolbar__row {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    position: relative;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    width: 100%;
+    height: auto;
+    min-height: 64px;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box; }
+    @media (max-width: 959px) and (orientation: landscape) {
+      .mdc-toolbar__row {
+        min-height: 48px; } }
+    @media (max-width: 599px) {
+      .mdc-toolbar__row {
+        min-height: 56px; } }
+  .mdc-toolbar__section {
+    display: -webkit-inline-box;
+    display: -ms-inline-flexbox;
+    display: inline-flex;
+    -webkit-box-flex: 1;
+        -ms-flex: 1;
+            flex: 1;
+    -webkit-box-align: start;
+        -ms-flex-align: start;
+            align-items: flex-start;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    min-width: 0;
+    height: 100%;
+    z-index: 1; }
+    .mdc-toolbar__section--align-start {
+      -webkit-box-pack: start;
+          -ms-flex-pack: start;
+              justify-content: flex-start;
+      -webkit-box-ordinal-group: 0;
+          -ms-flex-order: -1;
+              order: -1; }
+    .mdc-toolbar__section--align-end {
+      -webkit-box-pack: end;
+          -ms-flex-pack: end;
+              justify-content: flex-end;
+      -webkit-box-ordinal-group: 2;
+          -ms-flex-order: 1;
+              order: 1; }
+  .mdc-toolbar__title {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 1.25rem;
+    font-weight: 500;
+    letter-spacing: 0.02em;
+    line-height: 2rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+    -ms-flex-item-align: center;
+        align-self: center;
+    margin: 0;
+    margin-left: 24px;
+    padding: 16px 0;
+    line-height: 1.5rem;
+    z-index: 1; }
+  .mdc-toolbar__icon {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    padding: 16px 8px;
+    border: none;
+    background-color: inherit;
+    color: inherit;
+    text-decoration: none;
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-primary, white);
+    cursor: pointer; }
+  .mdc-toolbar__icon:last-child {
+    padding-right: 16px; }
+  .mdc-toolbar__icon--menu {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-align: center;
+        -ms-flex-align: center;
+            align-items: center;
+    -webkit-box-pack: center;
+        -ms-flex-pack: center;
+            justify-content: center;
+    padding: 16px;
+    border: none;
+    background-color: inherit;
+    color: inherit;
+    text-decoration: none;
+    /* @alternate */
+    color: white;
+    color: var(--mdc-theme-text-primary-on-primary, white);
+    padding: 16px 24px;
+    cursor: pointer; }
+
+.mdc-toolbar__icon--menu + .mdc-toolbar__title {
+  margin-left: 8px; }
+
+@media (max-width: 599px) {
+  .mdc-toolbar__icon--menu {
+    padding: 16px; }
+  .mdc-toolbar__icon:last-child {
+    padding: 16px 8px; }
+  .mdc-toolbar__title {
+    margin-left: 16px !important; } }
+
+.mdc-toolbar--fixed {
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 4;
+  -webkit-box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-toolbar--flexible {
+  --mdc-toolbar-ratio-to-extend-flexible: 4; }
+  .mdc-toolbar--flexible .mdc-toolbar__row:first-child {
+    height: 256px;
+    height: calc(64px * var(--mdc-toolbar-ratio-to-extend-flexible, 4)); }
+    @media (max-width: 599px) {
+      .mdc-toolbar--flexible .mdc-toolbar__row:first-child {
+        height: 224px;
+        height: calc(56px * var(--mdc-toolbar-ratio-to-extend-flexible, 4)); } }
+    .mdc-toolbar--flexible .mdc-toolbar__row:first-child::after {
+      position: absolute;
+      content: ""; }
+  .mdc-toolbar--flexible-default-behavior .mdc-toolbar__title {
+    font-family: Roboto, sans-serif;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    font-size: 2.125rem;
+    font-weight: 400;
+    letter-spacing: normal;
+    line-height: 2.5rem;
+    text-decoration: inherit;
+    text-transform: inherit;
+    -ms-flex-item-align: end;
+        align-self: flex-end;
+    line-height: 1.5rem; }
+  .mdc-toolbar--flexible-default-behavior .mdc-toolbar__row:first-child::after {
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    -webkit-transition: opacity .2s ease;
+    transition: opacity .2s ease;
+    opacity: 1; }
+  .mdc-toolbar--flexible-default-behavior.mdc-toolbar--flexible-space-minimized .mdc-toolbar__row:first-child::after {
+    opacity: 0; }
+  .mdc-toolbar--flexible-default-behavior.mdc-toolbar--flexible-space-minimized .mdc-toolbar__title {
+    font-weight: 500; }
+
+.mdc-toolbar--waterfall.mdc-toolbar--fixed {
+  -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+          box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+  -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
+  will-change: box-shadow; }
+  .mdc-toolbar--waterfall.mdc-toolbar--fixed.mdc-toolbar--flexible-space-minimized {
+    -webkit-box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }
+  .mdc-toolbar--waterfall.mdc-toolbar--fixed.mdc-toolbar--fixed-lastrow-only.mdc-toolbar--flexible-space-minimized {
+    -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }
+  .mdc-toolbar--waterfall.mdc-toolbar--fixed.mdc-toolbar--fixed-lastrow-only.mdc-toolbar--fixed-at-last-row {
+    -webkit-box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
+            box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }
+
+.mdc-toolbar-fixed-adjust {
+  margin-top: 64px; }
+  @media (max-width: 959px) and (orientation: landscape) {
+    .mdc-toolbar-fixed-adjust {
+      margin-top: 48px; } }
+  @media (max-width: 599px) {
+    .mdc-toolbar-fixed-adjust {
+      margin-top: 56px; } }
+
+.mdc-toolbar__section--shrink-to-fit {
+  -webkit-box-flex: 0;
+      -ms-flex: none;
+          flex: none; }
+
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+/* TODO(sgomes): Figure out what to do about desktop font sizes. */
+/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
+.mdc-typography {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased; }
+
+.mdc-typography--display4 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 7rem;
+  font-weight: 300;
+  letter-spacing: -0.04em;
+  line-height: 7rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--display4 {
+  margin: -1rem 0 3.5rem -0.085em; }
+
+.mdc-typography--display3 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 3.5rem;
+  font-weight: 400;
+  letter-spacing: -0.02em;
+  line-height: 3.5rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--display3 {
+  margin: -8px 0 64px -0.07em; }
+
+.mdc-typography--display2 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 2.813rem;
+  font-weight: 400;
+  letter-spacing: normal;
+  line-height: 3rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--display2 {
+  margin: -0.5rem 0 4rem -0.07em; }
+
+.mdc-typography--display1 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 2.125rem;
+  font-weight: 400;
+  letter-spacing: normal;
+  line-height: 2.5rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--display1 {
+  margin: -0.5rem 0 4rem -0.07em; }
+
+.mdc-typography--headline {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1.5rem;
+  font-weight: 400;
+  letter-spacing: normal;
+  line-height: 2rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--headline {
+  margin: -0.5rem 0 1rem -0.06em; }
+
+.mdc-typography--title {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1.25rem;
+  font-weight: 500;
+  letter-spacing: 0.02em;
+  line-height: 2rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--title {
+  margin: -0.5rem 0 1rem -0.05em; }
+
+.mdc-typography--subheading2 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 1rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.75rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--subheading2 {
+  margin: -0.5rem 0 1rem -0.06em; }
+
+.mdc-typography--subheading1 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.938rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.5rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--subheading1 {
+  margin: -0.313rem 0 0.813rem -0.06em; }
+
+.mdc-typography--body2 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.875rem;
+  font-weight: 500;
+  letter-spacing: 0.04em;
+  line-height: 1.5rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--body2 {
+  margin: -0.25rem 0 0.75rem 0; }
+
+.mdc-typography--body1 {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.875rem;
+  font-weight: 400;
+  letter-spacing: 0.04em;
+  line-height: 1.25rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--body1 {
+  margin: -0.25rem 0 0.75rem 0; }
+
+.mdc-typography--caption {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.75rem;
+  font-weight: 400;
+  letter-spacing: 0.08em;
+  line-height: 1.25rem;
+  text-decoration: inherit;
+  text-transform: inherit; }
+
+.mdc-typography--adjust-margin.mdc-typography--caption {
+  margin: -0.5rem 0 1rem -0.04em; }
+
+.mdc-typography--button {
+  font-family: Roboto, sans-serif;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  font-size: 0.875rem;
+  font-weight: 500;
+  letter-spacing: 0.04em;
+  line-height: 2.25rem;
+  text-decoration: none;
+  text-transform: uppercase; }
+
+.mdc-typography--adjust-margin.mdc-typography--button {
+  margin: inherit; }

+ 12483 - 0
public/web/lib/mdc/dist/material-components-web.js

@@ -0,0 +1,12483 @@
+/*!
+ Material Components for the web
+ Copyright (c) 2017 Google Inc.
+ License: Apache-2.0
+*/
+(function webpackUniversalModuleDefinition(root, factory) {
+	if(typeof exports === 'object' && typeof module === 'object')
+		module.exports = factory();
+	else if(typeof define === 'function' && define.amd)
+		define([], factory);
+	else if(typeof exports === 'object')
+		exports["mdc"] = factory();
+	else
+		root["mdc"] = factory();
+})(this, function() {
+return /******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "/assets/";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 17);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__selection_control__ = __webpack_require__(3);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__foundation__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCComponent", function() { return __WEBPACK_IMPORTED_MODULE_1__component__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionControlState", function() { return __WEBPACK_IMPORTED_MODULE_2__selection_control__["a"]; });
+/**
+ * Copyright 2016 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @template A
+ */
+var MDCFoundation = function () {
+  _createClass(MDCFoundation, null, [{
+    key: "cssClasses",
+
+    /** @return enum{cssClasses} */
+    get: function get() {
+      // Classes extending MDCFoundation should implement this method to return an object which exports every
+      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
+      return {};
+    }
+
+    /** @return enum{strings} */
+
+  }, {
+    key: "strings",
+    get: function get() {
+      // Classes extending MDCFoundation should implement this method to return an object which exports all
+      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
+      return {};
+    }
+
+    /** @return enum{numbers} */
+
+  }, {
+    key: "numbers",
+    get: function get() {
+      // Classes extending MDCFoundation should implement this method to return an object which exports all
+      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
+      return {};
+    }
+
+    /** @return {!Object} */
+
+  }, {
+    key: "defaultAdapter",
+    get: function get() {
+      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
+      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
+      // validation.
+      return {};
+    }
+
+    /**
+     * @param {A=} adapter
+     */
+
+  }]);
+
+  function MDCFoundation() {
+    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+    _classCallCheck(this, MDCFoundation);
+
+    /** @protected {!A} */
+    this.adapter_ = adapter;
+  }
+
+  _createClass(MDCFoundation, [{
+    key: "init",
+    value: function init() {
+      // Subclasses should override this method to perform initialization routines (registering events, etc.)
+    }
+  }, {
+    key: "destroy",
+    value: function destroy() {
+      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
+    }
+  }]);
+
+  return MDCFoundation;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(1);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+/**
+ * @template F
+ */
+
+var MDCComponent = function () {
+  _createClass(MDCComponent, null, [{
+    key: 'attachTo',
+
+    /**
+     * @param {!Element} root
+     * @return {!MDCComponent}
+     */
+    value: function attachTo(root) {
+      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
+      // returns an instantiated component with its root set to that element. Also note that in the cases of
+      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
+      // from getDefaultFoundation().
+      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
+    }
+
+    /**
+     * @param {!Element} root
+     * @param {F=} foundation
+     * @param {...?} args
+     */
+
+  }]);
+
+  function MDCComponent(root) {
+    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
+
+    _classCallCheck(this, MDCComponent);
+
+    /** @protected {!Element} */
+    this.root_ = root;
+
+    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
+      args[_key - 2] = arguments[_key];
+    }
+
+    this.initialize.apply(this, args);
+    // Note that we initialize foundation here and not within the constructor's default param so that
+    // this.root_ is defined and can be used within the foundation class.
+    /** @protected {!F} */
+    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
+    this.foundation_.init();
+    this.initialSyncWithDOM();
+  }
+
+  _createClass(MDCComponent, [{
+    key: 'initialize',
+    value: function initialize() /* ...args */{}
+    // Subclasses can override this to do any additional setup work that would be considered part of a
+    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
+    // initialized. Any additional arguments besides root and foundation will be passed in here.
+
+
+    /**
+     * @return {!F} foundation
+     */
+
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      // Subclasses must override this method to return a properly configured foundation class for the
+      // component.
+      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
+      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
+      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
+      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      // Subclasses may implement this method to release any resources / deregister any listeners they have
+      // attached. An example of this might be deregistering a resize event from the window object.
+      this.foundation_.destroy();
+    }
+
+    /**
+     * Wrapper method to add an event listener to the component's root element. This is most useful when
+     * listening for custom events.
+     * @param {string} evtType
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: 'listen',
+    value: function listen(evtType, handler) {
+      this.root_.addEventListener(evtType, handler);
+    }
+
+    /**
+     * Wrapper method to remove an event listener to the component's root element. This is most useful when
+     * unlistening for custom events.
+     * @param {string} evtType
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: 'unlisten',
+    value: function unlisten(evtType, handler) {
+      this.root_.removeEventListener(evtType, handler);
+    }
+
+    /**
+     * Fires a cross-browser-compatible custom event from the component root of the given type,
+     * with the given data.
+     * @param {string} evtType
+     * @param {!Object} evtData
+     * @param {boolean=} shouldBubble
+     */
+
+  }, {
+    key: 'emit',
+    value: function emit(evtType, evtData) {
+      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      var evt = void 0;
+      if (typeof CustomEvent === 'function') {
+        evt = new CustomEvent(evtType, {
+          detail: evtData,
+          bubbles: shouldBubble
+        });
+      } else {
+        evt = document.createEvent('CustomEvent');
+        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
+      }
+
+      this.root_.dispatchEvent(evt);
+    }
+  }]);
+
+  return MDCComponent;
+}();
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @typedef {!{
+ *   checked: boolean,
+ *   indeterminate: boolean,
+ *   disabled: boolean,
+ *   value: ?string
+ * }}
+ */
+var SelectionControlState = void 0;
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRipple", function() { return MDCRipple; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(23);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(8);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRippleFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+/**
+ * @extends MDCComponent<!MDCRippleFoundation>
+ */
+var MDCRipple = function (_MDCComponent) {
+  _inherits(MDCRipple, _MDCComponent);
+
+  /** @param {...?} args */
+  function MDCRipple() {
+    var _ref;
+
+    _classCallCheck(this, MDCRipple);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    /** @type {boolean} */
+    var _this = _possibleConstructorReturn(this, (_ref = MDCRipple.__proto__ || Object.getPrototypeOf(MDCRipple)).call.apply(_ref, [this].concat(args)));
+
+    _this.disabled = false;
+
+    /** @private {boolean} */
+    _this.unbounded_;
+    return _this;
+  }
+
+  /**
+   * @param {!Element} root
+   * @param {{isUnbounded: (boolean|undefined)}=} options
+   * @return {!MDCRipple}
+   */
+
+
+  _createClass(MDCRipple, [{
+    key: 'activate',
+    value: function activate() {
+      this.foundation_.activate();
+    }
+  }, {
+    key: 'deactivate',
+    value: function deactivate() {
+      this.foundation_.deactivate();
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      this.foundation_.layout();
+    }
+
+    /** @return {!MDCRippleFoundation} */
+
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */](MDCRipple.createAdapter(this));
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset;
+    }
+  }, {
+    key: 'unbounded',
+
+
+    /** @return {boolean} */
+    get: function get() {
+      return this.unbounded_;
+    }
+
+    /** @param {boolean} unbounded */
+    ,
+    set: function set(unbounded) {
+      var UNBOUNDED = __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].cssClasses.UNBOUNDED;
+
+      this.unbounded_ = Boolean(unbounded);
+      if (this.unbounded_) {
+        this.root_.classList.add(UNBOUNDED);
+      } else {
+        this.root_.classList.remove(UNBOUNDED);
+      }
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+          _ref2$isUnbounded = _ref2.isUnbounded,
+          isUnbounded = _ref2$isUnbounded === undefined ? undefined : _ref2$isUnbounded;
+
+      var ripple = new MDCRipple(root);
+      // Only override unbounded behavior if option is explicitly specified
+      if (isUnbounded !== undefined) {
+        ripple.unbounded = /** @type {boolean} */isUnbounded;
+      }
+      return ripple;
+    }
+
+    /**
+     * @param {!RippleCapableSurface} instance
+     * @return {!MDCRippleAdapter}
+     */
+
+  }, {
+    key: 'createAdapter',
+    value: function createAdapter(instance) {
+      var MATCHES = __WEBPACK_IMPORTED_MODULE_3__util__["getMatchesProperty"](HTMLElement.prototype);
+
+      return {
+        browserSupportsCssVars: function browserSupportsCssVars() {
+          return __WEBPACK_IMPORTED_MODULE_3__util__["supportsCssVariables"](window);
+        },
+        isUnbounded: function isUnbounded() {
+          return instance.unbounded;
+        },
+        isSurfaceActive: function isSurfaceActive() {
+          return instance.root_[MATCHES](':active');
+        },
+        isSurfaceDisabled: function isSurfaceDisabled() {
+          return instance.disabled;
+        },
+        addClass: function addClass(className) {
+          return instance.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return instance.root_.classList.remove(className);
+        },
+        registerInteractionHandler: function registerInteractionHandler(evtType, handler) {
+          return instance.root_.addEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(evtType, handler) {
+          return instance.root_.removeEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
+        },
+        registerResizeHandler: function registerResizeHandler(handler) {
+          return window.addEventListener('resize', handler);
+        },
+        deregisterResizeHandler: function deregisterResizeHandler(handler) {
+          return window.removeEventListener('resize', handler);
+        },
+        updateCssVariable: function updateCssVariable(varName, value) {
+          return instance.root_.style.setProperty(varName, value);
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          return instance.root_.getBoundingClientRect();
+        },
+        getWindowPageOffset: function getWindowPageOffset() {
+          return { x: window.pageXOffset, y: window.pageYOffset };
+        }
+      };
+    }
+  }]);
+
+  return MDCRipple;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/**
+ * See Material Design spec for more details on when to use ripples.
+ * https://material.io/guidelines/motion/choreography.html#choreography-creation
+ * @record
+ */
+
+var RippleCapableSurface = function RippleCapableSurface() {
+  _classCallCheck(this, RippleCapableSurface);
+};
+
+/** @protected {!Element} */
+
+
+RippleCapableSurface.prototype.root_;
+
+/**
+ * Whether or not the ripple bleeds out of the bounds of the element.
+ * @type {boolean|undefined}
+ */
+RippleCapableSurface.prototype.unbounded;
+
+/**
+ * Whether or not the ripple is attached to a disabled component.
+ * @type {boolean|undefined}
+ */
+RippleCapableSurface.prototype.disabled;
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return transformStyleProperties; });
+/* harmony export (immutable) */ __webpack_exports__["a"] = getCorrectEventName;
+/* harmony export (immutable) */ __webpack_exports__["b"] = getCorrectPropertyName;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @typedef {{
+ *   noPrefix: string,
+ *   webkitPrefix: string
+ * }}
+ */
+var VendorPropertyMapType = void 0;
+
+/** @const {Object<string, !VendorPropertyMapType>} */
+var eventTypeMap = {
+  'animationstart': {
+    noPrefix: 'animationstart',
+    webkitPrefix: 'webkitAnimationStart',
+    styleProperty: 'animation'
+  },
+  'animationend': {
+    noPrefix: 'animationend',
+    webkitPrefix: 'webkitAnimationEnd',
+    styleProperty: 'animation'
+  },
+  'animationiteration': {
+    noPrefix: 'animationiteration',
+    webkitPrefix: 'webkitAnimationIteration',
+    styleProperty: 'animation'
+  },
+  'transitionend': {
+    noPrefix: 'transitionend',
+    webkitPrefix: 'webkitTransitionEnd',
+    styleProperty: 'transition'
+  }
+};
+
+/** @const {Object<string, !VendorPropertyMapType>} */
+var cssPropertyMap = {
+  'animation': {
+    noPrefix: 'animation',
+    webkitPrefix: '-webkit-animation'
+  },
+  'transform': {
+    noPrefix: 'transform',
+    webkitPrefix: '-webkit-transform'
+  },
+  'transition': {
+    noPrefix: 'transition',
+    webkitPrefix: '-webkit-transition'
+  }
+};
+
+/**
+ * @param {!Object} windowObj
+ * @return {boolean}
+ */
+function hasProperShape(windowObj) {
+  return windowObj['document'] !== undefined && typeof windowObj['document']['createElement'] === 'function';
+}
+
+/**
+ * @param {string} eventType
+ * @return {boolean}
+ */
+function eventFoundInMaps(eventType) {
+  return eventType in eventTypeMap || eventType in cssPropertyMap;
+}
+
+/**
+ * @param {string} eventType
+ * @param {!Object<string, !VendorPropertyMapType>} map
+ * @param {!Element} el
+ * @return {string}
+ */
+function getJavaScriptEventName(eventType, map, el) {
+  return map[eventType].styleProperty in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
+}
+
+/**
+ * Helper function to determine browser prefix for CSS3 animation events
+ * and property names.
+ * @param {!Object} windowObj
+ * @param {string} eventType
+ * @return {string}
+ */
+function getAnimationName(windowObj, eventType) {
+  if (!hasProperShape(windowObj) || !eventFoundInMaps(eventType)) {
+    return eventType;
+  }
+
+  var map = /** @type {!Object<string, !VendorPropertyMapType>} */eventType in eventTypeMap ? eventTypeMap : cssPropertyMap;
+  var el = windowObj['document']['createElement']('div');
+  var eventName = '';
+
+  if (map === eventTypeMap) {
+    eventName = getJavaScriptEventName(eventType, map, el);
+  } else {
+    eventName = map[eventType].noPrefix in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
+  }
+
+  return eventName;
+}
+
+// Public functions to access getAnimationName() for JavaScript events or CSS
+// property names.
+
+var transformStyleProperties = ['transform', 'WebkitTransform', 'MozTransform', 'OTransform', 'MSTransform'];
+
+/**
+ * @param {!Object} windowObj
+ * @param {string} eventType
+ * @return {string}
+ */
+function getCorrectEventName(windowObj, eventType) {
+  return getAnimationName(windowObj, eventType);
+}
+
+/**
+ * @param {!Object} windowObj
+ * @param {string} eventType
+ * @return {string}
+ */
+function getCorrectPropertyName(windowObj, eventType) {
+  return getAnimationName(windowObj, eventType);
+}
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(34);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_0__constants__["a"]; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(35);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint no-unused-vars: [2, {"args": "none"}] */
+
+/**
+ * Adapter for MDC Ripple. Provides an interface for managing
+ * - classes
+ * - dom
+ * - CSS variables
+ * - position
+ * - dimensions
+ * - scroll position
+ * - event handlers
+ * - unbounded, active and disabled states
+ *
+ * Additionally, provides type information for the adapter to the Closure
+ * compiler.
+ *
+ * Implement this adapter for your framework of choice to delegate updates to
+ * the component in your framework of choice. See architecture documentation
+ * for more details.
+ * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
+ *
+ * @record
+ */
+var MDCRippleAdapter = function () {
+  function MDCRippleAdapter() {
+    _classCallCheck(this, MDCRippleAdapter);
+  }
+
+  _createClass(MDCRippleAdapter, [{
+    key: "browserSupportsCssVars",
+
+    /** @return {boolean} */
+    value: function browserSupportsCssVars() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "isUnbounded",
+    value: function isUnbounded() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "isSurfaceActive",
+    value: function isSurfaceActive() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "isSurfaceDisabled",
+    value: function isSurfaceDisabled() {}
+
+    /** @param {string} className */
+
+  }, {
+    key: "addClass",
+    value: function addClass(className) {}
+
+    /** @param {string} className */
+
+  }, {
+    key: "removeClass",
+    value: function removeClass(className) {}
+
+    /**
+     * @param {string} evtType
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: "registerInteractionHandler",
+    value: function registerInteractionHandler(evtType, handler) {}
+
+    /**
+     * @param {string} evtType
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: "deregisterInteractionHandler",
+    value: function deregisterInteractionHandler(evtType, handler) {}
+
+    /**
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: "registerResizeHandler",
+    value: function registerResizeHandler(handler) {}
+
+    /**
+     * @param {!Function} handler
+     */
+
+  }, {
+    key: "deregisterResizeHandler",
+    value: function deregisterResizeHandler(handler) {}
+
+    /**
+     * @param {string} varName
+     * @param {?number|string} value
+     */
+
+  }, {
+    key: "updateCssVariable",
+    value: function updateCssVariable(varName, value) {}
+
+    /** @return {!ClientRect} */
+
+  }, {
+    key: "computeBoundingRect",
+    value: function computeBoundingRect() {}
+
+    /** @return {{x: number, y: number}} */
+
+  }, {
+    key: "getWindowPageOffset",
+    value: function getWindowPageOffset() {}
+  }]);
+
+  return MDCRippleAdapter;
+}();
+
+/* unused harmony default export */ var _unused_webpack_default_export = (MDCRippleAdapter);
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["supportsCssVariables"] = supportsCssVariables;
+/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
+/* harmony export (immutable) */ __webpack_exports__["getMatchesProperty"] = getMatchesProperty;
+/* harmony export (immutable) */ __webpack_exports__["getNormalizedEventCoords"] = getNormalizedEventCoords;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Stores result from supportsCssVariables to avoid redundant processing to detect CSS custom variable support.
+ * @private {boolean|undefined}
+ */
+var supportsCssVariables_ = void 0;
+
+/**
+ * Stores result from applyPassive to avoid redundant processing to detect passive event listener support.
+ * @private {boolean|undefined}
+ */
+var supportsPassive_ = void 0;
+
+/**
+ * @param {!Window} windowObj
+ * @return {boolean}
+ */
+function detectEdgePseudoVarBug(windowObj) {
+  // Detect versions of Edge with buggy var() support
+  // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11495448/
+  var document = windowObj.document;
+  var className = 'test-edge-css-var';
+  var styleNode = document.createElement('style');
+  document.head.appendChild(styleNode);
+  var sheet = styleNode.sheet;
+  // Internet Explorer 11 requires indices to always be specified to insertRule
+  sheet.insertRule(':root { --' + className + ': 1px solid #000; }', 0);
+  sheet.insertRule('.' + className + ' { visibility: hidden; }', 1);
+  sheet.insertRule('.' + className + '::before { border: var(--' + className + '); }', 2);
+  var node = document.createElement('div');
+  node.className = className;
+  document.body.appendChild(node);
+  // Bug exists if ::before style ends up propagating to the parent element
+  var hasPseudoVarBug = windowObj.getComputedStyle(node).borderTopStyle === 'solid';
+  node.remove();
+  styleNode.remove();
+  return hasPseudoVarBug;
+}
+
+/**
+ * @param {!Window} windowObj
+ * @param {boolean=} forceRefresh
+ * @return {boolean|undefined}
+ */
+function supportsCssVariables(windowObj) {
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (typeof supportsCssVariables_ === 'boolean' && !forceRefresh) {
+    return supportsCssVariables_;
+  }
+
+  var supportsFunctionPresent = windowObj.CSS && typeof windowObj.CSS.supports === 'function';
+  if (!supportsFunctionPresent) {
+    return;
+  }
+
+  var explicitlySupportsCssVars = windowObj.CSS.supports('--css-vars', 'yes');
+  // See: https://bugs.webkit.org/show_bug.cgi?id=154669
+  // See: README section on Safari
+  var weAreFeatureDetectingSafari10plus = windowObj.CSS.supports('(--css-vars: yes)') && windowObj.CSS.supports('color', '#00000000');
+
+  if (explicitlySupportsCssVars || weAreFeatureDetectingSafari10plus) {
+    supportsCssVariables_ = !detectEdgePseudoVarBug(windowObj);
+  } else {
+    supportsCssVariables_ = false;
+  }
+  return supportsCssVariables_;
+}
+
+//
+/**
+ * Determine whether the current browser supports passive event listeners, and if so, use them.
+ * @param {!Window=} globalObj
+ * @param {boolean=} forceRefresh
+ * @return {boolean|{passive: boolean}}
+ */
+function applyPassive() {
+  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (supportsPassive_ === undefined || forceRefresh) {
+    var isSupported = false;
+    try {
+      globalObj.document.addEventListener('test', null, { get passive() {
+          isSupported = true;
+        } });
+    } catch (e) {}
+
+    supportsPassive_ = isSupported;
+  }
+
+  return supportsPassive_ ? { passive: true } : false;
+}
+
+/**
+ * @param {!Object} HTMLElementPrototype
+ * @return {!Array<string>}
+ */
+function getMatchesProperty(HTMLElementPrototype) {
+  return ['webkitMatchesSelector', 'msMatchesSelector', 'matches'].filter(function (p) {
+    return p in HTMLElementPrototype;
+  }).pop();
+}
+
+/**
+ * @param {!Event} ev
+ * @param {!{x: number, y: number}} pageOffset
+ * @param {!ClientRect} clientRect
+ * @return {!{x: number, y: number}}
+ */
+function getNormalizedEventCoords(ev, pageOffset, clientRect) {
+  var x = pageOffset.x,
+      y = pageOffset.y;
+
+  var documentX = x + clientRect.left;
+  var documentY = y + clientRect.top;
+
+  var normalizedX = void 0;
+  var normalizedY = void 0;
+  // Determine touch point relative to the ripple container.
+  if (ev.type === 'touchstart') {
+    normalizedX = ev.changedTouches[0].pageX - documentX;
+    normalizedY = ev.changedTouches[0].pageY - documentY;
+  } else {
+    normalizedX = ev.pageX - documentX;
+    normalizedY = ev.pageY - documentY;
+  }
+
+  return { x: normalizedX, y: normalizedY };
+}
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["remapEvent"] = remapEvent;
+/* harmony export (immutable) */ __webpack_exports__["getTransformPropertyName"] = getTransformPropertyName;
+/* harmony export (immutable) */ __webpack_exports__["supportsCssCustomProperties"] = supportsCssCustomProperties;
+/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
+/* harmony export (immutable) */ __webpack_exports__["saveElementTabState"] = saveElementTabState;
+/* harmony export (immutable) */ __webpack_exports__["restoreElementTabState"] = restoreElementTabState;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var TAB_DATA = 'data-mdc-tabindex';
+var TAB_DATA_HANDLED = 'data-mdc-tabindex-handled';
+
+var storedTransformPropertyName_ = void 0;
+var supportsPassive_ = void 0;
+
+// Remap touch events to pointer events, if the browser doesn't support touch events.
+function remapEvent(eventName) {
+  var globalObj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;
+
+  if (!('ontouchstart' in globalObj.document)) {
+    switch (eventName) {
+      case 'touchstart':
+        return 'pointerdown';
+      case 'touchmove':
+        return 'pointermove';
+      case 'touchend':
+        return 'pointerup';
+      default:
+        return eventName;
+    }
+  }
+
+  return eventName;
+}
+
+// Choose the correct transform property to use on the current browser.
+function getTransformPropertyName() {
+  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (storedTransformPropertyName_ === undefined || forceRefresh) {
+    var el = globalObj.document.createElement('div');
+    var transformPropertyName = 'transform' in el.style ? 'transform' : '-webkit-transform';
+    storedTransformPropertyName_ = transformPropertyName;
+  }
+
+  return storedTransformPropertyName_;
+}
+
+// Determine whether the current browser supports CSS properties.
+function supportsCssCustomProperties() {
+  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
+
+  if ('CSS' in globalObj) {
+    return globalObj.CSS.supports('(--color: red)');
+  }
+  return false;
+}
+
+// Determine whether the current browser supports passive event listeners, and if so, use them.
+function applyPassive() {
+  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (supportsPassive_ === undefined || forceRefresh) {
+    var isSupported = false;
+    try {
+      globalObj.document.addEventListener('test', null, { get passive() {
+          isSupported = true;
+        } });
+    } catch (e) {}
+
+    supportsPassive_ = isSupported;
+  }
+
+  return supportsPassive_ ? { passive: true } : false;
+}
+
+// Save the tab state for an element.
+function saveElementTabState(el) {
+  if (el.hasAttribute('tabindex')) {
+    el.setAttribute(TAB_DATA, el.getAttribute('tabindex'));
+  }
+  el.setAttribute(TAB_DATA_HANDLED, true);
+}
+
+// Restore the tab state for an element, if it was saved.
+function restoreElementTabState(el) {
+  // Only modify elements we've already handled, in case anything was dynamically added since we saved state.
+  if (el.hasAttribute(TAB_DATA_HANDLED)) {
+    if (el.hasAttribute(TAB_DATA)) {
+      el.setAttribute('tabindex', el.getAttribute(TAB_DATA));
+      el.removeAttribute(TAB_DATA);
+    } else {
+      el.removeAttribute('tabindex');
+    }
+    el.removeAttribute(TAB_DATA_HANDLED);
+  }
+}
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util__ = __webpack_require__(11);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__simple__ = __webpack_require__(53);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSimpleMenu", function() { return __WEBPACK_IMPORTED_MODULE_1__simple__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSimpleMenuFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__simple__["b"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_0__util__; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["getTransformPropertyName"] = getTransformPropertyName;
+/* harmony export (immutable) */ __webpack_exports__["clamp"] = clamp;
+/* harmony export (immutable) */ __webpack_exports__["bezierProgress"] = bezierProgress;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @type {string|undefined} */
+var storedTransformPropertyName_ = void 0;
+
+/**
+ * Returns the name of the correct transform property to use on the current browser.
+ * @param {!Window} globalObj
+ * @param {boolean=} forceRefresh
+ * @return {string}
+ */
+function getTransformPropertyName(globalObj) {
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (storedTransformPropertyName_ === undefined || forceRefresh) {
+    var el = globalObj.document.createElement('div');
+    var transformPropertyName = 'transform' in el.style ? 'transform' : 'webkitTransform';
+    storedTransformPropertyName_ = transformPropertyName;
+  }
+
+  return storedTransformPropertyName_;
+}
+
+/**
+ * Clamps a value between the minimum and the maximum, returning the clamped value.
+ * @param {number} value
+ * @param {number} min
+ * @param {number} max
+ * @return {number}
+ */
+function clamp(value) {
+  var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+  var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
+
+  return Math.min(max, Math.max(min, value));
+}
+
+/**
+ * Returns the easing value to apply at time t, for a given cubic bezier curve.
+ * Control points P0 and P3 are assumed to be (0,0) and (1,1), respectively.
+ * Parameters are as follows:
+ * - time: The current time in the animation, scaled between 0 and 1.
+ * - x1: The x value of control point P1.
+ * - y1: The y value of control point P1.
+ * - x2: The x value of control point P2.
+ * - y2: The y value of control point P2.
+ * @param {number} time
+ * @param {number} x1
+ * @param {number} y1
+ * @param {number} x2
+ * @param {number} y2
+ * @return {number}
+ */
+function bezierProgress(time, x1, y1, x2, y2) {
+  return getBezierCoordinate_(solvePositionFromXValue_(time, x1, x2), y1, y2);
+}
+
+/**
+ * Compute a single coordinate at a position point between 0 and 1.
+ * c1 and c2 are the matching coordinate on control points P1 and P2, respectively.
+ * Control points P0 and P3 are assumed to be (0,0) and (1,1), respectively.
+ * Adapted from https://github.com/google/closure-library/blob/master/closure/goog/math/bezier.js.
+ * @param {number} t
+ * @param {number} c1
+ * @param {number} c2
+ * @return {number}
+ */
+function getBezierCoordinate_(t, c1, c2) {
+  // Special case start and end.
+  if (t === 0 || t === 1) {
+    return t;
+  }
+
+  // Step one - from 4 points to 3
+  var ic0 = t * c1;
+  var ic1 = c1 + t * (c2 - c1);
+  var ic2 = c2 + t * (1 - c2);
+
+  // Step two - from 3 points to 2
+  ic0 += t * (ic1 - ic0);
+  ic1 += t * (ic2 - ic1);
+
+  // Final step - last point
+  return ic0 + t * (ic1 - ic0);
+}
+
+/**
+ * Project a point onto the Bezier curve, from a given X. Calculates the position t along the curve.
+ * Adapted from https://github.com/google/closure-library/blob/master/closure/goog/math/bezier.js.
+ * @param {number} xVal
+ * @param {number} x1
+ * @param {number} x2
+ * @return {number}
+ */
+function solvePositionFromXValue_(xVal, x1, x2) {
+  var EPSILON = 1e-6;
+  var MAX_ITERATIONS = 8;
+
+  if (xVal <= 0) {
+    return 0;
+  } else if (xVal >= 1) {
+    return 1;
+  }
+
+  // Initial estimate of t using linear interpolation.
+  var t = xVal;
+
+  // Try gradient descent to solve for t. If it works, it is very fast.
+  var tMin = 0;
+  var tMax = 1;
+  var value = 0;
+  for (var i = 0; i < MAX_ITERATIONS; i++) {
+    value = getBezierCoordinate_(t, x1, x2);
+    var derivative = (getBezierCoordinate_(t + EPSILON, x1, x2) - value) / EPSILON;
+    if (Math.abs(value - xVal) < EPSILON) {
+      return t;
+    } else if (Math.abs(derivative) < EPSILON) {
+      break;
+    } else {
+      if (value < xVal) {
+        tMin = t;
+      } else {
+        tMax = t;
+      }
+      t -= (value - xVal) / derivative;
+    }
+  }
+
+  // If the gradient descent got stuck in a local minimum, e.g. because
+  // the derivative was close to 0, use a Dichotomy refinement instead.
+  // We limit the number of interations to 8.
+  for (var _i = 0; Math.abs(value - xVal) > EPSILON && _i < MAX_ITERATIONS; _i++) {
+    if (value < xVal) {
+      tMin = t;
+      t = (t + tMax) / 2;
+    } else {
+      tMax = t;
+      t = (t + tMin) / 2;
+    }
+    value = getBezierCoordinate_(t, x1, x2);
+  }
+  return t;
+}
+
+/***/ }),
+/* 12 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  ACTIVE: 'mdc-slider--active',
+  DISABLED: 'mdc-slider--disabled',
+  DISCRETE: 'mdc-slider--discrete',
+  FOCUS: 'mdc-slider--focus',
+  IN_TRANSIT: 'mdc-slider--in-transit',
+  OFF: 'mdc-slider--off',
+  IS_DISCRETE: 'mdc-slider--discrete',
+  HAS_TRACK_MARKER: 'mdc-slider--display-markers'
+};
+
+var strings = {
+  TRACK_SELECTOR: '.mdc-slider__track',
+  TRACK_MARKER_CONTAINER_SELECTOR: '.mdc-slider__track-marker-container',
+  LAST_TRACK_MARKER_SELECTOR: '.mdc-slider__track-marker:last-child',
+  THUMB_CONTAINER_SELECTOR: '.mdc-slider__thumb-container',
+  PIN_VALUE_MARKER_SELECTOR: '.mdc-slider__pin-value-marker',
+  ARIA_VALUEMIN: 'aria-valuemin',
+  ARIA_VALUEMAX: 'aria-valuemax',
+  ARIA_VALUENOW: 'aria-valuenow',
+  ARIA_DISABLED: 'aria-disabled',
+  STEP_DATA_ATTR: 'data-step',
+  CHANGE_EVENT: 'MDCSlider:change',
+  INPUT_EVENT: 'MDCSlider:input'
+};
+
+var numbers = {
+  PAGE_FACTOR: 4
+};
+
+/***/ }),
+/* 13 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCTab; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_ripple__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(14);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation__ = __webpack_require__(70);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_3__foundation__["a"]; });
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+var MDCTab = function (_MDCComponent) {
+  _inherits(MDCTab, _MDCComponent);
+
+  _createClass(MDCTab, [{
+    key: 'computedWidth',
+    get: function get() {
+      return this.foundation_.getComputedWidth();
+    }
+  }, {
+    key: 'computedLeft',
+    get: function get() {
+      return this.foundation_.getComputedLeft();
+    }
+  }, {
+    key: 'isActive',
+    get: function get() {
+      return this.foundation_.isActive();
+    },
+    set: function set(isActive) {
+      this.foundation_.setActive(isActive);
+    }
+  }, {
+    key: 'preventDefaultOnClick',
+    get: function get() {
+      return this.foundation_.preventsDefaultOnClick();
+    },
+    set: function set(preventDefaultOnClick) {
+      this.foundation_.setPreventDefaultOnClick(preventDefaultOnClick);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCTab(root);
+    }
+  }]);
+
+  function MDCTab() {
+    var _ref;
+
+    _classCallCheck(this, MDCTab);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    var _this = _possibleConstructorReturn(this, (_ref = MDCTab.__proto__ || Object.getPrototypeOf(MDCTab)).call.apply(_ref, [this].concat(args)));
+
+    _this.ripple_ = __WEBPACK_IMPORTED_MODULE_1__material_ripple__["MDCRipple"].attachTo(_this.root_);
+    return _this;
+  }
+
+  _createClass(MDCTab, [{
+    key: 'destroy',
+    value: function destroy() {
+      this.ripple_.destroy();
+      _get(MDCTab.prototype.__proto__ || Object.getPrototypeOf(MDCTab.prototype), 'destroy', this).call(this);
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.root_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.root_.removeEventListener(type, handler);
+        },
+        getOffsetWidth: function getOffsetWidth() {
+          return _this2.root_.offsetWidth;
+        },
+        getOffsetLeft: function getOffsetLeft() {
+          return _this2.root_.offsetLeft;
+        },
+        notifySelected: function notifySelected() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.SELECTED_EVENT, { tab: _this2 }, true);
+        }
+      });
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      this.isActive = this.root_.classList.contains(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].ACTIVE);
+    }
+  }, {
+    key: 'measureSelf',
+    value: function measureSelf() {
+      this.foundation_.measureSelf();
+    }
+  }]);
+
+  return MDCTab;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 14 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  ACTIVE: 'mdc-tab--active'
+};
+
+var strings = {
+  SELECTED_EVENT: 'MDCTab:selected'
+};
+
+/***/ }),
+/* 15 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCTabBar; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__tab__ = __webpack_require__(13);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(71);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+var MDCTabBar = function (_MDCComponent) {
+  _inherits(MDCTabBar, _MDCComponent);
+
+  function MDCTabBar() {
+    _classCallCheck(this, MDCTabBar);
+
+    return _possibleConstructorReturn(this, (MDCTabBar.__proto__ || Object.getPrototypeOf(MDCTabBar)).apply(this, arguments));
+  }
+
+  _createClass(MDCTabBar, [{
+    key: 'initialize',
+    value: function initialize() {
+      var _this2 = this;
+
+      var tabFactory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (el) {
+        return new __WEBPACK_IMPORTED_MODULE_1__tab__["a" /* MDCTab */](el);
+      };
+
+      this.indicator_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.INDICATOR_SELECTOR);
+      this.tabs_ = this.gatherTabs_(tabFactory);
+      this.tabSelectedHandler_ = function (_ref) {
+        var detail = _ref.detail;
+        var tab = detail.tab;
+
+        _this2.setActiveTab_(tab, true);
+      };
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this3 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this3.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this3.root_.classList.remove(className);
+        },
+        bindOnMDCTabSelectedEvent: function bindOnMDCTabSelectedEvent() {
+          return _this3.listen(__WEBPACK_IMPORTED_MODULE_1__tab__["b" /* MDCTabFoundation */].strings.SELECTED_EVENT, _this3.tabSelectedHandler_);
+        },
+        unbindOnMDCTabSelectedEvent: function unbindOnMDCTabSelectedEvent() {
+          return _this3.unlisten(__WEBPACK_IMPORTED_MODULE_1__tab__["b" /* MDCTabFoundation */].strings.SELECTED_EVENT, _this3.tabSelectedHandler_);
+        },
+        registerResizeHandler: function registerResizeHandler(handler) {
+          return window.addEventListener('resize', handler);
+        },
+        deregisterResizeHandler: function deregisterResizeHandler(handler) {
+          return window.removeEventListener('resize', handler);
+        },
+        getOffsetWidth: function getOffsetWidth() {
+          return _this3.root_.offsetWidth;
+        },
+        setStyleForIndicator: function setStyleForIndicator(propertyName, value) {
+          return _this3.indicator_.style.setProperty(propertyName, value);
+        },
+        getOffsetWidthForIndicator: function getOffsetWidthForIndicator() {
+          return _this3.indicator_.offsetWidth;
+        },
+        notifyChange: function notifyChange(evtData) {
+          return _this3.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.CHANGE_EVENT, evtData);
+        },
+        getNumberOfTabs: function getNumberOfTabs() {
+          return _this3.tabs.length;
+        },
+        isTabActiveAtIndex: function isTabActiveAtIndex(index) {
+          return _this3.tabs[index].isActive;
+        },
+        setTabActiveAtIndex: function setTabActiveAtIndex(index, isActive) {
+          _this3.tabs[index].isActive = isActive;
+        },
+        isDefaultPreventedOnClickForTabAtIndex: function isDefaultPreventedOnClickForTabAtIndex(index) {
+          return _this3.tabs[index].preventDefaultOnClick;
+        },
+        setPreventDefaultOnClickForTabAtIndex: function setPreventDefaultOnClickForTabAtIndex(index, preventDefaultOnClick) {
+          _this3.tabs[index].preventDefaultOnClick = preventDefaultOnClick;
+        },
+        measureTabAtIndex: function measureTabAtIndex(index) {
+          return _this3.tabs[index].measureSelf();
+        },
+        getComputedWidthForTabAtIndex: function getComputedWidthForTabAtIndex(index) {
+          return _this3.tabs[index].computedWidth;
+        },
+        getComputedLeftForTabAtIndex: function getComputedLeftForTabAtIndex(index) {
+          return _this3.tabs[index].computedLeft;
+        }
+      });
+    }
+  }, {
+    key: 'gatherTabs_',
+    value: function gatherTabs_(tabFactory) {
+      var tabElements = [].slice.call(this.root_.querySelectorAll(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.TAB_SELECTOR));
+      return tabElements.map(function (el) {
+        return tabFactory(el);
+      });
+    }
+  }, {
+    key: 'setActiveTabIndex_',
+    value: function setActiveTabIndex_(activeTabIndex, notifyChange) {
+      this.foundation_.switchToTabAtIndex(activeTabIndex, notifyChange);
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      this.foundation_.layout();
+    }
+  }, {
+    key: 'setActiveTab_',
+    value: function setActiveTab_(activeTab, notifyChange) {
+      var indexOfTab = this.tabs.indexOf(activeTab);
+      if (indexOfTab < 0) {
+        throw new Error('Invalid tab component given as activeTab: Tab not found within this component\'s tab list');
+      }
+      this.setActiveTabIndex_(indexOfTab, notifyChange);
+    }
+  }, {
+    key: 'tabs',
+    get: function get() {
+      return this.tabs_;
+    }
+  }, {
+    key: 'activeTab',
+    get: function get() {
+      var activeIndex = this.foundation_.getActiveTabIndex();
+      return this.tabs[activeIndex];
+    },
+    set: function set(tab) {
+      this.setActiveTab_(tab, false);
+    }
+  }, {
+    key: 'activeTabIndex',
+    get: function get() {
+      return this.foundation_.getActiveTabIndex();
+    },
+    set: function set(index) {
+      this.setActiveTabIndex_(index, false);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCTabBar(root);
+    }
+  }]);
+
+  return MDCTabBar;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 16 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var strings = {
+  ARIA_HIDDEN: 'aria-hidden',
+  ROLE: 'role',
+  INPUT_SELECTOR: '.mdc-textfield__input',
+  LABEL_SELECTOR: '.mdc-textfield__label'
+};
+
+var cssClasses = {
+  ROOT: 'mdc-textfield',
+  UPGRADED: 'mdc-textfield--upgraded',
+  DISABLED: 'mdc-textfield--disabled',
+  FOCUSED: 'mdc-textfield--focused',
+  INVALID: 'mdc-textfield--invalid',
+  HELPTEXT_PERSISTENT: 'mdc-textfield-helptext--persistent',
+  HELPTEXT_VALIDATION_MSG: 'mdc-textfield-helptext--validation-msg',
+  LABEL_FLOAT_ABOVE: 'mdc-textfield__label--float-above',
+  BOX: 'mdc-textfield--box'
+};
+
+/***/ }),
+/* 17 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_auto_init__ = __webpack_require__(18);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_checkbox__ = __webpack_require__(19);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__material_dialog__ = __webpack_require__(25);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__material_drawer__ = __webpack_require__(31);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__material_form_field__ = __webpack_require__(40);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__material_grid_list__ = __webpack_require__(43);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__material_icon_toggle__ = __webpack_require__(46);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__material_linear_progress__ = __webpack_require__(50);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__material_menu__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__material_radio__ = __webpack_require__(57);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__material_ripple__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__material_select__ = __webpack_require__(61);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__material_slider__ = __webpack_require__(64);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__material_snackbar__ = __webpack_require__(66);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__material_tabs__ = __webpack_require__(69);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__material_textfield__ = __webpack_require__(76);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__material_toolbar__ = __webpack_require__(78);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "autoInit", function() { return __WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "base", function() { return __WEBPACK_IMPORTED_MODULE_1__material_base__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "checkbox", function() { return __WEBPACK_IMPORTED_MODULE_2__material_checkbox__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "dialog", function() { return __WEBPACK_IMPORTED_MODULE_3__material_dialog__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "drawer", function() { return __WEBPACK_IMPORTED_MODULE_4__material_drawer__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "formField", function() { return __WEBPACK_IMPORTED_MODULE_5__material_form_field__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "gridList", function() { return __WEBPACK_IMPORTED_MODULE_6__material_grid_list__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "iconToggle", function() { return __WEBPACK_IMPORTED_MODULE_7__material_icon_toggle__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "linearProgress", function() { return __WEBPACK_IMPORTED_MODULE_8__material_linear_progress__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "menu", function() { return __WEBPACK_IMPORTED_MODULE_9__material_menu__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "radio", function() { return __WEBPACK_IMPORTED_MODULE_10__material_radio__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "ripple", function() { return __WEBPACK_IMPORTED_MODULE_11__material_ripple__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "select", function() { return __WEBPACK_IMPORTED_MODULE_12__material_select__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "slider", function() { return __WEBPACK_IMPORTED_MODULE_13__material_slider__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "snackbar", function() { return __WEBPACK_IMPORTED_MODULE_14__material_snackbar__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "tabs", function() { return __WEBPACK_IMPORTED_MODULE_15__material_tabs__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "textfield", function() { return __WEBPACK_IMPORTED_MODULE_16__material_textfield__; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "toolbar", function() { return __WEBPACK_IMPORTED_MODULE_17__material_toolbar__; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// Register all components
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCCheckbox', __WEBPACK_IMPORTED_MODULE_2__material_checkbox__["MDCCheckbox"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCDialog', __WEBPACK_IMPORTED_MODULE_3__material_dialog__["MDCDialog"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCPersistentDrawer', __WEBPACK_IMPORTED_MODULE_4__material_drawer__["MDCPersistentDrawer"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCTemporaryDrawer', __WEBPACK_IMPORTED_MODULE_4__material_drawer__["MDCTemporaryDrawer"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCFormField', __WEBPACK_IMPORTED_MODULE_5__material_form_field__["MDCFormField"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCRipple', __WEBPACK_IMPORTED_MODULE_11__material_ripple__["MDCRipple"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCGridList', __WEBPACK_IMPORTED_MODULE_6__material_grid_list__["MDCGridList"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCIconToggle', __WEBPACK_IMPORTED_MODULE_7__material_icon_toggle__["MDCIconToggle"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCLinearProgress', __WEBPACK_IMPORTED_MODULE_8__material_linear_progress__["MDCLinearProgress"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCRadio', __WEBPACK_IMPORTED_MODULE_10__material_radio__["MDCRadio"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCSnackbar', __WEBPACK_IMPORTED_MODULE_14__material_snackbar__["MDCSnackbar"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCTab', __WEBPACK_IMPORTED_MODULE_15__material_tabs__["MDCTab"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCTabBar', __WEBPACK_IMPORTED_MODULE_15__material_tabs__["MDCTabBar"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCTextfield', __WEBPACK_IMPORTED_MODULE_16__material_textfield__["MDCTextfield"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCSimpleMenu', __WEBPACK_IMPORTED_MODULE_9__material_menu__["MDCSimpleMenu"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCSelect', __WEBPACK_IMPORTED_MODULE_12__material_select__["MDCSelect"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCSlider', __WEBPACK_IMPORTED_MODULE_13__material_slider__["MDCSlider"]);
+__WEBPACK_IMPORTED_MODULE_0__material_auto_init__["a" /* default */].register('MDCToolbar', __WEBPACK_IMPORTED_MODULE_17__material_toolbar__["MDCToolbar"]);
+
+// Export all components.
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = mdcAutoInit;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var registry = Object.create(null);
+
+var CONSOLE_WARN = console.warn.bind(console);
+
+/**
+ * Auto-initializes all mdc components on a page.
+ */
+function mdcAutoInit() {
+  var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
+  var warn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CONSOLE_WARN;
+
+  var nodes = root.querySelectorAll('[data-mdc-auto-init]');
+  for (var i = 0, node; node = nodes[i]; i++) {
+    var ctorName = node.dataset.mdcAutoInit;
+    if (!ctorName) {
+      throw new Error('(mdc-auto-init) Constructor name must be given.');
+    }
+
+    var Ctor = registry[ctorName];
+    if (typeof Ctor !== 'function') {
+      throw new Error('(mdc-auto-init) Could not find constructor in registry for ' + ctorName);
+    }
+
+    if (node[ctorName]) {
+      warn('(mdc-auto-init) Component already initialized for ' + node + '. Skipping...');
+      continue;
+    }
+
+    // TODO: Should we make an eslint rule for an attachTo() static method?
+    var component = Ctor.attachTo(node);
+    Object.defineProperty(node, ctorName, {
+      value: component,
+      writable: false,
+      enumerable: false,
+      configurable: true
+    });
+  }
+}
+
+mdcAutoInit.register = function (componentName, Ctor) {
+  var warn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CONSOLE_WARN;
+
+  if (typeof Ctor !== 'function') {
+    throw new Error('(mdc-auto-init) Invalid Ctor value ' + Ctor + '. Expected function');
+  }
+  if (registry[componentName]) {
+    warn('(mdc-auto-init) Overriding registration for ' + componentName + ' with ' + Ctor + '. ' + ('Was: ' + registry[componentName]));
+  }
+  registry[componentName] = Ctor;
+};
+
+mdcAutoInit.deregister = function (componentName) {
+  delete registry[componentName];
+};
+
+mdcAutoInit.deregisterAll = function () {
+  Object.keys(registry).forEach(this.deregister, this);
+};
+
+/***/ }),
+/* 19 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCCheckbox", function() { return MDCCheckbox; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_animation__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_base_selection_control__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation__ = __webpack_require__(20);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__material_ripple__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__material_ripple_util__ = __webpack_require__(8);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCCheckboxFoundation", function() { return __WEBPACK_IMPORTED_MODULE_3__foundation__["a"]; });
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+/* eslint-disable no-unused-vars */
+
+/* eslint-enable no-unused-vars */
+
+
+
+
+
+
+/**
+ * @extends MDCComponent<!MDCCheckboxFoundation>
+ */
+var MDCCheckbox = function (_MDCComponent) {
+  _inherits(MDCCheckbox, _MDCComponent);
+
+  _createClass(MDCCheckbox, [{
+    key: 'nativeCb_',
+
+
+    /**
+     * Returns the state of the native control element, or null if the native control element is not present.
+     * @return {?SelectionControlState}
+     * @private
+     */
+    get: function get() {
+      var NATIVE_CONTROL_SELECTOR = __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.NATIVE_CONTROL_SELECTOR;
+
+      var cbEl = /** @type {?SelectionControlState} */this.root_.querySelector(NATIVE_CONTROL_SELECTOR);
+      return cbEl;
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCCheckbox(root);
+    }
+  }]);
+
+  function MDCCheckbox() {
+    var _ref;
+
+    _classCallCheck(this, MDCCheckbox);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    /** @private {!MDCRipple} */
+    var _this = _possibleConstructorReturn(this, (_ref = MDCCheckbox.__proto__ || Object.getPrototypeOf(MDCCheckbox)).call.apply(_ref, [this].concat(args)));
+
+    _this.ripple_ = _this.initRipple_();
+    return _this;
+  }
+
+  /**
+   * @return {!MDCRipple}
+   * @private
+   */
+
+
+  _createClass(MDCCheckbox, [{
+    key: 'initRipple_',
+    value: function initRipple_() {
+      var _this2 = this;
+
+      var MATCHES = Object(__WEBPACK_IMPORTED_MODULE_5__material_ripple_util__["getMatchesProperty"])(HTMLElement.prototype);
+      var adapter = _extends(__WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRipple"].createAdapter(this), {
+        isUnbounded: function isUnbounded() {
+          return true;
+        },
+        isSurfaceActive: function isSurfaceActive() {
+          return _this2.nativeCb_[MATCHES](':active');
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.nativeCb_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.nativeCb_.removeEventListener(type, handler);
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          var _root_$getBoundingCli = _this2.root_.getBoundingClientRect(),
+              left = _root_$getBoundingCli.left,
+              top = _root_$getBoundingCli.top;
+
+          var DIM = 40;
+          return {
+            top: top,
+            left: left,
+            right: left + DIM,
+            bottom: top + DIM,
+            width: DIM,
+            height: DIM
+          };
+        }
+      });
+      var foundation = new __WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRippleFoundation"](adapter);
+      return new __WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRipple"](this.root_, foundation);
+    }
+
+    /** @return {!MDCCheckboxFoundation} */
+
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this3 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this3.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this3.root_.classList.remove(className);
+        },
+        registerAnimationEndHandler: function registerAnimationEndHandler(handler) {
+          return _this3.root_.addEventListener(Object(__WEBPACK_IMPORTED_MODULE_0__material_animation__["a" /* getCorrectEventName */])(window, 'animationend'), handler);
+        },
+        deregisterAnimationEndHandler: function deregisterAnimationEndHandler(handler) {
+          return _this3.root_.removeEventListener(Object(__WEBPACK_IMPORTED_MODULE_0__material_animation__["a" /* getCorrectEventName */])(window, 'animationend'), handler);
+        },
+        registerChangeHandler: function registerChangeHandler(handler) {
+          return _this3.nativeCb_.addEventListener('change', handler);
+        },
+        deregisterChangeHandler: function deregisterChangeHandler(handler) {
+          return _this3.nativeCb_.removeEventListener('change', handler);
+        },
+        getNativeControl: function getNativeControl() {
+          return _this3.nativeCb_;
+        },
+        forceLayout: function forceLayout() {
+          return _this3.root_.offsetWidth;
+        },
+        isAttachedToDOM: function isAttachedToDOM() {
+          return Boolean(_this3.root_.parentNode);
+        }
+      });
+    }
+
+    /** @return {!MDCRipple} */
+
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.ripple_.destroy();
+      _get(MDCCheckbox.prototype.__proto__ || Object.getPrototypeOf(MDCCheckbox.prototype), 'destroy', this).call(this);
+    }
+  }, {
+    key: 'ripple',
+    get: function get() {
+      return this.ripple_;
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'checked',
+    get: function get() {
+      return this.foundation_.isChecked();
+    }
+
+    /** @param {boolean} checked */
+    ,
+    set: function set(checked) {
+      this.foundation_.setChecked(checked);
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'indeterminate',
+    get: function get() {
+      return this.foundation_.isIndeterminate();
+    }
+
+    /** @param {boolean} indeterminate */
+    ,
+    set: function set(indeterminate) {
+      this.foundation_.setIndeterminate(indeterminate);
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    }
+
+    /** @param {boolean} disabled */
+    ,
+    set: function set(disabled) {
+      this.foundation_.setDisabled(disabled);
+    }
+
+    /** @return {?string} */
+
+  }, {
+    key: 'value',
+    get: function get() {
+      return this.foundation_.getValue();
+    }
+
+    /** @param {?string} value */
+    ,
+    set: function set(value) {
+      this.foundation_.setValue(value);
+    }
+  }]);
+
+  return MDCCheckbox;
+}(__WEBPACK_IMPORTED_MODULE_1__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 20 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_selection_control__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__adapter__ = __webpack_require__(21);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__constants__ = __webpack_require__(22);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* eslint-disable no-unused-vars */
+
+
+/* eslint-enable no-unused-vars */
+
+
+/** @const {!Array<string>} */
+var CB_PROTO_PROPS = ['checked', 'indeterminate'];
+
+/**
+ * @extends {MDCFoundation<!MDCCheckboxAdapter>}
+ */
+
+var MDCCheckboxFoundation = function (_MDCFoundation) {
+  _inherits(MDCCheckboxFoundation, _MDCFoundation);
+
+  _createClass(MDCCheckboxFoundation, null, [{
+    key: 'cssClasses',
+
+    /** @return enum {cssClasses} */
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */];
+    }
+
+    /** @return enum {strings} */
+
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */];
+    }
+
+    /** @return enum {numbers} */
+
+  }, {
+    key: 'numbers',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* numbers */];
+    }
+
+    /** @return {!MDCCheckboxAdapter} */
+
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return (/** @type {!MDCCheckboxAdapter} */{
+          addClass: function addClass() /* className: string */{},
+          removeClass: function removeClass() /* className: string */{},
+          registerAnimationEndHandler: function registerAnimationEndHandler() /* handler: EventListener */{},
+          deregisterAnimationEndHandler: function deregisterAnimationEndHandler() /* handler: EventListener */{},
+          registerChangeHandler: function registerChangeHandler() /* handler: EventListener */{},
+          deregisterChangeHandler: function deregisterChangeHandler() /* handler: EventListener */{},
+          getNativeControl: function getNativeControl() /* !SelectionControlState */{},
+          forceLayout: function forceLayout() {},
+          isAttachedToDOM: function isAttachedToDOM() /* boolean */{}
+        }
+      );
+    }
+  }]);
+
+  function MDCCheckboxFoundation(adapter) {
+    _classCallCheck(this, MDCCheckboxFoundation);
+
+    /** @private {string} */
+    var _this = _possibleConstructorReturn(this, (MDCCheckboxFoundation.__proto__ || Object.getPrototypeOf(MDCCheckboxFoundation)).call(this, _extends(MDCCheckboxFoundation.defaultAdapter, adapter)));
+
+    _this.currentCheckState_ = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_INIT;
+
+    /** @private {string} */
+    _this.currentAnimationClass_ = '';
+
+    /** @private {number} */
+    _this.animEndLatchTimer_ = 0;
+
+    _this.animEndHandler_ = /** @private {!EventListener} */function () {
+      clearTimeout(_this.animEndLatchTimer_);
+      _this.animEndLatchTimer_ = setTimeout(function () {
+        _this.adapter_.removeClass(_this.currentAnimationClass_);
+        _this.adapter_.deregisterAnimationEndHandler(_this.animEndHandler_);
+      }, __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* numbers */].ANIM_END_LATCH_MS);
+    };
+
+    _this.changeHandler_ = /** @private {!EventListener} */function () {
+      return _this.transitionCheckState_();
+    };
+    return _this;
+  }
+
+  _createClass(MDCCheckboxFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].UPGRADED);
+      this.adapter_.registerChangeHandler(this.changeHandler_);
+      this.installPropertyChangeHooks_();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterChangeHandler(this.changeHandler_);
+      this.uninstallPropertyChangeHooks_();
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isChecked',
+    value: function isChecked() {
+      return this.getNativeControl_().checked;
+    }
+
+    /** @param {boolean} checked */
+
+  }, {
+    key: 'setChecked',
+    value: function setChecked(checked) {
+      this.getNativeControl_().checked = checked;
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isIndeterminate',
+    value: function isIndeterminate() {
+      return this.getNativeControl_().indeterminate;
+    }
+
+    /** @param {boolean} indeterminate */
+
+  }, {
+    key: 'setIndeterminate',
+    value: function setIndeterminate(indeterminate) {
+      this.getNativeControl_().indeterminate = indeterminate;
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.getNativeControl_().disabled;
+    }
+
+    /** @param {boolean} disabled */
+
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(disabled) {
+      this.getNativeControl_().disabled = disabled;
+      if (disabled) {
+        this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].DISABLED);
+      } else {
+        this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].DISABLED);
+      }
+    }
+
+    /** @return {?string} */
+
+  }, {
+    key: 'getValue',
+    value: function getValue() {
+      return this.getNativeControl_().value;
+    }
+
+    /** @param {?string} value */
+
+  }, {
+    key: 'setValue',
+    value: function setValue(value) {
+      this.getNativeControl_().value = value;
+    }
+
+    /** @private */
+
+  }, {
+    key: 'installPropertyChangeHooks_',
+    value: function installPropertyChangeHooks_() {
+      var _this2 = this;
+
+      var nativeCb = this.getNativeControl_();
+      var cbProto = Object.getPrototypeOf(nativeCb);
+
+      CB_PROTO_PROPS.forEach(function (controlState) {
+        var desc = Object.getOwnPropertyDescriptor(cbProto, controlState);
+        // We have to check for this descriptor, since some browsers (Safari) don't support its return.
+        // See: https://bugs.webkit.org/show_bug.cgi?id=49739
+        if (validDescriptor(desc)) {
+          var nativeCbDesc = /** @type {!ObjectPropertyDescriptor} */{
+            get: desc.get,
+            set: function set(state) {
+              desc.set.call(nativeCb, state);
+              _this2.transitionCheckState_();
+            },
+            configurable: desc.configurable,
+            enumerable: desc.enumerable
+          };
+          Object.defineProperty(nativeCb, controlState, nativeCbDesc);
+        }
+      });
+    }
+
+    /** @private */
+
+  }, {
+    key: 'uninstallPropertyChangeHooks_',
+    value: function uninstallPropertyChangeHooks_() {
+      var nativeCb = this.getNativeControl_();
+      var cbProto = Object.getPrototypeOf(nativeCb);
+
+      CB_PROTO_PROPS.forEach(function (controlState) {
+        var desc = /** @type {!ObjectPropertyDescriptor} */Object.getOwnPropertyDescriptor(cbProto, controlState);
+        if (validDescriptor(desc)) {
+          Object.defineProperty(nativeCb, controlState, desc);
+        }
+      });
+    }
+
+    /** @private */
+
+  }, {
+    key: 'transitionCheckState_',
+    value: function transitionCheckState_() {
+      var nativeCb = this.adapter_.getNativeControl();
+      if (!nativeCb) {
+        return;
+      }
+      var oldState = this.currentCheckState_;
+      var newState = this.determineCheckState_(nativeCb);
+      if (oldState === newState) {
+        return;
+      }
+
+      // Check to ensure that there isn't a previously existing animation class, in case for example
+      // the user interacted with the checkbox before the animation was finished.
+      if (this.currentAnimationClass_.length > 0) {
+        clearTimeout(this.animEndLatchTimer_);
+        this.adapter_.forceLayout();
+        this.adapter_.removeClass(this.currentAnimationClass_);
+      }
+
+      this.currentAnimationClass_ = this.getTransitionAnimationClass_(oldState, newState);
+      this.currentCheckState_ = newState;
+
+      // Check for parentNode so that animations are only run when the element is attached
+      // to the DOM.
+      if (this.adapter_.isAttachedToDOM() && this.currentAnimationClass_.length > 0) {
+        this.adapter_.addClass(this.currentAnimationClass_);
+        this.adapter_.registerAnimationEndHandler(this.animEndHandler_);
+      }
+    }
+
+    /**
+     * @param {!SelectionControlState} nativeCb
+     * @return {string}
+     * @private
+     */
+
+  }, {
+    key: 'determineCheckState_',
+    value: function determineCheckState_(nativeCb) {
+      var TRANSITION_STATE_INDETERMINATE = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_INDETERMINATE,
+          TRANSITION_STATE_CHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_CHECKED,
+          TRANSITION_STATE_UNCHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_UNCHECKED;
+
+
+      if (nativeCb.indeterminate) {
+        return TRANSITION_STATE_INDETERMINATE;
+      }
+      return nativeCb.checked ? TRANSITION_STATE_CHECKED : TRANSITION_STATE_UNCHECKED;
+    }
+
+    /**
+     * @param {string} oldState
+     * @param {string} newState
+     * @return {string}
+     */
+
+  }, {
+    key: 'getTransitionAnimationClass_',
+    value: function getTransitionAnimationClass_(oldState, newState) {
+      var TRANSITION_STATE_INIT = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_INIT,
+          TRANSITION_STATE_CHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_CHECKED,
+          TRANSITION_STATE_UNCHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* strings */].TRANSITION_STATE_UNCHECKED;
+      var _MDCCheckboxFoundatio = MDCCheckboxFoundation.cssClasses,
+          ANIM_UNCHECKED_CHECKED = _MDCCheckboxFoundatio.ANIM_UNCHECKED_CHECKED,
+          ANIM_UNCHECKED_INDETERMINATE = _MDCCheckboxFoundatio.ANIM_UNCHECKED_INDETERMINATE,
+          ANIM_CHECKED_UNCHECKED = _MDCCheckboxFoundatio.ANIM_CHECKED_UNCHECKED,
+          ANIM_CHECKED_INDETERMINATE = _MDCCheckboxFoundatio.ANIM_CHECKED_INDETERMINATE,
+          ANIM_INDETERMINATE_CHECKED = _MDCCheckboxFoundatio.ANIM_INDETERMINATE_CHECKED,
+          ANIM_INDETERMINATE_UNCHECKED = _MDCCheckboxFoundatio.ANIM_INDETERMINATE_UNCHECKED;
+
+
+      switch (oldState) {
+        case TRANSITION_STATE_INIT:
+          if (newState === TRANSITION_STATE_UNCHECKED) {
+            return '';
+          }
+        // fallthrough
+        case TRANSITION_STATE_UNCHECKED:
+          return newState === TRANSITION_STATE_CHECKED ? ANIM_UNCHECKED_CHECKED : ANIM_UNCHECKED_INDETERMINATE;
+        case TRANSITION_STATE_CHECKED:
+          return newState === TRANSITION_STATE_UNCHECKED ? ANIM_CHECKED_UNCHECKED : ANIM_CHECKED_INDETERMINATE;
+        // TRANSITION_STATE_INDETERMINATE
+        default:
+          return newState === TRANSITION_STATE_CHECKED ? ANIM_INDETERMINATE_CHECKED : ANIM_INDETERMINATE_UNCHECKED;
+      }
+    }
+
+    /**
+     * @return {!SelectionControlState}
+     * @private
+     */
+
+  }, {
+    key: 'getNativeControl_',
+    value: function getNativeControl_() {
+      return this.adapter_.getNativeControl() || {
+        checked: false,
+        indeterminate: false,
+        disabled: false,
+        value: null
+      };
+    }
+  }]);
+
+  return MDCCheckboxFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/**
+ * @param {ObjectPropertyDescriptor|undefined} inputPropDesc
+ * @return {boolean}
+ */
+
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCCheckboxFoundation);
+function validDescriptor(inputPropDesc) {
+  return !!inputPropDesc && typeof inputPropDesc.set === 'function';
+}
+
+/***/ }),
+/* 21 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_selection_control__ = __webpack_require__(3);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable no-unused-vars */
+
+
+/* eslint no-unused-vars: [2, {"args": "none"}] */
+
+/**
+ * Adapter for MDC Checkbox. Provides an interface for managing
+ * - classes
+ * - dom
+ * - event handlers
+ *
+ * Additionally, provides type information for the adapter to the Closure
+ * compiler.
+ *
+ * Implement this adapter for your framework of choice to delegate updates to
+ * the component in your framework of choice. See architecture documentation
+ * for more details.
+ * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
+ *
+ * @record
+ */
+
+var MDCCheckboxAdapter = function () {
+  function MDCCheckboxAdapter() {
+    _classCallCheck(this, MDCCheckboxAdapter);
+  }
+
+  _createClass(MDCCheckboxAdapter, [{
+    key: 'addClass',
+
+    /** @param {string} className */
+    value: function addClass(className) {}
+
+    /** @param {string} className */
+
+  }, {
+    key: 'removeClass',
+    value: function removeClass(className) {}
+
+    /** @param {!EventListener} handler */
+
+  }, {
+    key: 'registerAnimationEndHandler',
+    value: function registerAnimationEndHandler(handler) {}
+
+    /** @param {!EventListener} handler */
+
+  }, {
+    key: 'deregisterAnimationEndHandler',
+    value: function deregisterAnimationEndHandler(handler) {}
+
+    /** @param {!EventListener} handler */
+
+  }, {
+    key: 'registerChangeHandler',
+    value: function registerChangeHandler(handler) {}
+
+    /** @param {!EventListener} handler */
+
+  }, {
+    key: 'deregisterChangeHandler',
+    value: function deregisterChangeHandler(handler) {}
+
+    /** @return {!SelectionControlState} */
+
+  }, {
+    key: 'getNativeControl',
+    value: function getNativeControl() {}
+  }, {
+    key: 'forceLayout',
+    value: function forceLayout() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isAttachedToDOM',
+    value: function isAttachedToDOM() {}
+  }]);
+
+  return MDCCheckboxAdapter;
+}();
+
+/* unused harmony default export */ var _unused_webpack_default_export = (MDCCheckboxAdapter);
+
+/***/ }),
+/* 22 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @const {string} */
+var ROOT = 'mdc-checkbox';
+
+/** @enum {string} */
+var cssClasses = {
+  UPGRADED: 'mdc-checkbox--upgraded',
+  CHECKED: 'mdc-checkbox--checked',
+  INDETERMINATE: 'mdc-checkbox--indeterminate',
+  DISABLED: 'mdc-checkbox--disabled',
+  ANIM_UNCHECKED_CHECKED: 'mdc-checkbox--anim-unchecked-checked',
+  ANIM_UNCHECKED_INDETERMINATE: 'mdc-checkbox--anim-unchecked-indeterminate',
+  ANIM_CHECKED_UNCHECKED: 'mdc-checkbox--anim-checked-unchecked',
+  ANIM_CHECKED_INDETERMINATE: 'mdc-checkbox--anim-checked-indeterminate',
+  ANIM_INDETERMINATE_CHECKED: 'mdc-checkbox--anim-indeterminate-checked',
+  ANIM_INDETERMINATE_UNCHECKED: 'mdc-checkbox--anim-indeterminate-unchecked'
+};
+
+/** @enum {string} */
+var strings = {
+  NATIVE_CONTROL_SELECTOR: '.' + ROOT + '__native-control',
+  TRANSITION_STATE_INIT: 'init',
+  TRANSITION_STATE_CHECKED: 'checked',
+  TRANSITION_STATE_UNCHECKED: 'unchecked',
+  TRANSITION_STATE_INDETERMINATE: 'indeterminate'
+};
+
+/** @enum {number} */
+var numbers = {
+  ANIM_END_LATCH_MS: 100
+};
+
+/***/ }),
+/* 23 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(24);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(8);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+/**
+ * @typedef {!{
+ *   isActivated: (boolean|undefined),
+ *   hasDeactivationUXRun: (boolean|undefined),
+ *   wasActivatedByPointer: (boolean|undefined),
+ *   wasElementMadeActive: (boolean|undefined),
+ *   activationStartTime: (number|undefined),
+ *   activationEvent: Event,
+ *   isProgrammatic: (boolean|undefined)
+ * }}
+ */
+var ActivationStateType = void 0;
+
+/**
+ * @typedef {!{
+ *   activate: (string|undefined),
+ *   deactivate: (string|undefined),
+ *   focus: (string|undefined),
+ *   blur: (string|undefined)
+ * }}
+ */
+var ListenerInfoType = void 0;
+
+/**
+ * @typedef {!{
+ *   activate: function(!Event),
+ *   deactivate: function(!Event),
+ *   focus: function(),
+ *   blur: function()
+ * }}
+ */
+var ListenersType = void 0;
+
+/**
+ * @typedef {!{
+ *   x: number,
+ *   y: number
+ * }}
+ */
+var PointType = void 0;
+
+/**
+ * @enum {string}
+ */
+var DEACTIVATION_ACTIVATION_PAIRS = {
+  mouseup: 'mousedown',
+  pointerup: 'pointerdown',
+  touchend: 'touchstart',
+  keyup: 'keydown',
+  blur: 'focus'
+};
+
+/**
+ * @extends {MDCFoundation<!MDCRippleAdapter>}
+ */
+
+var MDCRippleFoundation = function (_MDCFoundation) {
+  _inherits(MDCRippleFoundation, _MDCFoundation);
+
+  _createClass(MDCRippleFoundation, [{
+    key: 'isSupported_',
+
+
+    /**
+     * We compute this property so that we are not querying information about the client
+     * until the point in time where the foundation requests it. This prevents scenarios where
+     * client-side feature-detection may happen too early, such as when components are rendered on the server
+     * and then initialized at mount time on the client.
+     * @return {boolean}
+     */
+    get: function get() {
+      return this.adapter_.browserSupportsCssVars();
+    }
+  }], [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* strings */];
+    }
+  }, {
+    key: 'numbers',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* numbers */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        browserSupportsCssVars: function browserSupportsCssVars() /* boolean - cached */{},
+        isUnbounded: function isUnbounded() /* boolean */{},
+        isSurfaceActive: function isSurfaceActive() /* boolean */{},
+        isSurfaceDisabled: function isSurfaceDisabled() /* boolean */{},
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        registerInteractionHandler: function registerInteractionHandler() /* evtType: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* evtType: string, handler: EventListener */{},
+        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
+        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
+        updateCssVariable: function updateCssVariable() /* varName: string, value: string */{},
+        computeBoundingRect: function computeBoundingRect() /* ClientRect */{},
+        getWindowPageOffset: function getWindowPageOffset() /* {x: number, y: number} */{}
+      };
+    }
+  }]);
+
+  function MDCRippleFoundation(adapter) {
+    _classCallCheck(this, MDCRippleFoundation);
+
+    /** @private {number} */
+    var _this = _possibleConstructorReturn(this, (MDCRippleFoundation.__proto__ || Object.getPrototypeOf(MDCRippleFoundation)).call(this, _extends(MDCRippleFoundation.defaultAdapter, adapter)));
+
+    _this.layoutFrame_ = 0;
+
+    /** @private {!ClientRect} */
+    _this.frame_ = /** @type {!ClientRect} */{ width: 0, height: 0 };
+
+    /** @private {!ActivationStateType} */
+    _this.activationState_ = _this.defaultActivationState_();
+
+    /** @private {number} */
+    _this.xfDuration_ = 0;
+
+    /** @private {number} */
+    _this.initialSize_ = 0;
+
+    /** @private {number} */
+    _this.maxRadius_ = 0;
+
+    /** @private {!Array<{ListenerInfoType}>} */
+    _this.listenerInfos_ = [{ activate: 'touchstart', deactivate: 'touchend' }, { activate: 'pointerdown', deactivate: 'pointerup' }, { activate: 'mousedown', deactivate: 'mouseup' }, { activate: 'keydown', deactivate: 'keyup' }, { focus: 'focus', blur: 'blur' }];
+
+    /** @private {!ListenersType} */
+    _this.listeners_ = {
+      activate: function activate(e) {
+        return _this.activate_(e);
+      },
+      deactivate: function deactivate(e) {
+        return _this.deactivate_(e);
+      },
+      focus: function focus() {
+        return requestAnimationFrame(function () {
+          return _this.adapter_.addClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
+        });
+      },
+      blur: function blur() {
+        return requestAnimationFrame(function () {
+          return _this.adapter_.removeClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
+        });
+      }
+    };
+
+    /** @private {!Function} */
+    _this.resizeHandler_ = function () {
+      return _this.layout();
+    };
+
+    /** @private {!{left: number, top:number}} */
+    _this.unboundedCoords_ = {
+      left: 0,
+      top: 0
+    };
+
+    /** @private {number} */
+    _this.fgScale_ = 0;
+
+    /** @private {number} */
+    _this.activationTimer_ = 0;
+
+    /** @private {number} */
+    _this.fgDeactivationRemovalTimer_ = 0;
+
+    /** @private {boolean} */
+    _this.activationAnimationHasEnded_ = false;
+
+    /** @private {!Function} */
+    _this.activationTimerCallback_ = function () {
+      _this.activationAnimationHasEnded_ = true;
+      _this.runDeactivationUXLogicIfReady_();
+    };
+    return _this;
+  }
+
+  /**
+   * @return {!ActivationStateType}
+   */
+
+
+  _createClass(MDCRippleFoundation, [{
+    key: 'defaultActivationState_',
+    value: function defaultActivationState_() {
+      return {
+        isActivated: false,
+        hasDeactivationUXRun: false,
+        wasActivatedByPointer: false,
+        wasElementMadeActive: false,
+        activationStartTime: 0,
+        activationEvent: null,
+        isProgrammatic: false
+      };
+    }
+  }, {
+    key: 'init',
+    value: function init() {
+      var _this2 = this;
+
+      if (!this.isSupported_) {
+        return;
+      }
+      this.addEventListeners_();
+
+      var _MDCRippleFoundation$ = MDCRippleFoundation.cssClasses,
+          ROOT = _MDCRippleFoundation$.ROOT,
+          UNBOUNDED = _MDCRippleFoundation$.UNBOUNDED;
+
+      requestAnimationFrame(function () {
+        _this2.adapter_.addClass(ROOT);
+        if (_this2.adapter_.isUnbounded()) {
+          _this2.adapter_.addClass(UNBOUNDED);
+        }
+        _this2.layoutInternal_();
+      });
+    }
+
+    /** @private */
+
+  }, {
+    key: 'addEventListeners_',
+    value: function addEventListeners_() {
+      var _this3 = this;
+
+      this.listenerInfos_.forEach(function (info) {
+        Object.keys(info).forEach(function (k) {
+          _this3.adapter_.registerInteractionHandler(info[k], _this3.listeners_[k]);
+        });
+      });
+      this.adapter_.registerResizeHandler(this.resizeHandler_);
+    }
+
+    /**
+     * @param {Event} e
+     * @private
+     */
+
+  }, {
+    key: 'activate_',
+    value: function activate_(e) {
+      var _this4 = this;
+
+      if (this.adapter_.isSurfaceDisabled()) {
+        return;
+      }
+
+      var activationState = this.activationState_;
+
+      if (activationState.isActivated) {
+        return;
+      }
+
+      activationState.isActivated = true;
+      activationState.isProgrammatic = e === null;
+      activationState.activationEvent = e;
+      activationState.wasActivatedByPointer = activationState.isProgrammatic ? false : e.type === 'mousedown' || e.type === 'touchstart' || e.type === 'pointerdown';
+      activationState.activationStartTime = Date.now();
+
+      requestAnimationFrame(function () {
+        // This needs to be wrapped in an rAF call b/c web browsers
+        // report active states inconsistently when they're called within
+        // event handling code:
+        // - https://bugs.chromium.org/p/chromium/issues/detail?id=635971
+        // - https://bugzilla.mozilla.org/show_bug.cgi?id=1293741
+        activationState.wasElementMadeActive = e && e.type === 'keydown' ? _this4.adapter_.isSurfaceActive() : true;
+        if (activationState.wasElementMadeActive) {
+          _this4.animateActivation_();
+        } else {
+          // Reset activation state immediately if element was not made active.
+          _this4.activationState_ = _this4.defaultActivationState_();
+        }
+      });
+    }
+  }, {
+    key: 'activate',
+    value: function activate() {
+      this.activate_(null);
+    }
+
+    /** @private */
+
+  }, {
+    key: 'animateActivation_',
+    value: function animateActivation_() {
+      var _this5 = this;
+
+      var _MDCRippleFoundation$2 = MDCRippleFoundation.strings,
+          VAR_FG_TRANSLATE_START = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_START,
+          VAR_FG_TRANSLATE_END = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_END;
+      var _MDCRippleFoundation$3 = MDCRippleFoundation.cssClasses,
+          BG_ACTIVE_FILL = _MDCRippleFoundation$3.BG_ACTIVE_FILL,
+          FG_DEACTIVATION = _MDCRippleFoundation$3.FG_DEACTIVATION,
+          FG_ACTIVATION = _MDCRippleFoundation$3.FG_ACTIVATION;
+      var DEACTIVATION_TIMEOUT_MS = MDCRippleFoundation.numbers.DEACTIVATION_TIMEOUT_MS;
+
+
+      var translateStart = '';
+      var translateEnd = '';
+
+      if (!this.adapter_.isUnbounded()) {
+        var _getFgTranslationCoor = this.getFgTranslationCoordinates_(),
+            startPoint = _getFgTranslationCoor.startPoint,
+            endPoint = _getFgTranslationCoor.endPoint;
+
+        translateStart = startPoint.x + 'px, ' + startPoint.y + 'px';
+        translateEnd = endPoint.x + 'px, ' + endPoint.y + 'px';
+      }
+
+      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_START, translateStart);
+      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_END, translateEnd);
+      // Cancel any ongoing activation/deactivation animations
+      clearTimeout(this.activationTimer_);
+      clearTimeout(this.fgDeactivationRemovalTimer_);
+      this.rmBoundedActivationClasses_();
+      this.adapter_.removeClass(FG_DEACTIVATION);
+
+      // Force layout in order to re-trigger the animation.
+      this.adapter_.computeBoundingRect();
+      this.adapter_.addClass(BG_ACTIVE_FILL);
+      this.adapter_.addClass(FG_ACTIVATION);
+      this.activationTimer_ = setTimeout(function () {
+        return _this5.activationTimerCallback_();
+      }, DEACTIVATION_TIMEOUT_MS);
+    }
+
+    /**
+     * @private
+     * @return {{startPoint: PointType, endPoint: PointType}}
+     */
+
+  }, {
+    key: 'getFgTranslationCoordinates_',
+    value: function getFgTranslationCoordinates_() {
+      var activationState = this.activationState_;
+      var activationEvent = activationState.activationEvent,
+          wasActivatedByPointer = activationState.wasActivatedByPointer;
+
+
+      var startPoint = void 0;
+      if (wasActivatedByPointer) {
+        startPoint = Object(__WEBPACK_IMPORTED_MODULE_3__util__["getNormalizedEventCoords"])(
+        /** @type {!Event} */activationEvent, this.adapter_.getWindowPageOffset(), this.adapter_.computeBoundingRect());
+      } else {
+        startPoint = {
+          x: this.frame_.width / 2,
+          y: this.frame_.height / 2
+        };
+      }
+      // Center the element around the start point.
+      startPoint = {
+        x: startPoint.x - this.initialSize_ / 2,
+        y: startPoint.y - this.initialSize_ / 2
+      };
+
+      var endPoint = {
+        x: this.frame_.width / 2 - this.initialSize_ / 2,
+        y: this.frame_.height / 2 - this.initialSize_ / 2
+      };
+
+      return { startPoint: startPoint, endPoint: endPoint };
+    }
+
+    /** @private */
+
+  }, {
+    key: 'runDeactivationUXLogicIfReady_',
+    value: function runDeactivationUXLogicIfReady_() {
+      var _this6 = this;
+
+      var FG_DEACTIVATION = MDCRippleFoundation.cssClasses.FG_DEACTIVATION;
+      var _activationState_ = this.activationState_,
+          hasDeactivationUXRun = _activationState_.hasDeactivationUXRun,
+          isActivated = _activationState_.isActivated;
+
+      var activationHasEnded = hasDeactivationUXRun || !isActivated;
+      if (activationHasEnded && this.activationAnimationHasEnded_) {
+        this.rmBoundedActivationClasses_();
+        this.adapter_.addClass(FG_DEACTIVATION);
+        this.fgDeactivationRemovalTimer_ = setTimeout(function () {
+          _this6.adapter_.removeClass(FG_DEACTIVATION);
+        }, __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* numbers */].FG_DEACTIVATION_MS);
+      }
+    }
+
+    /** @private */
+
+  }, {
+    key: 'rmBoundedActivationClasses_',
+    value: function rmBoundedActivationClasses_() {
+      var _MDCRippleFoundation$4 = MDCRippleFoundation.cssClasses,
+          BG_ACTIVE_FILL = _MDCRippleFoundation$4.BG_ACTIVE_FILL,
+          FG_ACTIVATION = _MDCRippleFoundation$4.FG_ACTIVATION;
+
+      this.adapter_.removeClass(BG_ACTIVE_FILL);
+      this.adapter_.removeClass(FG_ACTIVATION);
+      this.activationAnimationHasEnded_ = false;
+      this.adapter_.computeBoundingRect();
+    }
+
+    /**
+     * @param {Event} e
+     * @private
+     */
+
+  }, {
+    key: 'deactivate_',
+    value: function deactivate_(e) {
+      var _this7 = this;
+
+      var activationState = this.activationState_;
+      // This can happen in scenarios such as when you have a keyup event that blurs the element.
+
+      if (!activationState.isActivated) {
+        return;
+      }
+      // Programmatic deactivation.
+      if (activationState.isProgrammatic) {
+        var evtObject = null;
+        var _state = /** @type {!ActivationStateType} */_extends({}, activationState);
+        requestAnimationFrame(function () {
+          return _this7.animateDeactivation_(evtObject, _state);
+        });
+        this.activationState_ = this.defaultActivationState_();
+        return;
+      }
+
+      var actualActivationType = DEACTIVATION_ACTIVATION_PAIRS[e.type];
+      var expectedActivationType = activationState.activationEvent.type;
+      // NOTE: Pointer events are tricky - https://patrickhlauke.github.io/touch/tests/results/
+      // Essentially, what we need to do here is decouple the deactivation UX from the actual
+      // deactivation state itself. This way, touch/pointer events in sequence do not trample one
+      // another.
+      var needsDeactivationUX = actualActivationType === expectedActivationType;
+      var needsActualDeactivation = needsDeactivationUX;
+      if (activationState.wasActivatedByPointer) {
+        needsActualDeactivation = e.type === 'mouseup';
+      }
+
+      var state = /** @type {!ActivationStateType} */_extends({}, activationState);
+      requestAnimationFrame(function () {
+        if (needsDeactivationUX) {
+          _this7.activationState_.hasDeactivationUXRun = true;
+          _this7.animateDeactivation_(e, state);
+        }
+
+        if (needsActualDeactivation) {
+          _this7.activationState_ = _this7.defaultActivationState_();
+        }
+      });
+    }
+  }, {
+    key: 'deactivate',
+    value: function deactivate() {
+      this.deactivate_(null);
+    }
+
+    /**
+     * @param {Event} e
+     * @param {!ActivationStateType} options
+     * @private
+     */
+
+  }, {
+    key: 'animateDeactivation_',
+    value: function animateDeactivation_(e, _ref) {
+      var wasActivatedByPointer = _ref.wasActivatedByPointer,
+          wasElementMadeActive = _ref.wasElementMadeActive;
+      var BG_FOCUSED = MDCRippleFoundation.cssClasses.BG_FOCUSED;
+
+      if (wasActivatedByPointer || wasElementMadeActive) {
+        // Remove class left over by element being focused
+        this.adapter_.removeClass(BG_FOCUSED);
+        this.runDeactivationUXLogicIfReady_();
+      }
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      var _this8 = this;
+
+      if (!this.isSupported_) {
+        return;
+      }
+      this.removeEventListeners_();
+
+      var _MDCRippleFoundation$5 = MDCRippleFoundation.cssClasses,
+          ROOT = _MDCRippleFoundation$5.ROOT,
+          UNBOUNDED = _MDCRippleFoundation$5.UNBOUNDED;
+
+      requestAnimationFrame(function () {
+        _this8.adapter_.removeClass(ROOT);
+        _this8.adapter_.removeClass(UNBOUNDED);
+        _this8.removeCssVars_();
+      });
+    }
+
+    /** @private */
+
+  }, {
+    key: 'removeEventListeners_',
+    value: function removeEventListeners_() {
+      var _this9 = this;
+
+      this.listenerInfos_.forEach(function (info) {
+        Object.keys(info).forEach(function (k) {
+          _this9.adapter_.deregisterInteractionHandler(info[k], _this9.listeners_[k]);
+        });
+      });
+      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
+    }
+
+    /** @private */
+
+  }, {
+    key: 'removeCssVars_',
+    value: function removeCssVars_() {
+      var _this10 = this;
+
+      var strings = MDCRippleFoundation.strings;
+
+      Object.keys(strings).forEach(function (k) {
+        if (k.indexOf('VAR_') === 0) {
+          _this10.adapter_.updateCssVariable(strings[k], null);
+        }
+      });
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      var _this11 = this;
+
+      if (this.layoutFrame_) {
+        cancelAnimationFrame(this.layoutFrame_);
+      }
+      this.layoutFrame_ = requestAnimationFrame(function () {
+        _this11.layoutInternal_();
+        _this11.layoutFrame_ = 0;
+      });
+    }
+
+    /** @private */
+
+  }, {
+    key: 'layoutInternal_',
+    value: function layoutInternal_() {
+      this.frame_ = this.adapter_.computeBoundingRect();
+
+      var maxDim = Math.max(this.frame_.height, this.frame_.width);
+      var surfaceDiameter = Math.sqrt(Math.pow(this.frame_.width, 2) + Math.pow(this.frame_.height, 2));
+
+      // 60% of the largest dimension of the surface
+      this.initialSize_ = maxDim * MDCRippleFoundation.numbers.INITIAL_ORIGIN_SCALE;
+
+      // Diameter of the surface + 10px
+      this.maxRadius_ = surfaceDiameter + MDCRippleFoundation.numbers.PADDING;
+      this.fgScale_ = this.maxRadius_ / this.initialSize_;
+      this.xfDuration_ = 1000 * Math.sqrt(this.maxRadius_ / 1024);
+      this.updateLayoutCssVars_();
+    }
+
+    /** @private */
+
+  }, {
+    key: 'updateLayoutCssVars_',
+    value: function updateLayoutCssVars_() {
+      var _MDCRippleFoundation$6 = MDCRippleFoundation.strings,
+          VAR_SURFACE_WIDTH = _MDCRippleFoundation$6.VAR_SURFACE_WIDTH,
+          VAR_SURFACE_HEIGHT = _MDCRippleFoundation$6.VAR_SURFACE_HEIGHT,
+          VAR_FG_SIZE = _MDCRippleFoundation$6.VAR_FG_SIZE,
+          VAR_LEFT = _MDCRippleFoundation$6.VAR_LEFT,
+          VAR_TOP = _MDCRippleFoundation$6.VAR_TOP,
+          VAR_FG_SCALE = _MDCRippleFoundation$6.VAR_FG_SCALE;
+
+
+      this.adapter_.updateCssVariable(VAR_SURFACE_WIDTH, this.frame_.width + 'px');
+      this.adapter_.updateCssVariable(VAR_SURFACE_HEIGHT, this.frame_.height + 'px');
+      this.adapter_.updateCssVariable(VAR_FG_SIZE, this.initialSize_ + 'px');
+      this.adapter_.updateCssVariable(VAR_FG_SCALE, this.fgScale_);
+
+      if (this.adapter_.isUnbounded()) {
+        this.unboundedCoords_ = {
+          left: Math.round(this.frame_.width / 2 - this.initialSize_ / 2),
+          top: Math.round(this.frame_.height / 2 - this.initialSize_ / 2)
+        };
+
+        this.adapter_.updateCssVariable(VAR_LEFT, this.unboundedCoords_.left + 'px');
+        this.adapter_.updateCssVariable(VAR_TOP, this.unboundedCoords_.top + 'px');
+      }
+    }
+  }]);
+
+  return MDCRippleFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCRippleFoundation);
+
+/***/ }),
+/* 24 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  // Ripple is a special case where the "root" component is really a "mixin" of sorts,
+  // given that it's an 'upgrade' to an existing component. That being said it is the root
+  // CSS class that all other CSS classes derive from.
+  ROOT: 'mdc-ripple-upgraded',
+  UNBOUNDED: 'mdc-ripple-upgraded--unbounded',
+  BG_FOCUSED: 'mdc-ripple-upgraded--background-focused',
+  BG_ACTIVE_FILL: 'mdc-ripple-upgraded--background-active-fill',
+  FG_ACTIVATION: 'mdc-ripple-upgraded--foreground-activation',
+  FG_DEACTIVATION: 'mdc-ripple-upgraded--foreground-deactivation'
+};
+
+var strings = {
+  VAR_SURFACE_WIDTH: '--mdc-ripple-surface-width',
+  VAR_SURFACE_HEIGHT: '--mdc-ripple-surface-height',
+  VAR_FG_SIZE: '--mdc-ripple-fg-size',
+  VAR_LEFT: '--mdc-ripple-left',
+  VAR_TOP: '--mdc-ripple-top',
+  VAR_FG_SCALE: '--mdc-ripple-fg-scale',
+  VAR_FG_TRANSLATE_START: '--mdc-ripple-fg-translate-start',
+  VAR_FG_TRANSLATE_END: '--mdc-ripple-fg-translate-end'
+};
+
+var numbers = {
+  PADDING: 10,
+  INITIAL_ORIGIN_SCALE: 0.6,
+  DEACTIVATION_TIMEOUT_MS: 300,
+  FG_DEACTIVATION_MS: 83
+};
+
+/***/ }),
+/* 25 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCDialog", function() { return MDCDialog; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_ripple__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(26);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(28);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCDialogFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+
+var MDCDialog = function (_MDCComponent) {
+  _inherits(MDCDialog, _MDCComponent);
+
+  function MDCDialog() {
+    _classCallCheck(this, MDCDialog);
+
+    return _possibleConstructorReturn(this, (MDCDialog.__proto__ || Object.getPrototypeOf(MDCDialog)).apply(this, arguments));
+  }
+
+  _createClass(MDCDialog, [{
+    key: 'initialize',
+    value: function initialize() {
+      this.focusTrap_ = __WEBPACK_IMPORTED_MODULE_3__util__["createFocusTrapInstance"](this.dialogSurface_, this.acceptButton_);
+      this.footerBtnRipples_ = [];
+
+      var footerBtns = this.root_.querySelectorAll('.mdc-dialog__footer__button');
+      for (var i = 0, footerBtn; footerBtn = footerBtns[i]; i++) {
+        this.footerBtnRipples_.push(new __WEBPACK_IMPORTED_MODULE_1__material_ripple__["MDCRipple"](footerBtn));
+      }
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.footerBtnRipples_.forEach(function (ripple) {
+        return ripple.destroy();
+      });
+      _get(MDCDialog.prototype.__proto__ || Object.getPrototypeOf(MDCDialog.prototype), 'destroy', this).call(this);
+    }
+  }, {
+    key: 'show',
+    value: function show() {
+      this.foundation_.open();
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.foundation_.close();
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        addBodyClass: function addBodyClass(className) {
+          return document.body.classList.add(className);
+        },
+        removeBodyClass: function removeBodyClass(className) {
+          return document.body.classList.remove(className);
+        },
+        eventTargetHasClass: function eventTargetHasClass(target, className) {
+          return target.classList.contains(className);
+        },
+        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
+          return _this2.root_.addEventListener(evt, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
+          return _this2.root_.removeEventListener(evt, handler);
+        },
+        registerSurfaceInteractionHandler: function registerSurfaceInteractionHandler(evt, handler) {
+          return _this2.dialogSurface_.addEventListener(evt, handler);
+        },
+        deregisterSurfaceInteractionHandler: function deregisterSurfaceInteractionHandler(evt, handler) {
+          return _this2.dialogSurface_.removeEventListener(evt, handler);
+        },
+        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
+          return document.addEventListener('keydown', handler);
+        },
+        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
+          return document.removeEventListener('keydown', handler);
+        },
+        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
+          return _this2.dialogSurface_.addEventListener('transitionend', handler);
+        },
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
+          return _this2.dialogSurface_.removeEventListener('transitionend', handler);
+        },
+        notifyAccept: function notifyAccept() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.ACCEPT_EVENT);
+        },
+        notifyCancel: function notifyCancel() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.CANCEL_EVENT);
+        },
+        trapFocusOnSurface: function trapFocusOnSurface() {
+          return _this2.focusTrap_.activate();
+        },
+        untrapFocusOnSurface: function untrapFocusOnSurface() {
+          return _this2.focusTrap_.deactivate();
+        },
+        isDialog: function isDialog(el) {
+          return el === _this2.dialogSurface_;
+        }
+      });
+    }
+  }, {
+    key: 'open',
+    get: function get() {
+      return this.foundation_.isOpen();
+    }
+  }, {
+    key: 'acceptButton_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.ACCEPT_SELECTOR);
+    }
+  }, {
+    key: 'dialogSurface_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.DIALOG_SURFACE_SELECTOR);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCDialog(root);
+    }
+  }]);
+
+  return MDCDialog;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 26 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(27);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCDialogFoundation = function (_MDCFoundation) {
+  _inherits(MDCDialogFoundation, _MDCFoundation);
+
+  _createClass(MDCDialogFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        addBodyClass: function addBodyClass() /* className: string */{},
+        removeBodyClass: function removeBodyClass() /* className: string */{},
+        eventTargetHasClass: function eventTargetHasClass() {
+          return (/* target: EventTarget, className: string */ /* boolean */false
+          );
+        },
+        registerInteractionHandler: function registerInteractionHandler() /* evt: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* evt: string, handler: EventListener */{},
+        registerSurfaceInteractionHandler: function registerSurfaceInteractionHandler() /* evt: string, handler: EventListener */{},
+        deregisterSurfaceInteractionHandler: function deregisterSurfaceInteractionHandler() /* evt: string, handler: EventListener */{},
+        registerDocumentKeydownHandler: function registerDocumentKeydownHandler() /* handler: EventListener */{},
+        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler() /* handler: EventListener */{},
+        registerTransitionEndHandler: function registerTransitionEndHandler() /* handler: EventListener */{},
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler() /* handler: EventListener */{},
+        notifyAccept: function notifyAccept() {},
+        notifyCancel: function notifyCancel() {},
+        trapFocusOnSurface: function trapFocusOnSurface() {},
+        untrapFocusOnSurface: function untrapFocusOnSurface() {},
+        isDialog: function isDialog() {
+          return (/* el: Element */ /* boolean */false
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCDialogFoundation(adapter) {
+    _classCallCheck(this, MDCDialogFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCDialogFoundation.__proto__ || Object.getPrototypeOf(MDCDialogFoundation)).call(this, _extends(MDCDialogFoundation.defaultAdapter, adapter)));
+
+    _this.isOpen_ = false;
+    _this.componentClickHandler_ = function (evt) {
+      if (_this.adapter_.eventTargetHasClass(evt.target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].BACKDROP)) {
+        _this.cancel(true);
+      }
+    };
+    _this.dialogClickHandler_ = function (evt) {
+      return _this.handleDialogClick_(evt);
+    };
+    _this.documentKeydownHandler_ = function (evt) {
+      if (evt.key && evt.key === 'Escape' || evt.keyCode === 27) {
+        _this.cancel(true);
+      }
+    };
+    _this.transitionEndHandler_ = function (evt) {
+      return _this.handleTransitionEnd_(evt);
+    };
+    return _this;
+  }
+
+  _createClass(MDCDialogFoundation, [{
+    key: 'destroy',
+    value: function destroy() {
+      // Ensure that dialog is cleaned up when destroyed
+      if (this.isOpen_) {
+        this.adapter_.deregisterSurfaceInteractionHandler('click', this.dialogClickHandler_);
+        this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
+        this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
+        this.adapter_.untrapFocusOnSurface();
+        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
+        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING);
+        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN);
+        this.enableScroll_();
+      }
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      this.isOpen_ = true;
+      this.disableScroll_();
+      this.adapter_.registerDocumentKeydownHandler(this.documentKeydownHandler_);
+      this.adapter_.registerSurfaceInteractionHandler('click', this.dialogClickHandler_);
+      this.adapter_.registerInteractionHandler('click', this.componentClickHandler_);
+      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
+      this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING);
+      this.adapter_.addClass(MDCDialogFoundation.cssClasses.OPEN);
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.isOpen_ = false;
+      this.adapter_.deregisterSurfaceInteractionHandler('click', this.dialogClickHandler_);
+      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
+      this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
+      this.adapter_.untrapFocusOnSurface();
+      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
+      this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING);
+      this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN);
+    }
+  }, {
+    key: 'isOpen',
+    value: function isOpen() {
+      return this.isOpen_;
+    }
+  }, {
+    key: 'accept',
+    value: function accept(shouldNotify) {
+      if (shouldNotify) {
+        this.adapter_.notifyAccept();
+      }
+
+      this.close();
+    }
+  }, {
+    key: 'cancel',
+    value: function cancel(shouldNotify) {
+      if (shouldNotify) {
+        this.adapter_.notifyCancel();
+      }
+
+      this.close();
+    }
+  }, {
+    key: 'handleDialogClick_',
+    value: function handleDialogClick_(evt) {
+      var target = evt.target;
+
+      if (this.adapter_.eventTargetHasClass(target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACCEPT_BTN)) {
+        this.accept(true);
+      } else if (this.adapter_.eventTargetHasClass(target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].CANCEL_BTN)) {
+        this.cancel(true);
+      }
+    }
+  }, {
+    key: 'handleTransitionEnd_',
+    value: function handleTransitionEnd_(evt) {
+      if (this.adapter_.isDialog(evt.target)) {
+        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
+        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING);
+        if (this.isOpen_) {
+          this.adapter_.trapFocusOnSurface();
+        } else {
+          this.enableScroll_();
+        };
+      };
+    }
+  }, {
+    key: 'disableScroll_',
+    value: function disableScroll_() {
+      this.adapter_.addBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
+    }
+  }, {
+    key: 'enableScroll_',
+    value: function enableScroll_() {
+      this.adapter_.removeBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
+    }
+  }]);
+
+  return MDCDialogFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCDialogFoundation);
+
+/***/ }),
+/* 27 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  ROOT: 'mdc-dialog',
+  OPEN: 'mdc-dialog--open',
+  ANIMATING: 'mdc-dialog--animating',
+  BACKDROP: 'mdc-dialog__backdrop',
+  SCROLL_LOCK: 'mdc-dialog-scroll-lock',
+  ACCEPT_BTN: 'mdc-dialog__footer__button--accept',
+  CANCEL_BTN: 'mdc-dialog__footer__button--cancel'
+};
+
+var strings = {
+  OPEN_DIALOG_SELECTOR: '.mdc-dialog--open',
+  DIALOG_SURFACE_SELECTOR: '.mdc-dialog__surface',
+  ACCEPT_SELECTOR: '.mdc-dialog__footer__button--accept',
+  ACCEPT_EVENT: 'MDCDialog:accept',
+  CANCEL_EVENT: 'MDCDialog:cancel'
+};
+
+/***/ }),
+/* 28 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["createFocusTrapInstance"] = createFocusTrapInstance;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_focus_trap__ = __webpack_require__(29);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_focus_trap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_focus_trap__);
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+function createFocusTrapInstance(surfaceEl, acceptButtonEl) {
+  var focusTrapFactory = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : __WEBPACK_IMPORTED_MODULE_0_focus_trap___default.a;
+
+  return focusTrapFactory(surfaceEl, {
+    initialFocus: acceptButtonEl,
+    clickOutsideDeactivates: true
+  });
+}
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var tabbable = __webpack_require__(30);
+
+var listeningFocusTrap = null;
+
+function focusTrap(element, userOptions) {
+  var tabbableNodes = [];
+  var nodeFocusedBeforeActivation = null;
+  var active = false;
+  var paused = false;
+
+  var container = (typeof element === 'string')
+    ? document.querySelector(element)
+    : element;
+
+  var config = userOptions || {};
+  config.returnFocusOnDeactivate = (userOptions && userOptions.returnFocusOnDeactivate !== undefined)
+    ? userOptions.returnFocusOnDeactivate
+    : true;
+  config.escapeDeactivates = (userOptions && userOptions.escapeDeactivates !== undefined)
+    ? userOptions.escapeDeactivates
+    : true;
+
+  var trap = {
+    activate: activate,
+    deactivate: deactivate,
+    pause: pause,
+    unpause: unpause,
+  };
+
+  return trap;
+
+  function activate(activateOptions) {
+    if (active) return;
+
+    var defaultedActivateOptions = {
+      onActivate: (activateOptions && activateOptions.onActivate !== undefined)
+        ? activateOptions.onActivate
+        : config.onActivate,
+    };
+
+    active = true;
+    paused = false;
+    nodeFocusedBeforeActivation = document.activeElement;
+
+    if (defaultedActivateOptions.onActivate) {
+      defaultedActivateOptions.onActivate();
+    }
+
+    addListeners();
+    return trap;
+  }
+
+  function deactivate(deactivateOptions) {
+    if (!active) return;
+
+    var defaultedDeactivateOptions = {
+      returnFocus: (deactivateOptions && deactivateOptions.returnFocus !== undefined)
+        ? deactivateOptions.returnFocus
+        : config.returnFocusOnDeactivate,
+      onDeactivate: (deactivateOptions && deactivateOptions.onDeactivate !== undefined)
+        ? deactivateOptions.onDeactivate
+        : config.onDeactivate,
+    };
+
+    removeListeners();
+
+    if (defaultedDeactivateOptions.onDeactivate) {
+      defaultedDeactivateOptions.onDeactivate();
+    }
+
+    if (defaultedDeactivateOptions.returnFocus) {
+      setTimeout(function () {
+        tryFocus(nodeFocusedBeforeActivation);
+      }, 0);
+    }
+
+    active = false;
+    paused = false;
+    return this;
+  }
+
+  function pause() {
+    if (paused || !active) return;
+    paused = true;
+    removeListeners();
+  }
+
+  function unpause() {
+    if (!paused || !active) return;
+    paused = false;
+    addListeners();
+  }
+
+  function addListeners() {
+    if (!active) return;
+
+    // There can be only one listening focus trap at a time
+    if (listeningFocusTrap) {
+      listeningFocusTrap.pause();
+    }
+    listeningFocusTrap = trap;
+
+    updateTabbableNodes();
+    tryFocus(firstFocusNode());
+    document.addEventListener('focus', checkFocus, true);
+    document.addEventListener('click', checkClick, true);
+    document.addEventListener('mousedown', checkPointerDown, true);
+    document.addEventListener('touchstart', checkPointerDown, true);
+    document.addEventListener('keydown', checkKey, true);
+
+    return trap;
+  }
+
+  function removeListeners() {
+    if (!active || listeningFocusTrap !== trap) return;
+
+    document.removeEventListener('focus', checkFocus, true);
+    document.removeEventListener('click', checkClick, true);
+    document.removeEventListener('mousedown', checkPointerDown, true);
+    document.removeEventListener('touchstart', checkPointerDown, true);
+    document.removeEventListener('keydown', checkKey, true);
+
+    listeningFocusTrap = null;
+
+    return trap;
+  }
+
+  function getNodeForOption(optionName) {
+    var optionValue = config[optionName];
+    var node = optionValue;
+    if (!optionValue) {
+      return null;
+    }
+    if (typeof optionValue === 'string') {
+      node = document.querySelector(optionValue);
+      if (!node) {
+        throw new Error('`' + optionName + '` refers to no known node');
+      }
+    }
+    if (typeof optionValue === 'function') {
+      node = optionValue();
+      if (!node) {
+        throw new Error('`' + optionName + '` did not return a node');
+      }
+    }
+    return node;
+  }
+
+  function firstFocusNode() {
+    var node;
+    if (getNodeForOption('initialFocus') !== null) {
+      node = getNodeForOption('initialFocus');
+    } else if (container.contains(document.activeElement)) {
+      node = document.activeElement;
+    } else {
+      node = tabbableNodes[0] || getNodeForOption('fallbackFocus');
+    }
+
+    if (!node) {
+      throw new Error('You can\'t have a focus-trap without at least one focusable element');
+    }
+
+    return node;
+  }
+
+  // This needs to be done on mousedown and touchstart instead of click
+  // so that it precedes the focus event
+  function checkPointerDown(e) {
+    if (config.clickOutsideDeactivates && !container.contains(e.target)) {
+      deactivate({ returnFocus: false });
+    }
+  }
+
+  function checkClick(e) {
+    if (config.clickOutsideDeactivates) return;
+    if (container.contains(e.target)) return;
+    e.preventDefault();
+    e.stopImmediatePropagation();
+  }
+
+  function checkFocus(e) {
+    if (container.contains(e.target)) return;
+    e.preventDefault();
+    e.stopImmediatePropagation();
+    // Checking for a blur method here resolves a Firefox issue (#15)
+    if (typeof e.target.blur === 'function') e.target.blur();
+  }
+
+  function checkKey(e) {
+    if (e.key === 'Tab' || e.keyCode === 9) {
+      handleTab(e);
+    }
+
+    if (config.escapeDeactivates !== false && isEscapeEvent(e)) {
+      deactivate();
+    }
+  }
+
+  function handleTab(e) {
+    e.preventDefault();
+    updateTabbableNodes();
+    var currentFocusIndex = tabbableNodes.indexOf(e.target);
+    var lastTabbableNode = tabbableNodes[tabbableNodes.length - 1];
+    var firstTabbableNode = tabbableNodes[0];
+
+    if (e.shiftKey) {
+      if (e.target === firstTabbableNode || tabbableNodes.indexOf(e.target) === -1) {
+        return tryFocus(lastTabbableNode);
+      }
+      return tryFocus(tabbableNodes[currentFocusIndex - 1]);
+    }
+
+    if (e.target === lastTabbableNode) return tryFocus(firstTabbableNode);
+
+    tryFocus(tabbableNodes[currentFocusIndex + 1]);
+  }
+
+  function updateTabbableNodes() {
+    tabbableNodes = tabbable(container);
+  }
+}
+
+function isEscapeEvent(e) {
+  return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;
+}
+
+function tryFocus(node) {
+  if (!node || !node.focus) return;
+  node.focus();
+  if (node.tagName.toLowerCase() === 'input') {
+    node.select();
+  }
+}
+
+module.exports = focusTrap;
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports) {
+
+module.exports = function(el) {
+  var basicTabbables = [];
+  var orderedTabbables = [];
+
+  // A node is "available" if
+  // - it's computed style
+  var isUnavailable = createIsUnavailable();
+
+  var candidateSelectors = [
+    'input',
+    'select',
+    'a[href]',
+    'textarea',
+    'button',
+    '[tabindex]',
+  ];
+
+  var candidates = el.querySelectorAll(candidateSelectors);
+
+  var candidate, candidateIndex;
+  for (var i = 0, l = candidates.length; i < l; i++) {
+    candidate = candidates[i];
+    candidateIndex = parseInt(candidate.getAttribute('tabindex'), 10) || candidate.tabIndex;
+
+    if (
+      candidateIndex < 0
+      || (candidate.tagName === 'INPUT' && candidate.type === 'hidden')
+      || candidate.disabled
+      || isUnavailable(candidate)
+    ) {
+      continue;
+    }
+
+    if (candidateIndex === 0) {
+      basicTabbables.push(candidate);
+    } else {
+      orderedTabbables.push({
+        tabIndex: candidateIndex,
+        node: candidate,
+      });
+    }
+  }
+
+  var tabbableNodes = orderedTabbables
+    .sort(function(a, b) {
+      return a.tabIndex - b.tabIndex;
+    })
+    .map(function(a) {
+      return a.node
+    });
+
+  Array.prototype.push.apply(tabbableNodes, basicTabbables);
+
+  return tabbableNodes;
+}
+
+function createIsUnavailable() {
+  // Node cache must be refreshed on every check, in case
+  // the content of the element has changed
+  var isOffCache = [];
+
+  // "off" means `display: none;`, as opposed to "hidden",
+  // which means `visibility: hidden;`. getComputedStyle
+  // accurately reflects visiblity in context but not
+  // "off" state, so we need to recursively check parents.
+
+  function isOff(node, nodeComputedStyle) {
+    if (node === document.documentElement) return false;
+
+    // Find the cached node (Array.prototype.find not available in IE9)
+    for (var i = 0, length = isOffCache.length; i < length; i++) {
+      if (isOffCache[i][0] === node) return isOffCache[i][1];
+    }
+
+    nodeComputedStyle = nodeComputedStyle || window.getComputedStyle(node);
+
+    var result = false;
+
+    if (nodeComputedStyle.display === 'none') {
+      result = true;
+    } else if (node.parentNode) {
+      result = isOff(node.parentNode);
+    }
+
+    isOffCache.push([node, result]);
+
+    return result;
+  }
+
+  return function isUnavailable(node) {
+    if (node === document.documentElement) return false;
+
+    var computedStyle = window.getComputedStyle(node);
+
+    if (isOff(node, computedStyle)) return true;
+
+    return computedStyle.visibility === 'hidden';
+  }
+}
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__temporary__ = __webpack_require__(32);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTemporaryDrawer", function() { return __WEBPACK_IMPORTED_MODULE_1__temporary__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTemporaryDrawerFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__temporary__["b"]; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__persistent__ = __webpack_require__(37);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCPersistentDrawer", function() { return __WEBPACK_IMPORTED_MODULE_2__persistent__["a"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCPersistentDrawerFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__persistent__["b"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_0__util__; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCTemporaryDrawer; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(33);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(9);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+/* unused harmony reexport util */
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+var MDCTemporaryDrawer = function (_MDCComponent) {
+  _inherits(MDCTemporaryDrawer, _MDCComponent);
+
+  function MDCTemporaryDrawer() {
+    _classCallCheck(this, MDCTemporaryDrawer);
+
+    return _possibleConstructorReturn(this, (MDCTemporaryDrawer.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawer)).apply(this, arguments));
+  }
+
+  _createClass(MDCTemporaryDrawer, [{
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      var _MDCTemporaryDrawerFo = __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings,
+          FOCUSABLE_ELEMENTS = _MDCTemporaryDrawerFo.FOCUSABLE_ELEMENTS,
+          OPACITY_VAR_NAME = _MDCTemporaryDrawerFo.OPACITY_VAR_NAME;
+
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        addBodyClass: function addBodyClass(className) {
+          return document.body.classList.add(className);
+        },
+        removeBodyClass: function removeBodyClass(className) {
+          return document.body.classList.remove(className);
+        },
+        hasNecessaryDom: function hasNecessaryDom() {
+          return Boolean(_this2.drawer);
+        },
+        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
+          return _this2.root_.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
+          return _this2.root_.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        registerDrawerInteractionHandler: function registerDrawerInteractionHandler(evt, handler) {
+          return _this2.drawer.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
+        },
+        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler(evt, handler) {
+          return _this2.drawer.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
+        },
+        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
+          return _this2.drawer.addEventListener('transitionend', handler);
+        },
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
+          return _this2.drawer.removeEventListener('transitionend', handler);
+        },
+        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
+          return document.addEventListener('keydown', handler);
+        },
+        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
+          return document.removeEventListener('keydown', handler);
+        },
+        getDrawerWidth: function getDrawerWidth() {
+          return _this2.drawer.offsetWidth;
+        },
+        setTranslateX: function setTranslateX(value) {
+          return _this2.drawer.style.setProperty(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"](), value === null ? null : 'translateX(' + value + 'px)');
+        },
+        updateCssVariable: function updateCssVariable(value) {
+          if (__WEBPACK_IMPORTED_MODULE_2__util__["supportsCssCustomProperties"]()) {
+            _this2.root_.style.setProperty(OPACITY_VAR_NAME, value);
+          }
+        },
+        getFocusableElements: function getFocusableElements() {
+          return _this2.drawer.querySelectorAll(FOCUSABLE_ELEMENTS);
+        },
+        saveElementTabState: function saveElementTabState(el) {
+          return __WEBPACK_IMPORTED_MODULE_2__util__["saveElementTabState"](el);
+        },
+        restoreElementTabState: function restoreElementTabState(el) {
+          return __WEBPACK_IMPORTED_MODULE_2__util__["restoreElementTabState"](el);
+        },
+        makeElementUntabbable: function makeElementUntabbable(el) {
+          return el.setAttribute('tabindex', -1);
+        },
+        notifyOpen: function notifyOpen() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.OPEN_EVENT);
+        },
+        notifyClose: function notifyClose() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CLOSE_EVENT);
+        },
+        isRtl: function isRtl() {
+          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
+        },
+        isDrawer: function isDrawer(el) {
+          return el === _this2.drawer;
+        }
+      });
+    }
+  }, {
+    key: 'open',
+    get: function get() {
+      return this.foundation_.isOpen();
+    },
+    set: function set(value) {
+      if (value) {
+        this.foundation_.open();
+      } else {
+        this.foundation_.close();
+      }
+    }
+
+    /* Return the drawer element inside the component. */
+
+  }, {
+    key: 'drawer',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.DRAWER_SELECTOR);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCTemporaryDrawer(root);
+    }
+  }]);
+
+  return MDCTemporaryDrawer;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 33 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(36);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCTemporaryDrawerFoundation = function (_MDCSlidableDrawerFou) {
+  _inherits(MDCTemporaryDrawerFoundation, _MDCSlidableDrawerFou);
+
+  _createClass(MDCTemporaryDrawerFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return _extends(__WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* MDCSlidableDrawerFoundation */].defaultAdapter, {
+        addBodyClass: function addBodyClass() /* className: string */{},
+        removeBodyClass: function removeBodyClass() /* className: string */{},
+        isDrawer: function isDrawer() {
+          return false;
+        },
+        updateCssVariable: function updateCssVariable() /* value: string */{}
+      });
+    }
+  }]);
+
+  function MDCTemporaryDrawerFoundation(adapter) {
+    _classCallCheck(this, MDCTemporaryDrawerFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCTemporaryDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation)).call(this, _extends(MDCTemporaryDrawerFoundation.defaultAdapter, adapter), MDCTemporaryDrawerFoundation.cssClasses.ROOT, MDCTemporaryDrawerFoundation.cssClasses.ANIMATING, MDCTemporaryDrawerFoundation.cssClasses.OPEN));
+
+    _this.componentClickHandler_ = function () {
+      return _this.close();
+    };
+    return _this;
+  }
+
+  _createClass(MDCTemporaryDrawerFoundation, [{
+    key: 'init',
+    value: function init() {
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'init', this).call(this);
+
+      // Make browser aware of custom property being used in this element.
+      // Workaround for certain types of hard-to-reproduce heisenbugs.
+      this.adapter_.updateCssVariable(0);
+      this.adapter_.registerInteractionHandler('click', this.componentClickHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'destroy', this).call(this);
+
+      this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
+      this.enableScroll_();
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      this.disableScroll_();
+      // Make sure custom property values are cleared before starting.
+      this.adapter_.updateCssVariable('');
+
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'open', this).call(this);
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      // Make sure custom property values are cleared before making any changes.
+      this.adapter_.updateCssVariable('');
+
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'close', this).call(this);
+    }
+  }, {
+    key: 'prepareForTouchEnd_',
+    value: function prepareForTouchEnd_() {
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'prepareForTouchEnd_', this).call(this);
+
+      this.adapter_.updateCssVariable('');
+    }
+  }, {
+    key: 'updateDrawer_',
+    value: function updateDrawer_() {
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'updateDrawer_', this).call(this);
+
+      var newOpacity = Math.max(0, 1 + this.direction_ * (this.newPosition_ / this.drawerWidth_));
+      this.adapter_.updateCssVariable(newOpacity);
+    }
+  }, {
+    key: 'isRootTransitioningEventTarget_',
+    value: function isRootTransitioningEventTarget_(el) {
+      return this.adapter_.isDrawer(el);
+    }
+  }, {
+    key: 'handleTransitionEnd_',
+    value: function handleTransitionEnd_(evt) {
+      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'handleTransitionEnd_', this).call(this, evt);
+      if (!this.isOpen_) {
+        this.enableScroll_();
+      }
+    }
+  }, {
+    key: 'disableScroll_',
+    value: function disableScroll_() {
+      this.adapter_.addBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
+    }
+  }, {
+    key: 'enableScroll_',
+    value: function enableScroll_() {
+      this.adapter_.removeBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
+    }
+  }]);
+
+  return MDCTemporaryDrawerFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* MDCSlidableDrawerFoundation */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCTemporaryDrawerFoundation);
+
+/***/ }),
+/* 34 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FOCUSABLE_ELEMENTS; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var FOCUSABLE_ELEMENTS = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), ' + 'button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]';
+
+/***/ }),
+/* 35 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCSlidableDrawerFoundation; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+var MDCSlidableDrawerFoundation = function (_MDCFoundation) {
+  _inherits(MDCSlidableDrawerFoundation, _MDCFoundation);
+
+  _createClass(MDCSlidableDrawerFoundation, null, [{
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        hasClass: function hasClass() /* className: string */{},
+        hasNecessaryDom: function hasNecessaryDom() {
+          return (/* boolean */false
+          );
+        },
+        registerInteractionHandler: function registerInteractionHandler() /* evt: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* evt: string, handler: EventListener */{},
+        registerDrawerInteractionHandler: function registerDrawerInteractionHandler() /* evt: string, handler: EventListener */{},
+        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler() /* evt: string, handler: EventListener */{},
+        registerTransitionEndHandler: function registerTransitionEndHandler() /* handler: EventListener */{},
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler() /* handler: EventListener */{},
+        registerDocumentKeydownHandler: function registerDocumentKeydownHandler() /* handler: EventListener */{},
+        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler() /* handler: EventListener */{},
+        setTranslateX: function setTranslateX() /* value: number | null */{},
+        getFocusableElements: function getFocusableElements() /* NodeList */{},
+        saveElementTabState: function saveElementTabState() /* el: Element */{},
+        restoreElementTabState: function restoreElementTabState() /* el: Element */{},
+        makeElementUntabbable: function makeElementUntabbable() /* el: Element */{},
+        notifyOpen: function notifyOpen() {},
+        notifyClose: function notifyClose() {},
+        isRtl: function isRtl() {
+          return (/* boolean */false
+          );
+        },
+        getDrawerWidth: function getDrawerWidth() {
+          return (/* number */0
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCSlidableDrawerFoundation(adapter, rootCssClass, animatingCssClass, openCssClass) {
+    _classCallCheck(this, MDCSlidableDrawerFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCSlidableDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCSlidableDrawerFoundation)).call(this, _extends(MDCSlidableDrawerFoundation.defaultAdapter, adapter)));
+
+    _this.rootCssClass_ = rootCssClass;
+    _this.animatingCssClass_ = animatingCssClass;
+    _this.openCssClass_ = openCssClass;
+
+    _this.transitionEndHandler_ = function (evt) {
+      return _this.handleTransitionEnd_(evt);
+    };
+
+    _this.inert_ = false;
+
+    _this.drawerClickHandler_ = function (evt) {
+      return evt.stopPropagation();
+    };
+    _this.componentTouchStartHandler_ = function (evt) {
+      return _this.handleTouchStart_(evt);
+    };
+    _this.componentTouchMoveHandler_ = function (evt) {
+      return _this.handleTouchMove_(evt);
+    };
+    _this.componentTouchEndHandler_ = function (evt) {
+      return _this.handleTouchEnd_(evt);
+    };
+    _this.documentKeydownHandler_ = function (evt) {
+      if (evt.key && evt.key === 'Escape' || evt.keyCode === 27) {
+        _this.close();
+      }
+    };
+    return _this;
+  }
+
+  _createClass(MDCSlidableDrawerFoundation, [{
+    key: 'init',
+    value: function init() {
+      var ROOT = this.rootCssClass_;
+      var OPEN = this.openCssClass_;
+
+      if (!this.adapter_.hasClass(ROOT)) {
+        throw new Error(ROOT + ' class required in root element.');
+      }
+
+      if (!this.adapter_.hasNecessaryDom()) {
+        throw new Error('Required DOM nodes missing in ' + ROOT + ' component.');
+      }
+
+      if (this.adapter_.hasClass(OPEN)) {
+        this.isOpen_ = true;
+      } else {
+        this.detabinate_();
+        this.isOpen_ = false;
+      }
+
+      this.adapter_.registerDrawerInteractionHandler('click', this.drawerClickHandler_);
+      this.adapter_.registerDrawerInteractionHandler('touchstart', this.componentTouchStartHandler_);
+      this.adapter_.registerInteractionHandler('touchmove', this.componentTouchMoveHandler_);
+      this.adapter_.registerInteractionHandler('touchend', this.componentTouchEndHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterDrawerInteractionHandler('click', this.drawerClickHandler_);
+      this.adapter_.deregisterDrawerInteractionHandler('touchstart', this.componentTouchStartHandler_);
+      this.adapter_.deregisterInteractionHandler('touchmove', this.componentTouchMoveHandler_);
+      this.adapter_.deregisterInteractionHandler('touchend', this.componentTouchEndHandler_);
+      // Deregister the document keydown handler just in case the component is destroyed while the menu is open.
+      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
+      this.adapter_.registerDocumentKeydownHandler(this.documentKeydownHandler_);
+      this.adapter_.addClass(this.animatingCssClass_);
+      this.adapter_.addClass(this.openCssClass_);
+      this.retabinate_();
+      // Debounce multiple calls
+      if (!this.isOpen_) {
+        this.adapter_.notifyOpen();
+      }
+      this.isOpen_ = true;
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
+      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
+      this.adapter_.addClass(this.animatingCssClass_);
+      this.adapter_.removeClass(this.openCssClass_);
+      this.detabinate_();
+      // Debounce multiple calls
+      if (this.isOpen_) {
+        this.adapter_.notifyClose();
+      }
+      this.isOpen_ = false;
+    }
+  }, {
+    key: 'isOpen',
+    value: function isOpen() {
+      return this.isOpen_;
+    }
+
+    /**
+     *  Render all children of the drawer inert when it's closed.
+     */
+
+  }, {
+    key: 'detabinate_',
+    value: function detabinate_() {
+      if (this.inert_) {
+        return;
+      }
+
+      var elements = this.adapter_.getFocusableElements();
+      if (elements) {
+        for (var i = 0; i < elements.length; i++) {
+          this.adapter_.saveElementTabState(elements[i]);
+          this.adapter_.makeElementUntabbable(elements[i]);
+        }
+      }
+
+      this.inert_ = true;
+    }
+
+    /**
+     *  Make all children of the drawer tabbable again when it's open.
+     */
+
+  }, {
+    key: 'retabinate_',
+    value: function retabinate_() {
+      if (!this.inert_) {
+        return;
+      }
+
+      var elements = this.adapter_.getFocusableElements();
+      if (elements) {
+        for (var i = 0; i < elements.length; i++) {
+          this.adapter_.restoreElementTabState(elements[i]);
+        }
+      }
+
+      this.inert_ = false;
+    }
+  }, {
+    key: 'handleTouchStart_',
+    value: function handleTouchStart_(evt) {
+      if (!this.adapter_.hasClass(this.openCssClass_)) {
+        return;
+      }
+      if (evt.pointerType && evt.pointerType !== 'touch') {
+        return;
+      }
+
+      this.direction_ = this.adapter_.isRtl() ? -1 : 1;
+      this.drawerWidth_ = this.adapter_.getDrawerWidth();
+      this.startX_ = evt.touches ? evt.touches[0].pageX : evt.pageX;
+      this.currentX_ = this.startX_;
+
+      this.updateRaf_ = requestAnimationFrame(this.updateDrawer_.bind(this));
+    }
+  }, {
+    key: 'handleTouchMove_',
+    value: function handleTouchMove_(evt) {
+      if (evt.pointerType && evt.pointerType !== 'touch') {
+        return;
+      }
+
+      this.currentX_ = evt.touches ? evt.touches[0].pageX : evt.pageX;
+    }
+  }, {
+    key: 'handleTouchEnd_',
+    value: function handleTouchEnd_(evt) {
+      if (evt.pointerType && evt.pointerType !== 'touch') {
+        return;
+      }
+
+      this.prepareForTouchEnd_();
+
+      // Did the user close the drawer by more than 50%?
+      if (Math.abs(this.newPosition_ / this.drawerWidth_) >= 0.5) {
+        this.close();
+      } else {
+        // Triggering an open here means we'll get a nice animation back to the fully open state.
+        this.open();
+      }
+    }
+  }, {
+    key: 'prepareForTouchEnd_',
+    value: function prepareForTouchEnd_() {
+      cancelAnimationFrame(this.updateRaf_);
+      this.adapter_.setTranslateX(null);
+    }
+  }, {
+    key: 'updateDrawer_',
+    value: function updateDrawer_() {
+      this.updateRaf_ = requestAnimationFrame(this.updateDrawer_.bind(this));
+      this.adapter_.setTranslateX(this.newPosition_);
+    }
+  }, {
+    key: 'isRootTransitioningEventTarget_',
+    value: function isRootTransitioningEventTarget_() {
+      // Classes extending MDCSlidableDrawerFoundation should implement this method to return true or false
+      // if the event target is the root event target currently transitioning.
+      return false;
+    }
+  }, {
+    key: 'handleTransitionEnd_',
+    value: function handleTransitionEnd_(evt) {
+      if (this.isRootTransitioningEventTarget_(evt.target)) {
+        this.adapter_.removeClass(this.animatingCssClass_);
+        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
+      }
+    }
+  }, {
+    key: 'newPosition_',
+    get: function get() {
+      var newPos = null;
+
+      if (this.direction_ === 1) {
+        newPos = Math.min(0, this.currentX_ - this.startX_);
+      } else {
+        newPos = Math.max(0, this.currentX_ - this.startX_);
+      }
+
+      return newPos;
+    }
+  }]);
+
+  return MDCSlidableDrawerFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/***/ }),
+/* 36 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(6);
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+var cssClasses = {
+  ROOT: 'mdc-temporary-drawer',
+  OPEN: 'mdc-temporary-drawer--open',
+  ANIMATING: 'mdc-temporary-drawer--animating',
+  SCROLL_LOCK: 'mdc-drawer-scroll-lock'
+};
+
+var strings = {
+  DRAWER_SELECTOR: '.mdc-temporary-drawer__drawer',
+  OPACITY_VAR_NAME: '--mdc-temporary-drawer-opacity',
+  FOCUSABLE_ELEMENTS: __WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* FOCUSABLE_ELEMENTS */],
+  OPEN_EVENT: 'MDCTemporaryDrawer:open',
+  CLOSE_EVENT: 'MDCTemporaryDrawer:close'
+};
+
+/***/ }),
+/* 37 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCPersistentDrawer; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(38);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(9);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+/* unused harmony reexport util */
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+var MDCPersistentDrawer = function (_MDCComponent) {
+  _inherits(MDCPersistentDrawer, _MDCComponent);
+
+  function MDCPersistentDrawer() {
+    _classCallCheck(this, MDCPersistentDrawer);
+
+    return _possibleConstructorReturn(this, (MDCPersistentDrawer.__proto__ || Object.getPrototypeOf(MDCPersistentDrawer)).apply(this, arguments));
+  }
+
+  _createClass(MDCPersistentDrawer, [{
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      var FOCUSABLE_ELEMENTS = __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.FOCUSABLE_ELEMENTS;
+
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        hasNecessaryDom: function hasNecessaryDom() {
+          return Boolean(_this2.drawer);
+        },
+        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
+          return _this2.root_.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
+          return _this2.root_.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        registerDrawerInteractionHandler: function registerDrawerInteractionHandler(evt, handler) {
+          return _this2.drawer.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
+        },
+        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler(evt, handler) {
+          return _this2.drawer.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
+        },
+        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
+          return _this2.root_.addEventListener('transitionend', handler);
+        },
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
+          return _this2.root_.removeEventListener('transitionend', handler);
+        },
+        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
+          return document.addEventListener('keydown', handler);
+        },
+        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
+          return document.removeEventListener('keydown', handler);
+        },
+        getDrawerWidth: function getDrawerWidth() {
+          return _this2.drawer.offsetWidth;
+        },
+        setTranslateX: function setTranslateX(value) {
+          return _this2.drawer.style.setProperty(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"](), value === null ? null : 'translateX(' + value + 'px)');
+        },
+        getFocusableElements: function getFocusableElements() {
+          return _this2.drawer.querySelectorAll(FOCUSABLE_ELEMENTS);
+        },
+        saveElementTabState: function saveElementTabState(el) {
+          return __WEBPACK_IMPORTED_MODULE_2__util__["saveElementTabState"](el);
+        },
+        restoreElementTabState: function restoreElementTabState(el) {
+          return __WEBPACK_IMPORTED_MODULE_2__util__["restoreElementTabState"](el);
+        },
+        makeElementUntabbable: function makeElementUntabbable(el) {
+          return el.setAttribute('tabindex', -1);
+        },
+        notifyOpen: function notifyOpen() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.OPEN_EVENT);
+        },
+        notifyClose: function notifyClose() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CLOSE_EVENT);
+        },
+        isRtl: function isRtl() {
+          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
+        },
+        isDrawer: function isDrawer(el) {
+          return el === _this2.drawer;
+        }
+      });
+    }
+  }, {
+    key: 'open',
+    get: function get() {
+      return this.foundation_.isOpen();
+    },
+    set: function set(value) {
+      if (value) {
+        this.foundation_.open();
+      } else {
+        this.foundation_.close();
+      }
+    }
+
+    // Return the drawer element inside the component.
+
+  }, {
+    key: 'drawer',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.DRAWER_SELECTOR);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCPersistentDrawer(root);
+    }
+  }]);
+
+  return MDCPersistentDrawer;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 38 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(39);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCPersistentDrawerFoundation = function (_MDCSlidableDrawerFou) {
+  _inherits(MDCPersistentDrawerFoundation, _MDCSlidableDrawerFou);
+
+  _createClass(MDCPersistentDrawerFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return _extends(__WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* MDCSlidableDrawerFoundation */].defaultAdapter, {
+        isDrawer: function isDrawer() {
+          return false;
+        }
+      });
+    }
+  }]);
+
+  function MDCPersistentDrawerFoundation(adapter) {
+    _classCallCheck(this, MDCPersistentDrawerFoundation);
+
+    return _possibleConstructorReturn(this, (MDCPersistentDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCPersistentDrawerFoundation)).call(this, _extends(MDCPersistentDrawerFoundation.defaultAdapter, adapter), MDCPersistentDrawerFoundation.cssClasses.ROOT, MDCPersistentDrawerFoundation.cssClasses.ANIMATING, MDCPersistentDrawerFoundation.cssClasses.OPEN));
+  }
+
+  _createClass(MDCPersistentDrawerFoundation, [{
+    key: 'isRootTransitioningEventTarget_',
+    value: function isRootTransitioningEventTarget_(el) {
+      return this.adapter_.isDrawer(el);
+    }
+  }]);
+
+  return MDCPersistentDrawerFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* MDCSlidableDrawerFoundation */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCPersistentDrawerFoundation);
+
+/***/ }),
+/* 39 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(6);
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+var cssClasses = {
+  ROOT: 'mdc-persistent-drawer',
+  OPEN: 'mdc-persistent-drawer--open',
+  ANIMATING: 'mdc-persistent-drawer--animating'
+};
+
+var strings = {
+  DRAWER_SELECTOR: '.mdc-persistent-drawer__drawer',
+  FOCUSABLE_ELEMENTS: __WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* FOCUSABLE_ELEMENTS */],
+  OPEN_EVENT: 'MDCPersistentDrawer:open',
+  CLOSE_EVENT: 'MDCPersistentDrawer:close'
+};
+
+/***/ }),
+/* 40 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFormField", function() { return MDCFormField; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(41);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFormFieldFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+var MDCFormField = function (_MDCComponent) {
+  _inherits(MDCFormField, _MDCComponent);
+
+  function MDCFormField() {
+    _classCallCheck(this, MDCFormField);
+
+    return _possibleConstructorReturn(this, (MDCFormField.__proto__ || Object.getPrototypeOf(MDCFormField)).apply(this, arguments));
+  }
+
+  _createClass(MDCFormField, [{
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.label_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.label_.removeEventListener(type, handler);
+        },
+        activateInputRipple: function activateInputRipple() {
+          if (_this2.input_ && _this2.input_.ripple) {
+            _this2.input_.ripple.activate();
+          }
+        },
+        deactivateInputRipple: function deactivateInputRipple() {
+          if (_this2.input_ && _this2.input_.ripple) {
+            _this2.input_.ripple.deactivate();
+          }
+        }
+      });
+    }
+  }, {
+    key: 'input',
+    set: function set(input) {
+      this.input_ = input;
+    },
+    get: function get() {
+      return this.input_;
+    }
+  }, {
+    key: 'label_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.LABEL_SELECTOR);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCFormField(root);
+    }
+  }]);
+
+  return MDCFormField;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 41 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(42);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCFormFieldFoundation = function (_MDCFoundation) {
+  _inherits(MDCFormFieldFoundation, _MDCFoundation);
+
+  _createClass(MDCFormFieldFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
+        activateInputRipple: function activateInputRipple() {},
+        deactivateInputRipple: function deactivateInputRipple() {}
+      };
+    }
+  }]);
+
+  function MDCFormFieldFoundation(adapter) {
+    _classCallCheck(this, MDCFormFieldFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCFormFieldFoundation.__proto__ || Object.getPrototypeOf(MDCFormFieldFoundation)).call(this, _extends(MDCFormFieldFoundation.defaultAdapter, adapter)));
+
+    _this.clickHandler_ = function (evt) {
+      return _this.handleClick_(evt);
+    };
+    return _this;
+  }
+
+  _createClass(MDCFormFieldFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.registerInteractionHandler('click', this.clickHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterInteractionHandler('click', this.clickHandler_);
+    }
+  }, {
+    key: 'handleClick_',
+    value: function handleClick_() {
+      var _this2 = this;
+
+      this.adapter_.activateInputRipple();
+      requestAnimationFrame(function () {
+        return _this2.adapter_.deactivateInputRipple();
+      });
+    }
+  }]);
+
+  return MDCFormFieldFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCFormFieldFoundation);
+
+/***/ }),
+/* 42 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  ROOT: 'mdc-form-field'
+};
+
+var strings = {
+  LABEL_SELECTOR: '.mdc-form-field > label'
+};
+
+/***/ }),
+/* 43 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCGridList", function() { return MDCGridList; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(44);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCGridListFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+var MDCGridList = function (_MDCComponent) {
+  _inherits(MDCGridList, _MDCComponent);
+
+  function MDCGridList() {
+    _classCallCheck(this, MDCGridList);
+
+    return _possibleConstructorReturn(this, (MDCGridList.__proto__ || Object.getPrototypeOf(MDCGridList)).apply(this, arguments));
+  }
+
+  _createClass(MDCGridList, [{
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        getOffsetWidth: function getOffsetWidth() {
+          return _this2.root_.offsetWidth;
+        },
+        getNumberOfTiles: function getNumberOfTiles() {
+          return _this2.root_.querySelectorAll(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.TILE_SELECTOR).length;
+        },
+        getOffsetWidthForTileAtIndex: function getOffsetWidthForTileAtIndex(index) {
+          return _this2.root_.querySelectorAll(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.TILE_SELECTOR)[index].offsetWidth;
+        },
+        setStyleForTilesElement: function setStyleForTilesElement(property, value) {
+          _this2.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.TILES_SELECTOR).style[property] = value;
+        },
+        registerResizeHandler: function registerResizeHandler(handler) {
+          return window.addEventListener('resize', handler);
+        },
+        deregisterResizeHandler: function deregisterResizeHandler(handler) {
+          return window.removeEventListener('resize', handler);
+        }
+      });
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCGridList(root);
+    }
+  }]);
+
+  return MDCGridList;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 44 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(45);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCGridListFoundation = function (_MDCFoundation) {
+  _inherits(MDCGridListFoundation, _MDCFoundation);
+
+  _createClass(MDCGridListFoundation, null, [{
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        getOffsetWidth: function getOffsetWidth() {
+          return (/* number */0
+          );
+        },
+        getNumberOfTiles: function getNumberOfTiles() {
+          return (/* number */0
+          );
+        },
+        getOffsetWidthForTileAtIndex: function getOffsetWidthForTileAtIndex() {
+          return (/* index: number */ /* number */0
+          );
+        },
+        setStyleForTilesElement: function setStyleForTilesElement() /* property: string, value: string */{},
+        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
+        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{}
+      };
+    }
+  }]);
+
+  function MDCGridListFoundation(adapter) {
+    _classCallCheck(this, MDCGridListFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCGridListFoundation.__proto__ || Object.getPrototypeOf(MDCGridListFoundation)).call(this, _extends(MDCGridListFoundation.defaultAdapter, adapter)));
+
+    _this.resizeHandler_ = function () {
+      return _this.alignCenter();
+    };
+    _this.resizeFrame_ = 0;
+    return _this;
+  }
+
+  _createClass(MDCGridListFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.alignCenter();
+      this.adapter_.registerResizeHandler(this.resizeHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
+    }
+  }, {
+    key: 'alignCenter',
+    value: function alignCenter() {
+      var _this2 = this;
+
+      if (this.resizeFrame_ !== 0) {
+        cancelAnimationFrame(this.resizeFrame_);
+      }
+      this.resizeFrame_ = requestAnimationFrame(function () {
+        _this2.alignCenter_();
+        _this2.resizeFrame_ = 0;
+      });
+    }
+  }, {
+    key: 'alignCenter_',
+    value: function alignCenter_() {
+      if (this.adapter_.getNumberOfTiles() == 0) {
+        return;
+      }
+      var gridWidth = this.adapter_.getOffsetWidth();
+      var itemWidth = this.adapter_.getOffsetWidthForTileAtIndex(0);
+      var tilesWidth = itemWidth * Math.floor(gridWidth / itemWidth);
+      this.adapter_.setStyleForTilesElement('width', tilesWidth + 'px');
+    }
+  }]);
+
+  return MDCGridListFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCGridListFoundation);
+
+/***/ }),
+/* 45 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return strings; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var strings = {
+  TILES_SELECTOR: '.mdc-grid-list__tiles',
+  TILE_SELECTOR: '.mdc-grid-tile'
+};
+
+/***/ }),
+/* 46 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCIconToggle", function() { return MDCIconToggle; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(47);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_ripple_adapter__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__material_ripple__ = __webpack_require__(4);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCIconToggleFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+/* eslint-disable no-unused-vars */
+
+/* eslint-enable no-unused-vars */
+
+
+
+
+/**
+ * @extends {MDCComponent<!MDCIconToggleFoundation>}
+ */
+var MDCIconToggle = function (_MDCComponent) {
+  _inherits(MDCIconToggle, _MDCComponent);
+
+  _createClass(MDCIconToggle, null, [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCIconToggle(root);
+    }
+  }]);
+
+  function MDCIconToggle() {
+    var _ref;
+
+    _classCallCheck(this, MDCIconToggle);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    /** @private {!MDCRipple} */
+    var _this = _possibleConstructorReturn(this, (_ref = MDCIconToggle.__proto__ || Object.getPrototypeOf(MDCIconToggle)).call.apply(_ref, [this].concat(args)));
+
+    _this.ripple_ = _this.initRipple_();
+    return _this;
+  }
+
+  /** @return {!Element} */
+
+
+  _createClass(MDCIconToggle, [{
+    key: 'initRipple_',
+
+
+    /**
+     * @return {!MDCRipple}
+     * @private
+     */
+    value: function initRipple_() {
+      var _this2 = this;
+
+      var adapter = _extends(__WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRipple"].createAdapter(this), {
+        isUnbounded: function isUnbounded() {
+          return true;
+        },
+        isSurfaceActive: function isSurfaceActive() {
+          return _this2.foundation_.isKeyboardActivated();
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          var dim = 48;
+
+          var _root_$getBoundingCli = _this2.root_.getBoundingClientRect(),
+              left = _root_$getBoundingCli.left,
+              top = _root_$getBoundingCli.top;
+
+          return {
+            left: left,
+            top: top,
+            width: dim,
+            height: dim,
+            right: left + dim,
+            bottom: left + dim
+          };
+        }
+      });
+      var foundation = new __WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRippleFoundation"](adapter);
+      return new __WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRipple"](this.root_, foundation);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.ripple_.destroy();
+      _get(MDCIconToggle.prototype.__proto__ || Object.getPrototypeOf(MDCIconToggle.prototype), 'destroy', this).call(this);
+    }
+
+    /** @return {!MDCIconToggleFoundation} */
+
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this3 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this3.iconEl_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this3.iconEl_.classList.remove(className);
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this3.root_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this3.root_.removeEventListener(type, handler);
+        },
+        setText: function setText(text) {
+          return _this3.iconEl_.textContent = text;
+        },
+        getTabIndex: function getTabIndex() {
+          return (/* number */_this3.root_.tabIndex
+          );
+        },
+        setTabIndex: function setTabIndex(tabIndex) {
+          return _this3.root_.tabIndex = tabIndex;
+        },
+        getAttr: function getAttr(name, value) {
+          return _this3.root_.getAttribute(name, value);
+        },
+        setAttr: function setAttr(name, value) {
+          return _this3.root_.setAttribute(name, value);
+        },
+        rmAttr: function rmAttr(name) {
+          return _this3.root_.removeAttribute(name);
+        },
+        notifyChange: function notifyChange(evtData) {
+          return _this3.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CHANGE_EVENT, evtData);
+        }
+      });
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      this.on = this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.ARIA_PRESSED) === 'true';
+      this.disabled = this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.ARIA_DISABLED) === 'true';
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'refreshToggleData',
+    value: function refreshToggleData() {
+      this.foundation_.refreshToggleData();
+    }
+  }, {
+    key: 'iconEl_',
+    get: function get() {
+      var sel = this.root_.dataset['iconInnerSelector'];
+
+      return sel ?
+      /** @type {!Element} */this.root_.querySelector(sel) : this.root_;
+    }
+  }, {
+    key: 'on',
+    get: function get() {
+      return this.foundation_.isOn();
+    }
+
+    /** @param {boolean} isOn */
+    ,
+    set: function set(isOn) {
+      this.foundation_.toggle(isOn);
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    }
+
+    /** @param {boolean} isDisabled */
+    ,
+    set: function set(isDisabled) {
+      this.foundation_.setDisabled(isDisabled);
+    }
+  }]);
+
+  return MDCIconToggle;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 47 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* unused harmony export KeyboardKey */
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(48);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(49);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* eslint-disable no-unused-vars */
+
+
+
+/**
+ * @extends {MDCFoundation<!MDCIconToggleAdapter>}
+ */
+
+var MDCIconToggleFoundation = function (_MDCFoundation) {
+  _inherits(MDCIconToggleFoundation, _MDCFoundation);
+
+  _createClass(MDCIconToggleFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
+        setText: function setText() /* text: string */{},
+        getTabIndex: function getTabIndex() {
+          return (/* number */0
+          );
+        },
+        setTabIndex: function setTabIndex() /* tabIndex: number */{},
+        getAttr: function getAttr() {
+          return (/* name: string */ /* string */''
+          );
+        },
+        setAttr: function setAttr() /* name: string, value: string */{},
+        rmAttr: function rmAttr() /* name: string */{},
+        notifyChange: function notifyChange() /* evtData: IconToggleEvent */{}
+      };
+    }
+  }]);
+
+  function MDCIconToggleFoundation(adapter) {
+    _classCallCheck(this, MDCIconToggleFoundation);
+
+    /** @private {boolean} */
+    var _this = _possibleConstructorReturn(this, (MDCIconToggleFoundation.__proto__ || Object.getPrototypeOf(MDCIconToggleFoundation)).call(this, _extends(MDCIconToggleFoundation.defaultAdapter, adapter)));
+
+    _this.on_ = false;
+
+    /** @private {boolean} */
+    _this.disabled_ = false;
+
+    /** @private {number} */
+    _this.savedTabIndex_ = -1;
+
+    /** @private {?IconToggleState} */
+    _this.toggleOnData_ = null;
+
+    /** @private {?IconToggleState} */
+    _this.toggleOffData_ = null;
+
+    _this.clickHandler_ = /** @private {!EventListener} */function () {
+      return _this.toggleFromEvt_();
+    };
+
+    /** @private {boolean} */
+    _this.isHandlingKeydown_ = false;
+
+    _this.keydownHandler_ = /** @private {!EventListener} */function ( /** @type {!KeyboardKey} */evt) {
+      if (isSpace(evt)) {
+        _this.isHandlingKeydown_ = true;
+        return evt.preventDefault();
+      }
+    };
+
+    _this.keyupHandler_ = /** @private {!EventListener} */function ( /** @type {!KeyboardKey} */evt) {
+      if (isSpace(evt)) {
+        _this.isHandlingKeydown_ = false;
+        _this.toggleFromEvt_();
+      }
+    };
+    return _this;
+  }
+
+  _createClass(MDCIconToggleFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.refreshToggleData();
+      this.adapter_.registerInteractionHandler('click', this.clickHandler_);
+      this.adapter_.registerInteractionHandler('keydown', this.keydownHandler_);
+      this.adapter_.registerInteractionHandler('keyup', this.keyupHandler_);
+    }
+  }, {
+    key: 'refreshToggleData',
+    value: function refreshToggleData() {
+      var _MDCIconToggleFoundat = MDCIconToggleFoundation.strings,
+          DATA_TOGGLE_ON = _MDCIconToggleFoundat.DATA_TOGGLE_ON,
+          DATA_TOGGLE_OFF = _MDCIconToggleFoundat.DATA_TOGGLE_OFF;
+
+      this.toggleOnData_ = this.parseJsonDataAttr_(DATA_TOGGLE_ON);
+      this.toggleOffData_ = this.parseJsonDataAttr_(DATA_TOGGLE_OFF);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterInteractionHandler('click', this.clickHandler_);
+      this.adapter_.deregisterInteractionHandler('keydown', this.keydownHandler_);
+      this.adapter_.deregisterInteractionHandler('keyup', this.keyupHandler_);
+    }
+
+    /** @private */
+
+  }, {
+    key: 'toggleFromEvt_',
+    value: function toggleFromEvt_() {
+      this.toggle();
+      var isOn = this.on_;
+
+      this.adapter_.notifyChange( /** @type {!IconToggleEvent} */{ isOn: isOn });
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isOn',
+    value: function isOn() {
+      return this.on_;
+    }
+
+    /** @param {boolean=} isOn */
+
+  }, {
+    key: 'toggle',
+    value: function toggle() {
+      var isOn = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : !this.on_;
+
+      this.on_ = isOn;
+
+      var _MDCIconToggleFoundat2 = MDCIconToggleFoundation.strings,
+          ARIA_LABEL = _MDCIconToggleFoundat2.ARIA_LABEL,
+          ARIA_PRESSED = _MDCIconToggleFoundat2.ARIA_PRESSED;
+
+
+      if (this.on_) {
+        this.adapter_.setAttr(ARIA_PRESSED, 'true');
+      } else {
+        this.adapter_.setAttr(ARIA_PRESSED, 'false');
+      }
+
+      var _ref = this.on_ ? this.toggleOffData_ : this.toggleOnData_,
+          classToRemove = _ref.cssClass;
+
+      if (classToRemove) {
+        this.adapter_.removeClass(classToRemove);
+      }
+
+      var _ref2 = this.on_ ? this.toggleOnData_ : this.toggleOffData_,
+          content = _ref2.content,
+          label = _ref2.label,
+          cssClass = _ref2.cssClass;
+
+      if (cssClass) {
+        this.adapter_.addClass(cssClass);
+      }
+      if (content) {
+        this.adapter_.setText(content);
+      }
+      if (label) {
+        this.adapter_.setAttr(ARIA_LABEL, label);
+      }
+    }
+
+    /**
+     * @param {string} dataAttr
+     * @return {!IconToggleState}
+     */
+
+  }, {
+    key: 'parseJsonDataAttr_',
+    value: function parseJsonDataAttr_(dataAttr) {
+      var val = this.adapter_.getAttr(dataAttr);
+      if (!val) {
+        return {};
+      }
+      return (/** @type {!IconToggleState} */JSON.parse(val)
+      );
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.disabled_;
+    }
+
+    /** @param {boolean} isDisabled */
+
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(isDisabled) {
+      this.disabled_ = isDisabled;
+
+      var DISABLED = MDCIconToggleFoundation.cssClasses.DISABLED;
+      var ARIA_DISABLED = MDCIconToggleFoundation.strings.ARIA_DISABLED;
+
+
+      if (this.disabled_) {
+        this.savedTabIndex_ = this.adapter_.getTabIndex();
+        this.adapter_.setTabIndex(-1);
+        this.adapter_.setAttr(ARIA_DISABLED, 'true');
+        this.adapter_.addClass(DISABLED);
+      } else {
+        this.adapter_.setTabIndex(this.savedTabIndex_);
+        this.adapter_.rmAttr(ARIA_DISABLED);
+        this.adapter_.removeClass(DISABLED);
+      }
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isKeyboardActivated',
+    value: function isKeyboardActivated() {
+      return this.isHandlingKeydown_;
+    }
+  }]);
+
+  return MDCIconToggleFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/**
+ * @typedef {!{
+ *   key: string,
+ *   keyCode: number
+ * }}
+ */
+
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCIconToggleFoundation);
+var KeyboardKey = void 0;
+
+/**
+ * @param {!KeyboardKey} keyboardKey
+ * @return {boolean}
+ */
+function isSpace(keyboardKey) {
+  return keyboardKey.key === 'Space' || keyboardKey.keyCode === 32;
+}
+
+/** @record */
+
+var IconToggleState = function IconToggleState() {
+  _classCallCheck(this, IconToggleState);
+};
+
+/**
+ * The aria-label value of the icon toggle, or undefined if there is no aria-label.
+ * @export {string|undefined}
+ */
+
+
+IconToggleState.prototype.label;
+
+/**
+ * The text for the icon toggle, or undefined if there is no text.
+ * @export {string|undefined}
+ */
+IconToggleState.prototype.content;
+
+/**
+ * The CSS class to add to the icon toggle, or undefined if there is no CSS class.
+ * @export {string|undefined}
+ */
+IconToggleState.prototype.cssClass;
+
+/***/ }),
+/* 48 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* unused harmony export IconToggleEvent */
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint no-unused-vars: [2, {"args": "none"}] */
+
+/**
+ * Adapter for MDC Icon Toggle. Provides an interface for managing
+ * - classes
+ * - dom
+ * - inner text
+ * - event handlers
+ * - event dispatch
+ *
+ * Additionally, provides type information for the adapter to the Closure
+ * compiler.
+ *
+ * Implement this adapter for your framework of choice to delegate updates to
+ * the component in your framework of choice. See architecture documentation
+ * for more details.
+ * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
+ *
+ * @record
+ */
+var MDCIconToggleAdapter = function () {
+  function MDCIconToggleAdapter() {
+    _classCallCheck(this, MDCIconToggleAdapter);
+  }
+
+  _createClass(MDCIconToggleAdapter, [{
+    key: "addClass",
+
+    /** @param {string} className */
+    value: function addClass(className) {}
+
+    /** @param {string} className */
+
+  }, {
+    key: "removeClass",
+    value: function removeClass(className) {}
+
+    /**
+     * @param {string} type
+     * @param {!EventListener} handler
+     */
+
+  }, {
+    key: "registerInteractionHandler",
+    value: function registerInteractionHandler(type, handler) {}
+
+    /**
+     * @param {string} type
+     * @param {!EventListener} handler
+     */
+
+  }, {
+    key: "deregisterInteractionHandler",
+    value: function deregisterInteractionHandler(type, handler) {}
+
+    /** @param {string} text */
+
+  }, {
+    key: "setText",
+    value: function setText(text) {}
+
+    /** @return {number} */
+
+  }, {
+    key: "getTabIndex",
+    value: function getTabIndex() {}
+
+    /** @param {number} tabIndex */
+
+  }, {
+    key: "setTabIndex",
+    value: function setTabIndex(tabIndex) {}
+
+    /**
+     * @param {string} name
+     * @return {string}
+     */
+
+  }, {
+    key: "getAttr",
+    value: function getAttr(name) {}
+
+    /**
+     * @param {string} name
+     * @param {string} value
+     */
+
+  }, {
+    key: "setAttr",
+    value: function setAttr(name, value) {}
+
+    /** @param {string} name */
+
+  }, {
+    key: "rmAttr",
+    value: function rmAttr(name) {}
+
+    /** @param {!IconToggleEvent} evtData */
+
+  }, {
+    key: "notifyChange",
+    value: function notifyChange(evtData) {}
+  }]);
+
+  return MDCIconToggleAdapter;
+}();
+
+/**
+ * @typedef {!{
+ *   isOn: boolean,
+ * }}
+ */
+
+
+/* unused harmony default export */ var _unused_webpack_default_export = (MDCIconToggleAdapter);
+var IconToggleEvent = void 0;
+
+/***/ }),
+/* 49 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @enum {string} */
+var cssClasses = {
+  ROOT: 'mdc-icon-toggle',
+  DISABLED: 'mdc-icon-toggle--disabled'
+};
+
+/** @enum {string} */
+var strings = {
+  DATA_TOGGLE_ON: 'data-toggle-on',
+  DATA_TOGGLE_OFF: 'data-toggle-off',
+  ARIA_PRESSED: 'aria-pressed',
+  ARIA_DISABLED: 'aria-disabled',
+  ARIA_LABEL: 'aria-label',
+  CHANGE_EVENT: 'MDCIconToggle:change'
+};
+
+/***/ }),
+/* 50 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCLinearProgress", function() { return MDCLinearProgress; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(51);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCLinearProgressFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+var MDCLinearProgress = function (_MDCComponent) {
+  _inherits(MDCLinearProgress, _MDCComponent);
+
+  function MDCLinearProgress() {
+    _classCallCheck(this, MDCLinearProgress);
+
+    return _possibleConstructorReturn(this, (MDCLinearProgress.__proto__ || Object.getPrototypeOf(MDCLinearProgress)).apply(this, arguments));
+  }
+
+  _createClass(MDCLinearProgress, [{
+    key: 'open',
+    value: function open() {
+      this.foundation_.open();
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.foundation_.close();
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        getPrimaryBar: function getPrimaryBar() {
+          return _this2.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.PRIMARY_BAR_SELECTOR);
+        },
+        getBuffer: function getBuffer() {
+          return _this2.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.BUFFER_SELECTOR);
+        },
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        setStyle: function setStyle(el, styleProperty, value) {
+          return el.style[styleProperty] = value;
+        }
+      });
+    }
+  }, {
+    key: 'determinate',
+    set: function set(value) {
+      this.foundation_.setDeterminate(value);
+    }
+  }, {
+    key: 'progress',
+    set: function set(value) {
+      this.foundation_.setProgress(value);
+    }
+  }, {
+    key: 'buffer',
+    set: function set(value) {
+      this.foundation_.setBuffer(value);
+    }
+  }, {
+    key: 'reverse',
+    set: function set(value) {
+      this.foundation_.setReverse(value);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCLinearProgress(root);
+    }
+  }]);
+
+  return MDCLinearProgress;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 51 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_animation__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(52);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+var MDCLinearProgressFoundation = function (_MDCFoundation) {
+  _inherits(MDCLinearProgressFoundation, _MDCFoundation);
+
+  _createClass(MDCLinearProgressFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        getPrimaryBar: function getPrimaryBar() /* el: Element */{},
+        getBuffer: function getBuffer() /* el: Element */{},
+        hasClass: function hasClass() {
+          return (/* className: string */false
+          );
+        },
+        removeClass: function removeClass() /* className: string */{},
+        setStyle: function setStyle() /* el: Element, styleProperty: string, value: number */{}
+      };
+    }
+  }]);
+
+  function MDCLinearProgressFoundation(adapter) {
+    _classCallCheck(this, MDCLinearProgressFoundation);
+
+    return _possibleConstructorReturn(this, (MDCLinearProgressFoundation.__proto__ || Object.getPrototypeOf(MDCLinearProgressFoundation)).call(this, _extends(MDCLinearProgressFoundation.defaultAdapter, adapter)));
+  }
+
+  _createClass(MDCLinearProgressFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.determinate_ = !this.adapter_.hasClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].INDETERMINATE_CLASS);
+      this.reverse_ = this.adapter_.hasClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].REVERSED_CLASS);
+    }
+  }, {
+    key: 'setDeterminate',
+    value: function setDeterminate(isDeterminate) {
+      this.determinate_ = isDeterminate;
+      if (this.determinate_) {
+        this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].INDETERMINATE_CLASS);
+      } else {
+        this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].INDETERMINATE_CLASS);
+        this.setScale_(this.adapter_.getPrimaryBar(), 1);
+        this.setScale_(this.adapter_.getBuffer(), 1);
+      }
+    }
+  }, {
+    key: 'setProgress',
+    value: function setProgress(value) {
+      if (this.determinate_) {
+        this.setScale_(this.adapter_.getPrimaryBar(), value);
+      }
+    }
+  }, {
+    key: 'setBuffer',
+    value: function setBuffer(value) {
+      if (this.determinate_) {
+        this.setScale_(this.adapter_.getBuffer(), value);
+      }
+    }
+  }, {
+    key: 'setReverse',
+    value: function setReverse(isReversed) {
+      this.reverse_ = isReversed;
+      if (this.reverse_) {
+        this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].REVERSED_CLASS);
+      } else {
+        this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].REVERSED_CLASS);
+      }
+    }
+  }, {
+    key: 'open',
+    value: function open() {
+      this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].CLOSED_CLASS);
+    }
+  }, {
+    key: 'close',
+    value: function close() {
+      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].CLOSED_CLASS);
+    }
+  }, {
+    key: 'setScale_',
+    value: function setScale_(el, scaleValue) {
+      var _this2 = this;
+
+      var value = 'scaleX(' + scaleValue + ')';
+      __WEBPACK_IMPORTED_MODULE_1__material_animation__["c" /* transformStyleProperties */].forEach(function (transformStyleProperty) {
+        _this2.adapter_.setStyle(el, transformStyleProperty, value);
+      });
+    }
+  }]);
+
+  return MDCLinearProgressFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCLinearProgressFoundation);
+
+/***/ }),
+/* 52 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  CLOSED_CLASS: 'mdc-linear-progress--closed',
+  INDETERMINATE_CLASS: 'mdc-linear-progress--indeterminate',
+  REVERSED_CLASS: 'mdc-linear-progress--reversed'
+};
+
+var strings = {
+  PRIMARY_BAR_SELECTOR: '.mdc-linear-progress__primary-bar',
+  BUFFER_SELECTOR: '.mdc-linear-progress__buffer'
+};
+
+/***/ }),
+/* 53 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCSimpleMenu; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(54);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(11);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+/**
+ * @extends MDCComponent<!MDCSimpleMenuFoundation>
+ */
+var MDCSimpleMenu = function (_MDCComponent) {
+  _inherits(MDCSimpleMenu, _MDCComponent);
+
+  /** @param {...?} args */
+  function MDCSimpleMenu() {
+    var _ref;
+
+    _classCallCheck(this, MDCSimpleMenu);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    /** @private {!Element} */
+    var _this = _possibleConstructorReturn(this, (_ref = MDCSimpleMenu.__proto__ || Object.getPrototypeOf(MDCSimpleMenu)).call.apply(_ref, [this].concat(args)));
+
+    _this.previousFocus_;
+    return _this;
+  }
+
+  /**
+   * @param {!Element} root
+   * @return {!MDCSimpleMenu}
+   */
+
+
+  _createClass(MDCSimpleMenu, [{
+    key: 'show',
+
+
+    /** @param {{focusIndex: ?number}=} options */
+    value: function show() {
+      var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+          _ref2$focusIndex = _ref2.focusIndex,
+          focusIndex = _ref2$focusIndex === undefined ? null : _ref2$focusIndex;
+
+      this.foundation_.open({ focusIndex: focusIndex });
+    }
+  }, {
+    key: 'hide',
+    value: function hide() {
+      this.foundation_.close();
+    }
+
+    /**
+     * Return the item container element inside the component.
+     * @return {?Element}
+     */
+
+  }, {
+    key: 'getDefaultFoundation',
+
+
+    /** @return {!MDCSimpleMenuFoundation} */
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        hasNecessaryDom: function hasNecessaryDom() {
+          return Boolean(_this2.itemsContainer_);
+        },
+        getAttributeForEventTarget: function getAttributeForEventTarget(target, attributeName) {
+          return target.getAttribute(attributeName);
+        },
+        getInnerDimensions: function getInnerDimensions() {
+          var itemsContainer = _this2.itemsContainer_;
+
+          return { width: itemsContainer.offsetWidth, height: itemsContainer.offsetHeight };
+        },
+        hasAnchor: function hasAnchor() {
+          return _this2.root_.parentElement && _this2.root_.parentElement.classList.contains('mdc-menu-anchor');
+        },
+        getAnchorDimensions: function getAnchorDimensions() {
+          return _this2.root_.parentElement.getBoundingClientRect();
+        },
+        getWindowDimensions: function getWindowDimensions() {
+          return { width: window.innerWidth, height: window.innerHeight };
+        },
+        setScale: function setScale(x, y) {
+          _this2.root_.style[Object(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"])(window)] = 'scale(' + x + ', ' + y + ')';
+        },
+        setInnerScale: function setInnerScale(x, y) {
+          _this2.itemsContainer_.style[Object(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"])(window)] = 'scale(' + x + ', ' + y + ')';
+        },
+        getNumberOfItems: function getNumberOfItems() {
+          return _this2.items.length;
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.root_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.root_.removeEventListener(type, handler);
+        },
+        registerBodyClickHandler: function registerBodyClickHandler(handler) {
+          return document.body.addEventListener('click', handler);
+        },
+        deregisterBodyClickHandler: function deregisterBodyClickHandler(handler) {
+          return document.body.removeEventListener('click', handler);
+        },
+        getYParamsForItemAtIndex: function getYParamsForItemAtIndex(index) {
+          var _items$index = _this2.items[index],
+              top = _items$index.offsetTop,
+              height = _items$index.offsetHeight;
+
+          return { top: top, height: height };
+        },
+        setTransitionDelayForItemAtIndex: function setTransitionDelayForItemAtIndex(index, value) {
+          return _this2.items[index].style.setProperty('transition-delay', value);
+        },
+        getIndexForEventTarget: function getIndexForEventTarget(target) {
+          return _this2.items.indexOf(target);
+        },
+        notifySelected: function notifySelected(evtData) {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.SELECTED_EVENT, {
+            index: evtData.index,
+            item: _this2.items[evtData.index]
+          });
+        },
+        notifyCancel: function notifyCancel() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CANCEL_EVENT, {});
+        },
+        saveFocus: function saveFocus() {
+          _this2.previousFocus_ = document.activeElement;
+        },
+        restoreFocus: function restoreFocus() {
+          if (_this2.previousFocus_) {
+            _this2.previousFocus_.focus();
+          }
+        },
+        isFocused: function isFocused() {
+          return document.activeElement === _this2.root_;
+        },
+        focus: function focus() {
+          return _this2.root_.focus();
+        },
+        getFocusedItemIndex: function getFocusedItemIndex() {
+          return _this2.items.indexOf(document.activeElement);
+        },
+        focusItemAtIndex: function focusItemAtIndex(index) {
+          return _this2.items[index].focus();
+        },
+        isRtl: function isRtl() {
+          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
+        },
+        setTransformOrigin: function setTransformOrigin(origin) {
+          _this2.root_.style[Object(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"])(window) + '-origin'] = origin;
+        },
+        setPosition: function setPosition(position) {
+          _this2.root_.style.left = 'left' in position ? position.left : null;
+          _this2.root_.style.right = 'right' in position ? position.right : null;
+          _this2.root_.style.top = 'top' in position ? position.top : null;
+          _this2.root_.style.bottom = 'bottom' in position ? position.bottom : null;
+        },
+        getAccurateTime: function getAccurateTime() {
+          return window.performance.now();
+        }
+      });
+    }
+  }, {
+    key: 'open',
+
+
+    /** @return {boolean} */
+    get: function get() {
+      return this.foundation_.isOpen();
+    }
+
+    /** @param {boolean} value */
+    ,
+    set: function set(value) {
+      if (value) {
+        this.foundation_.open();
+      } else {
+        this.foundation_.close();
+      }
+    }
+  }, {
+    key: 'itemsContainer_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.ITEMS_SELECTOR);
+    }
+
+    /**
+     * Return the items within the menu. Note that this only contains the set of elements within
+     * the items container that are proper list items, and not supplemental / presentational DOM
+     * elements.
+     * @return {!Array<!Element>}
+     */
+
+  }, {
+    key: 'items',
+    get: function get() {
+      var itemsContainer = this.itemsContainer_;
+
+      return [].slice.call(itemsContainer.querySelectorAll('.mdc-list-item[role]'));
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCSimpleMenu(root);
+    }
+  }]);
+
+  return MDCSimpleMenu;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 54 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(55);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(56);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(11);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+/**
+ * @extends {MDCFoundation<!MDCSimpleMenuAdapter>}
+ */
+
+var MDCSimpleMenuFoundation = function (_MDCFoundation) {
+  _inherits(MDCSimpleMenuFoundation, _MDCFoundation);
+
+  _createClass(MDCSimpleMenuFoundation, null, [{
+    key: 'cssClasses',
+
+    /** @return enum{cssClasses} */
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
+    }
+
+    /** @return enum{strings} */
+
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* strings */];
+    }
+
+    /** @return enum{numbers} */
+
+  }, {
+    key: 'numbers',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* numbers */];
+    }
+
+    /**
+     * {@see MDCSimpleMenuAdapter} for typing information on parameters and return
+     * types.
+     * @return {!MDCSimpleMenuAdapter}
+     */
+
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return (/** @type {!MDCSimpleMenuAdapter} */{
+          addClass: function addClass() {},
+          removeClass: function removeClass() {},
+          hasClass: function hasClass() {
+            return false;
+          },
+          hasNecessaryDom: function hasNecessaryDom() {
+            return false;
+          },
+          getAttributeForEventTarget: function getAttributeForEventTarget() {},
+          getInnerDimensions: function getInnerDimensions() {
+            return {};
+          },
+          hasAnchor: function hasAnchor() {
+            return false;
+          },
+          getAnchorDimensions: function getAnchorDimensions() {
+            return {};
+          },
+          getWindowDimensions: function getWindowDimensions() {
+            return {};
+          },
+          setScale: function setScale() {},
+          setInnerScale: function setInnerScale() {},
+          getNumberOfItems: function getNumberOfItems() {
+            return 0;
+          },
+          registerInteractionHandler: function registerInteractionHandler() {},
+          deregisterInteractionHandler: function deregisterInteractionHandler() {},
+          registerBodyClickHandler: function registerBodyClickHandler() {},
+          deregisterBodyClickHandler: function deregisterBodyClickHandler() {},
+          getYParamsForItemAtIndex: function getYParamsForItemAtIndex() {
+            return {};
+          },
+          setTransitionDelayForItemAtIndex: function setTransitionDelayForItemAtIndex() {},
+          getIndexForEventTarget: function getIndexForEventTarget() {
+            return 0;
+          },
+          notifySelected: function notifySelected() {},
+          notifyCancel: function notifyCancel() {},
+          saveFocus: function saveFocus() {},
+          restoreFocus: function restoreFocus() {},
+          isFocused: function isFocused() {
+            return false;
+          },
+          focus: function focus() {},
+          getFocusedItemIndex: function getFocusedItemIndex() {
+            return -1;
+          },
+          focusItemAtIndex: function focusItemAtIndex() {},
+          isRtl: function isRtl() {
+            return false;
+          },
+          setTransformOrigin: function setTransformOrigin() {},
+          setPosition: function setPosition() {},
+          getAccurateTime: function getAccurateTime() {
+            return 0;
+          }
+        }
+      );
+    }
+
+    /** @param {!MDCSimpleMenuAdapter} adapter */
+
+  }]);
+
+  function MDCSimpleMenuFoundation(adapter) {
+    _classCallCheck(this, MDCSimpleMenuFoundation);
+
+    /** @private {function(!Event)} */
+    var _this = _possibleConstructorReturn(this, (MDCSimpleMenuFoundation.__proto__ || Object.getPrototypeOf(MDCSimpleMenuFoundation)).call(this, _extends(MDCSimpleMenuFoundation.defaultAdapter, adapter)));
+
+    _this.clickHandler_ = function (evt) {
+      return _this.handlePossibleSelected_(evt);
+    };
+    /** @private {function(!Event)} */
+    _this.keydownHandler_ = function (evt) {
+      return _this.handleKeyboardDown_(evt);
+    };
+    /** @private {function(!Event)} */
+    _this.keyupHandler_ = function (evt) {
+      return _this.handleKeyboardUp_(evt);
+    };
+    /** @private {function(!Event)} */
+    _this.documentClickHandler_ = function (evt) {
+      _this.adapter_.notifyCancel();
+      _this.close(evt);
+    };
+    /** @private {boolean} */
+    _this.isOpen_ = false;
+    /** @private {number} */
+    _this.startScaleX_ = 0;
+    /** @private {number} */
+    _this.startScaleY_ = 0;
+    /** @private {number} */
+    _this.targetScale_ = 1;
+    /** @private {number} */
+    _this.scaleX_ = 0;
+    /** @private {number} */
+    _this.scaleY_ = 0;
+    /** @private {boolean} */
+    _this.running_ = false;
+    /** @private {number} */
+    _this.selectedTriggerTimerId_ = 0;
+    /** @private {number} */
+    _this.animationRequestId_ = 0;
+    /** @private {!{ width: number, height: number }} */
+    _this.dimensions_;
+    /** @private {number} */
+    _this.startTime_;
+    /** @private {number} */
+    _this.itemHeight_;
+    return _this;
+  }
+
+  _createClass(MDCSimpleMenuFoundation, [{
+    key: 'init',
+    value: function init() {
+      var _MDCSimpleMenuFoundat = MDCSimpleMenuFoundation.cssClasses,
+          ROOT = _MDCSimpleMenuFoundat.ROOT,
+          OPEN = _MDCSimpleMenuFoundat.OPEN;
+
+
+      if (!this.adapter_.hasClass(ROOT)) {
+        throw new Error(ROOT + ' class required in root element.');
+      }
+
+      if (!this.adapter_.hasNecessaryDom()) {
+        throw new Error('Required DOM nodes missing in ' + ROOT + ' component.');
+      }
+
+      if (this.adapter_.hasClass(OPEN)) {
+        this.isOpen_ = true;
+      }
+
+      this.adapter_.registerInteractionHandler('click', this.clickHandler_);
+      this.adapter_.registerInteractionHandler('keyup', this.keyupHandler_);
+      this.adapter_.registerInteractionHandler('keydown', this.keydownHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      clearTimeout(this.selectedTriggerTimerId_);
+      // Cancel any currently running animations.
+      cancelAnimationFrame(this.animationRequestId_);
+      this.adapter_.deregisterInteractionHandler('click', this.clickHandler_);
+      this.adapter_.deregisterInteractionHandler('keyup', this.keyupHandler_);
+      this.adapter_.deregisterInteractionHandler('keydown', this.keydownHandler_);
+      this.adapter_.deregisterBodyClickHandler(this.documentClickHandler_);
+    }
+
+    /**
+     * Calculates transition delays for individual menu items, so that they fade in one at a time.
+     * @private
+     */
+
+  }, {
+    key: 'applyTransitionDelays_',
+    value: function applyTransitionDelays_() {
+      var _MDCSimpleMenuFoundat2 = MDCSimpleMenuFoundation.cssClasses,
+          BOTTOM_LEFT = _MDCSimpleMenuFoundat2.BOTTOM_LEFT,
+          BOTTOM_RIGHT = _MDCSimpleMenuFoundat2.BOTTOM_RIGHT;
+
+      var numItems = this.adapter_.getNumberOfItems();
+      var height = this.dimensions_.height;
+
+      var transitionDuration = MDCSimpleMenuFoundation.numbers.TRANSITION_DURATION_MS / 1000;
+      var start = MDCSimpleMenuFoundation.numbers.TRANSITION_SCALE_ADJUSTMENT_Y;
+
+      for (var index = 0; index < numItems; index++) {
+        var _adapter_$getYParamsF = this.adapter_.getYParamsForItemAtIndex(index),
+            itemTop = _adapter_$getYParamsF.top,
+            itemHeight = _adapter_$getYParamsF.height;
+
+        this.itemHeight_ = itemHeight;
+        var itemDelayFraction = itemTop / height;
+        if (this.adapter_.hasClass(BOTTOM_LEFT) || this.adapter_.hasClass(BOTTOM_RIGHT)) {
+          itemDelayFraction = (height - itemTop - itemHeight) / height;
+        }
+        var itemDelay = (start + itemDelayFraction * (1 - start)) * transitionDuration;
+        // Use toFixed() here to normalize CSS unit precision across browsers
+        this.adapter_.setTransitionDelayForItemAtIndex(index, itemDelay.toFixed(3) + 's');
+      }
+    }
+
+    /**
+     * Removes transition delays from menu items.
+     * @private
+     */
+
+  }, {
+    key: 'removeTransitionDelays_',
+    value: function removeTransitionDelays_() {
+      var numItems = this.adapter_.getNumberOfItems();
+      for (var i = 0; i < numItems; i++) {
+        this.adapter_.setTransitionDelayForItemAtIndex(i, null);
+      }
+    }
+
+    /**
+     * Animates menu opening or closing.
+     * @private
+     */
+
+  }, {
+    key: 'animationLoop_',
+    value: function animationLoop_() {
+      var _this2 = this;
+
+      var time = this.adapter_.getAccurateTime();
+      var _MDCSimpleMenuFoundat3 = MDCSimpleMenuFoundation.numbers,
+          TRANSITION_DURATION_MS = _MDCSimpleMenuFoundat3.TRANSITION_DURATION_MS,
+          TRANSITION_X1 = _MDCSimpleMenuFoundat3.TRANSITION_X1,
+          TRANSITION_Y1 = _MDCSimpleMenuFoundat3.TRANSITION_Y1,
+          TRANSITION_X2 = _MDCSimpleMenuFoundat3.TRANSITION_X2,
+          TRANSITION_Y2 = _MDCSimpleMenuFoundat3.TRANSITION_Y2,
+          TRANSITION_SCALE_ADJUSTMENT_X = _MDCSimpleMenuFoundat3.TRANSITION_SCALE_ADJUSTMENT_X,
+          TRANSITION_SCALE_ADJUSTMENT_Y = _MDCSimpleMenuFoundat3.TRANSITION_SCALE_ADJUSTMENT_Y;
+
+      var currentTime = Object(__WEBPACK_IMPORTED_MODULE_3__util__["clamp"])((time - this.startTime_) / TRANSITION_DURATION_MS);
+
+      // Animate X axis very slowly, so that only the Y axis animation is visible during fade-out.
+      var currentTimeX = Object(__WEBPACK_IMPORTED_MODULE_3__util__["clamp"])((currentTime - TRANSITION_SCALE_ADJUSTMENT_X) / (1 - TRANSITION_SCALE_ADJUSTMENT_X));
+      // No time-shifting on the Y axis when closing.
+      var currentTimeY = currentTime;
+
+      var startScaleY = this.startScaleY_;
+      if (this.targetScale_ === 1) {
+        // Start with the menu at the height of a single item.
+        if (this.itemHeight_) {
+          startScaleY = Math.max(this.itemHeight_ / this.dimensions_.height, startScaleY);
+        }
+        // X axis moves faster, so time-shift forward.
+        currentTimeX = Object(__WEBPACK_IMPORTED_MODULE_3__util__["clamp"])(currentTime + TRANSITION_SCALE_ADJUSTMENT_X);
+        // Y axis moves slower, so time-shift backwards and adjust speed by the difference.
+        currentTimeY = Object(__WEBPACK_IMPORTED_MODULE_3__util__["clamp"])((currentTime - TRANSITION_SCALE_ADJUSTMENT_Y) / (1 - TRANSITION_SCALE_ADJUSTMENT_Y));
+      }
+
+      // Apply cubic bezier easing independently to each axis.
+      var easeX = Object(__WEBPACK_IMPORTED_MODULE_3__util__["bezierProgress"])(currentTimeX, TRANSITION_X1, TRANSITION_Y1, TRANSITION_X2, TRANSITION_Y2);
+      var easeY = Object(__WEBPACK_IMPORTED_MODULE_3__util__["bezierProgress"])(currentTimeY, TRANSITION_X1, TRANSITION_Y1, TRANSITION_X2, TRANSITION_Y2);
+
+      // Calculate the scales to apply to the outer container and inner container.
+      this.scaleX_ = this.startScaleX_ + (this.targetScale_ - this.startScaleX_) * easeX;
+      var invScaleX = 1 / (this.scaleX_ === 0 ? 1 : this.scaleX_);
+      this.scaleY_ = startScaleY + (this.targetScale_ - startScaleY) * easeY;
+      var invScaleY = 1 / (this.scaleY_ === 0 ? 1 : this.scaleY_);
+
+      // Apply scales.
+      this.adapter_.setScale(this.scaleX_, this.scaleY_);
+      this.adapter_.setInnerScale(invScaleX, invScaleY);
+
+      // Stop animation when we've covered the entire 0 - 1 range of time.
+      if (currentTime < 1) {
+        this.animationRequestId_ = requestAnimationFrame(function () {
+          return _this2.animationLoop_();
+        });
+      } else {
+        this.animationRequestId_ = 0;
+        this.running_ = false;
+        this.adapter_.removeClass(MDCSimpleMenuFoundation.cssClasses.ANIMATING);
+      }
+    }
+
+    /**
+     * Starts the open or close animation.
+     * @private
+     */
+
+  }, {
+    key: 'animateMenu_',
+    value: function animateMenu_() {
+      var _this3 = this;
+
+      this.startTime_ = this.adapter_.getAccurateTime();
+      this.startScaleX_ = this.scaleX_;
+      this.startScaleY_ = this.scaleY_;
+
+      this.targetScale_ = this.isOpen_ ? 1 : 0;
+
+      if (!this.running_) {
+        this.running_ = true;
+        this.animationRequestId_ = requestAnimationFrame(function () {
+          return _this3.animationLoop_();
+        });
+      }
+    }
+
+    /**
+     * @param {?number} focusIndex
+     * @private
+     */
+
+  }, {
+    key: 'focusOnOpen_',
+    value: function focusOnOpen_(focusIndex) {
+      if (focusIndex === null) {
+        // First, try focusing the menu.
+        this.adapter_.focus();
+        // If that doesn't work, focus first item instead.
+        if (!this.adapter_.isFocused()) {
+          this.adapter_.focusItemAtIndex(0);
+        }
+      } else {
+        this.adapter_.focusItemAtIndex(focusIndex);
+      }
+    }
+
+    /**
+     * Handle keys that we want to repeat on hold (tab and arrows).
+     * @param {!Event} evt
+     * @return {boolean}
+     * @private
+     */
+
+  }, {
+    key: 'handleKeyboardDown_',
+    value: function handleKeyboardDown_(evt) {
+      // Do nothing if Alt, Ctrl or Meta are pressed.
+      if (evt.altKey || evt.ctrlKey || evt.metaKey) {
+        return true;
+      }
+
+      var keyCode = evt.keyCode,
+          key = evt.key,
+          shiftKey = evt.shiftKey;
+
+      var isTab = key === 'Tab' || keyCode === 9;
+      var isArrowUp = key === 'ArrowUp' || keyCode === 38;
+      var isArrowDown = key === 'ArrowDown' || keyCode === 40;
+      var isSpace = key === 'Space' || keyCode === 32;
+
+      var focusedItemIndex = this.adapter_.getFocusedItemIndex();
+      var lastItemIndex = this.adapter_.getNumberOfItems() - 1;
+
+      if (shiftKey && isTab && focusedItemIndex === 0) {
+        this.adapter_.focusItemAtIndex(lastItemIndex);
+        evt.preventDefault();
+        return false;
+      }
+
+      if (!shiftKey && isTab && focusedItemIndex === lastItemIndex) {
+        this.adapter_.focusItemAtIndex(0);
+        evt.preventDefault();
+        return false;
+      }
+
+      // Ensure Arrow{Up,Down} and space do not cause inadvertent scrolling
+      if (isArrowUp || isArrowDown || isSpace) {
+        evt.preventDefault();
+      }
+
+      if (isArrowUp) {
+        if (focusedItemIndex === 0 || this.adapter_.isFocused()) {
+          this.adapter_.focusItemAtIndex(lastItemIndex);
+        } else {
+          this.adapter_.focusItemAtIndex(focusedItemIndex - 1);
+        }
+      } else if (isArrowDown) {
+        if (focusedItemIndex === lastItemIndex || this.adapter_.isFocused()) {
+          this.adapter_.focusItemAtIndex(0);
+        } else {
+          this.adapter_.focusItemAtIndex(focusedItemIndex + 1);
+        }
+      }
+
+      return true;
+    }
+
+    /**
+     * Handle keys that we don't want to repeat on hold (Enter, Space, Escape).
+     * @param {!Event} evt
+     * @return {boolean}
+     * @private
+     */
+
+  }, {
+    key: 'handleKeyboardUp_',
+    value: function handleKeyboardUp_(evt) {
+      // Do nothing if Alt, Ctrl or Meta are pressed.
+      if (evt.altKey || evt.ctrlKey || evt.metaKey) {
+        return true;
+      }
+
+      var keyCode = evt.keyCode,
+          key = evt.key;
+
+      var isEnter = key === 'Enter' || keyCode === 13;
+      var isSpace = key === 'Space' || keyCode === 32;
+      var isEscape = key === 'Escape' || keyCode === 27;
+
+      if (isEnter || isSpace) {
+        this.handlePossibleSelected_(evt);
+      }
+
+      if (isEscape) {
+        this.adapter_.notifyCancel();
+        this.close();
+      }
+
+      return true;
+    }
+
+    /**
+     * @param {!Event} evt
+     * @private
+     */
+
+  }, {
+    key: 'handlePossibleSelected_',
+    value: function handlePossibleSelected_(evt) {
+      var _this4 = this;
+
+      if (this.adapter_.getAttributeForEventTarget(evt.target, __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* strings */].ARIA_DISABLED_ATTR) === 'true') {
+        return;
+      }
+      var targetIndex = this.adapter_.getIndexForEventTarget(evt.target);
+      if (targetIndex < 0) {
+        return;
+      }
+      // Debounce multiple selections
+      if (this.selectedTriggerTimerId_) {
+        return;
+      }
+      this.selectedTriggerTimerId_ = setTimeout(function () {
+        _this4.selectedTriggerTimerId_ = 0;
+        _this4.close();
+        _this4.adapter_.notifySelected({ index: targetIndex });
+      }, __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* numbers */].SELECTED_TRIGGER_DELAY);
+    }
+
+    /** @private */
+
+  }, {
+    key: 'autoPosition_',
+    value: function autoPosition_() {
+      var _position;
+
+      if (!this.adapter_.hasAnchor()) {
+        return;
+      }
+
+      // Defaults: open from the top left.
+      var vertical = 'top';
+      var horizontal = 'left';
+
+      var anchor = this.adapter_.getAnchorDimensions();
+      var windowDimensions = this.adapter_.getWindowDimensions();
+
+      var topOverflow = anchor.top + this.dimensions_.height - windowDimensions.height;
+      var bottomOverflow = this.dimensions_.height - anchor.bottom;
+      var extendsBeyondTopBounds = topOverflow > 0;
+
+      if (extendsBeyondTopBounds) {
+        if (bottomOverflow < topOverflow) {
+          vertical = 'bottom';
+        }
+      }
+
+      var leftOverflow = anchor.left + this.dimensions_.width - windowDimensions.width;
+      var rightOverflow = this.dimensions_.width - anchor.right;
+      var extendsBeyondLeftBounds = leftOverflow > 0;
+      var extendsBeyondRightBounds = rightOverflow > 0;
+
+      if (this.adapter_.isRtl()) {
+        // In RTL, we prefer to open from the right.
+        horizontal = 'right';
+        if (extendsBeyondRightBounds && leftOverflow < rightOverflow) {
+          horizontal = 'left';
+        }
+      } else if (extendsBeyondLeftBounds && rightOverflow < leftOverflow) {
+        horizontal = 'right';
+      }
+
+      var position = (_position = {}, _defineProperty(_position, horizontal, '0'), _defineProperty(_position, vertical, '0'), _position);
+
+      this.adapter_.setTransformOrigin(vertical + ' ' + horizontal);
+      this.adapter_.setPosition(position);
+    }
+
+    /**
+     * Open the menu.
+     * @param {{focusIndex: ?number}=} options
+     */
+
+  }, {
+    key: 'open',
+    value: function open() {
+      var _this5 = this;
+
+      var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
+          _ref$focusIndex = _ref.focusIndex,
+          focusIndex = _ref$focusIndex === undefined ? null : _ref$focusIndex;
+
+      this.adapter_.saveFocus();
+      this.adapter_.addClass(MDCSimpleMenuFoundation.cssClasses.ANIMATING);
+      this.animationRequestId_ = requestAnimationFrame(function () {
+        _this5.dimensions_ = _this5.adapter_.getInnerDimensions();
+        _this5.applyTransitionDelays_();
+        _this5.autoPosition_();
+        _this5.animateMenu_();
+        _this5.adapter_.addClass(MDCSimpleMenuFoundation.cssClasses.OPEN);
+        _this5.focusOnOpen_(focusIndex);
+        _this5.adapter_.registerBodyClickHandler(_this5.documentClickHandler_);
+      });
+      this.isOpen_ = true;
+    }
+
+    /**
+     * Closes the menu.
+     * @param {Event=} evt
+     */
+
+  }, {
+    key: 'close',
+    value: function close() {
+      var _this6 = this;
+
+      var evt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      var targetIsDisabled = evt ? this.adapter_.getAttributeForEventTarget(evt.target, __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* strings */].ARIA_DISABLED_ATTR) === 'true' : false;
+
+      if (targetIsDisabled) {
+        return;
+      }
+
+      this.adapter_.deregisterBodyClickHandler(this.documentClickHandler_);
+      this.adapter_.addClass(MDCSimpleMenuFoundation.cssClasses.ANIMATING);
+      requestAnimationFrame(function () {
+        _this6.removeTransitionDelays_();
+        _this6.animateMenu_();
+        _this6.adapter_.removeClass(MDCSimpleMenuFoundation.cssClasses.OPEN);
+      });
+      this.isOpen_ = false;
+      this.adapter_.restoreFocus();
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isOpen',
+    value: function isOpen() {
+      return this.isOpen_;
+    }
+  }]);
+
+  return MDCSimpleMenuFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCSimpleMenuFoundation);
+
+/***/ }),
+/* 55 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint no-unused-vars: [2, {"args": "none"}] */
+
+/**
+ * Adapter for MDC Simple Menu. Provides an interface for managing
+ * - classes
+ * - dom
+ * - focus
+ * - position
+ * - dimensions
+ * - event handlers
+ *
+ * Additionally, provides type information for the adapter to the Closure
+ * compiler.
+ *
+ * Implement this adapter for your framework of choice to delegate updates to
+ * the component in your framework of choice. See architecture documentation
+ * for more details.
+ * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
+ *
+ * @record
+ */
+var MDCSimpleMenuAdapter = function () {
+  function MDCSimpleMenuAdapter() {
+    _classCallCheck(this, MDCSimpleMenuAdapter);
+  }
+
+  _createClass(MDCSimpleMenuAdapter, [{
+    key: "addClass",
+
+    /** @param {string} className */
+    value: function addClass(className) {}
+
+    /** @param {string} className */
+
+  }, {
+    key: "removeClass",
+    value: function removeClass(className) {}
+
+    /**
+     * @param {string} className
+     * @return {boolean}
+     */
+
+  }, {
+    key: "hasClass",
+    value: function hasClass(className) {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "hasNecessaryDom",
+    value: function hasNecessaryDom() {}
+
+    /**
+     * @param {EventTarget} target
+     * @param {string} attributeName
+     * @return {string}
+     */
+
+  }, {
+    key: "getAttributeForEventTarget",
+    value: function getAttributeForEventTarget(target, attributeName) {}
+
+    /** @return {{ width: number, height: number }} */
+
+  }, {
+    key: "getInnerDimensions",
+    value: function getInnerDimensions() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "hasAnchor",
+    value: function hasAnchor() {}
+
+    /** @return {{width: number, height: number, top: number, right: number, bottom: number, left: number}} */
+
+  }, {
+    key: "getAnchorDimensions",
+    value: function getAnchorDimensions() {}
+
+    /** @return {{ width: number, height: number }} */
+
+  }, {
+    key: "getWindowDimensions",
+    value: function getWindowDimensions() {}
+
+    /**
+     * @param {number} x
+     * @param {number} y
+     */
+
+  }, {
+    key: "setScale",
+    value: function setScale(x, y) {}
+
+    /**
+     * @param {number} x
+     * @param {number} y
+     */
+
+  }, {
+    key: "setInnerScale",
+    value: function setInnerScale(x, y) {}
+
+    /** @return {number} */
+
+  }, {
+    key: "getNumberOfItems",
+    value: function getNumberOfItems() {}
+
+    /**
+     * @param {string} type
+     * @param {function(!Event)} handler
+     */
+
+  }, {
+    key: "registerInteractionHandler",
+    value: function registerInteractionHandler(type, handler) {}
+
+    /**
+     * @param {string} type
+     * @param {function(!Event)} handler
+     */
+
+  }, {
+    key: "deregisterInteractionHandler",
+    value: function deregisterInteractionHandler(type, handler) {}
+
+    /** @param {function(!Event)} handler */
+
+  }, {
+    key: "registerBodyClickHandler",
+    value: function registerBodyClickHandler(handler) {}
+
+    /** @param {function(!Event)} handler */
+
+  }, {
+    key: "deregisterBodyClickHandler",
+    value: function deregisterBodyClickHandler(handler) {}
+
+    /**
+     * @param {number} index
+     * @return {{top: number, height: number}}
+     */
+
+  }, {
+    key: "getYParamsForItemAtIndex",
+    value: function getYParamsForItemAtIndex(index) {}
+
+    /**
+     * @param {number} index
+     * @param {string|null} value
+     */
+
+  }, {
+    key: "setTransitionDelayForItemAtIndex",
+    value: function setTransitionDelayForItemAtIndex(index, value) {}
+
+    /**
+     * @param {EventTarget} target
+     * @return {number}
+     */
+
+  }, {
+    key: "getIndexForEventTarget",
+    value: function getIndexForEventTarget(target) {}
+
+    /** @param {{index: number}} evtData */
+
+  }, {
+    key: "notifySelected",
+    value: function notifySelected(evtData) {}
+  }, {
+    key: "notifyCancel",
+    value: function notifyCancel() {}
+  }, {
+    key: "saveFocus",
+    value: function saveFocus() {}
+  }, {
+    key: "restoreFocus",
+    value: function restoreFocus() {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "isFocused",
+    value: function isFocused() {}
+  }, {
+    key: "focus",
+    value: function focus() {}
+
+    /** @return {number} */
+
+  }, {
+    key: "getFocusedItemIndex",
+    value: function getFocusedItemIndex() /* number */{}
+
+    /** @param {number} index */
+
+  }, {
+    key: "focusItemAtIndex",
+    value: function focusItemAtIndex(index) {}
+
+    /** @return {boolean} */
+
+  }, {
+    key: "isRtl",
+    value: function isRtl() {}
+
+    /** @param {string} origin */
+
+  }, {
+    key: "setTransformOrigin",
+    value: function setTransformOrigin(origin) {}
+
+    /** @param {{
+    *   top: (string|undefined),
+    *   right: (string|undefined),
+    *   bottom: (string|undefined),
+    *   left: (string|undefined)
+    * }} position */
+
+  }, {
+    key: "setPosition",
+    value: function setPosition(position) {}
+
+    /** @return {number} */
+
+  }, {
+    key: "getAccurateTime",
+    value: function getAccurateTime() {}
+  }]);
+
+  return MDCSimpleMenuAdapter;
+}();
+
+/* unused harmony default export */ var _unused_webpack_default_export = (MDCSimpleMenuAdapter);
+
+/***/ }),
+/* 56 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @enum {string} */
+var cssClasses = {
+  ROOT: 'mdc-simple-menu',
+  OPEN: 'mdc-simple-menu--open',
+  ANIMATING: 'mdc-simple-menu--animating',
+  TOP_RIGHT: 'mdc-simple-menu--open-from-top-right',
+  BOTTOM_LEFT: 'mdc-simple-menu--open-from-bottom-left',
+  BOTTOM_RIGHT: 'mdc-simple-menu--open-from-bottom-right'
+};
+
+/** @enum {string} */
+var strings = {
+  ITEMS_SELECTOR: '.mdc-simple-menu__items',
+  SELECTED_EVENT: 'MDCSimpleMenu:selected',
+  CANCEL_EVENT: 'MDCSimpleMenu:cancel',
+  ARIA_DISABLED_ATTR: 'aria-disabled'
+};
+
+/** @enum {number} */
+var numbers = {
+  // Amount of time to wait before triggering a selected event on the menu. Note that this time
+  // will most likely be bumped up once interactive lists are supported to allow for the ripple to
+  // animate before closing the menu
+  SELECTED_TRIGGER_DELAY: 50,
+  // Total duration of the menu animation.
+  TRANSITION_DURATION_MS: 300,
+  // The menu starts its open animation with the X axis at this time value (0 - 1).
+  TRANSITION_SCALE_ADJUSTMENT_X: 0.5,
+  // The time value the menu waits until the animation starts on the Y axis (0 - 1).
+  TRANSITION_SCALE_ADJUSTMENT_Y: 0.2,
+  // The cubic bezier control points for the animation (cubic-bezier(0, 0, 0.2, 1)).
+  TRANSITION_X1: 0,
+  TRANSITION_Y1: 0,
+  TRANSITION_X2: 0.2,
+  TRANSITION_Y2: 1
+};
+
+/***/ }),
+/* 57 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRadio", function() { return MDCRadio; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_selection_control__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(58);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__material_ripple__ = __webpack_require__(4);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRadioFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* eslint-disable no-unused-vars */
+
+/* eslint-enable no-unused-vars */
+
+
+
+
+
+/**
+ * @extends MDCComponent<!MDCRadioFoundation>
+ */
+var MDCRadio = function (_MDCComponent) {
+  _inherits(MDCRadio, _MDCComponent);
+
+  _createClass(MDCRadio, [{
+    key: 'checked',
+
+
+    /** @return {boolean} */
+    get: function get() {
+      return this.foundation_.isChecked();
+    }
+
+    /** @param {boolean} checked */
+    ,
+    set: function set(checked) {
+      this.foundation_.setChecked(checked);
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    }
+
+    /** @param {boolean} disabled */
+    ,
+    set: function set(disabled) {
+      this.foundation_.setDisabled(disabled);
+    }
+
+    /** @return {?string} */
+
+  }, {
+    key: 'value',
+    get: function get() {
+      return this.foundation_.getValue();
+    }
+
+    /** @param {?string} value */
+    ,
+    set: function set(value) {
+      this.foundation_.setValue(value);
+    }
+
+    /** @return {!MDCRipple} */
+
+  }, {
+    key: 'ripple',
+    get: function get() {
+      return this.ripple_;
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCRadio(root);
+    }
+  }]);
+
+  function MDCRadio() {
+    var _ref;
+
+    _classCallCheck(this, MDCRadio);
+
+    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+
+    /** @private {!MDCRipple} */
+    var _this = _possibleConstructorReturn(this, (_ref = MDCRadio.__proto__ || Object.getPrototypeOf(MDCRadio)).call.apply(_ref, [this].concat(args)));
+
+    _this.ripple_ = _this.initRipple_();
+    return _this;
+  }
+
+  /**
+   * @return {!MDCRipple}
+   * @private
+   */
+
+
+  _createClass(MDCRadio, [{
+    key: 'initRipple_',
+    value: function initRipple_() {
+      var _this2 = this;
+
+      var adapter = _extends(__WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRipple"].createAdapter(this), {
+        isUnbounded: function isUnbounded() {
+          return true;
+        },
+        // Radio buttons technically go "active" whenever there is *any* keyboard interaction. This is not the
+        // UI we desire.
+        isSurfaceActive: function isSurfaceActive() {
+          return false;
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.nativeControl_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.nativeControl_.removeEventListener(type, handler);
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          var _root_$getBoundingCli = _this2.root_.getBoundingClientRect(),
+              left = _root_$getBoundingCli.left,
+              top = _root_$getBoundingCli.top;
+
+          var DIM = 40;
+          return {
+            top: top,
+            left: left,
+            right: left + DIM,
+            bottom: top + DIM,
+            width: DIM,
+            height: DIM
+          };
+        }
+      });
+      var foundation = new __WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRippleFoundation"](adapter);
+      return new __WEBPACK_IMPORTED_MODULE_3__material_ripple__["MDCRipple"](this.root_, foundation);
+    }
+
+    /**
+     * Returns the state of the native control element, or null if the native control element is not present.
+     * @return {?SelectionControlState}
+     * @private
+     */
+
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.ripple_.destroy();
+      _get(MDCRadio.prototype.__proto__ || Object.getPrototypeOf(MDCRadio.prototype), 'destroy', this).call(this);
+    }
+
+    /** @return {!MDCRadioFoundation} */
+
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this3 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this3.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this3.root_.classList.remove(className);
+        },
+        getNativeControl: function getNativeControl() {
+          return _this3.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.NATIVE_CONTROL_SELECTOR);
+        }
+      });
+    }
+  }, {
+    key: 'nativeControl_',
+    get: function get() {
+      var NATIVE_CONTROL_SELECTOR = __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.NATIVE_CONTROL_SELECTOR;
+
+      var el = /** @type {?SelectionControlState} */this.root_.querySelector(NATIVE_CONTROL_SELECTOR);
+      return el;
+    }
+  }]);
+
+  return MDCRadio;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 58 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_selection_control__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__adapter__ = __webpack_require__(59);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__constants__ = __webpack_require__(60);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+/* eslint-disable no-unused-vars */
+
+
+/* eslint-enable no-unused-vars */
+
+
+/**
+ * @extends {MDCFoundation<!MDCRadioAdapter>}
+ */
+
+var MDCRadioFoundation = function (_MDCFoundation) {
+  _inherits(MDCRadioFoundation, _MDCFoundation);
+
+  function MDCRadioFoundation() {
+    _classCallCheck(this, MDCRadioFoundation);
+
+    return _possibleConstructorReturn(this, (MDCRadioFoundation.__proto__ || Object.getPrototypeOf(MDCRadioFoundation)).apply(this, arguments));
+  }
+
+  _createClass(MDCRadioFoundation, [{
+    key: 'isChecked',
+
+
+    /** @return {boolean} */
+    value: function isChecked() {
+      return this.getNativeControl_().checked;
+    }
+
+    /** @param {boolean} checked */
+
+  }, {
+    key: 'setChecked',
+    value: function setChecked(checked) {
+      this.getNativeControl_().checked = checked;
+    }
+
+    /** @return {boolean} */
+
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.getNativeControl_().disabled;
+    }
+
+    /** @param {boolean} disabled */
+
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(disabled) {
+      var DISABLED = MDCRadioFoundation.cssClasses.DISABLED;
+
+      this.getNativeControl_().disabled = disabled;
+      if (disabled) {
+        this.adapter_.addClass(DISABLED);
+      } else {
+        this.adapter_.removeClass(DISABLED);
+      }
+    }
+
+    /** @return {?string} */
+
+  }, {
+    key: 'getValue',
+    value: function getValue() {
+      return this.getNativeControl_().value;
+    }
+
+    /** @param {?string} value */
+
+  }, {
+    key: 'setValue',
+    value: function setValue(value) {
+      this.getNativeControl_().value = value;
+    }
+
+    /**
+     * @return {!SelectionControlState}
+     * @private
+     */
+
+  }, {
+    key: 'getNativeControl_',
+    value: function getNativeControl_() {
+      return this.adapter_.getNativeControl() || {
+        checked: false,
+        disabled: false,
+        value: null
+      };
+    }
+  }], [{
+    key: 'cssClasses',
+
+    /** @return enum {cssClasses} */
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */];
+    }
+
+    /** @return enum {strings} */
+
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */];
+    }
+
+    /** @return {!MDCRadioAdapter} */
+
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return (/** @type {!MDCRadioAdapter} */{
+          addClass: function addClass() /* className: string */{},
+          removeClass: function removeClass() /* className: string */{},
+          getNativeControl: function getNativeControl() /* !SelectionControlState */{}
+        }
+      );
+    }
+  }]);
+
+  return MDCRadioFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCRadioFoundation);
+
+/***/ }),
+/* 59 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_selection_control__ = __webpack_require__(3);
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable no-unused-vars */
+
+
+/* eslint no-unused-vars: [2, {"args": "none"}] */
+
+/**
+ * Adapter for MDC Radio. Provides an interface for managing
+ * - classes
+ * - dom
+ *
+ * Additionally, provides type information for the adapter to the Closure
+ * compiler.
+ *
+ * Implement this adapter for your framework of choice to delegate updates to
+ * the component in your framework of choice. See architecture documentation
+ * for more details.
+ * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
+ *
+ * @record
+ */
+
+var MDCRadioAdapter = function () {
+  function MDCRadioAdapter() {
+    _classCallCheck(this, MDCRadioAdapter);
+  }
+
+  _createClass(MDCRadioAdapter, [{
+    key: 'addClass',
+
+    /** @param {string} className */
+    value: function addClass(className) {}
+
+    /** @param {string} className */
+
+  }, {
+    key: 'removeClass',
+    value: function removeClass(className) {}
+
+    /** @return {!SelectionControlState} */
+
+  }, {
+    key: 'getNativeControl',
+    value: function getNativeControl() {}
+  }]);
+
+  return MDCRadioAdapter;
+}();
+
+/* unused harmony default export */ var _unused_webpack_default_export = (MDCRadioAdapter);
+
+/***/ }),
+/* 60 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/** @enum {string} */
+var strings = {
+  NATIVE_CONTROL_SELECTOR: '.mdc-radio__native-control'
+};
+
+/** @enum {string} */
+var cssClasses = {
+  ROOT: 'mdc-radio',
+  DISABLED: 'mdc-radio--disabled'
+};
+
+/***/ }),
+/* 61 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSelect", function() { return MDCSelect; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_menu__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(62);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSelectFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+var MDCSelect = function (_MDCComponent) {
+  _inherits(MDCSelect, _MDCComponent);
+
+  function MDCSelect() {
+    _classCallCheck(this, MDCSelect);
+
+    return _possibleConstructorReturn(this, (MDCSelect.__proto__ || Object.getPrototypeOf(MDCSelect)).apply(this, arguments));
+  }
+
+  _createClass(MDCSelect, [{
+    key: 'item',
+    value: function item(index) {
+      return this.options[index] || null;
+    }
+  }, {
+    key: 'nameditem',
+    value: function nameditem(key) {
+      // NOTE: IE11 precludes us from using Array.prototype.find
+      for (var i = 0, options = this.options, option; option = options[i]; i++) {
+        if (option.id === key || option.getAttribute('name') === key) {
+          return option;
+        }
+      }
+      return null;
+    }
+  }, {
+    key: 'initialize',
+    value: function initialize() {
+      var menuFactory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (el) {
+        return new __WEBPACK_IMPORTED_MODULE_1__material_menu__["MDCSimpleMenu"](el);
+      };
+
+      this.menuEl_ = this.root_.querySelector('.mdc-select__menu');
+      this.menu_ = menuFactory(this.menuEl_);
+      this.selectedText_ = this.root_.querySelector('.mdc-select__selected-text');
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        setAttr: function setAttr(attr, value) {
+          return _this2.root_.setAttribute(attr, value);
+        },
+        rmAttr: function rmAttr(attr, value) {
+          return _this2.root_.removeAttribute(attr, value);
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          return _this2.root_.getBoundingClientRect();
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          return _this2.root_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          return _this2.root_.removeEventListener(type, handler);
+        },
+        focus: function focus() {
+          return _this2.root_.focus();
+        },
+        makeTabbable: function makeTabbable() {
+          _this2.root_.tabIndex = 0;
+        },
+        makeUntabbable: function makeUntabbable() {
+          _this2.root_.tabIndex = -1;
+        },
+        getComputedStyleValue: function getComputedStyleValue(prop) {
+          return window.getComputedStyle(_this2.root_).getPropertyValue(prop);
+        },
+        setStyle: function setStyle(propertyName, value) {
+          return _this2.root_.style.setProperty(propertyName, value);
+        },
+        create2dRenderingContext: function create2dRenderingContext() {
+          return document.createElement('canvas').getContext('2d');
+        },
+        setMenuElStyle: function setMenuElStyle(propertyName, value) {
+          return _this2.menuEl_.style.setProperty(propertyName, value);
+        },
+        setMenuElAttr: function setMenuElAttr(attr, value) {
+          return _this2.menuEl_.setAttribute(attr, value);
+        },
+        rmMenuElAttr: function rmMenuElAttr(attr) {
+          return _this2.menuEl_.removeAttribute(attr);
+        },
+        getMenuElOffsetHeight: function getMenuElOffsetHeight() {
+          return _this2.menuEl_.offsetHeight;
+        },
+        openMenu: function openMenu(focusIndex) {
+          return _this2.menu_.show({ focusIndex: focusIndex });
+        },
+        isMenuOpen: function isMenuOpen() {
+          return _this2.menu_.open;
+        },
+        setSelectedTextContent: function setSelectedTextContent(selectedTextContent) {
+          _this2.selectedText_.textContent = selectedTextContent;
+        },
+        getNumberOfOptions: function getNumberOfOptions() {
+          return _this2.options.length;
+        },
+        getTextForOptionAtIndex: function getTextForOptionAtIndex(index) {
+          return _this2.options[index].textContent;
+        },
+        getValueForOptionAtIndex: function getValueForOptionAtIndex(index) {
+          return _this2.options[index].id || _this2.options[index].textContent;
+        },
+        setAttrForOptionAtIndex: function setAttrForOptionAtIndex(index, attr, value) {
+          return _this2.options[index].setAttribute(attr, value);
+        },
+        rmAttrForOptionAtIndex: function rmAttrForOptionAtIndex(index, attr) {
+          return _this2.options[index].removeAttribute(attr);
+        },
+        getOffsetTopForOptionAtIndex: function getOffsetTopForOptionAtIndex(index) {
+          return _this2.options[index].offsetTop;
+        },
+        registerMenuInteractionHandler: function registerMenuInteractionHandler(type, handler) {
+          return _this2.menu_.listen(type, handler);
+        },
+        deregisterMenuInteractionHandler: function deregisterMenuInteractionHandler(type, handler) {
+          return _this2.menu_.unlisten(type, handler);
+        },
+        notifyChange: function notifyChange() {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.CHANGE_EVENT, _this2);
+        },
+        getWindowInnerHeight: function getWindowInnerHeight() {
+          return window.innerHeight;
+        }
+      });
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      var selectedOption = this.selectedOptions[0];
+      var idx = selectedOption ? this.options.indexOf(selectedOption) : -1;
+      if (idx >= 0) {
+        this.selectedIndex = idx;
+      }
+
+      if (this.root_.getAttribute('aria-disabled') === 'true') {
+        this.disabled = true;
+      }
+    }
+  }, {
+    key: 'value',
+    get: function get() {
+      return this.foundation_.getValue();
+    }
+  }, {
+    key: 'options',
+    get: function get() {
+      return this.menu_.items;
+    }
+  }, {
+    key: 'selectedOptions',
+    get: function get() {
+      return this.root_.querySelectorAll('[aria-selected]');
+    }
+  }, {
+    key: 'selectedIndex',
+    get: function get() {
+      return this.foundation_.getSelectedIndex();
+    },
+    set: function set(selectedIndex) {
+      this.foundation_.setSelectedIndex(selectedIndex);
+    }
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    },
+    set: function set(disabled) {
+      this.foundation_.setDisabled(disabled);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCSelect(root);
+    }
+  }]);
+
+  return MDCSelect;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 62 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(63);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_menu__ = __webpack_require__(10);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+var OPENER_KEYS = [{ key: 'ArrowUp', keyCode: 38, forType: 'keydown' }, { key: 'ArrowDown', keyCode: 40, forType: 'keydown' }, { key: 'Space', keyCode: 32, forType: 'keyup' }];
+
+var MDCSelectFoundation = function (_MDCFoundation) {
+  _inherits(MDCSelectFoundation, _MDCFoundation);
+
+  _createClass(MDCSelectFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        setAttr: function setAttr() /* attr: string, value: string */{},
+        rmAttr: function rmAttr() /* attr: string */{},
+        computeBoundingRect: function computeBoundingRect() {
+          return (/* {left: number, top: number} */{ left: 0, top: 0 }
+          );
+        },
+        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
+        focus: function focus() {},
+        makeTabbable: function makeTabbable() {},
+        makeUntabbable: function makeUntabbable() {},
+        getComputedStyleValue: function getComputedStyleValue() {
+          return (/* propertyName: string */ /* string */''
+          );
+        },
+        setStyle: function setStyle() /* propertyName: string, value: string */{},
+        create2dRenderingContext: function create2dRenderingContext() {
+          return (/* {font: string, measureText: (string) => {width: number}} */{
+              font: '',
+              measureText: function measureText() {
+                return { width: 0 };
+              }
+            }
+          );
+        },
+        setMenuElStyle: function setMenuElStyle() /* propertyName: string, value: string */{},
+        setMenuElAttr: function setMenuElAttr() /* attr: string, value: string */{},
+        rmMenuElAttr: function rmMenuElAttr() /* attr: string */{},
+        getMenuElOffsetHeight: function getMenuElOffsetHeight() {
+          return (/* number */0
+          );
+        },
+        openMenu: function openMenu() /* focusIndex: number */{},
+        isMenuOpen: function isMenuOpen() {
+          return (/* boolean */false
+          );
+        },
+        setSelectedTextContent: function setSelectedTextContent() /* textContent: string */{},
+        getNumberOfOptions: function getNumberOfOptions() {
+          return (/* number */0
+          );
+        },
+        getTextForOptionAtIndex: function getTextForOptionAtIndex() {
+          return (/* index: number */ /* string */''
+          );
+        },
+        getValueForOptionAtIndex: function getValueForOptionAtIndex() {
+          return (/* index: number */ /* string */''
+          );
+        },
+        setAttrForOptionAtIndex: function setAttrForOptionAtIndex() /* index: number, attr: string, value: string */{},
+        rmAttrForOptionAtIndex: function rmAttrForOptionAtIndex() /* index: number, attr: string */{},
+        getOffsetTopForOptionAtIndex: function getOffsetTopForOptionAtIndex() {
+          return (/* index: number */ /* number */0
+          );
+        },
+        registerMenuInteractionHandler: function registerMenuInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterMenuInteractionHandler: function deregisterMenuInteractionHandler() /* type: string, handler: EventListener */{},
+        notifyChange: function notifyChange() {},
+        getWindowInnerHeight: function getWindowInnerHeight() {
+          return (/* number */0
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCSelectFoundation(adapter) {
+    _classCallCheck(this, MDCSelectFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCSelectFoundation.__proto__ || Object.getPrototypeOf(MDCSelectFoundation)).call(this, _extends(MDCSelectFoundation.defaultAdapter, adapter)));
+
+    _this.ctx_ = null;
+    _this.selectedIndex_ = -1;
+    _this.disabled_ = false;
+    _this.displayHandler_ = function (evt) {
+      evt.preventDefault();
+      if (!_this.adapter_.isMenuOpen()) {
+        _this.open_();
+      }
+    };
+    _this.displayViaKeyboardHandler_ = function (evt) {
+      return _this.handleDisplayViaKeyboard_(evt);
+    };
+    _this.selectionHandler_ = function (_ref) {
+      var detail = _ref.detail;
+      var index = detail.index;
+
+      _this.close_();
+      if (index !== _this.selectedIndex_) {
+        _this.setSelectedIndex(index);
+        _this.adapter_.notifyChange();
+      }
+    };
+    _this.cancelHandler_ = function () {
+      _this.close_();
+    };
+    return _this;
+  }
+
+  _createClass(MDCSelectFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.ctx_ = this.adapter_.create2dRenderingContext();
+      this.adapter_.registerInteractionHandler('click', this.displayHandler_);
+      this.adapter_.registerInteractionHandler('keydown', this.displayViaKeyboardHandler_);
+      this.adapter_.registerInteractionHandler('keyup', this.displayViaKeyboardHandler_);
+      this.adapter_.registerMenuInteractionHandler(__WEBPACK_IMPORTED_MODULE_2__material_menu__["MDCSimpleMenuFoundation"].strings.SELECTED_EVENT, this.selectionHandler_);
+      this.adapter_.registerMenuInteractionHandler(__WEBPACK_IMPORTED_MODULE_2__material_menu__["MDCSimpleMenuFoundation"].strings.CANCEL_EVENT, this.cancelHandler_);
+      this.resize();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      // Drop reference to context object to prevent potential leaks
+      this.ctx_ = null;
+      this.adapter_.deregisterInteractionHandler('click', this.displayHandler_);
+      this.adapter_.deregisterInteractionHandler('keydown', this.displayViaKeyboardHandler_);
+      this.adapter_.deregisterInteractionHandler('keyup', this.displayViaKeyboardHandler_);
+      this.adapter_.deregisterMenuInteractionHandler(__WEBPACK_IMPORTED_MODULE_2__material_menu__["MDCSimpleMenuFoundation"].strings.SELECTED_EVENT, this.selectionHandler_);
+      this.adapter_.deregisterMenuInteractionHandler(__WEBPACK_IMPORTED_MODULE_2__material_menu__["MDCSimpleMenuFoundation"].strings.CANCEL_EVENT, this.cancelHandler_);
+    }
+  }, {
+    key: 'getValue',
+    value: function getValue() {
+      return this.selectedIndex_ >= 0 ? this.adapter_.getValueForOptionAtIndex(this.selectedIndex_) : '';
+    }
+  }, {
+    key: 'getSelectedIndex',
+    value: function getSelectedIndex() {
+      return this.selectedIndex_;
+    }
+  }, {
+    key: 'setSelectedIndex',
+    value: function setSelectedIndex(index) {
+      var prevSelectedIndex = this.selectedIndex_;
+      if (prevSelectedIndex >= 0) {
+        this.adapter_.rmAttrForOptionAtIndex(this.selectedIndex_, 'aria-selected');
+      }
+
+      this.selectedIndex_ = index >= 0 && index < this.adapter_.getNumberOfOptions() ? index : -1;
+      var selectedTextContent = '';
+      if (this.selectedIndex_ >= 0) {
+        selectedTextContent = this.adapter_.getTextForOptionAtIndex(this.selectedIndex_).trim();
+        this.adapter_.setAttrForOptionAtIndex(this.selectedIndex_, 'aria-selected', 'true');
+      }
+      this.adapter_.setSelectedTextContent(selectedTextContent);
+    }
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.disabled_;
+    }
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(disabled) {
+      var DISABLED = MDCSelectFoundation.cssClasses.DISABLED;
+
+      this.disabled_ = disabled;
+      if (this.disabled_) {
+        this.adapter_.addClass(DISABLED);
+        this.adapter_.setAttr('aria-disabled', 'true');
+        this.adapter_.makeUntabbable();
+      } else {
+        this.adapter_.removeClass(DISABLED);
+        this.adapter_.rmAttr('aria-disabled');
+        this.adapter_.makeTabbable();
+      }
+    }
+  }, {
+    key: 'resize',
+    value: function resize() {
+      var font = this.adapter_.getComputedStyleValue('font');
+      var letterSpacing = parseFloat(this.adapter_.getComputedStyleValue('letter-spacing'));
+      if (font) {
+        this.ctx_.font = font;
+      } else {
+        var primaryFontFamily = this.adapter_.getComputedStyleValue('font-family').split(',')[0];
+        var fontSize = this.adapter_.getComputedStyleValue('font-size');
+        this.ctx_.font = fontSize + ' ' + primaryFontFamily;
+      }
+
+      var maxTextLength = 0;
+      for (var i = 0, l = this.adapter_.getNumberOfOptions(); i < l; i++) {
+        var txt = this.adapter_.getTextForOptionAtIndex(i).trim();
+
+        var _ctx_$measureText = this.ctx_.measureText(txt),
+            width = _ctx_$measureText.width;
+
+        var addedSpace = letterSpacing * txt.length;
+        maxTextLength = Math.max(maxTextLength, Math.ceil(width + addedSpace));
+      }
+      this.adapter_.setStyle('width', maxTextLength + 'px');
+    }
+  }, {
+    key: 'open_',
+    value: function open_() {
+      var OPEN = MDCSelectFoundation.cssClasses.OPEN;
+
+      var focusIndex = this.selectedIndex_ < 0 ? 0 : this.selectedIndex_;
+
+      this.setMenuStylesForOpenAtIndex_(focusIndex);
+      this.adapter_.addClass(OPEN);
+      this.adapter_.openMenu(focusIndex);
+    }
+  }, {
+    key: 'setMenuStylesForOpenAtIndex_',
+    value: function setMenuStylesForOpenAtIndex_(index) {
+      var innerHeight = this.adapter_.getWindowInnerHeight();
+
+      var _adapter_$computeBoun = this.adapter_.computeBoundingRect(),
+          left = _adapter_$computeBoun.left,
+          top = _adapter_$computeBoun.top;
+
+      this.adapter_.setMenuElAttr('aria-hidden', 'true');
+      this.adapter_.setMenuElStyle('display', 'block');
+      var menuHeight = this.adapter_.getMenuElOffsetHeight();
+      var itemOffsetTop = this.adapter_.getOffsetTopForOptionAtIndex(index);
+      this.adapter_.setMenuElStyle('display', '');
+      this.adapter_.rmMenuElAttr('aria-hidden');
+
+      var adjustedTop = top - itemOffsetTop;
+      var overflowsTop = adjustedTop < 0;
+      var overflowsBottom = adjustedTop + menuHeight > innerHeight;
+      if (overflowsTop) {
+        adjustedTop = 0;
+      } else if (overflowsBottom) {
+        adjustedTop = Math.max(0, innerHeight - menuHeight);
+      };
+
+      this.adapter_.setMenuElStyle('left', left + 'px');
+      this.adapter_.setMenuElStyle('top', adjustedTop + 'px');
+      this.adapter_.setMenuElStyle('transform-origin', 'center ' + itemOffsetTop + 'px');
+    }
+  }, {
+    key: 'close_',
+    value: function close_() {
+      var OPEN = MDCSelectFoundation.cssClasses.OPEN;
+
+      this.adapter_.removeClass(OPEN);
+      this.adapter_.focus();
+    }
+  }, {
+    key: 'handleDisplayViaKeyboard_',
+    value: function handleDisplayViaKeyboard_(evt) {
+      // We use a hard-coded 2 instead of Event.AT_TARGET to avoid having to reference a browser
+      // global.
+      var EVENT_PHASE_AT_TARGET = 2;
+      if (evt.eventPhase !== EVENT_PHASE_AT_TARGET) {
+        return;
+      }
+
+      // Prevent pressing space down from scrolling the page
+      var isSpaceDown = evt.type === 'keydown' && (evt.key === 'Space' || evt.keyCode === 32);
+      if (isSpaceDown) {
+        evt.preventDefault();
+      }
+
+      var isOpenerKey = OPENER_KEYS.some(function (_ref2) {
+        var key = _ref2.key,
+            keyCode = _ref2.keyCode,
+            forType = _ref2.forType;
+
+        return evt.type === forType && (evt.key === key || evt.keyCode === keyCode);
+      });
+      if (isOpenerKey) {
+        this.displayHandler_(evt);
+      }
+    }
+  }]);
+
+  return MDCSelectFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCSelectFoundation);
+
+/***/ }),
+/* 63 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var cssClasses = {
+  ROOT: 'mdc-select',
+  OPEN: 'mdc-select--open',
+  DISABLED: 'mdc-select--disabled'
+};
+
+var strings = {
+  CHANGE_EVENT: 'MDCSelect:change'
+};
+
+/***/ }),
+/* 64 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSlider", function() { return MDCSlider; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(65);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSliderFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+var MDCSlider = function (_MDCComponent) {
+  _inherits(MDCSlider, _MDCComponent);
+
+  function MDCSlider() {
+    _classCallCheck(this, MDCSlider);
+
+    return _possibleConstructorReturn(this, (MDCSlider.__proto__ || Object.getPrototypeOf(MDCSlider)).apply(this, arguments));
+  }
+
+  _createClass(MDCSlider, [{
+    key: 'initialize',
+    value: function initialize() {
+      this.thumbContainer_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].THUMB_CONTAINER_SELECTOR);
+      this.track_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].TRACK_SELECTOR);
+      this.pinValueMarker_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].PIN_VALUE_MARKER_SELECTOR);
+      this.trackMarkerContainer_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].TRACK_MARKER_CONTAINER_SELECTOR);
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        getAttribute: function getAttribute(name) {
+          return _this2.root_.getAttribute(name);
+        },
+        setAttribute: function setAttribute(name, value) {
+          return _this2.root_.setAttribute(name, value);
+        },
+        removeAttribute: function removeAttribute(name) {
+          return _this2.root_.removeAttribute(name);
+        },
+        computeBoundingRect: function computeBoundingRect() {
+          return _this2.root_.getBoundingClientRect();
+        },
+        getTabIndex: function getTabIndex() {
+          return _this2.root_.tabIndex;
+        },
+        registerInteractionHandler: function registerInteractionHandler(type, handler) {
+          _this2.root_.addEventListener(type, handler);
+        },
+        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
+          _this2.root_.removeEventListener(type, handler);
+        },
+        registerThumbContainerInteractionHandler: function registerThumbContainerInteractionHandler(type, handler) {
+          _this2.thumbContainer_.addEventListener(type, handler);
+        },
+        deregisterThumbContainerInteractionHandler: function deregisterThumbContainerInteractionHandler(type, handler) {
+          _this2.thumbContainer_.removeEventListener(type, handler);
+        },
+        registerBodyInteractionHandler: function registerBodyInteractionHandler(type, handler) {
+          document.body.addEventListener(type, handler);
+        },
+        deregisterBodyInteractionHandler: function deregisterBodyInteractionHandler(type, handler) {
+          document.body.removeEventListener(type, handler);
+        },
+        registerResizeHandler: function registerResizeHandler(handler) {
+          window.addEventListener('resize', handler);
+        },
+        deregisterResizeHandler: function deregisterResizeHandler(handler) {
+          window.removeEventListener('resize', handler);
+        },
+        notifyInput: function notifyInput() {
+          _this2.emit(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].INPUT_EVENT, _this2);
+        },
+        notifyChange: function notifyChange() {
+          _this2.emit(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].CHANGE_EVENT, _this2);
+        },
+        setThumbContainerStyleProperty: function setThumbContainerStyleProperty(propertyName, value) {
+          _this2.thumbContainer_.style.setProperty(propertyName, value);
+        },
+        setTrackStyleProperty: function setTrackStyleProperty(propertyName, value) {
+          _this2.track_.style.setProperty(propertyName, value);
+        },
+        setMarkerValue: function setMarkerValue(value) {
+          _this2.pinValueMarker_.innerText = value;
+        },
+        appendTrackMarkers: function appendTrackMarkers(numMarkers) {
+          var frag = document.createDocumentFragment();
+          for (var i = 0; i < numMarkers; i++) {
+            var marker = document.createElement('div');
+            marker.classList.add('mdc-slider__track-marker');
+            frag.appendChild(marker);
+          }
+          _this2.trackMarkerContainer_.appendChild(frag);
+        },
+        removeTrackMarkers: function removeTrackMarkers() {
+          while (_this2.trackMarkerContainer_.firstChild) {
+            _this2.trackMarkerContainer_.removeChild(_this2.trackMarkerContainer_.firstChild);
+          }
+        },
+        setLastTrackMarkersStyleProperty: function setLastTrackMarkersStyleProperty(propertyName, value) {
+          // We remove and append new nodes, thus, the last track marker must be dynamically found.
+          var lastTrackMarker = _this2.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].LAST_TRACK_MARKER_SELECTOR);
+          lastTrackMarker.style.setProperty(propertyName, value);
+        },
+        isRTL: function isRTL() {
+          return getComputedStyle(_this2.root_).direction === 'rtl';
+        }
+      });
+    }
+  }, {
+    key: 'initialSyncWithDOM',
+    value: function initialSyncWithDOM() {
+      var origValueNow = parseFloat(this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].ARIA_VALUENOW));
+      this.min = parseFloat(this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].ARIA_VALUEMIN)) || this.min;
+      this.max = parseFloat(this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].ARIA_VALUEMAX)) || this.max;
+      this.step = parseFloat(this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].STEP_DATA_ATTR)) || this.step;
+      this.value = origValueNow || this.value;
+      this.disabled = this.root_.hasAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].ARIA_DISABLED) && this.root_.getAttribute(__WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */].ARIA_DISABLED) !== 'false';
+      this.foundation_.setupTrackMarker();
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      this.foundation_.layout();
+    }
+  }, {
+    key: 'stepUp',
+    value: function stepUp() {
+      var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.step || 1;
+
+      this.value += amount;
+    }
+  }, {
+    key: 'stepDown',
+    value: function stepDown() {
+      var amount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.step || 1;
+
+      this.value -= amount;
+    }
+  }, {
+    key: 'value',
+    get: function get() {
+      return this.foundation_.getValue();
+    },
+    set: function set(value) {
+      this.foundation_.setValue(value);
+    }
+  }, {
+    key: 'min',
+    get: function get() {
+      return this.foundation_.getMin();
+    },
+    set: function set(min) {
+      this.foundation_.setMin(min);
+    }
+  }, {
+    key: 'max',
+    get: function get() {
+      return this.foundation_.getMax();
+    },
+    set: function set(max) {
+      this.foundation_.setMax(max);
+    }
+  }, {
+    key: 'step',
+    get: function get() {
+      return this.foundation_.getStep();
+    },
+    set: function set(step) {
+      this.foundation_.setStep(step);
+    }
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    },
+    set: function set(disabled) {
+      this.foundation_.setDisabled(disabled);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCSlider(root);
+    }
+  }]);
+
+  return MDCSlider;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 65 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_animation__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_base_foundation__ = __webpack_require__(1);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ *you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+var KEY_IDS = {
+  ARROW_LEFT: 'ArrowLeft',
+  ARROW_RIGHT: 'ArrowRight',
+  ARROW_UP: 'ArrowUp',
+  ARROW_DOWN: 'ArrowDown',
+  HOME: 'Home',
+  END: 'End',
+  PAGE_UP: 'PageUp',
+  PAGE_DOWN: 'PageDown'
+};
+
+var MDCSliderFoundation = function (_MDCFoundation) {
+  _inherits(MDCSliderFoundation, _MDCFoundation);
+
+  _createClass(MDCSliderFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */];
+    }
+  }, {
+    key: 'numbers',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_0__constants__["b" /* numbers */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        hasClass: function hasClass() {
+          return (/* className: string */ /* boolean */false
+          );
+        },
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        getAttribute: function getAttribute() {
+          return (/* name: string */ /* string|null */null
+          );
+        },
+        setAttribute: function setAttribute() /* name: string, value: string */{},
+        removeAttribute: function removeAttribute() /* name: string */{},
+        computeBoundingRect: function computeBoundingRect() {
+          return (/* ClientRect */{
+              top: 0, right: 0, bottom: 0, left: 0, width: 0, height: 0
+            }
+          );
+        },
+        getTabIndex: function getTabIndex() {
+          return (/* number */0
+          );
+        },
+        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
+        registerThumbContainerInteractionHandler: function registerThumbContainerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterThumbContainerInteractionHandler: function deregisterThumbContainerInteractionHandler() /* type: string, handler: EventListener */{},
+        registerBodyInteractionHandler: function registerBodyInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterBodyInteractionHandler: function deregisterBodyInteractionHandler() /* type: string, handler: EventListener */{},
+        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
+        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
+        notifyInput: function notifyInput() {},
+        notifyChange: function notifyChange() {},
+        setThumbContainerStyleProperty: function setThumbContainerStyleProperty() /* propertyName: string, value: string */{},
+        setTrackStyleProperty: function setTrackStyleProperty() /* propertyName: string, value: string */{},
+        setMarkerValue: function setMarkerValue() /* value: number */{},
+        appendTrackMarkers: function appendTrackMarkers() /* numMarkers: number */{},
+        removeTrackMarkers: function removeTrackMarkers() {},
+        setLastTrackMarkersStyleProperty: function setLastTrackMarkersStyleProperty() /* propertyName: string, value: string */{},
+        isRTL: function isRTL() {
+          return (/* boolean */false
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCSliderFoundation() {
+    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+    _classCallCheck(this, MDCSliderFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCSliderFoundation.__proto__ || Object.getPrototypeOf(MDCSliderFoundation)).call(this, _extends(MDCSliderFoundation.defaultAdapter, adapter)));
+
+    _this.rect_ = null;
+    // We set this to NaN since we want it to be a number, but we can't use '0' or '-1'
+    // because those could be valid tabindices set by the client code.
+    _this.savedTabIndex_ = NaN;
+    _this.off_ = false;
+    _this.active_ = false;
+    _this.inTransit_ = false;
+    _this.isDiscrete_ = false;
+    _this.hasTrackMarker_ = false;
+    _this.handlingThumbTargetEvt_ = false;
+    _this.min_ = 0;
+    _this.max_ = 100;
+    _this.step_ = 0;
+    _this.value_ = 0;
+    _this.disabled_ = false;
+    _this.preventFocusState_ = false;
+    _this.updateUIFrame_ = 0;
+    _this.thumbContainerPointerHandler_ = function () {
+      _this.handlingThumbTargetEvt_ = true;
+    };
+    _this.mousedownHandler_ = _this.createDownHandler_('mousemove', 'mouseup');
+    _this.pointerdownHandler_ = _this.createDownHandler_('pointermove', 'pointerup');
+    _this.touchstartHandler_ = _this.createDownHandler_('touchmove', 'touchend', function (_ref) {
+      var targetTouches = _ref.targetTouches;
+      return targetTouches[0].pageX;
+    });
+    _this.keydownHandler_ = function (evt) {
+      return _this.handleKeydown_(evt);
+    };
+    _this.focusHandler_ = function () {
+      return _this.handleFocus_();
+    };
+    _this.blurHandler_ = function () {
+      return _this.handleBlur_();
+    };
+    _this.resizeHandler_ = function () {
+      return _this.layout();
+    };
+    return _this;
+  }
+
+  _createClass(MDCSliderFoundation, [{
+    key: 'init',
+    value: function init() {
+      var _this2 = this;
+
+      this.isDiscrete_ = this.adapter_.hasClass(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].IS_DISCRETE);
+      this.hasTrackMarker_ = this.adapter_.hasClass(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].HAS_TRACK_MARKER);
+      this.adapter_.registerInteractionHandler('mousedown', this.mousedownHandler_);
+      this.adapter_.registerInteractionHandler('pointerdown', this.pointerdownHandler_);
+      this.adapter_.registerInteractionHandler('touchstart', this.touchstartHandler_);
+      this.adapter_.registerInteractionHandler('keydown', this.keydownHandler_);
+      this.adapter_.registerInteractionHandler('focus', this.focusHandler_);
+      this.adapter_.registerInteractionHandler('blur', this.blurHandler_);
+      ['mousedown', 'pointerdown', 'touchstart'].forEach(function (evtName) {
+        _this2.adapter_.registerThumbContainerInteractionHandler(evtName, _this2.thumbContainerPointerHandler_);
+      });
+      this.adapter_.registerResizeHandler(this.resizeHandler_);
+      this.layout();
+      // At last step, provide a reasonable default value to discrete slider
+      if (this.isDiscrete_ && this.getStep() == 0) {
+        this.setStep(1);
+      }
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      var _this3 = this;
+
+      this.adapter_.deregisterInteractionHandler('mousedown', this.mousedownHandler_);
+      this.adapter_.deregisterInteractionHandler('pointerdown', this.mousedownHandler_);
+      this.adapter_.deregisterInteractionHandler('touchstart', this.mousedownHandler_);
+      this.adapter_.deregisterInteractionHandler('keydown', this.keydownHandler_);
+      this.adapter_.deregisterInteractionHandler('focus', this.focusHandler_);
+      this.adapter_.deregisterInteractionHandler('blur', this.blurHandler_);
+      ['mousedown', 'pointerdown', 'touchstart'].forEach(function (evtName) {
+        _this3.adapter_.deregisterThumbContainerInteractionHandler(evtName, _this3.thumbContainerPointerHandler_);
+      });
+      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
+    }
+  }, {
+    key: 'setupTrackMarker',
+    value: function setupTrackMarker() {
+      if (this.isDiscrete_ && this.hasTrackMarker_ && this.getStep() != 0) {
+        var min = this.getMin();
+        var max = this.getMax();
+        var step = this.getStep();
+        var numMarkers = (max - min) / step;
+
+        // In case distance between max & min is indivisible to step,
+        // we place the secondary to last marker proportionally at where thumb
+        // could reach and place the last marker at max value
+        var indivisible = Math.ceil(numMarkers) !== numMarkers;
+        if (indivisible) {
+          numMarkers = Math.ceil(numMarkers);
+        }
+
+        this.adapter_.removeTrackMarkers();
+        this.adapter_.appendTrackMarkers(numMarkers);
+
+        if (indivisible) {
+          var lastStepRatio = (max - numMarkers * step) / step + 1;
+          var flex = Object(__WEBPACK_IMPORTED_MODULE_1__material_animation__["b" /* getCorrectPropertyName */])(window, 'flex');
+          this.adapter_.setLastTrackMarkersStyleProperty(flex, lastStepRatio);
+        }
+      }
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      this.rect_ = this.adapter_.computeBoundingRect();
+      this.updateUIForCurrentValue_();
+    }
+  }, {
+    key: 'getValue',
+    value: function getValue() {
+      return this.value_;
+    }
+  }, {
+    key: 'setValue',
+    value: function setValue(value) {
+      this.setValue_(value, false);
+    }
+  }, {
+    key: 'getMax',
+    value: function getMax() {
+      return this.max_;
+    }
+  }, {
+    key: 'setMax',
+    value: function setMax(max) {
+      if (max < this.min_) {
+        throw new Error('Cannot set max to be less than the slider\'s minimum value');
+      }
+      this.max_ = max;
+      this.setValue_(this.value_, false, true);
+      this.adapter_.setAttribute(__WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */].ARIA_VALUEMAX, String(this.max_));
+      this.setupTrackMarker();
+    }
+  }, {
+    key: 'getMin',
+    value: function getMin() {
+      return this.min_;
+    }
+  }, {
+    key: 'setMin',
+    value: function setMin(min) {
+      if (min > this.max_) {
+        throw new Error('Cannot set min to be greater than the slider\'s maximum value');
+      }
+      this.min_ = min;
+      this.setValue_(this.value_, false, true);
+      this.adapter_.setAttribute(__WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */].ARIA_VALUEMIN, String(this.min_));
+      this.setupTrackMarker();
+    }
+  }, {
+    key: 'getStep',
+    value: function getStep() {
+      return this.step_;
+    }
+  }, {
+    key: 'setStep',
+    value: function setStep(step) {
+      if (step < 0) {
+        throw new Error('Step cannot be set to a negative number');
+      }
+      if (this.isDiscrete_ && (typeof step !== 'number' || step < 1)) {
+        step = 1;
+      }
+      this.step_ = step;
+      this.setValue_(this.value_, false, true);
+      this.setupTrackMarker();
+    }
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.disabled_;
+    }
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(disabled) {
+      this.disabled_ = disabled;
+      this.toggleClass_(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].DISABLED, this.disabled_);
+      if (this.disabled_) {
+        this.savedTabIndex_ = this.adapter_.getTabIndex();
+        this.adapter_.setAttribute(__WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */].ARIA_DISABLED, 'true');
+        this.adapter_.removeAttribute('tabindex');
+      } else {
+        this.adapter_.removeAttribute(__WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */].ARIA_DISABLED);
+        if (!isNaN(this.savedTabIndex_)) {
+          this.adapter_.setAttribute('tabindex', String(this.savedTabIndex_));
+        }
+      }
+    }
+  }, {
+    key: 'createDownHandler_',
+    value: function createDownHandler_(moveEvt, upEvt) {
+      var _this4 = this;
+
+      var getPageX = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (_ref2) {
+        var pageX = _ref2.pageX;
+        return pageX;
+      };
+
+      var moveHandler = function moveHandler(evt) {
+        evt.preventDefault();
+        _this4.setValueFromEvt_(evt, getPageX);
+      };
+
+      var upHandler = function upHandler() {
+        _this4.setActive_(false);
+        _this4.adapter_.deregisterBodyInteractionHandler(moveEvt, moveHandler);
+        _this4.adapter_.deregisterBodyInteractionHandler(upEvt, upHandler);
+        _this4.adapter_.notifyChange();
+      };
+
+      var downHandler = function downHandler(evt) {
+        if (_this4.disabled_) {
+          return;
+        }
+
+        _this4.preventFocusState_ = true;
+        _this4.setInTransit_(!_this4.handlingThumbTargetEvt_);
+        _this4.handlingThumbTargetEvt_ = false;
+
+        _this4.setActive_(true);
+
+        _this4.adapter_.registerBodyInteractionHandler(moveEvt, moveHandler);
+        _this4.adapter_.registerBodyInteractionHandler(upEvt, upHandler);
+        _this4.setValueFromEvt_(evt, getPageX);
+      };
+
+      return downHandler;
+    }
+  }, {
+    key: 'setValueFromEvt_',
+    value: function setValueFromEvt_(evt, getPageX) {
+      var pageX = getPageX(evt);
+      var value = this.computeValueFromPageX_(pageX);
+      this.setValue_(value, true);
+    }
+  }, {
+    key: 'computeValueFromPageX_',
+    value: function computeValueFromPageX_(pageX) {
+      var max = this.max_,
+          min = this.min_;
+
+      var xPos = pageX - this.rect_.left;
+      var pctComplete = xPos / this.rect_.width;
+      if (this.adapter_.isRTL()) {
+        pctComplete = 1 - pctComplete;
+      }
+      // Fit the percentage complete between the range [min,max]
+      // by remapping from [0, 1] to [min, min+(max-min)].
+      return min + pctComplete * (max - min);
+    }
+  }, {
+    key: 'handleKeydown_',
+    value: function handleKeydown_(evt) {
+      var keyId = this.getKeyId_(evt);
+      var value = this.getValueForKeyId_(keyId);
+      if (isNaN(value)) {
+        return;
+      }
+
+      // Prevent page from scrolling due to key presses that would normally scroll the page
+      evt.preventDefault();
+      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].FOCUS);
+      this.setValue_(value, true);
+      this.adapter_.notifyChange();
+    }
+  }, {
+    key: 'getKeyId_',
+    value: function getKeyId_(kbdEvt) {
+      switch (kbdEvt.key || kbdEvt.keyCode) {
+        case KEY_IDS.ARROW_LEFT:
+        case 37:
+          return KEY_IDS.ARROW_LEFT;
+        case KEY_IDS.ARROW_RIGHT:
+        case 39:
+          return KEY_IDS.ARROW_RIGHT;
+        case KEY_IDS.ARROW_UP:
+        case 38:
+          return KEY_IDS.ARROW_UP;
+        case KEY_IDS.ARROW_DOWN:
+        case 40:
+          return KEY_IDS.ARROW_DOWN;
+        case KEY_IDS.HOME:
+        case 36:
+          return KEY_IDS.HOME;
+        case KEY_IDS.END:
+        case 35:
+          return KEY_IDS.END;
+        case KEY_IDS.PAGE_UP:
+        case 33:
+          return KEY_IDS.PAGE_UP;
+        case KEY_IDS.PAGE_DOWN:
+        case 34:
+          return KEY_IDS.PAGE_DOWN;
+        default:
+          // Doesn't matter
+          return '';
+      }
+    }
+  }, {
+    key: 'getValueForKeyId_',
+    value: function getValueForKeyId_(keyId) {
+      var max = this.max_,
+          min = this.min_,
+          step = this.step_;
+
+      var delta = step || (max - min) / 100;
+      var valueNeedsToBeFlipped = this.adapter_.isRTL() && (keyId === KEY_IDS.ARROW_LEFT || keyId === KEY_IDS.ARROW_RIGHT);
+      if (valueNeedsToBeFlipped) {
+        delta = -delta;
+      }
+
+      switch (keyId) {
+        case KEY_IDS.ARROW_LEFT:
+        case KEY_IDS.ARROW_DOWN:
+          return this.value_ - delta;
+        case KEY_IDS.ARROW_RIGHT:
+        case KEY_IDS.ARROW_UP:
+          return this.value_ + delta;
+        case KEY_IDS.HOME:
+          return this.min_;
+        case KEY_IDS.END:
+          return this.max_;
+        case KEY_IDS.PAGE_UP:
+          return this.value_ + delta * __WEBPACK_IMPORTED_MODULE_0__constants__["b" /* numbers */].PAGE_FACTOR;
+        case KEY_IDS.PAGE_DOWN:
+          return this.value_ - delta * __WEBPACK_IMPORTED_MODULE_0__constants__["b" /* numbers */].PAGE_FACTOR;
+        default:
+          return NaN;
+      }
+    }
+  }, {
+    key: 'handleFocus_',
+    value: function handleFocus_() {
+      if (this.preventFocusState_) {
+        return;
+      }
+      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].FOCUS);
+    }
+  }, {
+    key: 'handleBlur_',
+    value: function handleBlur_() {
+      this.preventFocusState_ = false;
+      this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].FOCUS);
+    }
+  }, {
+    key: 'setValue_',
+    value: function setValue_(value, shouldFireInput) {
+      var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
+
+      if (value === this.value_ && !force) {
+        return;
+      }
+
+      var min = this.min_,
+          max = this.max_;
+
+      var valueSetToBoundary = value === min || value === max;
+      if (this.step_ && !valueSetToBoundary) {
+        value = this.quantize_(value);
+      }
+      if (value < min) {
+        value = min;
+      } else if (value > max) {
+        value = max;
+      }
+      this.value_ = value;
+      this.adapter_.setAttribute(__WEBPACK_IMPORTED_MODULE_0__constants__["c" /* strings */].ARIA_VALUENOW, String(this.value_));
+      this.updateUIForCurrentValue_();
+
+      if (shouldFireInput) {
+        this.adapter_.notifyInput();
+        if (this.isDiscrete_) {
+          this.adapter_.setMarkerValue(value);
+        }
+      }
+    }
+  }, {
+    key: 'quantize_',
+    value: function quantize_(value) {
+      var numSteps = Math.round(value / this.step_);
+      var quantizedVal = numSteps * this.step_;
+      return quantizedVal;
+    }
+  }, {
+    key: 'updateUIForCurrentValue_',
+    value: function updateUIForCurrentValue_() {
+      var _this5 = this;
+
+      var max = this.max_,
+          min = this.min_,
+          value = this.value_;
+
+      var pctComplete = (value - min) / (max - min);
+      var translatePx = pctComplete * this.rect_.width;
+      if (this.adapter_.isRTL()) {
+        translatePx = this.rect_.width - translatePx;
+      }
+
+      var transformProp = Object(__WEBPACK_IMPORTED_MODULE_1__material_animation__["b" /* getCorrectPropertyName */])(window, 'transform');
+      var transitionendEvtName = Object(__WEBPACK_IMPORTED_MODULE_1__material_animation__["a" /* getCorrectEventName */])(window, 'transitionend');
+
+      if (this.inTransit_) {
+        var onTransitionEnd = function onTransitionEnd() {
+          _this5.setInTransit_(false);
+          _this5.adapter_.deregisterThumbContainerInteractionHandler(transitionendEvtName, onTransitionEnd);
+        };
+        this.adapter_.registerThumbContainerInteractionHandler(transitionendEvtName, onTransitionEnd);
+      }
+
+      this.updateUIFrame_ = requestAnimationFrame(function () {
+        _this5.setOff_(pctComplete === 0);
+        // NOTE(traviskaufman): It would be nice to use calc() here,
+        // but IE cannot handle calcs in transforms correctly.
+        // See: https://goo.gl/NC2itk
+        // Also note that the -50% offset is used to center the slider thumb.
+        _this5.adapter_.setThumbContainerStyleProperty(transformProp, 'translateX(' + translatePx + 'px) translateX(-50%)');
+        _this5.adapter_.setTrackStyleProperty(transformProp, 'scaleX(' + pctComplete + ')');
+      });
+    }
+  }, {
+    key: 'setOff_',
+    value: function setOff_(off) {
+      this.off_ = off;
+      this.toggleClass_(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].OFF, this.off_);
+    }
+  }, {
+    key: 'setActive_',
+    value: function setActive_(active) {
+      this.active_ = active;
+      this.toggleClass_(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].ACTIVE, this.active_);
+    }
+  }, {
+    key: 'setInTransit_',
+    value: function setInTransit_(inTransit) {
+      this.inTransit_ = inTransit;
+      this.toggleClass_(__WEBPACK_IMPORTED_MODULE_0__constants__["a" /* cssClasses */].IN_TRANSIT, this.inTransit_);
+    }
+  }, {
+    key: 'toggleClass_',
+    value: function toggleClass_(className, shouldBePresent) {
+      if (shouldBePresent) {
+        this.adapter_.addClass(className);
+      } else {
+        this.adapter_.removeClass(className);
+      }
+    }
+  }]);
+
+  return MDCSliderFoundation;
+}(__WEBPACK_IMPORTED_MODULE_2__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCSliderFoundation);
+
+/***/ }),
+/* 66 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSnackbar", function() { return MDCSnackbar; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(67);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_animation__ = __webpack_require__(5);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCSnackbarFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+var MDCSnackbar = function (_MDCComponent) {
+  _inherits(MDCSnackbar, _MDCComponent);
+
+  function MDCSnackbar() {
+    _classCallCheck(this, MDCSnackbar);
+
+    return _possibleConstructorReturn(this, (MDCSnackbar.__proto__ || Object.getPrototypeOf(MDCSnackbar)).apply(this, arguments));
+  }
+
+  _createClass(MDCSnackbar, [{
+    key: 'show',
+    value: function show(data) {
+      this.foundation_.show(data);
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      var _MDCSnackbarFoundatio = __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings,
+          TEXT_SELECTOR = _MDCSnackbarFoundatio.TEXT_SELECTOR,
+          ACTION_BUTTON_SELECTOR = _MDCSnackbarFoundatio.ACTION_BUTTON_SELECTOR;
+
+      var getText = function getText() {
+        return _this2.root_.querySelector(TEXT_SELECTOR);
+      };
+      var getActionButton = function getActionButton() {
+        return _this2.root_.querySelector(ACTION_BUTTON_SELECTOR);
+      };
+
+      /* eslint brace-style: "off" */
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        setAriaHidden: function setAriaHidden() {
+          return _this2.root_.setAttribute('aria-hidden', 'true');
+        },
+        unsetAriaHidden: function unsetAriaHidden() {
+          return _this2.root_.removeAttribute('aria-hidden');
+        },
+        setActionAriaHidden: function setActionAriaHidden() {
+          return getActionButton().setAttribute('aria-hidden', 'true');
+        },
+        unsetActionAriaHidden: function unsetActionAriaHidden() {
+          return getActionButton().removeAttribute('aria-hidden');
+        },
+        setActionText: function setActionText(text) {
+          getActionButton().textContent = text;
+        },
+        setMessageText: function setMessageText(text) {
+          getText().textContent = text;
+        },
+        setFocus: function setFocus() {
+          return getActionButton().focus();
+        },
+        visibilityIsHidden: function visibilityIsHidden() {
+          return document.hidden;
+        },
+        registerCapturedBlurHandler: function registerCapturedBlurHandler(handler) {
+          return getActionButton().addEventListener('blur', handler, true);
+        },
+        deregisterCapturedBlurHandler: function deregisterCapturedBlurHandler(handler) {
+          return getActionButton().removeEventListener('blur', handler, true);
+        },
+        registerVisibilityChangeHandler: function registerVisibilityChangeHandler(handler) {
+          return document.addEventListener('visibilitychange', handler);
+        },
+        deregisterVisibilityChangeHandler: function deregisterVisibilityChangeHandler(handler) {
+          return document.removeEventListener('visibilitychange', handler);
+        },
+        registerCapturedInteractionHandler: function registerCapturedInteractionHandler(evt, handler) {
+          return document.body.addEventListener(evt, handler, true);
+        },
+        deregisterCapturedInteractionHandler: function deregisterCapturedInteractionHandler(evt, handler) {
+          return document.body.removeEventListener(evt, handler, true);
+        },
+        registerActionClickHandler: function registerActionClickHandler(handler) {
+          return getActionButton().addEventListener('click', handler);
+        },
+        deregisterActionClickHandler: function deregisterActionClickHandler(handler) {
+          return getActionButton().removeEventListener('click', handler);
+        },
+        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
+          return _this2.root_.addEventListener(Object(__WEBPACK_IMPORTED_MODULE_2__material_animation__["a" /* getCorrectEventName */])(window, 'transitionend'), handler);
+        },
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
+          return _this2.root_.removeEventListener(Object(__WEBPACK_IMPORTED_MODULE_2__material_animation__["a" /* getCorrectEventName */])(window, 'transitionend'), handler);
+        }
+      });
+    }
+  }, {
+    key: 'dismissesOnAction',
+    get: function get() {
+      return this.foundation_.dismissesOnAction();
+    },
+    set: function set(dismissesOnAction) {
+      this.foundation_.setDismissOnAction(dismissesOnAction);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCSnackbar(root);
+    }
+  }]);
+
+  return MDCSnackbar;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 67 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(68);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCSnackbarFoundation = function (_MDCFoundation) {
+  _inherits(MDCSnackbarFoundation, _MDCFoundation);
+
+  _createClass(MDCSnackbarFoundation, [{
+    key: 'active',
+    get: function get() {
+      return this.active_;
+    }
+  }], [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        setAriaHidden: function setAriaHidden() {},
+        unsetAriaHidden: function unsetAriaHidden() {},
+        setActionAriaHidden: function setActionAriaHidden() {},
+        unsetActionAriaHidden: function unsetActionAriaHidden() {},
+        setActionText: function setActionText() /* actionText: string */{},
+        setMessageText: function setMessageText() /* message: string */{},
+        setFocus: function setFocus() {},
+        visibilityIsHidden: function visibilityIsHidden() {
+          return (/* boolean */false
+          );
+        },
+        registerCapturedBlurHandler: function registerCapturedBlurHandler() /* handler: EventListener */{},
+        deregisterCapturedBlurHandler: function deregisterCapturedBlurHandler() /* handler: EventListener */{},
+        registerVisibilityChangeHandler: function registerVisibilityChangeHandler() /* handler: EventListener */{},
+        deregisterVisibilityChangeHandler: function deregisterVisibilityChangeHandler() /* handler: EventListener */{},
+        registerCapturedInteractionHandler: function registerCapturedInteractionHandler() /* evtType: string, handler: EventListener */{},
+        deregisterCapturedInteractionHandler: function deregisterCapturedInteractionHandler() /* evtType: string, handler: EventListener */{},
+        registerActionClickHandler: function registerActionClickHandler() /* handler: EventListener */{},
+        deregisterActionClickHandler: function deregisterActionClickHandler() /* handler: EventListener */{},
+        registerTransitionEndHandler: function registerTransitionEndHandler() /* handler: EventListener */{},
+        deregisterTransitionEndHandler: function deregisterTransitionEndHandler() /* handler: EventListener */{}
+      };
+    }
+  }]);
+
+  function MDCSnackbarFoundation(adapter) {
+    _classCallCheck(this, MDCSnackbarFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCSnackbarFoundation.__proto__ || Object.getPrototypeOf(MDCSnackbarFoundation)).call(this, _extends(MDCSnackbarFoundation.defaultAdapter, adapter)));
+
+    _this.active_ = false;
+    _this.actionWasClicked_ = false;
+    _this.dismissOnAction_ = true;
+    _this.firstFocus_ = true;
+    _this.pointerDownRecognized_ = false;
+    _this.snackbarHasFocus_ = false;
+    _this.snackbarData_ = null;
+    _this.queue_ = [];
+    _this.actionClickHandler_ = function () {
+      _this.actionWasClicked_ = true;
+      _this.invokeAction_();
+    };
+    _this.visibilitychangeHandler_ = function () {
+      clearTimeout(_this.timeoutId_);
+      _this.snackbarHasFocus_ = true;
+
+      if (!_this.adapter_.visibilityIsHidden()) {
+        setTimeout(_this.cleanup_.bind(_this), _this.snackbarData_.timeout || __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* numbers */].MESSAGE_TIMEOUT);
+      }
+    };
+    _this.interactionHandler_ = function (evt) {
+      if (evt.type == 'touchstart' || evt.type == 'mousedown') {
+        _this.pointerDownRecognized_ = true;
+      }
+      _this.handlePossibleTabKeyboardFocus_(evt);
+
+      if (evt.type == 'focus') {
+        _this.pointerDownRecognized_ = false;
+      }
+    };
+    _this.blurHandler_ = function () {
+      clearTimeout(_this.timeoutId_);
+      _this.snackbarHasFocus_ = false;
+      _this.timeoutId_ = setTimeout(_this.cleanup_.bind(_this), _this.snackbarData_.timeout || __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* numbers */].MESSAGE_TIMEOUT);
+    };
+    return _this;
+  }
+
+  _createClass(MDCSnackbarFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.registerActionClickHandler(this.actionClickHandler_);
+      this.adapter_.setAriaHidden();
+      this.adapter_.setActionAriaHidden();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      var _this2 = this;
+
+      this.adapter_.deregisterActionClickHandler(this.actionClickHandler_);
+      this.adapter_.deregisterCapturedBlurHandler(this.blurHandler_);
+      this.adapter_.deregisterVisibilityChangeHandler(this.visibilitychangeHandler_);
+      ['touchstart', 'mousedown', 'focus'].forEach(function (evtType) {
+        _this2.adapter_.deregisterCapturedInteractionHandler(evtType, _this2.interactionHandler_);
+      });
+    }
+  }, {
+    key: 'dismissesOnAction',
+    value: function dismissesOnAction() {
+      return this.dismissOnAction_;
+    }
+  }, {
+    key: 'setDismissOnAction',
+    value: function setDismissOnAction(dismissOnAction) {
+      this.dismissOnAction_ = !!dismissOnAction;
+    }
+  }, {
+    key: 'show',
+    value: function show(data) {
+      var _this3 = this;
+
+      clearTimeout(this.timeoutId_);
+      this.snackbarData_ = data;
+      this.firstFocus_ = true;
+      this.adapter_.registerVisibilityChangeHandler(this.visibilitychangeHandler_);
+      this.adapter_.registerCapturedBlurHandler(this.blurHandler_);
+      ['touchstart', 'mousedown', 'focus'].forEach(function (evtType) {
+        _this3.adapter_.registerCapturedInteractionHandler(evtType, _this3.interactionHandler_);
+      });
+
+      if (!this.snackbarData_) {
+        throw new Error('Please provide a data object with at least a message to display.');
+      }
+      if (!this.snackbarData_.message) {
+        throw new Error('Please provide a message to be displayed.');
+      }
+      if (this.snackbarData_.actionHandler && !this.snackbarData_.actionText) {
+        throw new Error('Please provide action text with the handler.');
+      }
+      if (this.active) {
+        this.queue_.push(this.snackbarData_);
+      }
+
+      var ACTIVE = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTIVE,
+          MULTILINE = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].MULTILINE,
+          ACTION_ON_BOTTOM = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTION_ON_BOTTOM;
+
+
+      this.adapter_.setMessageText(this.snackbarData_.message);
+
+      if (this.snackbarData_.multiline) {
+        this.adapter_.addClass(MULTILINE);
+        if (this.snackbarData_.actionOnBottom) {
+          this.adapter_.addClass(ACTION_ON_BOTTOM);
+        }
+      }
+
+      if (this.snackbarData_.actionHandler) {
+        this.adapter_.setActionText(this.snackbarData_.actionText);
+        this.actionHandler_ = this.snackbarData_.actionHandler;
+        this.setActionHidden_(false);
+      } else {
+        this.setActionHidden_(true);
+        this.actionHandler_ = null;
+        this.adapter_.setActionText(null);
+      }
+
+      this.active_ = true;
+      this.adapter_.addClass(ACTIVE);
+      this.adapter_.unsetAriaHidden();
+
+      this.timeoutId_ = setTimeout(this.cleanup_.bind(this), this.snackbarData_.timeout || __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* numbers */].MESSAGE_TIMEOUT);
+    }
+  }, {
+    key: 'handlePossibleTabKeyboardFocus_',
+    value: function handlePossibleTabKeyboardFocus_() {
+      var hijackFocus = this.firstFocus_ && !this.pointerDownRecognized_;
+
+      if (hijackFocus) {
+        this.setFocusOnAction_();
+      }
+
+      this.firstFocus_ = false;
+    }
+  }, {
+    key: 'setFocusOnAction_',
+    value: function setFocusOnAction_() {
+      this.adapter_.setFocus();
+      this.snackbarHasFocus_ = true;
+      this.firstFocus_ = false;
+    }
+  }, {
+    key: 'invokeAction_',
+    value: function invokeAction_() {
+      try {
+        if (!this.actionHandler_) {
+          return;
+        }
+
+        this.actionHandler_();
+      } finally {
+        if (this.dismissOnAction_) {
+          this.cleanup_();
+        }
+      }
+    }
+  }, {
+    key: 'cleanup_',
+    value: function cleanup_() {
+      var _this4 = this;
+
+      var allowDismissal = !this.snackbarHasFocus_ || this.actionWasClicked_;
+
+      if (allowDismissal) {
+        var ACTIVE = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTIVE,
+            MULTILINE = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].MULTILINE,
+            ACTION_ON_BOTTOM = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTION_ON_BOTTOM;
+
+
+        this.adapter_.removeClass(ACTIVE);
+
+        var handler = function handler() {
+          clearTimeout(_this4.timeoutId_);
+          _this4.adapter_.deregisterTransitionEndHandler(handler);
+          _this4.adapter_.removeClass(MULTILINE);
+          _this4.adapter_.removeClass(ACTION_ON_BOTTOM);
+          _this4.setActionHidden_(true);
+          _this4.adapter_.setAriaHidden();
+          _this4.active_ = false;
+          _this4.snackbarHasFocus_ = false;
+          _this4.showNext_();
+        };
+
+        this.adapter_.registerTransitionEndHandler(handler);
+      }
+    }
+  }, {
+    key: 'showNext_',
+    value: function showNext_() {
+      if (!this.queue_.length) {
+        return;
+      }
+      this.show(this.queue_.shift());
+    }
+  }, {
+    key: 'setActionHidden_',
+    value: function setActionHidden_(isHidden) {
+      if (isHidden) {
+        this.adapter_.setActionAriaHidden();
+      } else {
+        this.adapter_.unsetActionAriaHidden();
+      }
+    }
+  }]);
+
+  return MDCSnackbarFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCSnackbarFoundation);
+
+/***/ }),
+/* 68 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+var cssClasses = {
+  ROOT: 'mdc-snackbar',
+  TEXT: 'mdc-snackbar__text',
+  ACTION_WRAPPER: 'mdc-snackbar__action-wrapper',
+  ACTION_BUTTON: 'mdc-snackbar__action-button',
+  ACTIVE: 'mdc-snackbar--active',
+  MULTILINE: 'mdc-snackbar--multiline',
+  ACTION_ON_BOTTOM: 'mdc-snackbar--action-on-bottom'
+};
+
+var strings = {
+  TEXT_SELECTOR: '.mdc-snackbar__text',
+  ACTION_WRAPPER_SELECTOR: '.mdc-snackbar__action-wrapper',
+  ACTION_BUTTON_SELECTOR: '.mdc-snackbar__action-button'
+};
+
+var numbers = {
+  MESSAGE_TIMEOUT: 2750
+};
+
+/***/ }),
+/* 69 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__tab__ = __webpack_require__(13);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTabFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__tab__["b"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTab", function() { return __WEBPACK_IMPORTED_MODULE_0__tab__["a"]; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__tab_bar__ = __webpack_require__(15);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTabBarFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__tab_bar__["b"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTabBar", function() { return __WEBPACK_IMPORTED_MODULE_1__tab_bar__["a"]; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__tab_bar_scroller__ = __webpack_require__(73);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTabBarScrollerFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__tab_bar_scroller__["b"]; });
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTabBarScroller", function() { return __WEBPACK_IMPORTED_MODULE_2__tab_bar_scroller__["a"]; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(14);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCTabFoundation = function (_MDCFoundation) {
+  _inherits(MDCTabFoundation, _MDCFoundation);
+
+  _createClass(MDCTabFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
+        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
+        getOffsetWidth: function getOffsetWidth() {
+          return (/* number */0
+          );
+        },
+        getOffsetLeft: function getOffsetLeft() {
+          return (/* number */0
+          );
+        },
+        notifySelected: function notifySelected() {}
+      };
+    }
+  }]);
+
+  function MDCTabFoundation() {
+    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+    _classCallCheck(this, MDCTabFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCTabFoundation.__proto__ || Object.getPrototypeOf(MDCTabFoundation)).call(this, _extends(MDCTabFoundation.defaultAdapter, adapter)));
+
+    _this.computedWidth_ = 0;
+    _this.computedLeft_ = 0;
+    _this.isActive_ = false;
+    _this.preventDefaultOnClick_ = false;
+
+    _this.clickHandler_ = function (evt) {
+      if (_this.preventDefaultOnClick_) {
+        evt.preventDefault();
+      }
+      _this.adapter_.notifySelected();
+    };
+
+    _this.keydownHandler_ = function (evt) {
+      if (evt.key && evt.key === 'Enter' || evt.keyCode === 13) {
+        _this.adapter_.notifySelected();
+      }
+    };
+    return _this;
+  }
+
+  _createClass(MDCTabFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.registerInteractionHandler('click', this.clickHandler_);
+      this.adapter_.registerInteractionHandler('keydown', this.keydownHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterInteractionHandler('click', this.clickHandler_);
+      this.adapter_.deregisterInteractionHandler('keydown', this.keydownHandler_);
+    }
+  }, {
+    key: 'getComputedWidth',
+    value: function getComputedWidth() {
+      return this.computedWidth_;
+    }
+  }, {
+    key: 'getComputedLeft',
+    value: function getComputedLeft() {
+      return this.computedLeft_;
+    }
+  }, {
+    key: 'isActive',
+    value: function isActive() {
+      return this.isActive_;
+    }
+  }, {
+    key: 'setActive',
+    value: function setActive(isActive) {
+      this.isActive_ = isActive;
+      if (this.isActive_) {
+        this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTIVE);
+      } else {
+        this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACTIVE);
+      }
+    }
+  }, {
+    key: 'preventsDefaultOnClick',
+    value: function preventsDefaultOnClick() {
+      return this.preventDefaultOnClick_;
+    }
+  }, {
+    key: 'setPreventDefaultOnClick',
+    value: function setPreventDefaultOnClick(preventDefaultOnClick) {
+      this.preventDefaultOnClick_ = preventDefaultOnClick;
+    }
+  }, {
+    key: 'measureSelf',
+    value: function measureSelf() {
+      this.computedWidth_ = this.adapter_.getOffsetWidth();
+      this.computedLeft_ = this.adapter_.getOffsetLeft();
+    }
+  }]);
+
+  return MDCTabFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCTabFoundation);
+
+/***/ }),
+/* 71 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_animation__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(72);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+var MDCTabBarFoundation = function (_MDCFoundation) {
+  _inherits(MDCTabBarFoundation, _MDCFoundation);
+
+  _createClass(MDCTabBarFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        bindOnMDCTabSelectedEvent: function bindOnMDCTabSelectedEvent() {},
+        unbindOnMDCTabSelectedEvent: function unbindOnMDCTabSelectedEvent() {},
+        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
+        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
+        getOffsetWidth: function getOffsetWidth() {
+          return (/* number */0
+          );
+        },
+        setStyleForIndicator: function setStyleForIndicator() /* propertyName: string, value: string */{},
+        getOffsetWidthForIndicator: function getOffsetWidthForIndicator() {
+          return (/* number */0
+          );
+        },
+        notifyChange: function notifyChange() /* evtData: {activeTabIndex: number} */{},
+        getNumberOfTabs: function getNumberOfTabs() {
+          return (/* number */0
+          );
+        },
+        isTabActiveAtIndex: function isTabActiveAtIndex() {
+          return (/* index: number */ /* boolean */false
+          );
+        },
+        setTabActiveAtIndex: function setTabActiveAtIndex() /* index: number, isActive: true */{},
+        isDefaultPreventedOnClickForTabAtIndex: function isDefaultPreventedOnClickForTabAtIndex() {
+          return (/* index: number */ /* boolean */false
+          );
+        },
+        setPreventDefaultOnClickForTabAtIndex: function setPreventDefaultOnClickForTabAtIndex() /* index: number, preventDefaultOnClick: boolean */{},
+        measureTabAtIndex: function measureTabAtIndex() /* index: number */{},
+        getComputedWidthForTabAtIndex: function getComputedWidthForTabAtIndex() {
+          return (/* index: number */ /* number */0
+          );
+        },
+        getComputedLeftForTabAtIndex: function getComputedLeftForTabAtIndex() {
+          return (/* index: number */ /* number */0
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCTabBarFoundation(adapter) {
+    _classCallCheck(this, MDCTabBarFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCTabBarFoundation.__proto__ || Object.getPrototypeOf(MDCTabBarFoundation)).call(this, _extends(MDCTabBarFoundation.defaultAdapter, adapter)));
+
+    _this.isIndicatorShown_ = false;
+    _this.computedWidth_ = 0;
+    _this.computedLeft_ = 0;
+    _this.activeTabIndex_ = 0;
+    _this.layoutFrame_ = 0;
+    _this.resizeHandler_ = function () {
+      return _this.layout();
+    };
+    return _this;
+  }
+
+  _createClass(MDCTabBarFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].UPGRADED);
+      this.adapter_.bindOnMDCTabSelectedEvent();
+      this.adapter_.registerResizeHandler(this.resizeHandler_);
+      var activeTabIndex = this.findActiveTabIndex_();
+      if (activeTabIndex >= 0) {
+        this.activeTabIndex_ = activeTabIndex;
+      }
+      this.layout();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].UPGRADED);
+      this.adapter_.unbindOnMDCTabSelectedEvent();
+      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
+    }
+  }, {
+    key: 'layoutInternal_',
+    value: function layoutInternal_() {
+      var _this2 = this;
+
+      this.forEachTabIndex_(function (index) {
+        return _this2.adapter_.measureTabAtIndex(index);
+      });
+      this.computedWidth_ = this.adapter_.getOffsetWidth();
+      this.layoutIndicator_();
+    }
+  }, {
+    key: 'layoutIndicator_',
+    value: function layoutIndicator_() {
+      var isIndicatorFirstRender = !this.isIndicatorShown_;
+
+      // Ensure that indicator appears in the right position immediately for correct first render.
+      if (isIndicatorFirstRender) {
+        this.adapter_.setStyleForIndicator('transition', 'none');
+      }
+
+      var translateAmtForActiveTabLeft = this.adapter_.getComputedLeftForTabAtIndex(this.activeTabIndex_);
+      var scaleAmtForActiveTabWidth = this.adapter_.getComputedWidthForTabAtIndex(this.activeTabIndex_) / this.adapter_.getOffsetWidth();
+
+      var transformValue = 'translateX(' + translateAmtForActiveTabLeft + 'px) scale(' + scaleAmtForActiveTabWidth + ', 1)';
+      this.adapter_.setStyleForIndicator(Object(__WEBPACK_IMPORTED_MODULE_1__material_animation__["b" /* getCorrectPropertyName */])(window, 'transform'), transformValue);
+
+      if (isIndicatorFirstRender) {
+        // Force layout so that transform styles to take effect.
+        this.adapter_.getOffsetWidthForIndicator();
+        this.adapter_.setStyleForIndicator('transition', '');
+        this.adapter_.setStyleForIndicator('visibility', 'visible');
+        this.isIndicatorShown_ = true;
+      }
+    }
+  }, {
+    key: 'findActiveTabIndex_',
+    value: function findActiveTabIndex_() {
+      var _this3 = this;
+
+      var activeTabIndex = -1;
+      this.forEachTabIndex_(function (index) {
+        if (_this3.adapter_.isTabActiveAtIndex(index)) {
+          activeTabIndex = index;
+          return true;
+        }
+      });
+      return activeTabIndex;
+    }
+  }, {
+    key: 'forEachTabIndex_',
+    value: function forEachTabIndex_(iterator) {
+      var numTabs = this.adapter_.getNumberOfTabs();
+      for (var index = 0; index < numTabs; index++) {
+        var shouldBreak = iterator(index);
+        if (shouldBreak) {
+          break;
+        }
+      }
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      var _this4 = this;
+
+      if (this.layoutFrame_) {
+        cancelAnimationFrame(this.layoutFrame_);
+      }
+
+      this.layoutFrame_ = requestAnimationFrame(function () {
+        _this4.layoutInternal_();
+        _this4.layoutFrame_ = 0;
+      });
+    }
+  }, {
+    key: 'switchToTabAtIndex',
+    value: function switchToTabAtIndex(index, shouldNotify) {
+      var _this5 = this;
+
+      if (index === this.activeTabIndex_) {
+        return;
+      }
+
+      if (index < 0 || index >= this.adapter_.getNumberOfTabs()) {
+        throw new Error('Out of bounds index specified for tab: ' + index);
+      }
+
+      var prevActiveTabIndex = this.activeTabIndex_;
+      this.activeTabIndex_ = index;
+      requestAnimationFrame(function () {
+        if (prevActiveTabIndex >= 0) {
+          _this5.adapter_.setTabActiveAtIndex(prevActiveTabIndex, false);
+        }
+        _this5.adapter_.setTabActiveAtIndex(_this5.activeTabIndex_, true);
+        _this5.layoutIndicator_();
+        if (shouldNotify) {
+          _this5.adapter_.notifyChange({ activeTabIndex: _this5.activeTabIndex_ });
+        }
+      });
+    }
+  }, {
+    key: 'getActiveTabIndex',
+    value: function getActiveTabIndex() {
+      return this.findActiveTabIndex_();
+    }
+  }]);
+
+  return MDCTabBarFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCTabBarFoundation);
+
+/***/ }),
+/* 72 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  UPGRADED: 'mdc-tab-bar-upgraded'
+};
+
+var strings = {
+  TAB_SELECTOR: '.mdc-tab',
+  INDICATOR_SELECTOR: '.mdc-tab-bar__indicator',
+  CHANGE_EVENT: 'MDCTabBar:change'
+};
+
+/***/ }),
+/* 73 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCTabBarScroller; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_animation__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_component__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__tab_bar__ = __webpack_require__(15);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation__ = __webpack_require__(74);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_3__foundation__["a"]; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+var MDCTabBarScroller = function (_MDCComponent) {
+  _inherits(MDCTabBarScroller, _MDCComponent);
+
+  function MDCTabBarScroller() {
+    _classCallCheck(this, MDCTabBarScroller);
+
+    return _possibleConstructorReturn(this, (MDCTabBarScroller.__proto__ || Object.getPrototypeOf(MDCTabBarScroller)).apply(this, arguments));
+  }
+
+  _createClass(MDCTabBarScroller, [{
+    key: 'initialize',
+    value: function initialize() {
+      var tabBarFactory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (root) {
+        return new __WEBPACK_IMPORTED_MODULE_2__tab_bar__["a" /* MDCTabBar */](root);
+      };
+
+      this.scrollFrame_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.FRAME_SELECTOR);
+      this.tabBarEl_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.TABS_SELECTOR);
+      this.forwardIndicator_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.INDICATOR_FORWARD_SELECTOR);
+      this.backIndicator_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.INDICATOR_BACK_SELECTOR);
+      this.tabBar_ = tabBarFactory(this.tabBarEl_);
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */]({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        eventTargetHasClass: function eventTargetHasClass(target, className) {
+          return target.classList.contains(className);
+        },
+        addClassToForwardIndicator: function addClassToForwardIndicator(className) {
+          return _this2.forwardIndicator_.classList.add(className);
+        },
+        removeClassFromForwardIndicator: function removeClassFromForwardIndicator(className) {
+          return _this2.forwardIndicator_.classList.remove(className);
+        },
+        addClassToBackIndicator: function addClassToBackIndicator(className) {
+          return _this2.backIndicator_.classList.add(className);
+        },
+        removeClassFromBackIndicator: function removeClassFromBackIndicator(className) {
+          return _this2.backIndicator_.classList.remove(className);
+        },
+        isRTL: function isRTL() {
+          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
+        },
+        registerBackIndicatorClickHandler: function registerBackIndicatorClickHandler(handler) {
+          return _this2.backIndicator_.addEventListener('click', handler);
+        },
+        deregisterBackIndicatorClickHandler: function deregisterBackIndicatorClickHandler(handler) {
+          return _this2.backIndicator_.removeEventListener('click', handler);
+        },
+        registerForwardIndicatorClickHandler: function registerForwardIndicatorClickHandler(handler) {
+          return _this2.forwardIndicator_.addEventListener('click', handler);
+        },
+        deregisterForwardIndicatorClickHandler: function deregisterForwardIndicatorClickHandler(handler) {
+          return _this2.forwardIndicator_.removeEventListener('click', handler);
+        },
+        registerCapturedInteractionHandler: function registerCapturedInteractionHandler(evt, handler) {
+          return _this2.root_.addEventListener(evt, handler, true);
+        },
+        deregisterCapturedInteractionHandler: function deregisterCapturedInteractionHandler(evt, handler) {
+          return _this2.root_.removeEventListener(evt, handler, true);
+        },
+        registerWindowResizeHandler: function registerWindowResizeHandler(handler) {
+          return window.addEventListener('resize', handler);
+        },
+        deregisterWindowResizeHandler: function deregisterWindowResizeHandler(handler) {
+          return window.removeEventListener('resize', handler);
+        },
+        getNumberOfTabs: function getNumberOfTabs() {
+          return _this2.tabBar.tabs.length;
+        },
+        getComputedWidthForTabAtIndex: function getComputedWidthForTabAtIndex(index) {
+          return _this2.tabBar.tabs[index].computedWidth;
+        },
+        getComputedLeftForTabAtIndex: function getComputedLeftForTabAtIndex(index) {
+          return _this2.tabBar.tabs[index].computedLeft;
+        },
+        getOffsetWidthForScrollFrame: function getOffsetWidthForScrollFrame() {
+          return _this2.scrollFrame_.offsetWidth;
+        },
+        getScrollLeftForScrollFrame: function getScrollLeftForScrollFrame() {
+          return _this2.scrollFrame_.scrollLeft;
+        },
+        setScrollLeftForScrollFrame: function setScrollLeftForScrollFrame(scrollLeftAmount) {
+          return _this2.scrollFrame_.scrollLeft = scrollLeftAmount;
+        },
+        getOffsetWidthForTabBar: function getOffsetWidthForTabBar() {
+          return _this2.tabBarEl_.offsetWidth;
+        },
+        setTransformStyleForTabBar: function setTransformStyleForTabBar(value) {
+          _this2.tabBarEl_.style.setProperty(Object(__WEBPACK_IMPORTED_MODULE_0__material_animation__["b" /* getCorrectPropertyName */])(window, 'transform'), value);
+        },
+        getOffsetLeftForEventTarget: function getOffsetLeftForEventTarget(target) {
+          return target.offsetLeft;
+        },
+        getOffsetWidthForEventTarget: function getOffsetWidthForEventTarget(target) {
+          return target.offsetWidth;
+        }
+      });
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      this.foundation_.layout();
+    }
+  }, {
+    key: 'tabBar',
+    get: function get() {
+      return this.tabBar_;
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCTabBarScroller(root);
+    }
+  }]);
+
+  return MDCTabBarScroller;
+}(__WEBPACK_IMPORTED_MODULE_1__material_base_component__["a" /* default */]);
+
+/***/ }),
+/* 74 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(75);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+var MDCTabBarScrollerFoundation = function (_MDCFoundation) {
+  _inherits(MDCTabBarScrollerFoundation, _MDCFoundation);
+
+  _createClass(MDCTabBarScrollerFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        eventTargetHasClass: function eventTargetHasClass() {
+          return (/* target: EventTarget, className: string */ /* boolean */false
+          );
+        },
+        addClassToForwardIndicator: function addClassToForwardIndicator() /* className: string */{},
+        removeClassFromForwardIndicator: function removeClassFromForwardIndicator() /* className: string */{},
+        addClassToBackIndicator: function addClassToBackIndicator() /* className: string */{},
+        removeClassFromBackIndicator: function removeClassFromBackIndicator() /* className: string */{},
+        isRTL: function isRTL() {
+          return (/* boolean */false
+          );
+        },
+        registerBackIndicatorClickHandler: function registerBackIndicatorClickHandler() /* handler: EventListener */{},
+        deregisterBackIndicatorClickHandler: function deregisterBackIndicatorClickHandler() /* handler: EventListener */{},
+        registerForwardIndicatorClickHandler: function registerForwardIndicatorClickHandler() /* handler: EventListener */{},
+        deregisterForwardIndicatorClickHandler: function deregisterForwardIndicatorClickHandler() /* handler: EventListener */{},
+        registerCapturedInteractionHandler: function registerCapturedInteractionHandler() /* evt: string, handler: EventListener */{},
+        deregisterCapturedInteractionHandler: function deregisterCapturedInteractionHandler() /* evt: string, handler: EventListener */{},
+        registerWindowResizeHandler: function registerWindowResizeHandler() /* handler: EventListener */{},
+        deregisterWindowResizeHandler: function deregisterWindowResizeHandler() /* handler: EventListener */{},
+        getNumberOfTabs: function getNumberOfTabs() {
+          return (/* number */0
+          );
+        },
+        getComputedWidthForTabAtIndex: function getComputedWidthForTabAtIndex() {
+          return (/* number */0
+          );
+        },
+        getComputedLeftForTabAtIndex: function getComputedLeftForTabAtIndex() {
+          return (/* number */0
+          );
+        },
+        getOffsetWidthForScrollFrame: function getOffsetWidthForScrollFrame() {
+          return (/* number */0
+          );
+        },
+        getScrollLeftForScrollFrame: function getScrollLeftForScrollFrame() {
+          return (/* number */0
+          );
+        },
+        setScrollLeftForScrollFrame: function setScrollLeftForScrollFrame() /* scrollLeftAmount: number */{},
+        getOffsetWidthForTabBar: function getOffsetWidthForTabBar() {
+          return (/* number */0
+          );
+        },
+        setTransformStyleForTabBar: function setTransformStyleForTabBar() /* value: string */{},
+        getOffsetLeftForEventTarget: function getOffsetLeftForEventTarget() {
+          return (/* target: EventTarget */ /* number */0
+          );
+        },
+        getOffsetWidthForEventTarget: function getOffsetWidthForEventTarget() {
+          return (/* target: EventTarget */ /* number */0
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCTabBarScrollerFoundation(adapter) {
+    _classCallCheck(this, MDCTabBarScrollerFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCTabBarScrollerFoundation.__proto__ || Object.getPrototypeOf(MDCTabBarScrollerFoundation)).call(this, _extends(MDCTabBarScrollerFoundation.defaultAdapter, adapter)));
+
+    _this.pointerDownRecognized_ = false;
+    _this.currentTranslateOffset_ = 0;
+    _this.focusedTarget_ = null;
+    _this.layoutFrame_ = 0;
+    _this.scrollFrameScrollLeft_ = 0;
+    _this.forwardIndicatorClickHandler_ = function (evt) {
+      return _this.scrollForward(evt);
+    };
+    _this.backIndicatorClickHandler_ = function (evt) {
+      return _this.scrollBack(evt);
+    };
+    _this.resizeHandler_ = function () {
+      return _this.layout();
+    };
+    _this.interactionHandler_ = function (evt) {
+      if (evt.type == 'touchstart' || evt.type == 'mousedown') {
+        _this.pointerDownRecognized_ = true;
+      }
+      _this.handlePossibleTabKeyboardFocus_(evt);
+
+      if (evt.type == 'focus') {
+        _this.pointerDownRecognized_ = false;
+      }
+    };
+    return _this;
+  }
+
+  _createClass(MDCTabBarScrollerFoundation, [{
+    key: 'init',
+    value: function init() {
+      var _this2 = this;
+
+      this.adapter_.registerBackIndicatorClickHandler(this.backIndicatorClickHandler_);
+      this.adapter_.registerForwardIndicatorClickHandler(this.forwardIndicatorClickHandler_);
+      this.adapter_.registerWindowResizeHandler(this.resizeHandler_);
+      ['touchstart', 'mousedown', 'focus'].forEach(function (evtType) {
+        _this2.adapter_.registerCapturedInteractionHandler(evtType, _this2.interactionHandler_);
+      });
+      this.layout();
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      var _this3 = this;
+
+      this.adapter_.deregisterBackIndicatorClickHandler(this.backIndicatorClickHandler_);
+      this.adapter_.deregisterForwardIndicatorClickHandler(this.forwardIndicatorClickHandler_);
+      this.adapter_.deregisterWindowResizeHandler(this.resizeHandler_);
+      ['touchstart', 'mousedown', 'focus'].forEach(function (evtType) {
+        _this3.adapter_.deregisterCapturedInteractionHandler(evtType, _this3.interactionHandler_);
+      });
+    }
+  }, {
+    key: 'scrollBack',
+    value: function scrollBack() {
+      var evt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      if (evt) {
+        evt.preventDefault();
+      }
+
+      var tabWidthAccumulator = 0;
+      var scrollTargetIndex = 0;
+
+      for (var i = this.adapter_.getNumberOfTabs() - 1; i > 0; i--) {
+        var tabOffsetLeft = this.adapter_.getComputedLeftForTabAtIndex(i);
+        var tabBarWidthLessTabOffsetLeft = this.adapter_.getOffsetWidthForTabBar() - tabOffsetLeft;
+
+        var tabIsNotOccluded = tabOffsetLeft > this.currentTranslateOffset_;
+        if (this.isRTL_()) {
+          tabIsNotOccluded = tabBarWidthLessTabOffsetLeft > this.currentTranslateOffset_;
+        }
+
+        if (tabIsNotOccluded) {
+          continue;
+        }
+
+        tabWidthAccumulator += this.adapter_.getComputedWidthForTabAtIndex(i);
+
+        var scrollTargetDetermined = tabWidthAccumulator > this.adapter_.getOffsetWidthForScrollFrame();
+        if (scrollTargetDetermined) {
+          scrollTargetIndex = this.isRTL_() ? i + 1 : i;
+          break;
+        }
+      }
+
+      this.scrollToTabAtIndex_(scrollTargetIndex);
+    }
+  }, {
+    key: 'scrollForward',
+    value: function scrollForward() {
+      var evt = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+
+      if (evt) {
+        evt.preventDefault();
+      }
+
+      var scrollFrameOffsetWidth = this.adapter_.getOffsetWidthForScrollFrame() + this.currentTranslateOffset_;
+      var scrollTargetIndex = 0;
+
+      for (var i = 0; i < this.adapter_.getNumberOfTabs(); i++) {
+        var tabOffsetLeftAndWidth = this.adapter_.getComputedLeftForTabAtIndex(i) + this.adapter_.getComputedWidthForTabAtIndex(i);
+        var scrollTargetDetermined = tabOffsetLeftAndWidth > scrollFrameOffsetWidth;
+
+        if (this.isRTL_()) {
+          var frameOffsetAndTabWidth = scrollFrameOffsetWidth - this.adapter_.getComputedWidthForTabAtIndex(i);
+          var _tabOffsetLeftAndWidth = this.adapter_.getComputedLeftForTabAtIndex(i) + this.adapter_.getComputedWidthForTabAtIndex(i);
+          var tabRightOffset = this.adapter_.getOffsetWidthForTabBar() - _tabOffsetLeftAndWidth;
+
+          scrollTargetDetermined = tabRightOffset > frameOffsetAndTabWidth;
+        }
+
+        if (scrollTargetDetermined) {
+          scrollTargetIndex = i;
+          break;
+        }
+      }
+
+      this.scrollToTabAtIndex_(scrollTargetIndex);
+    }
+  }, {
+    key: 'layout',
+    value: function layout() {
+      var _this4 = this;
+
+      cancelAnimationFrame(this.layoutFrame_);
+      this.scrollFrameScrollLeft_ = this.adapter_.getScrollLeftForScrollFrame();
+      this.layoutFrame_ = requestAnimationFrame(function () {
+        return _this4.layout_();
+      });
+    }
+  }, {
+    key: 'isRTL_',
+    value: function isRTL_() {
+      return this.adapter_.isRTL();
+    }
+  }, {
+    key: 'handlePossibleTabKeyboardFocus_',
+    value: function handlePossibleTabKeyboardFocus_(evt) {
+      if (!this.adapter_.eventTargetHasClass(evt.target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].TAB) || this.pointerDownRecognized_) {
+        return;
+      }
+
+      var resetAmt = this.isRTL_() ? this.scrollFrameScrollLeft_ : 0;
+      this.adapter_.setScrollLeftForScrollFrame(resetAmt);
+
+      this.focusedTarget_ = evt.target;
+      var scrollFrameWidth = this.adapter_.getOffsetWidthForScrollFrame();
+      var tabBarWidth = this.adapter_.getOffsetWidthForTabBar();
+      var leftEdge = this.adapter_.getOffsetLeftForEventTarget(this.focusedTarget_);
+      var rightEdge = leftEdge + this.adapter_.getOffsetWidthForEventTarget(this.focusedTarget_);
+
+      var shouldScrollBack = rightEdge <= this.currentTranslateOffset_;
+      var shouldScrollForward = rightEdge > this.currentTranslateOffset_ + scrollFrameWidth;
+
+      if (this.isRTL_()) {
+        var normalizedLeftOffset = tabBarWidth - leftEdge;
+        shouldScrollBack = leftEdge >= tabBarWidth - this.currentTranslateOffset_;
+        shouldScrollForward = normalizedLeftOffset > scrollFrameWidth + this.currentTranslateOffset_;
+      }
+
+      if (shouldScrollForward) {
+        this.scrollForward();
+      } else if (shouldScrollBack) {
+        this.scrollBack();
+      }
+
+      this.pointerDownRecognized_ = false;
+    }
+  }, {
+    key: 'layout_',
+    value: function layout_() {
+      var frameWidth = this.adapter_.getOffsetWidthForScrollFrame();
+      var isOverflowing = this.adapter_.getOffsetWidthForTabBar() > frameWidth;
+
+      if (!isOverflowing) {
+        this.currentTranslateOffset_ = 0;
+      }
+
+      this.shiftFrame_();
+      this.updateIndicatorEnabledStates_();
+    }
+  }, {
+    key: 'scrollToTabAtIndex_',
+    value: function scrollToTabAtIndex_(index) {
+      var _this5 = this;
+
+      var scrollTargetOffsetLeft = this.adapter_.getComputedLeftForTabAtIndex(index);
+      var scrollTargetOffsetWidth = this.adapter_.getComputedWidthForTabAtIndex(index);
+
+      this.currentTranslateOffset_ = this.normalizeForRTL_(scrollTargetOffsetLeft, scrollTargetOffsetWidth);
+
+      requestAnimationFrame(function () {
+        return _this5.shiftFrame_();
+      });
+    }
+  }, {
+    key: 'normalizeForRTL_',
+    value: function normalizeForRTL_(left, width) {
+      return this.isRTL_() ? this.adapter_.getOffsetWidthForTabBar() - (left + width) : left;
+    }
+  }, {
+    key: 'shiftFrame_',
+    value: function shiftFrame_() {
+      var shiftAmount = this.isRTL_() ? this.currentTranslateOffset_ : -this.currentTranslateOffset_;
+
+      this.adapter_.setTransformStyleForTabBar('translateX(' + shiftAmount + 'px)');
+      this.updateIndicatorEnabledStates_();
+    }
+  }, {
+    key: 'updateIndicatorEnabledStates_',
+    value: function updateIndicatorEnabledStates_() {
+      var INDICATOR_ENABLED = __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].INDICATOR_ENABLED;
+
+      if (this.currentTranslateOffset_ === 0) {
+        this.adapter_.removeClassFromBackIndicator(INDICATOR_ENABLED);
+      } else {
+        this.adapter_.addClassToBackIndicator(INDICATOR_ENABLED);
+      }
+
+      var remainingTabBarWidth = this.adapter_.getOffsetWidthForTabBar() - this.currentTranslateOffset_;
+      if (remainingTabBarWidth > this.adapter_.getOffsetWidthForScrollFrame()) {
+        this.adapter_.addClassToForwardIndicator(INDICATOR_ENABLED);
+      } else {
+        this.adapter_.removeClassFromForwardIndicator(INDICATOR_ENABLED);
+      }
+    }
+  }]);
+
+  return MDCTabBarScrollerFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCTabBarScrollerFoundation);
+
+/***/ }),
+/* 75 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  INDICATOR_FORWARD: 'mdc-tab-bar-scroller__indicator--forward',
+  INDICATOR_BACK: 'mdc-tab-bar-scroller__indicator--back',
+  INDICATOR_ENABLED: 'mdc-tab-bar-scroller__indicator--enabled',
+  TAB: 'mdc-tab'
+};
+
+var strings = {
+  FRAME_SELECTOR: '.mdc-tab-bar-scroller__scroll-frame',
+  TABS_SELECTOR: '.mdc-tab-bar-scroller__scroll-frame__tabs',
+  TAB_SELECTOR: '.mdc-tab',
+  INDICATOR_FORWARD_SELECTOR: '.mdc-tab-bar-scroller__indicator--forward',
+  INDICATOR_BACK_SELECTOR: '.mdc-tab-bar-scroller__indicator--back'
+};
+
+/***/ }),
+/* 76 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTextfield", function() { return MDCTextfield; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_ripple__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(16);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation__ = __webpack_require__(77);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTextfieldFoundation", function() { return __WEBPACK_IMPORTED_MODULE_3__foundation__["a"]; });
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+var MDCTextfield = function (_MDCComponent) {
+  _inherits(MDCTextfield, _MDCComponent);
+
+  function MDCTextfield() {
+    _classCallCheck(this, MDCTextfield);
+
+    return _possibleConstructorReturn(this, (MDCTextfield.__proto__ || Object.getPrototypeOf(MDCTextfield)).apply(this, arguments));
+  }
+
+  _createClass(MDCTextfield, [{
+    key: 'initialize',
+    value: function initialize() {
+      var rippleFactory = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (el) {
+        return new __WEBPACK_IMPORTED_MODULE_1__material_ripple__["MDCRipple"](el);
+      };
+
+      this.input_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */].INPUT_SELECTOR);
+      this.label_ = this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */].LABEL_SELECTOR);
+      this.helptextElement = null;
+      this.ripple = null;
+      if (this.input_.hasAttribute('aria-controls')) {
+        this.helptextElement = document.getElementById(this.input_.getAttribute('aria-controls'));
+      }
+      if (this.root_.classList.contains(__WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */].BOX)) {
+        this.ripple = rippleFactory(this.root_);
+      };
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      if (this.ripple) {
+        this.ripple.destroy();
+      }
+      _get(MDCTextfield.prototype.__proto__ || Object.getPrototypeOf(MDCTextfield.prototype), 'destroy', this).call(this);
+    }
+  }, {
+    key: 'initialSyncWithDom',
+    value: function initialSyncWithDom() {
+      this.disabled = this.input_.disabled;
+    }
+  }, {
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */](_extends({
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        addClassToLabel: function addClassToLabel(className) {
+          var label = _this2.label_;
+          if (label) {
+            label.classList.add(className);
+          }
+        },
+        removeClassFromLabel: function removeClassFromLabel(className) {
+          var label = _this2.label_;
+          if (label) {
+            label.classList.remove(className);
+          }
+        }
+      }, this.getInputAdapterMethods_(), this.getHelptextAdapterMethods_()));
+    }
+  }, {
+    key: 'getInputAdapterMethods_',
+    value: function getInputAdapterMethods_() {
+      var _this3 = this;
+
+      return {
+        registerInputFocusHandler: function registerInputFocusHandler(handler) {
+          return _this3.input_.addEventListener('focus', handler);
+        },
+        registerInputBlurHandler: function registerInputBlurHandler(handler) {
+          return _this3.input_.addEventListener('blur', handler);
+        },
+        registerInputInputHandler: function registerInputInputHandler(handler) {
+          return _this3.input_.addEventListener('input', handler);
+        },
+        registerInputKeydownHandler: function registerInputKeydownHandler(handler) {
+          return _this3.input_.addEventListener('keydown', handler);
+        },
+        deregisterInputFocusHandler: function deregisterInputFocusHandler(handler) {
+          return _this3.input_.removeEventListener('focus', handler);
+        },
+        deregisterInputBlurHandler: function deregisterInputBlurHandler(handler) {
+          return _this3.input_.removeEventListener('blur', handler);
+        },
+        deregisterInputInputHandler: function deregisterInputInputHandler(handler) {
+          return _this3.input_.removeEventListener('input', handler);
+        },
+        deregisterInputKeydownHandler: function deregisterInputKeydownHandler(handler) {
+          return _this3.input_.removeEventListener('keydown', handler);
+        },
+        getNativeInput: function getNativeInput() {
+          return _this3.input_;
+        }
+      };
+    }
+  }, {
+    key: 'getHelptextAdapterMethods_',
+    value: function getHelptextAdapterMethods_() {
+      var _this4 = this;
+
+      return {
+        addClassToHelptext: function addClassToHelptext(className) {
+          if (_this4.helptextElement) {
+            _this4.helptextElement.classList.add(className);
+          }
+        },
+        removeClassFromHelptext: function removeClassFromHelptext(className) {
+          if (_this4.helptextElement) {
+            _this4.helptextElement.classList.remove(className);
+          }
+        },
+        helptextHasClass: function helptextHasClass(className) {
+          if (!_this4.helptextElement) {
+            return false;
+          }
+          return _this4.helptextElement.classList.contains(className);
+        },
+        setHelptextAttr: function setHelptextAttr(name, value) {
+          if (_this4.helptextElement) {
+            _this4.helptextElement.setAttribute(name, value);
+          }
+        },
+        removeHelptextAttr: function removeHelptextAttr(name) {
+          if (_this4.helptextElement) {
+            _this4.helptextElement.removeAttribute(name);
+          }
+        }
+      };
+    }
+  }, {
+    key: 'disabled',
+    get: function get() {
+      return this.foundation_.isDisabled();
+    },
+    set: function set(disabled) {
+      this.foundation_.setDisabled(disabled);
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCTextfield(root);
+    }
+  }]);
+
+  return MDCTextfield;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 77 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(16);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+var MDCTextfieldFoundation = function (_MDCFoundation) {
+  _inherits(MDCTextfieldFoundation, _MDCFoundation);
+
+  _createClass(MDCTextfieldFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        addClassToLabel: function addClassToLabel() /* className: string */{},
+        removeClassFromLabel: function removeClassFromLabel() /* className: string */{},
+        addClassToHelptext: function addClassToHelptext() /* className: string */{},
+        removeClassFromHelptext: function removeClassFromHelptext() /* className: string */{},
+        helptextHasClass: function helptextHasClass() {
+          return (/* className: string */ /* boolean */false
+          );
+        },
+        registerInputFocusHandler: function registerInputFocusHandler() /* handler: EventListener */{},
+        deregisterInputFocusHandler: function deregisterInputFocusHandler() /* handler: EventListener */{},
+        registerInputBlurHandler: function registerInputBlurHandler() /* handler: EventListener */{},
+        deregisterInputBlurHandler: function deregisterInputBlurHandler() /* handler: EventListener */{},
+        registerInputInputHandler: function registerInputInputHandler() /* handler: EventListener */{},
+        deregisterInputInputHandler: function deregisterInputInputHandler() /* handler: EventListener */{},
+        registerInputKeydownHandler: function registerInputKeydownHandler() /* handler: EventListener */{},
+        deregisterInputKeydownHandler: function deregisterInputKeydownHandler() /* handler: EventListener */{},
+        setHelptextAttr: function setHelptextAttr() /* name: string, value: string */{},
+        removeHelptextAttr: function removeHelptextAttr() /* name: string */{},
+        getNativeInput: function getNativeInput() {
+          return (/* HTMLInputElement */{}
+          );
+        }
+      };
+    }
+  }]);
+
+  function MDCTextfieldFoundation() {
+    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+    _classCallCheck(this, MDCTextfieldFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCTextfieldFoundation.__proto__ || Object.getPrototypeOf(MDCTextfieldFoundation)).call(this, _extends(MDCTextfieldFoundation.defaultAdapter, adapter)));
+
+    _this.receivedUserInput_ = false;
+    _this.inputFocusHandler_ = function () {
+      return _this.activateFocus_();
+    };
+    _this.inputBlurHandler_ = function () {
+      return _this.deactivateFocus_();
+    };
+    _this.inputInputHandler_ = function () {
+      return _this.autoCompleteFocus_();
+    };
+    _this.inputKeydownHandler_ = function () {
+      return _this.receivedUserInput_ = true;
+    };
+    return _this;
+  }
+
+  _createClass(MDCTextfieldFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.adapter_.addClass(MDCTextfieldFoundation.cssClasses.UPGRADED);
+      this.adapter_.registerInputFocusHandler(this.inputFocusHandler_);
+      this.adapter_.registerInputBlurHandler(this.inputBlurHandler_);
+      this.adapter_.registerInputInputHandler(this.inputInputHandler_);
+      this.adapter_.registerInputKeydownHandler(this.inputKeydownHandler_);
+
+      // Ensure label does not collide with any pre-filled value.
+      if (this.getNativeInput_().value) {
+        this.adapter_.addClassToLabel(MDCTextfieldFoundation.cssClasses.LABEL_FLOAT_ABOVE);
+      }
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.removeClass(MDCTextfieldFoundation.cssClasses.UPGRADED);
+      this.adapter_.deregisterInputFocusHandler(this.inputFocusHandler_);
+      this.adapter_.deregisterInputBlurHandler(this.inputBlurHandler_);
+      this.adapter_.deregisterInputInputHandler(this.inputInputHandler_);
+      this.adapter_.deregisterInputKeydownHandler(this.inputKeydownHandler_);
+    }
+  }, {
+    key: 'activateFocus_',
+    value: function activateFocus_() {
+      var _MDCTextfieldFoundati = MDCTextfieldFoundation.cssClasses,
+          FOCUSED = _MDCTextfieldFoundati.FOCUSED,
+          LABEL_FLOAT_ABOVE = _MDCTextfieldFoundati.LABEL_FLOAT_ABOVE;
+
+      this.adapter_.addClass(FOCUSED);
+      this.adapter_.addClassToLabel(LABEL_FLOAT_ABOVE);
+      this.showHelptext_();
+    }
+  }, {
+    key: 'autoCompleteFocus_',
+    value: function autoCompleteFocus_() {
+      if (!this.receivedUserInput_) {
+        this.activateFocus_();
+      }
+    }
+  }, {
+    key: 'showHelptext_',
+    value: function showHelptext_() {
+      var ARIA_HIDDEN = MDCTextfieldFoundation.strings.ARIA_HIDDEN;
+
+      this.adapter_.removeHelptextAttr(ARIA_HIDDEN);
+    }
+  }, {
+    key: 'deactivateFocus_',
+    value: function deactivateFocus_() {
+      var _MDCTextfieldFoundati2 = MDCTextfieldFoundation.cssClasses,
+          FOCUSED = _MDCTextfieldFoundati2.FOCUSED,
+          INVALID = _MDCTextfieldFoundati2.INVALID,
+          LABEL_FLOAT_ABOVE = _MDCTextfieldFoundati2.LABEL_FLOAT_ABOVE;
+
+      var input = this.getNativeInput_();
+      var isValid = input.checkValidity();
+
+      this.adapter_.removeClass(FOCUSED);
+      if (!input.value && !this.isBadInput_()) {
+        this.adapter_.removeClassFromLabel(LABEL_FLOAT_ABOVE);
+        this.receivedUserInput_ = false;
+      }
+      if (isValid) {
+        this.adapter_.removeClass(INVALID);
+      } else {
+        this.adapter_.addClass(INVALID);
+      }
+      this.updateHelptextOnDeactivation_(isValid);
+    }
+  }, {
+    key: 'updateHelptextOnDeactivation_',
+    value: function updateHelptextOnDeactivation_(isValid) {
+      var _MDCTextfieldFoundati3 = MDCTextfieldFoundation.cssClasses,
+          HELPTEXT_PERSISTENT = _MDCTextfieldFoundati3.HELPTEXT_PERSISTENT,
+          HELPTEXT_VALIDATION_MSG = _MDCTextfieldFoundati3.HELPTEXT_VALIDATION_MSG;
+      var ROLE = MDCTextfieldFoundation.strings.ROLE;
+
+      var helptextIsPersistent = this.adapter_.helptextHasClass(HELPTEXT_PERSISTENT);
+      var helptextIsValidationMsg = this.adapter_.helptextHasClass(HELPTEXT_VALIDATION_MSG);
+      var validationMsgNeedsDisplay = helptextIsValidationMsg && !isValid;
+
+      if (validationMsgNeedsDisplay) {
+        this.adapter_.setHelptextAttr(ROLE, 'alert');
+      } else {
+        this.adapter_.removeHelptextAttr(ROLE);
+      }
+
+      if (helptextIsPersistent || validationMsgNeedsDisplay) {
+        return;
+      }
+      this.hideHelptext_();
+    }
+  }, {
+    key: 'hideHelptext_',
+    value: function hideHelptext_() {
+      var ARIA_HIDDEN = MDCTextfieldFoundation.strings.ARIA_HIDDEN;
+
+      this.adapter_.setHelptextAttr(ARIA_HIDDEN, 'true');
+    }
+  }, {
+    key: 'isBadInput_',
+    value: function isBadInput_() {
+      var input = this.getNativeInput_();
+      return input.validity ? input.validity.badInput : input.badInput;
+    }
+  }, {
+    key: 'isDisabled',
+    value: function isDisabled() {
+      return this.getNativeInput_().disabled;
+    }
+  }, {
+    key: 'setDisabled',
+    value: function setDisabled(disabled) {
+      var DISABLED = MDCTextfieldFoundation.cssClasses.DISABLED;
+
+      this.getNativeInput_().disabled = disabled;
+      if (disabled) {
+        this.adapter_.addClass(DISABLED);
+      } else {
+        this.adapter_.removeClass(DISABLED);
+      }
+    }
+  }, {
+    key: 'getNativeInput_',
+    value: function getNativeInput_() {
+      return this.adapter_.getNativeInput() || {
+        checkValidity: function checkValidity() {
+          return true;
+        },
+        value: '',
+        disabled: false,
+        badInput: false
+      };
+    }
+  }]);
+
+  return MDCTextfieldFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCTextfieldFoundation);
+
+/***/ }),
+/* 78 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCToolbar", function() { return MDCToolbar; });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(0);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(79);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(81);
+/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCToolbarFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
+/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_2__util__; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+
+
+
+
+
+
+var MDCToolbar = function (_MDCComponent) {
+  _inherits(MDCToolbar, _MDCComponent);
+
+  function MDCToolbar() {
+    _classCallCheck(this, MDCToolbar);
+
+    return _possibleConstructorReturn(this, (MDCToolbar.__proto__ || Object.getPrototypeOf(MDCToolbar)).apply(this, arguments));
+  }
+
+  _createClass(MDCToolbar, [{
+    key: 'getDefaultFoundation',
+    value: function getDefaultFoundation() {
+      var _this2 = this;
+
+      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
+        hasClass: function hasClass(className) {
+          return _this2.root_.classList.contains(className);
+        },
+        addClass: function addClass(className) {
+          return _this2.root_.classList.add(className);
+        },
+        removeClass: function removeClass(className) {
+          return _this2.root_.classList.remove(className);
+        },
+        registerScrollHandler: function registerScrollHandler(handler) {
+          return window.addEventListener('scroll', handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        deregisterScrollHandler: function deregisterScrollHandler(handler) {
+          return window.removeEventListener('scroll', handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
+        },
+        registerResizeHandler: function registerResizeHandler(handler) {
+          return window.addEventListener('resize', handler);
+        },
+        deregisterResizeHandler: function deregisterResizeHandler(handler) {
+          return window.removeEventListener('resize', handler);
+        },
+        getViewportWidth: function getViewportWidth() {
+          return window.innerWidth;
+        },
+        getViewportScrollY: function getViewportScrollY() {
+          return window.pageYOffset;
+        },
+        getOffsetHeight: function getOffsetHeight() {
+          return _this2.root_.offsetHeight;
+        },
+        getFirstRowElementOffsetHeight: function getFirstRowElementOffsetHeight() {
+          return _this2.firstRowElement_.offsetHeight;
+        },
+        notifyChange: function notifyChange(evtData) {
+          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CHANGE_EVENT, evtData);
+        },
+        setStyle: function setStyle(property, value) {
+          return _this2.root_.style.setProperty(property, value);
+        },
+        setStyleForTitleElement: function setStyleForTitleElement(property, value) {
+          return _this2.titleElement_.style.setProperty(property, value);
+        },
+        setStyleForFlexibleRowElement: function setStyleForFlexibleRowElement(property, value) {
+          return _this2.firstRowElement_.style.setProperty(property, value);
+        },
+        setStyleForFixedAdjustElement: function setStyleForFixedAdjustElement(property, value) {
+          if (_this2.fixedAdjustElement) {
+            _this2.fixedAdjustElement.style.setProperty(property, value);
+          }
+        }
+      });
+    }
+  }, {
+    key: 'firstRowElement_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.FIRST_ROW_SELECTOR);
+    }
+  }, {
+    key: 'titleElement_',
+    get: function get() {
+      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.TITLE_SELECTOR);
+    }
+  }, {
+    key: 'fixedAdjustElement',
+    set: function set(fixedAdjustElement) {
+      this.fixedAdjustElement_ = fixedAdjustElement;
+      this.foundation_.updateAdjustElementStyles();
+    },
+    get: function get() {
+      return this.fixedAdjustElement_;
+    }
+  }], [{
+    key: 'attachTo',
+    value: function attachTo(root) {
+      return new MDCToolbar(root);
+    }
+  }]);
+
+  return MDCToolbar;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
+
+/***/ }),
+/* 79 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(80);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+
+var MDCToolbarFoundation = function (_MDCFoundation) {
+  _inherits(MDCToolbarFoundation, _MDCFoundation);
+
+  _createClass(MDCToolbarFoundation, null, [{
+    key: 'cssClasses',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
+    }
+  }, {
+    key: 'strings',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["c" /* strings */];
+    }
+  }, {
+    key: 'numbers',
+    get: function get() {
+      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* numbers */];
+    }
+  }, {
+    key: 'defaultAdapter',
+    get: function get() {
+      return {
+        hasClass: function hasClass() {
+          return (/* className: string */ /* boolean */false
+          );
+        },
+        addClass: function addClass() /* className: string */{},
+        removeClass: function removeClass() /* className: string */{},
+        registerScrollHandler: function registerScrollHandler() /* handler: EventListener */{},
+        deregisterScrollHandler: function deregisterScrollHandler() /* handler: EventListener */{},
+        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
+        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
+        getViewportWidth: function getViewportWidth() {
+          return (/* number */0
+          );
+        },
+        getViewportScrollY: function getViewportScrollY() {
+          return (/* number */0
+          );
+        },
+        getOffsetHeight: function getOffsetHeight() {
+          return (/* number */0
+          );
+        },
+        getFirstRowElementOffsetHeight: function getFirstRowElementOffsetHeight() {
+          return (/* number */0
+          );
+        },
+        notifyChange: function notifyChange() /* evtData: {flexibleExpansionRatio: number} */{},
+        setStyle: function setStyle() /* property: string, value: string */{},
+        setStyleForTitleElement: function setStyleForTitleElement() /* property: string, value: string */{},
+        setStyleForFlexibleRowElement: function setStyleForFlexibleRowElement() /* property: string, value: string */{},
+        setStyleForFixedAdjustElement: function setStyleForFixedAdjustElement() /* property: string, value: string */{}
+      };
+    }
+  }]);
+
+  function MDCToolbarFoundation(adapter) {
+    _classCallCheck(this, MDCToolbarFoundation);
+
+    var _this = _possibleConstructorReturn(this, (MDCToolbarFoundation.__proto__ || Object.getPrototypeOf(MDCToolbarFoundation)).call(this, _extends(MDCToolbarFoundation.defaultAdapter, adapter)));
+
+    _this.resizeHandler_ = function () {
+      return _this.checkRowHeight_();
+    };
+    _this.scrollHandler_ = function () {
+      return _this.updateToolbarStyles_();
+    };
+    _this.checkRowHeightFrame_ = 0;
+    _this.scrollFrame_ = 0;
+    _this.executedLastChange_ = false;
+
+    _this.calculations_ = {
+      toolbarRowHeight: 0,
+      // Calculated Height ratio. We use ratio to calculate corresponding heights in resize event.
+      toolbarRatio: 0, // The ratio of toolbar height to row height
+      flexibleExpansionRatio: 0, // The ratio of flexible space height to row height
+      maxTranslateYRatio: 0, // The ratio of max toolbar move up distance to row height
+      scrollThresholdRatio: 0, // The ratio of max scrollTop that we should listen to to row height
+      // Derived Heights based on the above key ratios.
+      toolbarHeight: 0,
+      flexibleExpansionHeight: 0, // Flexible row minus toolbar height (derived)
+      maxTranslateYDistance: 0, // When toolbar only fix last row (derived)
+      scrollThreshold: 0
+    };
+    // Toolbar fixed behavior
+    // If toolbar is fixed
+    _this.fixed_ = false;
+    // If fixed is targeted only at the last row
+    _this.fixedLastrow_ = false;
+    // Toolbar flexible behavior
+    // If the first row is flexible
+    _this.hasFlexibleRow_ = false;
+    // If use the default behavior
+    _this.useFlexDefaultBehavior_ = false;
+    return _this;
+  }
+
+  _createClass(MDCToolbarFoundation, [{
+    key: 'init',
+    value: function init() {
+      this.fixed_ = this.adapter_.hasClass(MDCToolbarFoundation.cssClasses.FIXED);
+      this.fixedLastrow_ = this.adapter_.hasClass(MDCToolbarFoundation.cssClasses.FIXED_LASTROW) & this.fixed_;
+      this.hasFlexibleRow_ = this.adapter_.hasClass(MDCToolbarFoundation.cssClasses.TOOLBAR_ROW_FLEXIBLE);
+      if (this.hasFlexibleRow_) {
+        this.useFlexDefaultBehavior_ = this.adapter_.hasClass(MDCToolbarFoundation.cssClasses.FLEXIBLE_DEFAULT_BEHAVIOR);
+      }
+      this.initKeyRatio_();
+      this.setKeyHeights_();
+      this.adapter_.registerResizeHandler(this.resizeHandler_);
+      this.adapter_.registerScrollHandler(this.scrollHandler_);
+    }
+  }, {
+    key: 'destroy',
+    value: function destroy() {
+      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
+      this.adapter_.deregisterScrollHandler(this.scrollHandler_);
+    }
+  }, {
+    key: 'updateAdjustElementStyles',
+    value: function updateAdjustElementStyles() {
+      if (this.fixed_) {
+        this.adapter_.setStyleForFixedAdjustElement('margin-top', this.calculations_.toolbarHeight + 'px');
+      }
+    }
+  }, {
+    key: 'getFlexibleExpansionRatio_',
+    value: function getFlexibleExpansionRatio_(scrollTop) {
+      // To prevent division by zero when there is no flexibleExpansionHeight
+      var delta = 0.0001;
+      return Math.max(0, 1 - scrollTop / (this.calculations_.flexibleExpansionHeight + delta));
+    }
+  }, {
+    key: 'checkRowHeight_',
+    value: function checkRowHeight_() {
+      var _this2 = this;
+
+      cancelAnimationFrame(this.checkRowHeightFrame_);
+      this.checkRowHeightFrame_ = requestAnimationFrame(function () {
+        return _this2.setKeyHeights_();
+      });
+    }
+  }, {
+    key: 'setKeyHeights_',
+    value: function setKeyHeights_() {
+      var newToolbarRowHeight = this.getRowHeight_();
+      if (newToolbarRowHeight !== this.calculations_.toolbarRowHeight) {
+        this.calculations_.toolbarRowHeight = newToolbarRowHeight;
+        this.calculations_.toolbarHeight = this.calculations_.toolbarRatio * this.calculations_.toolbarRowHeight;
+        this.calculations_.flexibleExpansionHeight = this.calculations_.flexibleExpansionRatio * this.calculations_.toolbarRowHeight;
+        this.calculations_.maxTranslateYDistance = this.calculations_.maxTranslateYRatio * this.calculations_.toolbarRowHeight;
+        this.calculations_.scrollThreshold = this.calculations_.scrollThresholdRatio * this.calculations_.toolbarRowHeight;
+        this.updateAdjustElementStyles();
+        this.updateToolbarStyles_();
+      }
+    }
+  }, {
+    key: 'updateToolbarStyles_',
+    value: function updateToolbarStyles_() {
+      var _this3 = this;
+
+      cancelAnimationFrame(this.scrollFrame_);
+      this.scrollFrame_ = requestAnimationFrame(function () {
+        var scrollTop = _this3.adapter_.getViewportScrollY();
+        var hasScrolledOutOfThreshold = _this3.scrolledOutOfThreshold_(scrollTop);
+
+        if (hasScrolledOutOfThreshold && _this3.executedLastChange_) {
+          return;
+        }
+
+        var flexibleExpansionRatio = _this3.getFlexibleExpansionRatio_(scrollTop);
+
+        _this3.updateToolbarFlexibleState_(flexibleExpansionRatio);
+        if (_this3.fixedLastrow_) {
+          _this3.updateToolbarFixedState_(scrollTop);
+        }
+        if (_this3.hasFlexibleRow_) {
+          _this3.updateFlexibleRowElementStyles_(flexibleExpansionRatio);
+        }
+        _this3.executedLastChange_ = hasScrolledOutOfThreshold;
+        _this3.adapter_.notifyChange({ flexibleExpansionRatio: flexibleExpansionRatio });
+      });
+    }
+  }, {
+    key: 'scrolledOutOfThreshold_',
+    value: function scrolledOutOfThreshold_(scrollTop) {
+      return scrollTop > this.calculations_.scrollThreshold;
+    }
+  }, {
+    key: 'initKeyRatio_',
+    value: function initKeyRatio_() {
+      var toolbarRowHeight = this.getRowHeight_();
+      var firstRowMaxRatio = this.adapter_.getFirstRowElementOffsetHeight() / toolbarRowHeight;
+      this.calculations_.toolbarRatio = this.adapter_.getOffsetHeight() / toolbarRowHeight;
+      this.calculations_.flexibleExpansionRatio = firstRowMaxRatio - 1;
+      this.calculations_.maxTranslateYRatio = this.fixedLastrow_ ? this.calculations_.toolbarRatio - firstRowMaxRatio : 0;
+      this.calculations_.scrollThresholdRatio = (this.fixedLastrow_ ? this.calculations_.toolbarRatio : firstRowMaxRatio) - 1;
+    }
+  }, {
+    key: 'getRowHeight_',
+    value: function getRowHeight_() {
+      var breakpoint = MDCToolbarFoundation.numbers.TOOLBAR_MOBILE_BREAKPOINT;
+      return this.adapter_.getViewportWidth() < breakpoint ? MDCToolbarFoundation.numbers.TOOLBAR_ROW_MOBILE_HEIGHT : MDCToolbarFoundation.numbers.TOOLBAR_ROW_HEIGHT;
+    }
+  }, {
+    key: 'updateToolbarFlexibleState_',
+    value: function updateToolbarFlexibleState_(flexibleExpansionRatio) {
+      this.adapter_.removeClass(MDCToolbarFoundation.cssClasses.FLEXIBLE_MAX);
+      this.adapter_.removeClass(MDCToolbarFoundation.cssClasses.FLEXIBLE_MIN);
+      if (flexibleExpansionRatio === 1) {
+        this.adapter_.addClass(MDCToolbarFoundation.cssClasses.FLEXIBLE_MAX);
+      } else if (flexibleExpansionRatio === 0) {
+        this.adapter_.addClass(MDCToolbarFoundation.cssClasses.FLEXIBLE_MIN);
+      }
+    }
+  }, {
+    key: 'updateToolbarFixedState_',
+    value: function updateToolbarFixedState_(scrollTop) {
+      var translateDistance = Math.max(0, Math.min(scrollTop - this.calculations_.flexibleExpansionHeight, this.calculations_.maxTranslateYDistance));
+      this.adapter_.setStyle('transform', 'translateY(' + -translateDistance + 'px)');
+
+      if (translateDistance === this.calculations_.maxTranslateYDistance) {
+        this.adapter_.addClass(MDCToolbarFoundation.cssClasses.FIXED_AT_LAST_ROW);
+      } else {
+        this.adapter_.removeClass(MDCToolbarFoundation.cssClasses.FIXED_AT_LAST_ROW);
+      }
+    }
+  }, {
+    key: 'updateFlexibleRowElementStyles_',
+    value: function updateFlexibleRowElementStyles_(flexibleExpansionRatio) {
+      if (this.fixed_) {
+        var height = this.calculations_.flexibleExpansionHeight * flexibleExpansionRatio;
+        this.adapter_.setStyleForFlexibleRowElement('height', height + this.calculations_.toolbarRowHeight + 'px');
+      }
+      if (this.useFlexDefaultBehavior_) {
+        this.updateElementStylesDefaultBehavior_(flexibleExpansionRatio);
+      }
+    }
+  }, {
+    key: 'updateElementStylesDefaultBehavior_',
+    value: function updateElementStylesDefaultBehavior_(flexibleExpansionRatio) {
+      var maxTitleSize = MDCToolbarFoundation.numbers.MAX_TITLE_SIZE;
+      var minTitleSize = MDCToolbarFoundation.numbers.MIN_TITLE_SIZE;
+      var currentTitleSize = (maxTitleSize - minTitleSize) * flexibleExpansionRatio + minTitleSize;
+
+      this.adapter_.setStyleForTitleElement('font-size', currentTitleSize + 'rem');
+    }
+  }]);
+
+  return MDCToolbarFoundation;
+}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
+
+/* harmony default export */ __webpack_exports__["a"] = (MDCToolbarFoundation);
+
+/***/ }),
+/* 80 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return strings; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return numbers; });
+/**
+ * Copyright 2017 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var cssClasses = {
+  FIXED: 'mdc-toolbar--fixed',
+  FIXED_LASTROW: 'mdc-toolbar--fixed-lastrow-only',
+  FIXED_AT_LAST_ROW: 'mdc-toolbar--fixed-at-last-row',
+  TOOLBAR_ROW_FLEXIBLE: 'mdc-toolbar--flexible',
+  FLEXIBLE_DEFAULT_BEHAVIOR: 'mdc-toolbar--flexible-default-behavior',
+  FLEXIBLE_MAX: 'mdc-toolbar--flexible-space-maximized',
+  FLEXIBLE_MIN: 'mdc-toolbar--flexible-space-minimized'
+};
+
+var strings = {
+  TITLE_SELECTOR: '.mdc-toolbar__title',
+  FIRST_ROW_SELECTOR: '.mdc-toolbar__row:first-child',
+  CHANGE_EVENT: 'MDCToolbar:change'
+};
+
+var numbers = {
+  MAX_TITLE_SIZE: 2.125,
+  MIN_TITLE_SIZE: 1.25,
+  TOOLBAR_ROW_HEIGHT: 64,
+  TOOLBAR_ROW_MOBILE_HEIGHT: 56,
+  TOOLBAR_MOBILE_BREAKPOINT: 600
+};
+
+/***/ }),
+/* 81 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
+/**
+ * Copyright 2016 Google Inc. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+var supportsPassive_ = void 0;
+
+// Determine whether the current browser supports passive event listeners, and if so, use them.
+function applyPassive() {
+  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
+  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+  if (supportsPassive_ === undefined || forceRefresh) {
+    var isSupported = false;
+    try {
+      globalObj.document.addEventListener('test', null, { get passive() {
+          isSupported = true;
+        } });
+    } catch (e) {}
+
+    supportsPassive_ = isSupported;
+  }
+
+  return supportsPassive_ ? { passive: true } : false;
+}
+
+/***/ })
+/******/ ]);
+});

File diff suppressed because it is too large
+ 5 - 0
public/web/lib/mdc/dist/material-components-web.min.css


File diff suppressed because it is too large
+ 5 - 0
public/web/lib/mdc/dist/material-components-web.min.js


+ 1 - 1
public/webapps.json

@@ -29,7 +29,7 @@
 
     "vr":{
         "title":"Live monument",
-        "imgUrl": "",
+        "imgUrl": "./vr/webimg.jpg",
         "text": "App"
     }
 }

+ 53 - 32
support/client/lib/index.html

@@ -15,12 +15,12 @@
 
 <html>
 
-  <!-- The Virtual World Framework client is a collection of scripts and a world specification   -->
-  <!-- passed to an initialization call. In this sample, the world specification is provided     -->
-  <!-- inline for clarity, but it is normally provided by the reflector or may be specified as a -->
-  <!-- URI and loaded from a network-visible location.                                           -->
+<!-- The Virtual World Framework client is a collection of scripts and a world specification   -->
+<!-- passed to an initialization call. In this sample, the world specification is provided     -->
+<!-- inline for clarity, but it is normally provided by the reflector or may be specified as a -->
+<!-- URI and loaded from a network-visible location.                                           -->
 
-  <head>
+<head>
 
     <title>Virtual World Framework</title>
     <link rel="icon" type="image/x-icon" href="favicon.ico" />
@@ -30,24 +30,30 @@
     <script type="text/javascript" src="compatibilitycheck.js"></script>
 
     <script type="text/javascript" src="socket.io/socket.io.js"></script>
-   <!-- <script type="text/javascript" src="socket.io-sessionid-patch.js"></script> -->
+    <!-- <script type="text/javascript" src="socket.io-sessionid-patch.js"></script> -->
+
 
-     
     <script type="text/javascript" src="vwf/view/lib/cell.js"></script>
     <script type="text/javascript" src="vwf/view/lib/he.js"></script>
     <script type="text/javascript" src="vwf/view/lib/draggabilly.pkgd.js"></script>
 
     <link rel="stylesheet" href="vwf/view/lib/mdc/dist/material-components-web.css">
-    <script src= "vwf/view/lib/mdc/dist/material-components-web.js"></script>
+    <script src="vwf/view/lib/mdc/dist/material-components-web.js"></script>
 
     <script type="text/javascript" src="require.js"></script>
 
     <script type="text/javascript" src="async.js"></script>
 
     <script type="text/javascript" src="closure/base.js"></script>
-    <script type="text/javascript">goog.require('goog.vec.Vec2')</script>
-    <script type="text/javascript">goog.require('goog.vec.Mat4')</script>
-    <script type="text/javascript">goog.require('goog.vec.Quaternion')</script>
+    <script type="text/javascript">
+        goog.require('goog.vec.Vec2')
+    </script>
+    <script type="text/javascript">
+        goog.require('goog.vec.Mat4')
+    </script>
+    <script type="text/javascript">
+        goog.require('goog.vec.Quaternion')
+    </script>
 
     <script type="text/javascript" src="crypto.js"></script>
     <script type="text/javascript" src="md5.js"></script>
@@ -72,13 +78,13 @@
     <!-- in a shared world. Views may accept external input -such as pointer and key events or   -->
     <!-- directives from a connection to an outside engine that is not visible to all users- but -->
     <!-- may only affect the simulation indirectly through the synchronization server.           -->
-    
+
     <script type="text/javascript">
         // Users can specify which libraries the application will load by adding parameters to the URL.
         // Model libraries are specified as a query parameter and view libraries as a hash fragment.
         var queryString = window.location.search.substring(1);
         var hashString = window.location.hash.substring(2);
-        var userLibraries = {model:{}, view:{}};
+        var userLibraries = { model: {}, view: {} };
         var googleEarth = false;
         var match;
         var application;
@@ -90,7 +96,7 @@
                 "jquery-ui": "jquery-ui-1.10.3.custom.min",
                 hammer: "jquery.hammer",
             },
-            shim: {                
+            shim: {
                 "jquery-ui": {
                     deps: ["jquery"],
                     exports: "$"
@@ -102,11 +108,11 @@
                 }
             }
         };
-        require(requireConfig, ["jquery", "jquery-encoder-0.1.0"], function($) {
-            while(match = regex.exec(queryString)) {
+        require(requireConfig, ["jquery", "jquery-encoder-0.1.0"], function ($) {
+            while (match = regex.exec(queryString)) {
                 var key = $.encoder.canonicalize(match[1]);
                 var parameters = $.encoder.canonicalize(match[2]);
-                if(key == "application") {
+                if (key == "application") {
                     // Get the application specification if one is provided in the query string.
                     application = parameters;
                 }
@@ -114,35 +120,36 @@
                     try {
                         parameters = JSON.parse(parameters);
                     }
-                    catch(e) {
+                    catch (e) {
                     }
                     userLibraries["model"]["vwf/model/" + key] = (parameters && parameters != "") ? parameters : undefined;
                 }
             }
 
-            while(match = regex.exec(hashString)) {
+            while (match = regex.exec(hashString)) {
                 var key = $.encoder.canonicalize(match[1]);
                 var parameters = $.encoder.canonicalize(match[2]);
                 try {
                     parameters = JSON.parse(parameters);
                 }
-                catch(e) {
+                catch (e) {
                 }
                 userLibraries["view"]["vwf/view/" + key] = (parameters && parameters != "") ? parameters : undefined;
-                if(key == "google-earth") {
+                if (key == "google-earth") {
                     googleEarth = true;
                 }
             }
 
-            googleEarth && document.write( "<scr" + "ipt type='text/javascript' src='http://www.google.com/jsapi?hl=en&amp;key=ABQIAAAAwbkbZLyhsmTCWXbTcjbgbRSzHs7K5SvaUdm8ua-Xxy_-2dYwMxQMhnagaawTo7L1FE1-amhuQxIlXw'></scr" + "ipt>");
+            googleEarth && document.write("<scr" + "ipt type='text/javascript' src='http://www.google.com/jsapi?hl=en&amp;key=ABQIAAAAwbkbZLyhsmTCWXbTcjbgbRSzHs7K5SvaUdm8ua-Xxy_-2dYwMxQMhnagaawTo7L1FE1-amhuQxIlXw'></scr" + "ipt>");
 
             vwf.loadConfiguration(application, userLibraries, compatibilityCheck);
-            
-        });
 
+        });
+    </script>
+    <script type="text/javascript">
+        googleEarth && google.load("earth", "1")
     </script>
-    <script type="text/javascript">googleEarth && google.load( "earth", "1" )</script>
-    
+
 
     <!-- This is the common view implementation and an example view that summarizes the          -->
     <!-- simulation state in HTML on the main page.                                              -->
@@ -150,9 +157,19 @@
     <link rel="stylesheet" type="text/css" href="index.css" />
     <link rel="stylesheet" type="text/css" href="vwf/view/editor/editor.css" />
 
-  </head>
+    <!-- Global Site Tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-11815598-9"></script>
+    <script>
+        window.dataLayer = window.dataLayer || [];
+        function gtag() { dataLayer.push(arguments) };
+        gtag('js', new Date());
+        gtag('config', 'UA-11815598-9');
+    </script>
 
-  <body class="mdc-typography">
+
+</head>
+
+<body class="mdc-typography">
     <!-- Generic clients may have nearly empty pages, but pages for custom clients may be laid   -->
     <!-- out in any manner desired. Any view and models that render to the page should be        -->
     <!-- instructed where to attach their content.                                               -->
@@ -160,7 +177,9 @@
     <!-- The main content renders to "#vwf-root", the item with the id "vwf-root".               -->
 
     <!-- The loading spinner -->
-    <div id="vwf-loading-spinner" class="pace pace-active"><div class="pace-activity"></div></div>
+    <div id="vwf-loading-spinner" class="pace pace-active">
+        <div class="pace-activity"></div>
+    </div>
 
     <div id="incompatibleBrowser">
         <div>
@@ -170,8 +189,10 @@
     <div id="vwf-root"></div>
 
 
-    <script>mdc.autoInit()</script>
+    <script>
+        mdc.autoInit()
+    </script>
 
-  </body>
+</body>
 
-</html>
+</html>

+ 6 - 5
support/client/lib/vwf.js

@@ -326,7 +326,7 @@
                      "vwf/model/aframe/addon/aframe-interpolation": {
                         deps: [ "vwf/model/aframe/aframe-master" ]
                     },
-                    "vwf/model/aframe/addon/aframe-gamepad-controls.min": {
+                    "vwf/model/aframe/extras/aframe-extras": {
                         deps: [ "vwf/model/aframe/aframe-master" ]
                     },
                     "vwf/model/aframe/addon/SkyShader": {
@@ -335,9 +335,10 @@
                     "vwf/model/aframe/addon/BVHLoader": {
                         deps: [ "vwf/model/aframe/aframe-master" ]
                     },
-                    
                     "vwf/model/aframe/addon/monument-app": {
-                        deps: [ "vwf/model/aframe/aframe-master", "vwf/model/aframe/addon/SkyShader",
+                        deps: [ "vwf/model/aframe/aframe-master",
+                        "vwf/model/aframe/extras/aframe-extras",
+                        "vwf/model/aframe/addon/SkyShader",
                         "vwf/model/aframe/addon/BVHLoader"]
                     }
                     
@@ -396,10 +397,10 @@
 
                   { library: "vwf/model/aframe", 
                     linkedLibraries: [ "vwf/model/aframe/aframe-master",
+                    "vwf/model/aframe/extras/aframe-extras",
                     "vwf/model/aframe/addon/aframe-interpolation",
                     "vwf/model/aframe/addon/SkyShader",
                     "vwf/model/aframe/addon/monument-app",
-                    "vwf/model/aframe/addon/aframe-gamepad-controls.min",
                     "vwf/model/aframe/addon/BVHLoader"
                  ], 
                     active: false 
@@ -456,10 +457,10 @@
                 
                  { library: "vwf/view/aframe", active: false },
                 { library: "vwf/model/aframe/aframe-master", active: false },
+                { library: "vwf/model/aframe/extras/aframe-extras", active: false },
                 { library: "vwf/model/aframe/addon/aframe-interpolation", active: false },
                 { library: "vwf/model/aframe/addon/SkyShader", active: false },
                 { library: "vwf/model/aframe/addon/monument-app", active: false },
-                { library: "vwf/model/aframe/addon/aframe-gamepad-controls.min", active: false },
                 { library: "vwf/model/aframe/addon/BVHLoader", active: false },
                 
               

+ 472 - 200
support/client/lib/vwf/model/aframe/addon/monument-app.js

@@ -1,227 +1,499 @@
 if (typeof AFRAME === 'undefined') {
     throw new Error('Component attempted to register before AFRAME was available.');
-  }
+}
 AFRAME.registerComponent('envmap', {
-    
-        /**
-         * Creates a new THREE.ShaderMaterial using the two shaders defined
-         * in vertex.glsl and fragment.glsl.
-         */
-        init: function () {
-            const data = this.data;
-    
-            //this.applyToMesh();
-            this.el.addEventListener('model-loaded', () => this.applyToMesh());
-        },
-        /**
-         * Update the ShaderMaterial when component data changes.
-         */
-        update: function () {
-    
-        },
-    
-        getEnvMap: function () {
-    
-            var path = './assets/textures/skybox2/';
-            var format = '.jpg';
-            var urls = [
-                path + 'px' + format, path + 'nx' + format,
-                path + 'py' + format, path + 'ny' + format,
-                path + 'pz' + format, path + 'nz' + format
-            ];
-    
-            envMap = new THREE.CubeTextureLoader().load(urls);
-            envMap.format = THREE.RGBFormat;
-            return envMap;
-    
-        },
-    
-        /**
-         * Apply the material to the current entity.
-         */
-        applyToMesh: function () {
-    
-            const mesh = this.el.getObject3D('mesh');
-            //var scene = mesh;
-            var envMap = this.getEnvMap();
-    
-    
-            mesh.traverse(function (node) {
-    
-                if (node.material) {
-    
-                    node.material.side = THREE.BackSide;
-                    node.material.needsUpdate = true;
-                    //side = THREE.DoubleSide; break;
-    
-                }
-    
-            });
-    
-            mesh.traverse(function (node) {
-    
-                if (node.material && (node.material.isMeshStandardMaterial ||
-                    (node.material.isShaderMaterial && node.material.envMap !== undefined))) {
-    
-                    node.material.envMap = envMap;
-                    node.material.needsUpdate = true;
-    
-    
-                }
-    
-            });
-    
-            // const mesh = this.el.getObject3D('mesh');
-            // if (mesh) {
-            //   mesh.material = this.material;
-            // }
-    
-        },
-        /**
-         * On each frame, update the 'time' uniform in the shaders.
-         */
-        tick: function (t) {
-    
-        }
-    })
 
+    /**
+     * Creates a new THREE.ShaderMaterial using the two shaders defined
+     * in vertex.glsl and fragment.glsl.
+     */
+    init: function () {
+        const data = this.data;
+
+        //this.applyToMesh();
+        this.el.addEventListener('model-loaded', () => this.applyToMesh());
+    },
+    /**
+     * Update the ShaderMaterial when component data changes.
+     */
+    update: function () {
+
+    },
+
+    getEnvMap: function () {
+
+        var path = './assets/textures/skybox2/';
+        var format = '.jpg';
+        var urls = [
+            path + 'px' + format, path + 'nx' + format,
+            path + 'py' + format, path + 'ny' + format,
+            path + 'pz' + format, path + 'nz' + format
+        ];
+
+        envMap = new THREE.CubeTextureLoader().load(urls);
+        envMap.format = THREE.RGBFormat;
+        return envMap;
+
+    },
+
+    /**
+     * Apply the material to the current entity.
+     */
+    applyToMesh: function () {
+
+        const mesh = this.el.getObject3D('mesh');
+        //var scene = mesh;
+        var envMap = this.getEnvMap();
+
+
+        mesh.traverse(function (node) {
+
+            if (node.material) {
+
+                node.material.side = THREE.BackSide;
+                node.material.needsUpdate = true;
+                //side = THREE.DoubleSide; break;
+
+            }
+
+        });
+
+        mesh.traverse(function (node) {
 
-    //https://threejs.org/examples/webgl_shaders_sky.html
+            if (node.material && (node.material.isMeshStandardMaterial ||
+                (node.material.isShaderMaterial && node.material.envMap !== undefined))) {
+
+                node.material.envMap = envMap;
+                node.material.needsUpdate = true;
+
+
+            }
+
+        });
+
+        // const mesh = this.el.getObject3D('mesh');
+        // if (mesh) {
+        //   mesh.material = this.material;
+        // }
+
+    },
+    /**
+     * On each frame, update the 'time' uniform in the shaders.
+     */
+    tick: function (t) {
+
+    }
+})
+
+
+//https://threejs.org/examples/webgl_shaders_sky.html
 
 AFRAME.registerComponent('skyshader', {
+
+
+    init: function () {
+
+        let sunSphereEl = document.querySelector('a-scene').querySelector('#sun');
+        this.sunSphere = sunSphereEl.object3D;
+
+        this.sky = new THREE.Sky();
+        let scene = this.el.sceneEl;
+
+
+        let effectController = {
+            turbidity: 5,
+            rayleigh: 2,
+            mieCoefficient: 0.005,
+            mieDirectionalG: 0.8,
+            luminance: 1,
+            inclination: 0, // elevation / inclination
+            azimuth: 0.25, // Facing front,
+            sun: ! true
+        };
+
+        let uniforms = this.sky.uniforms;
+        uniforms.turbidity.value = effectController.turbidity;
+        uniforms.rayleigh.value = effectController.rayleigh;
+        uniforms.luminance.value = effectController.luminance;
+        uniforms.mieCoefficient.value = effectController.mieCoefficient;
+        uniforms.mieDirectionalG.value = effectController.mieDirectionalG;
+
+        this.el.setObject3D('mesh', this.sky.mesh);
+
+        let distance = 400000;
+
+        var theta = Math.PI * (effectController.inclination - 0.5);
+        var phi = 2 * Math.PI * (effectController.azimuth - 0.5);
+
+        this.sunSphere.position.x = distance * Math.cos(phi);
+        this.sunSphere.position.y = distance * Math.sin(phi) * Math.sin(theta);
+        this.sunSphere.position.z = distance * Math.sin(phi) * Math.cos(theta);
+
+        this.sunSphere.visible = effectController.sun;
+        this.sky.uniforms.sunPosition.value.copy(this.sunSphere.position);
+
+
+    },
+
+    update: function () {
+
+    },
+
+    tick: function (t) {
+
+    }
+})
+
+AFRAME.registerComponent('sun', {
+
+
+    init: function () {
+
+        this.sunSphere = new THREE.Mesh(
+            new THREE.SphereBufferGeometry(20000, 16, 8),
+            new THREE.MeshBasicMaterial({ color: 0xffffff })
+        );
+        this.sunSphere.position.y = - 700000;
+        this.sunSphere.visible = true;
+
+        this.el.setObject3D('mesh', this.sunSphere);
+
+    },
+
+    update: function () {
+    },
+
+    tick: function (t) {
+    }
+})
+
+
+AFRAME.registerComponent('avatarbvh0', {
+
+    /**
+     * Creates a new THREE.ShaderMaterial using the two shaders defined
+     * in vertex.glsl and fragment.glsl.
+     */
+    init: function () {
+        let skeletonHelper;
+        let self = this;
+        this.clock = new THREE.Clock();
+
+
+
+        let loader = new THREE.BVHLoader();
+        loader.load("./assets/walk.bvh", function (result) {
+
+            skeletonHelper = new THREE.SkeletonHelper(result.skeleton.bones[0]);
+            skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly
+
+            //var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } );
+
+            skeletonHelper.material.depthTest = true;
+            skeletonHelper.material.lineWidth = 10.0;
+            skeletonHelper.material.depthWrite = true;
+            skeletonHelper.material.transparent = false;
+            skeletonHelper.material.flatShading = true;
+
+            var boneContainer = new THREE.Group();
+            boneContainer.add(result.skeleton.bones[0]);
+
+            self.el.setObject3D('skeletonHelper', skeletonHelper);
+            self.el.setObject3D('mesh', boneContainer);
+            //scene.add( skeletonHelper );
+            // scene.add( boneContainer );
+
+            // play animation
+            self.mixer = new THREE.AnimationMixer(skeletonHelper);
+            self.mixer.clipAction(result.clip).setEffectiveWeight(1.0).play();
+
+        });
+
+    },
+    /**
+     * Update the ShaderMaterial when component data changes.
+     */
+    update: function () {
+
+    },
+
+
+
+    tick: function (t) {
+        var delta = this.clock.getDelta();
+
+        if (this.mixer) this.mixer.update(delta);
+    }
+})
+
+
+AFRAME.registerComponent('avatarbvh', {
     
     
         init: function () {
     
-            let sunSphereEl = document.querySelector('a-scene').querySelector('#sun');
-            this.sunSphere = sunSphereEl.object3D;
-    
-            this.sky = new THREE.Sky();
-            let scene = this.el.sceneEl;
-    
-    
-            let effectController = {
-                turbidity: 5,
-                rayleigh: 2,
-                mieCoefficient: 0.005,
-                mieDirectionalG: 0.8,
-                luminance: 1,
-                inclination: 0, // elevation / inclination
-                azimuth: 0.25, // Facing front,
-                sun: ! true
-            };
-    
-            let uniforms = this.sky.uniforms;
-            uniforms.turbidity.value = effectController.turbidity;
-            uniforms.rayleigh.value = effectController.rayleigh;
-            uniforms.luminance.value = effectController.luminance;
-            uniforms.mieCoefficient.value = effectController.mieCoefficient;
-            uniforms.mieDirectionalG.value = effectController.mieDirectionalG;
-    
-            this.el.setObject3D('mesh', this.sky.mesh);
-    
-            let distance = 400000;
-    
-            var theta = Math.PI * (effectController.inclination - 0.5);
-            var phi = 2 * Math.PI * (effectController.azimuth - 0.5);
-    
-            this.sunSphere.position.x = distance * Math.cos(phi);
-            this.sunSphere.position.y = distance * Math.sin(phi) * Math.sin(theta);
-            this.sunSphere.position.z = distance * Math.sin(phi) * Math.cos(theta);
-    
-            this.sunSphere.visible = effectController.sun;
-            this.sky.uniforms.sunPosition.value.copy(this.sunSphere.position);
-    
-    
+            let helper;
+            let self = this;
+            this.clock = new THREE.Clock();
+
+            console.log(this.el.object3D);
+            this.el.addEventListener('model-loaded', function (evt) {
+
+                const model = evt.detail.model
+                console.log(model);
+
+                // let loader = new THREE.BVHLoader();
+                // loader.load("./assets/walk.bvh", function (bvh) {
+
+                //     console.log(model);
+                //      self.mixer = new THREE.AnimationMixer(model.children[0].children[0]);
+                // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
+
+                // })
+
+
+
+                //console.log(evt);
+                self.mixer = new THREE.AnimationMixer(model);
+                self.mixer.clipAction(model.animations[0]).setEffectiveWeight(1.0).play();
+
+            })
+
+            
+
+            let loader = new THREE.BVHLoader();
+            loader.load("./assets/walk.bvh", function (bvh) {
+
+
+
+                const mesh = self.el.object3D;
+                //mesh.material.skinning = true;
+                
+                // mesh.updateMatrixWorld();
+                // mesh.skeleton.calculateInverses();   
+                // mesh.normalizeSkinWeights ()
+                
+                // See example from THREE.Skeleton for the armSkeleton
+
+
+                // var rootBone = bvh.skeleton.bones[0]
+                // mesh.add( rootBone );
+            
+                
+                
+                // mesh.bind( bvh.skeleton );
+                // skeletonHelper = new THREE.SkeletonHelper(mesh);
+
+                // self.mixer = new THREE.AnimationMixer(mesh );
+                // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
+
+            })
+
         },
     
         update: function () {
-    
         },
     
         tick: function (t) {
-    
+
+            var delta = this.clock.getDelta();
+            // update skeletal animcation
+            if (this.mixer){
+            this.mixer.update(delta)
+            }
+
         }
     })
-    
-    AFRAME.registerComponent('sun', {
-    
-    
-        init: function () {
-    
-            this.sunSphere = new THREE.Mesh(
-                new THREE.SphereBufferGeometry(20000, 16, 8),
-                new THREE.MeshBasicMaterial({ color: 0xffffff })
+
+
+AFRAME.registerComponent('avatarbvh_best', {
+
+    /**
+     * Creates a new THREE.ShaderMaterial using the two shaders defined
+     * in vertex.glsl and fragment.glsl.
+     */
+
+    createBones: function (object, jsonBones) {
+        /* adapted from the THREE.SkinnedMesh constructor */
+        // create bone instances from json bone data
+        const bones = jsonBones.map(gbone => {
+            bone = new THREE.Bone()
+            bone.name = gbone.name
+            bone.position.fromArray(gbone.pos)
+            bone.quaternion.fromArray(gbone.rotq)
+            if (gbone.scl !== undefined) bone.scale.fromArray(gbone.scl)
+            return bone
+        })
+        // add bone instances to the root object
+        jsonBones.forEach((gbone, index) => {
+            if (gbone.parent !== -1 && gbone.parent !== null && bones[gbone.parent] !== undefined) {
+                bones[gbone.parent].add(bones[index])
+            } else {
+               // object.add(bones[index])
+            }
+        })
+        return bones
+    },
+
+    createSkinnedMesh: function (mesh, skeleton) {
+        // create SkinnedMesh from static mesh geometry and swap it in the scene graph
+        const skinnedMesh = new THREE.SkinnedMesh(mesh.geometry, mesh.material)
+        skinnedMesh.castShadow = true
+        skinnedMesh.receiveShadow = true
+        // bind to skeleton
+        skinnedMesh.bind(skeleton)
+        // swap mesh for skinned mesh
+        //mesh.parent.add(skinnedMesh)
+       // mesh.parent.remove(mesh)
+        return skinnedMesh
+    },
+
+    init: function () {
+        let helper;
+        let self = this;
+        this.clock = new THREE.Clock();
+
+
+        let loader = new THREE.BVHLoader();
+        loader.load("./assets/walk.bvh", function (bvh) {
+
+           // skeletonHelper = new THREE.SkeletonHelper(result.skeleton.bones[0]);
+           // skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly
+
+           self.bvhData = bvh;
+
+         new THREE.GLTFLoader().load("./assets/av2/avatar.gltf", result => {
+             let scene = result
+
+             
+             const mesh = new THREE.SkinnedMesh(
+                result,
+                new THREE.MeshPhongMaterial()
             );
-            this.sunSphere.position.y = - 700000;
-            this.sunSphere.visible = true;
-    
-            this.el.setObject3D('mesh', this.sunSphere);
-    
-        },
-    
-        update: function () {
-        },
-    
-        tick: function (t) {
-        }
+            mesh.material.skinning = true;
+            //group.add( mesh );
+            
+            mesh.updateMatrixWorld();
+            mesh.skeleton.calculateInverses();   
+            mesh.normalizeSkinWeights ()
+            
+            // See example from THREE.Skeleton for the armSkeleton
+            var rootBone = self.bvhData.skeleton.bones[0]
+            mesh.add( rootBone );
+            
+            // Bind the skeleton to the mesh
+            
+            
+            mesh.bind( self.bvhData.skeleton );
+            
+            
+            
+            skeletonHelper = new THREE.SkeletonHelper(mesh);
+            //skeletonHelper.skeleton = self.bvhData.skeleton;
+            
+            //var boneContainer = new THREE.Group();
+            // boneContainer.add(mesh);
+            
+            // mesh.bind(self.bvhData.skeleton, mesh.matrixWorld)
+            
+            // const bones = self.createBones(result, result.bones)
+            
+            // mesh.updateMatrixWorld()
+            // let skeleton = new THREE.Skeleton(bones, undefined, true)
+            // mesh.bind(skeleton, mesh.matrixWorld)
+            
+            // let body = self.createSkinnedMesh(mesh, skeleton)
+            // skeletonHelper = new THREE.SkeletonHelper(body);
+            
+            
+            self.el.setObject3D('mesh', mesh)
+            //self.el.setObject3D('mesh',boneContainer)
+            
+            self.mixer = new THREE.AnimationMixer(mesh );
+            self.mixer.clipAction(self.bvhData.clip).setEffectiveWeight(1.0).play();
+            //self.mixer.clipAction( mesh.geometry.animations[ 0 ] ).play();
+            
+
+
+        //     const mesh = new THREE.SkinnedMesh(
+        //         result,
+        //         new THREE.MeshPhongMaterial()
+        //     );
+        //     mesh.material.skinning = true;
+        //     self.el.setObject3D('mesh', mesh)
+        //     self.mixer = new THREE.AnimationMixer( mesh );
+        //     self.mixer.clipAction( mesh.geometry.animations[ 0 ] ).play();
+
+
+            // find armature root object.
+            // This is a group instance with a userData.bones property
+            // containing bones in the same format as would normally be 
+            // found on a SkinnedMesh Geometry instance
+            
+            //let root = scene.getObjectByName('Human')
+
+            // manually create bones and parent them to the root object
+            // NOTE: This is normally done in the SkinnedMesh constructor
+           
+           // const bones = self.createBones(root, root.userData.bones)
+           // const bones = bvh.skeleton.bones[0]
+
+            // Important! must update world matrices before creating skeleton instance
+            //result.updateMatrixWorld()
+            // create skeleton
+            // let skeleton = new THREE.Skeleton(bones, undefined, true)
+            // const skinnedMesh = new THREE.SkinnedMesh(result, null)
+            // skinnedMesh.bind(skeleton, mesh.matrixWorld)
+            // create SkinnedMesh from static mesh geometry
+           // let body = self.createSkinnedMesh(root.getObjectByName('Body'), skeleton)
+            
+           //let body = self.createSkinnedMesh(result, skeleton)
+
+            //let clothes = self.createSkinnedMesh(root.getObjectByName('Clothes'), skeleton)
+            // create skeleton helper
+        //     self.helper = new THREE.SkeletonHelper(root)
+        //     scene.add(self.helper)
+        //   self.el.setObject3D('mesh', scene)
+          // self.el.setObject3D('mesh', clothes)
+            //self.el.setObject3D('skeletonHelper', self.helper)
+
+
+            // scene.add( helper )
+            // skeletal animation
+          // self.mixer = new THREE.AnimationMixer(root);
+          //self.mixer.clipAction(scene.animations[0]).play()
+         // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
+         // let action = self.mixer.clipAction( scene.animations[ 0 ] ).play();
+          //action.enabled = true;
+
+        // self.mixer = new THREE.AnimationMixer(self.helper);
+        // self.mixer.clipAction(scene.animations[0]).play();
+
+            // start
+            //animate()
+        })
+
     })
-    
 
-    AFRAME.registerComponent('avatarbvh', {
-        
-            /**
-             * Creates a new THREE.ShaderMaterial using the two shaders defined
-             * in vertex.glsl and fragment.glsl.
-             */
-            init: function () {
-                let skeletonHelper;
-                let self = this;
-                this.clock = new THREE.Clock();
+    },
+    /**
+     * Update the ShaderMaterial when component data changes.
+     */
+    update: function () {
 
+    },
 
 
-               let loader = new THREE.BVHLoader();
-                loader.load( "./assets/walk.bvh", function( result ) {
-    
-                    skeletonHelper = new THREE.SkeletonHelper( result.skeleton.bones[ 0 ] );
-                    skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly
-    
-                    //var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } );
 
-                    skeletonHelper.material.depthTest = true;
-                    skeletonHelper.material.lineWidth = 10.0;
-                    skeletonHelper.material.depthWrite = true;
-                    skeletonHelper.material.transparent = false;
-                    skeletonHelper.material.flatShading = true;
+    tick: function (t) {
 
-                    var boneContainer = new THREE.Group();
-                    boneContainer.add( result.skeleton.bones[ 0 ] );
-    
-                    self.el.setObject3D('skeletonHelper', skeletonHelper);
-                    self.el.setObject3D('mesh', boneContainer);
-                    //scene.add( skeletonHelper );
-                   // scene.add( boneContainer );
-    
-                    // play animation
-                    self.mixer = new THREE.AnimationMixer( skeletonHelper );
-                    self.mixer.clipAction( result.clip ).setEffectiveWeight( 1.0 ).play();
-    
-                } );
-
-            },
-            /**
-             * Update the ShaderMaterial when component data changes.
-             */
-            update: function () {
-        
-            },
-        
-          
-       
-            tick: function (t) {
-                                var delta = this.clock.getDelta();
-                
-                                if ( this.mixer ) this.mixer.update( delta );
-            }
-        })
+        var delta = this.clock.getDelta();
+        // update skeletal animcation
+        if (this.mixer){
+        this.mixer.update(delta)
+        // update skeleton helper
+        //this.helper.update()
+        }
+
+    }
+})

+ 166 - 149
support/client/lib/vwf/model/aframe/aframe-master.js

@@ -66054,7 +66054,7 @@ function extend() {
 },{}],77:[function(_dereq_,module,exports){
 module.exports={
   "name": "aframe",
-  "version": "0.6.1",
+  "version": "0.7.0",
   "description": "A web framework for building virtual reality experiences.",
   "homepage": "https://aframe.io/",
   "main": "dist/aframe-master.js",
@@ -66072,7 +66072,7 @@ module.exports={
     "lint": "semistandard -v | snazzy",
     "lint:fix": "semistandard --fix",
     "precommit": "npm run lint",
-    "prerelease": "node scripts/release.js 0.6.0 0.6.1",
+    "prerelease": "node scripts/release.js 0.6.1 0.7.0",
     "start": "npm run dev",
     "test": "karma start ./tests/karma.conf.js",
     "test:docs": "node scripts/docsLint.js",
@@ -66959,7 +66959,6 @@ module.exports.Component = registerComponent('gearvr-controls', {
     this.checkIfControllerPresent = bind(this.checkIfControllerPresent, this);
     this.removeControllersUpdateListener = bind(this.removeControllersUpdateListener, this);
     this.onAxisMoved = bind(this.onAxisMoved, this);
-    this.onGamepadConnectionEvent = bind(this.onGamepadConnectionEvent, this);
   },
 
   init: function () {
@@ -67010,22 +67009,14 @@ module.exports.Component = registerComponent('gearvr-controls', {
                                         this.data.hand ? {hand: this.data.hand} : {});
   },
 
-  onGamepadConnectionEvent: function (evt) {
-    this.checkIfControllerPresent();
-  },
-
   play: function () {
     this.checkIfControllerPresent();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.addEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
     this.addControllersUpdateListener();
   },
 
   pause: function () {
     this.removeEventListeners();
     this.removeControllersUpdateListener();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.removeEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   injectTrackedControls: function () {
@@ -67052,7 +67043,6 @@ module.exports.Component = registerComponent('gearvr-controls', {
   },
 
   onControllersUpdate: function () {
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
     this.checkIfControllerPresent();
   },
 
@@ -67341,6 +67331,7 @@ module.exports.Component = registerComponent('hand-controls', {
 
   init: function () {
     var self = this;
+    var el = this.el;
     // Current pose.
     this.gesture = ANIMATIONS.open;
     // Active buttons populated by events provided by the attached controls.
@@ -67369,6 +67360,11 @@ module.exports.Component = registerComponent('hand-controls', {
     this.onBorYTouchEnd = function () { self.handleButton('BorY', 'touchend'); };
     this.onSurfaceTouchStart = function () { self.handleButton('surface', 'touchstart'); };
     this.onSurfaceTouchEnd = function () { self.handleButton('surface', 'touchend'); };
+    this.onControllerConnected = function () { self.setModelVisibility(true); };
+    this.onControllerDisconnected = function () { self.setModelVisibility(false); };
+
+    el.addEventListener('controllerconnected', this.onControllerConnected);
+    el.addEventListener('controllerdisconnected', this.onControllerDisconnected);
   },
 
   play: function () {
@@ -67458,9 +67454,6 @@ module.exports.Component = registerComponent('hand-controls', {
       model: false,
       rotationOffset: hand === 'left' ? 90 : -90
     };
-    el.setAttribute('vive-controls', controlConfiguration);
-    el.setAttribute('oculus-touch-controls', controlConfiguration);
-    el.setAttribute('windows-motion-controls', controlConfiguration);
 
     // Set model.
     if (hand !== previousHand) {
@@ -67471,6 +67464,11 @@ module.exports.Component = registerComponent('hand-controls', {
         el.setObject3D('mesh', mesh);
         mesh.position.set(0, 0, 0);
         mesh.rotation.set(0, 0, 0);
+        // hidden by default
+        mesh.visible = false;
+        el.setAttribute('vive-controls', controlConfiguration);
+        el.setAttribute('oculus-touch-controls', controlConfiguration);
+        el.setAttribute('windows-motion-controls', controlConfiguration);
       });
     }
   },
@@ -67625,6 +67623,12 @@ module.exports.Component = registerComponent('hand-controls', {
     fromAction.play();
     toAction.play();
     fromAction.crossFadeTo(toAction, 0.15, true);
+  },
+
+  setModelVisibility: function (visible) {
+    var model = this.el.getObject3D('mesh');
+    if (!model) { return; }
+    model.visible = visible;
   }
 });
 
@@ -67711,6 +67715,7 @@ registerComponent('laser-controls', {
     var config = this.config;
     var data = this.data;
     var el = this.el;
+    var self = this;
 
     // Set all controller models.
     el.setAttribute('daydream-controls', {hand: data.hand});
@@ -67721,7 +67726,11 @@ registerComponent('laser-controls', {
 
     // Wait for controller to connect, or have a valid pointing pose, before creating ray
     el.addEventListener('controllerconnected', createRay);
-    el.addEventListener('controllermodelready', createRay);
+    el.addEventListener('controllerdisconnected', hideRay);
+    el.addEventListener('controllermodelready', function (evt) {
+      createRay(evt);
+      self.modelReady = true;
+    });
 
     function createRay (evt) {
       var controllerConfig = config[evt.detail.name];
@@ -67744,14 +67753,20 @@ registerComponent('laser-controls', {
 
       // Only apply a default raycaster if it does not yet exist. This prevents it overwriting
       // config applied from a controllermodelready event.
-      if (evt.detail.rayOrigin || !el.hasAttribute('raycaster')) {
+      if (evt.detail.rayOrigin || !self.modelReady) {
         el.setAttribute('raycaster', raycasterConfig);
+      } else {
+        el.setAttribute('raycaster', 'showLine', true);
       }
 
       el.setAttribute('cursor', utils.extend({
         fuse: false
       }, controllerConfig.cursor));
     }
+
+    function hideRay () {
+      el.setAttribute('raycaster', 'showLine', false);
+    }
   },
 
   config: {
@@ -68471,7 +68486,7 @@ registerShader('portal', {
       'vec2 sampleUV;',
       'float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);',
       'sampleUV.y = saturate(direction.y * 0.5  + 0.5);',
-      'sampleUV.x = atan(direction.z, direction.x) * -RECIPROCAL_PI2 + 0.5;',
+      'sampleUV.x = atan(direction.z, -direction.x) * -RECIPROCAL_PI2 + 0.5;',
       'if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {',
         'gl_FragColor = vec4(strokeColor, 1.0);',
       '} else {',
@@ -68513,7 +68528,7 @@ module.exports.Component = registerComponent('look-controls', {
     this.previousHMDPosition = new THREE.Vector3();
     this.hmdQuaternion = new THREE.Quaternion();
     this.hmdEuler = new THREE.Euler();
-    this.position = {};
+    this.position = new THREE.Vector3();
     this.rotation = {};
 
     this.setupMouseControls();
@@ -68712,34 +68727,25 @@ module.exports.Component = registerComponent('look-controls', {
   /**
    * Handle positional tracking.
    */
-  updatePosition: (function () {
-    var deltaHMDPosition = new THREE.Vector3();
-
-    return function () {
-      var el = this.el;
-      var currentHMDPosition;
-      var currentPosition;
-      var position = this.position;
-      var previousHMDPosition = this.previousHMDPosition;
-      var sceneEl = this.el.sceneEl;
-
-      if (!sceneEl.is('vr-mode')) { return; }
+  updatePosition: function () {
+    var el = this.el;
+    var currentHMDPosition;
+    var currentPosition;
+    var position = this.position;
+    var previousHMDPosition = this.previousHMDPosition;
+    var sceneEl = this.el.sceneEl;
 
-      // Calculate change in position.
-      currentHMDPosition = this.calculateHMDPosition();
-      deltaHMDPosition.copy(currentHMDPosition).sub(previousHMDPosition);
+    if (!sceneEl.is('vr-mode')) { return; }
 
-      if (isNullVector(deltaHMDPosition)) { return; }
+    // Calculate change in position.
+    currentHMDPosition = this.calculateHMDPosition();
 
-      previousHMDPosition.copy(currentHMDPosition);
+    currentPosition = el.getAttribute('position');
 
-      currentPosition = el.getAttribute('position');
-      position.x = currentPosition.x + deltaHMDPosition.x;
-      position.y = currentPosition.y + deltaHMDPosition.y;
-      position.z = currentPosition.z + deltaHMDPosition.z;
-      el.setAttribute('position', position);
-    };
-  })(),
+    position.copy(currentPosition).sub(previousHMDPosition).add(currentHMDPosition);
+    el.setAttribute('position', position);
+    previousHMDPosition.copy(currentHMDPosition);
+  },
 
   /**
    * Get headset position from VRControls.
@@ -69269,15 +69275,11 @@ module.exports.Component = registerComponent('oculus-touch-controls', {
   play: function () {
     this.checkIfControllerPresent();
     this.addControllersUpdateListener();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.addEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   pause: function () {
     this.removeEventListeners();
     this.removeControllersUpdateListener();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.removeEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   updateControllerModel: function () {
@@ -71387,7 +71389,7 @@ module.exports.Component = registerComponent('tracked-controls', {
     this.controllerPosition = new THREE.Vector3();
     this.controllerQuaternion = new THREE.Quaternion();
     this.deltaControllerPosition = new THREE.Vector3();
-    this.position = {};
+    this.position = new THREE.Vector3();
     this.rotation = {};
     this.standingMatrix = new THREE.Matrix4();
 
@@ -71431,8 +71433,7 @@ module.exports.Component = registerComponent('tracked-controls', {
       data.controller
     );
 
-    // Only replace the stored controller if we find a new one.
-    this.controller = controller || this.controller;
+    this.controller = controller;
   },
 
   applyArmModel: function (controllerPosition) {
@@ -71494,15 +71495,14 @@ module.exports.Component = registerComponent('tracked-controls', {
     var controller = this.controller;
     var controllerEuler = this.controllerEuler;
     var controllerPosition = this.controllerPosition;
-    var currentPosition;
-    var deltaControllerPosition = this.deltaControllerPosition;
+    var elPosition;
+    var previousControllerPosition = this.previousControllerPosition;
     var dolly = this.dolly;
     var el = this.el;
     var pose;
     var standingMatrix = this.standingMatrix;
     var vrDisplay = this.system.vrDisplay;
     var headEl = this.getHeadElement();
-    var headObject3D = headEl.object3D;
     var headCamera = headEl.components.camera;
     var userHeight = (headCamera ? headCamera.data.userHeight : 0) || this.defaultUserHeight();
 
@@ -71510,53 +71510,48 @@ module.exports.Component = registerComponent('tracked-controls', {
 
     // Compose pose from Gamepad.
     pose = controller.pose;
-    // If no orientation, use camera.
-    if (pose.orientation) {
+    if (pose.orientation !== null) {
       dolly.quaternion.fromArray(pose.orientation);
-    } else {
-      dolly.quaternion.copy(headObject3D.quaternion);
     }
-    if (pose.position) {
+
+    // controller position or arm model
+    if (pose.position !== null) {
       dolly.position.fromArray(pose.position);
     } else {
-      if (this.data.armModel) {
-        // Controller not 6DOF, apply arm model.
-        this.applyArmModel(controllerPosition);
-      }
-      dolly.position.copy(controllerPosition);
+      // Controller not 6DOF, apply arm model.
+      if (this.data.armModel) { this.applyArmModel(dolly.position); }
     }
-    dolly.updateMatrix();
 
     // Apply transforms, if 6DOF and in VR.
-    if (pose.position && vrDisplay) {
+    if (pose.position != null && vrDisplay) {
       if (vrDisplay.stageParameters) {
         standingMatrix.fromArray(vrDisplay.stageParameters.sittingToStandingTransform);
-        dolly.applyMatrix(standingMatrix);
+        dolly.matrix.compose(dolly.position, dolly.quaternion, dolly.scale);
+        dolly.matrix.multiplyMatrices(standingMatrix, dolly.matrix);
       } else {
         // Apply default camera height
         dolly.position.y += userHeight;
-        dolly.updateMatrix();
+        dolly.matrix.compose(dolly.position, dolly.quaternion, dolly.scale);
       }
+    } else {
+      dolly.matrix.compose(dolly.position, dolly.quaternion, dolly.scale);
     }
 
     // Decompose.
     controllerEuler.setFromRotationMatrix(dolly.matrix);
     controllerPosition.setFromMatrixPosition(dolly.matrix);
 
-    // Apply rotation (as absolute, with rotation offset).
+    // Apply rotation.
     this.rotation.x = THREE.Math.radToDeg(controllerEuler.x);
     this.rotation.y = THREE.Math.radToDeg(controllerEuler.y);
     this.rotation.z = THREE.Math.radToDeg(controllerEuler.z) + this.data.rotationOffset;
     el.setAttribute('rotation', this.rotation);
 
-    // Apply position (as delta from previous Gamepad position).
-    deltaControllerPosition.copy(controllerPosition).sub(this.previousControllerPosition);
-    this.previousControllerPosition.copy(controllerPosition);
-    currentPosition = el.getAttribute('position');
-    this.position.x = currentPosition.x + deltaControllerPosition.x;
-    this.position.y = currentPosition.y + deltaControllerPosition.y;
-    this.position.z = currentPosition.z + deltaControllerPosition.z;
+    // Apply position.
+    elPosition = el.getAttribute('position');
+    this.position.copy(elPosition).sub(previousControllerPosition).add(controllerPosition);
     el.setAttribute('position', this.position);
+    previousControllerPosition.copy(controllerPosition);
   },
 
   /**
@@ -71759,15 +71754,11 @@ module.exports.Component = registerComponent('vive-controls', {
   play: function () {
     this.checkIfControllerPresent();
     this.addControllersUpdateListener();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.addEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   pause: function () {
     this.removeEventListeners();
     this.removeControllersUpdateListener();
-    // Note that due to gamepadconnected event propagation issues, we don't rely on events.
-    window.removeEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   bindMethods: function () {
@@ -72224,8 +72215,7 @@ module.exports.Component = registerComponent('windows-motion-controls', {
       'thumbstick': 'THUMBSTICK_PRESS',
       'trackpad': 'TOUCHPAD_PRESS'
     },
-    pointingPoseMeshName: 'Pointing_Pose',
-    holdingPoseMeshName: 'Holding_Pose'
+    pointingPoseMeshName: 'POINTING_POSE'
   },
 
   bindMethods: function () {
@@ -72238,11 +72228,14 @@ module.exports.Component = registerComponent('windows-motion-controls', {
 
   init: function () {
     var self = this;
+    var el = this.el;
     this.onButtonChanged = bind(this.onButtonChanged, this);
     this.onButtonDown = function (evt) { self.onButtonEvent(evt, 'down'); };
     this.onButtonUp = function (evt) { self.onButtonEvent(evt, 'up'); };
     this.onButtonTouchStart = function (evt) { self.onButtonEvent(evt, 'touchstart'); };
     this.onButtonTouchEnd = function (evt) { self.onButtonEvent(evt, 'touchend'); };
+    this.onControllerConnected = function () { self.setModelVisibility(true); };
+    this.onControllerDisconnected = function () { self.setModelVisibility(false); };
     this.controllerPresent = false;
     this.lastControllerCheck = 0;
     this.previousButtonValues = {};
@@ -72257,12 +72250,16 @@ module.exports.Component = registerComponent('windows-motion-controls', {
     // Pointing poses
     this.rayOrigin = {
       origin: new THREE.Vector3(),
-      direction: new THREE.Vector3(0, 0, -1)
+      direction: new THREE.Vector3(0, 0, -1),
+      createdFromMesh: false
     };
 
     // Stored on object to allow for mocking in tests
     this.emitIfAxesChanged = controllerUtils.emitIfAxesChanged;
     this.checkControllerPresentAndSetup = controllerUtils.checkControllerPresentAndSetup;
+
+    el.addEventListener('controllerconnected', this.onControllerConnected);
+    el.addEventListener('controllerdisconnected', this.onControllerDisconnected);
   },
 
   addEventListeners: function () {
@@ -72296,31 +72293,21 @@ module.exports.Component = registerComponent('windows-motion-controls', {
       hand: this.data.hand,
       index: this.data.pair
     });
-
-    if (this.data.hideDisconnected) {
-      this.el.setAttribute('visible', this.controllerPresent);
-    }
   },
 
   play: function () {
     this.checkIfControllerPresent();
     this.addControllersUpdateListener();
-
-    window.addEventListener('gamepadconnected', this.checkIfControllerPresent, false);
-    window.addEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   pause: function () {
     this.removeEventListeners();
     this.removeControllersUpdateListener();
-
-    window.removeEventListener('gamepadconnected', this.checkIfControllerPresent, false);
-    window.removeEventListener('gamepaddisconnected', this.checkIfControllerPresent, false);
   },
 
   updateControllerModel: function () {
     // If we do not want to load a model, or, have already loaded the model, emit the controllermodelready event.
-    if (!this.data.model || this.el.getAttribute('gltf-model')) {
+    if (!this.data.model || this.rayOrigin.createdFromMesh) {
       this.modelReady();
       return;
     }
@@ -72365,7 +72352,8 @@ module.exports.Component = registerComponent('windows-motion-controls', {
     this.el.setAttribute('tracked-controls', {
       idPrefix: GAMEPAD_ID_PREFIX,
       controller: data.pair,
-      hand: data.hand
+      hand: data.hand,
+      armModel: false
     });
 
     this.updateControllerModel();
@@ -72394,28 +72382,21 @@ module.exports.Component = registerComponent('windows-motion-controls', {
   },
 
   loadModel: function (url) {
-    debug('Loading asset from: ' + url);
-
     // The model is loaded by the gltf-model compoent when this attribute is initially set,
     // removed and re-loaded if the given url changes.
     this.el.setAttribute('gltf-model', 'url(' + url + ')');
   },
 
   onModelLoaded: function (evt) {
-    var controllerObject3D = evt.detail.model;
+    var rootNode = this.controllerModel = evt.detail.model;
     var loadedMeshInfo = this.loadedMeshInfo;
     var i;
     var meshName;
     var mesh;
     var meshInfo;
-    var quaternion = new THREE.Quaternion();
 
     debug('Processing model');
 
-    // Find the appropriate nodes
-    var rootNode = controllerObject3D.getObjectByName('RootNode');
-    rootNode.updateMatrixWorld();
-
     // Reset the caches
     loadedMeshInfo.buttonMeshes = {};
     loadedMeshInfo.axisMeshes = {};
@@ -72486,36 +72467,9 @@ module.exports.Component = registerComponent('windows-motion-controls', {
         }
       }
 
-      // Calculate the pointer pose (used for rays), by applying the inverse holding pose, then the pointing pose.
-      this.rayOrigin.origin.set(0, 0, 0);
-      this.rayOrigin.direction.set(0, 0, -1);
-
-      // Holding pose
-      mesh = rootNode.getObjectByName(this.mapping.holdingPoseMeshName);
-      if (mesh) {
-        mesh.localToWorld(this.rayOrigin.origin);
-        this.rayOrigin.direction.applyQuaternion(quaternion.setFromEuler(mesh.rotation).inverse());
-      } else {
-        debug('Mesh does not contain holding origin data.');
-        document.getElementById('debug').innerHTML += '<br />Mesh does not contain holding origin data.';
-      }
-
-      // Pointing pose
-      mesh = rootNode.getObjectByName(this.mapping.pointingPoseMeshName);
-      if (mesh) {
-        var offset = new THREE.Vector3();
-        mesh.localToWorld(offset);
-        this.rayOrigin.origin.add(offset);
-
-        this.rayOrigin.direction.applyQuaternion(quaternion.setFromEuler(mesh.rotation));
-      } else {
-        debug('Mesh does not contain pointing origin data, defaulting to none.');
-      }
-
-      // Emit event stating that our pointing ray is now accurate.
-      this.modelReady();
-    } else {
-      warn('No node with name "RootNode" in controller glTF.');
+      this.calculateRayOriginFromMesh(rootNode);
+      // Determine if the model has to be visible or not.
+      this.setModelVisibility();
     }
 
     debug('Model load complete.');
@@ -72532,6 +72486,46 @@ module.exports.Component = registerComponent('windows-motion-controls', {
     }
   },
 
+  calculateRayOriginFromMesh: (function () {
+    var quaternion = new THREE.Quaternion();
+    return function (rootNode) {
+      var mesh;
+
+      // Calculate the pointer pose (used for rays), by applying the world transform of th POINTER_POSE node
+      // in the glTF (assumes that root node is at world origin)
+      this.rayOrigin.origin.set(0, 0, 0);
+      this.rayOrigin.direction.set(0, 0, -1);
+      this.rayOrigin.createdFromMesh = true;
+
+      // Try to read Pointing pose from the source model
+      mesh = rootNode.getObjectByName(this.mapping.pointingPoseMeshName);
+      if (mesh) {
+        var parent = rootNode.parent;
+
+        // We need to read pose transforms accumulated from the root of the glTF, not the scene.
+        if (parent) {
+          rootNode.parent = null;
+          rootNode.updateMatrixWorld(true);
+          rootNode.parent = parent;
+        }
+
+        mesh.getWorldPosition(this.rayOrigin.origin);
+        mesh.getWorldQuaternion(quaternion);
+        this.rayOrigin.direction.applyQuaternion(quaternion);
+
+        // Recalculate the world matrices now that the rootNode is re-attached to the parent.
+        if (parent) {
+          rootNode.updateMatrixWorld(true);
+        }
+      } else {
+        debug('Mesh does not contain pointing origin data, defaulting to none.');
+      }
+
+      // Emit event stating that our pointing ray is now accurate.
+      this.modelReady();
+    };
+  })(),
+
   lerpAxisTransform: (function () {
     var quaternion = new THREE.Quaternion();
     return function (axis, axisValue) {
@@ -72608,6 +72602,14 @@ module.exports.Component = registerComponent('windows-motion-controls', {
     }
 
     this.emitIfAxesChanged(this, this.mapping.axes, evt);
+  },
+
+  setModelVisibility: function (visible) {
+    var model = this.el.getObject3D('mesh');
+    visible = visible !== undefined ? visible : this.modelVisible;
+    this.modelVisible = visible;
+    if (!model) { return; }
+    model.visible = visible;
   }
 });
 
@@ -76027,9 +76029,6 @@ module.exports.AScene = registerElement('a-scene', {
         // Exit VR on `vrdisplaydeactivate` (e.g. taking off Rift headset).
         window.addEventListener('vrdisplaydeactivate', this.exitVRBound);
 
-        // Enter VR on `vrdisplayconnect` (e.g. plugging on Rift headset).
-        window.addEventListener('vrdisplayconnect', this.enterVRBound);
-
         // Exit VR on `vrdisplaydisconnect` (e.g. unplugging Rift headset).
         window.addEventListener('vrdisplaydisconnect', this.exitVRTrueBound);
 
@@ -76358,12 +76357,13 @@ module.exports.AScene = registerElement('a-scene', {
         var canvas = this.canvas;
         var embedded = this.getAttribute('embedded') && !this.is('vr-mode');
         var size;
-        // Possible camera or canvas not injected yet.
-        // ON MOBILE the webvr-polyfill relies on the fullscreen API to enter
-        // VR mode. The canvas is resized by VREffect following the values returned
-        // by getEyeParameters. We don't want to overwrite the size with the
-        // windows width and height.
-        if (!camera || !canvas || this.is('vr-mode') && isMobile) { return; }
+        var isEffectPresenting = this.effect && this.effect.isPresenting;
+        // Do not update renderer, if a camera or a canvas have not been injected.
+        // In VR mode, VREffect handles canvas resize based on the dimensions returned by
+        // the getEyeParameters function of the WebVR API. These dimensions are independent of
+        // the window size, therefore should not be overwritten with the window's width and height,
+        // except when in fullscreen mode.
+        if (!camera || !canvas || (this.is('vr-mode') && (this.isMobile || isEffectPresenting))) { return; }
         // Update camera.
         size = getCanvasSize(canvas, embedded);
         camera.aspect = size.width / size.height;
@@ -76383,11 +76383,6 @@ module.exports.AScene = registerElement('a-scene', {
           antialias: shouldAntiAlias(this),
           alpha: true
         });
-        // r86 shipped with a bug fixed in https://github.com/mrdoob/three.js/pull/11970
-        // We need to setup a dummy VRDevice to avoid a TypeError
-        // when vrdisplaypresentchange fires.
-        // This line can be removed after updating to THREE r87.
-        renderer.vr.setDevice({});
         renderer.setPixelRatio(window.devicePixelRatio);
         renderer.sortObjects = false;
         this.effect = new THREE.VREffect(renderer);
@@ -78343,7 +78338,7 @@ _dereq_('./core/a-mixin');
 _dereq_('./extras/components/');
 _dereq_('./extras/primitives/');
 
-console.log('A-Frame Version: 0.6.1 (Date 08-09-2017, Commit #ee643e1)');
+console.log('A-Frame Version: 0.7.0 (Date 22-09-2017, Commit #75ac4d8)');
 console.log('three Version:', pkg.dependencies['three']);
 console.log('WebVR Polyfill Version:', pkg.dependencies['webvr-polyfill']);
 
@@ -81004,6 +80999,9 @@ THREE.VRControls = function ( object, onError ) {
 
 	}
 
+	window.addEventListener('vrdisplayconnect', function (evt) { vrDisplay = evt.display; });
+	window.addEventListener('vrdisplaydisconnect', function () { vrDisplay = undefined });
+
 	function gotVRDisplays( displays ) {
 
 		vrDisplays = displays;
@@ -81184,6 +81182,18 @@ THREE.VREffect = function( renderer, onError ) {
 
 	}
 
+	window.addEventListener('vrdisplayconnect', function (evt) { vrDisplay = evt.display; });
+	window.addEventListener('vrdisplaydisconnect', function (evt) {
+		var f;
+		
+		scope.exitPresent();
+		// Cancels current request animation frame.
+		f = scope.cancelAnimationFrame();
+		vrDisplay = undefined;
+		// Resumes the request animation frame.
+		scope.requestAnimationFrame(f);
+	});
+
 	function gotVRDisplays( displays ) {
 
 		vrDisplays = displays;
@@ -81343,10 +81353,12 @@ THREE.VREffect = function( renderer, onError ) {
 
 	this.requestAnimationFrame = function( f ) {
 
-		if ( vrDisplay !== undefined ) {
+		var f = scope.f = f || scope.f;
 
-			return vrDisplay.requestAnimationFrame( f );
+		if (!f) { return; }
 
+		if ( vrDisplay !== undefined ) {
+			return vrDisplay.requestAnimationFrame( f );
 		} else {
 
 			return window.requestAnimationFrame( f );
@@ -81357,6 +81369,10 @@ THREE.VREffect = function( renderer, onError ) {
 
 	this.cancelAnimationFrame = function( h ) {
 
+		var f = scope.f;
+
+		scope.f = undefined;
+
 		if ( vrDisplay !== undefined ) {
 
 			vrDisplay.cancelAnimationFrame( h );
@@ -81367,6 +81383,7 @@ THREE.VREffect = function( renderer, onError ) {
 
 		}
 
+		return f;
 	};
 
 	this.submitFrame = function() {

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/aframe-master.js.map


File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/aframe-master.min.js


File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/aframe-master.min.js.map


+ 17987 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.controls.js

@@ -0,0 +1,17987 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+require('./src/controls').registerAll();
+},{"./src/controls":78}],2:[function(require,module,exports){
+module.exports = Object.assign(function GamepadButton () {}, {
+	FACE_1: 0,
+	FACE_2: 1,
+	FACE_3: 2,
+	FACE_4: 3,
+
+	L_SHOULDER_1: 4,
+	R_SHOULDER_1: 5,
+	L_SHOULDER_2: 6,
+	R_SHOULDER_2: 7,
+
+	SELECT: 8,
+	START: 9,
+
+	DPAD_UP: 12,
+	DPAD_DOWN: 13,
+	DPAD_LEFT: 14,
+	DPAD_RIGHT: 15,
+
+	VENDOR: 16,
+});
+
+},{}],3:[function(require,module,exports){
+function GamepadButtonEvent (type, index, details) {
+  this.type = type;
+  this.index = index;
+  this.pressed = details.pressed;
+  this.value = details.value;
+}
+
+module.exports = GamepadButtonEvent;
+
+},{}],4:[function(require,module,exports){
+/**
+ * Polyfill for the additional KeyboardEvent properties defined in the D3E and
+ * D4E draft specifications, by @inexorabletash.
+ *
+ * See: https://github.com/inexorabletash/polyfill
+ */
+(function(global) {
+  var nativeKeyboardEvent = ('KeyboardEvent' in global);
+  if (!nativeKeyboardEvent)
+    global.KeyboardEvent = function KeyboardEvent() { throw TypeError('Illegal constructor'); };
+
+  global.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0x00; // Default or unknown location
+  global.KeyboardEvent.DOM_KEY_LOCATION_LEFT          = 0x01; // e.g. Left Alt key
+  global.KeyboardEvent.DOM_KEY_LOCATION_RIGHT         = 0x02; // e.g. Right Alt key
+  global.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD        = 0x03; // e.g. Numpad 0 or +
+
+  var STANDARD = window.KeyboardEvent.DOM_KEY_LOCATION_STANDARD,
+      LEFT = window.KeyboardEvent.DOM_KEY_LOCATION_LEFT,
+      RIGHT = window.KeyboardEvent.DOM_KEY_LOCATION_RIGHT,
+      NUMPAD = window.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD;
+
+  //--------------------------------------------------------------------
+  //
+  // Utilities
+  //
+  //--------------------------------------------------------------------
+
+  function contains(s, ss) { return String(s).indexOf(ss) !== -1; }
+
+  var os = (function() {
+    if (contains(navigator.platform, 'Win')) { return 'win'; }
+    if (contains(navigator.platform, 'Mac')) { return 'mac'; }
+    if (contains(navigator.platform, 'CrOS')) { return 'cros'; }
+    if (contains(navigator.platform, 'Linux')) { return 'linux'; }
+    if (contains(navigator.userAgent, 'iPad') || contains(navigator.platform, 'iPod') || contains(navigator.platform, 'iPhone')) { return 'ios'; }
+    return '';
+  } ());
+
+  var browser = (function() {
+    if (contains(navigator.userAgent, 'Chrome/')) { return 'chrome'; }
+    if (contains(navigator.vendor, 'Apple')) { return 'safari'; }
+    if (contains(navigator.userAgent, 'MSIE')) { return 'ie'; }
+    if (contains(navigator.userAgent, 'Gecko/')) { return 'moz'; }
+    if (contains(navigator.userAgent, 'Opera/')) { return 'opera'; }
+    return '';
+  } ());
+
+  var browser_os = browser + '-' + os;
+
+  function mergeIf(baseTable, select, table) {
+    if (browser_os === select || browser === select || os === select) {
+      Object.keys(table).forEach(function(keyCode) {
+        baseTable[keyCode] = table[keyCode];
+      });
+    }
+  }
+
+  function remap(o, key) {
+    var r = {};
+    Object.keys(o).forEach(function(k) {
+      var item = o[k];
+      if (key in item) {
+        r[item[key]] = item;
+      }
+    });
+    return r;
+  }
+
+  function invert(o) {
+    var r = {};
+    Object.keys(o).forEach(function(k) {
+      r[o[k]] = k;
+    });
+    return r;
+  }
+
+  //--------------------------------------------------------------------
+  //
+  // Generic Mappings
+  //
+  //--------------------------------------------------------------------
+
+  // "keyInfo" is a dictionary:
+  //   code: string - name from DOM Level 3 KeyboardEvent code Values
+  //     https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3Events-code.html
+  //   location (optional): number - one of the DOM_KEY_LOCATION values
+  //   keyCap (optional): string - keyboard label in en-US locale
+  // USB code Usage ID from page 0x07 unless otherwise noted (Informative)
+
+  // Map of keyCode to keyInfo
+  var keyCodeToInfoTable = {
+    // 0x01 - VK_LBUTTON
+    // 0x02 - VK_RBUTTON
+    0x03: { code: 'Cancel' }, // [USB: 0x9b] char \x0018 ??? (Not in D3E)
+    // 0x04 - VK_MBUTTON
+    // 0x05 - VK_XBUTTON1
+    // 0x06 - VK_XBUTTON2
+    0x06: { code: 'Help' }, // [USB: 0x75] ???
+    // 0x07 - undefined
+    0x08: { code: 'Backspace' }, // [USB: 0x2a] Labelled Delete on Macintosh keyboards.
+    0x09: { code: 'Tab' }, // [USB: 0x2b]
+    // 0x0A-0x0B - reserved
+    0X0C: { code: 'Clear' }, // [USB: 0x9c] NumPad Center (Not in D3E)
+    0X0D: { code: 'Enter' }, // [USB: 0x28]
+    // 0x0E-0x0F - undefined
+
+    0x10: { code: 'Shift' },
+    0x11: { code: 'Control' },
+    0x12: { code: 'Alt' },
+    0x13: { code: 'Pause' }, // [USB: 0x48]
+    0x14: { code: 'CapsLock' }, // [USB: 0x39]
+    0x15: { code: 'KanaMode' }, // [USB: 0x88] - "HangulMode" for Korean layout
+    0x16: { code: 'HangulMode' }, // [USB: 0x90] 0x15 as well in MSDN VK table ???
+    0x17: { code: 'JunjaMode' }, // (Not in D3E)
+    0x18: { code: 'FinalMode' }, // (Not in D3E)
+    0x19: { code: 'KanjiMode' }, // [USB: 0x91] - "HanjaMode" for Korean layout
+    // 0x1A - undefined
+    0x1B: { code: 'Escape' }, // [USB: 0x29]
+    0x1C: { code: 'Convert' }, // [USB: 0x8a]
+    0x1D: { code: 'NonConvert' }, // [USB: 0x8b]
+    0x1E: { code: 'Accept' }, // (Not in D3E)
+    0x1F: { code: 'ModeChange' }, // (Not in D3E)
+
+    0x20: { code: 'Space' }, // [USB: 0x2c]
+    0x21: { code: 'PageUp' }, // [USB: 0x4b]
+    0x22: { code: 'PageDown' }, // [USB: 0x4e]
+    0x23: { code: 'End' }, // [USB: 0x4d]
+    0x24: { code: 'Home' }, // [USB: 0x4a]
+    0x25: { code: 'ArrowLeft' }, // [USB: 0x50]
+    0x26: { code: 'ArrowUp' }, // [USB: 0x52]
+    0x27: { code: 'ArrowRight' }, // [USB: 0x4f]
+    0x28: { code: 'ArrowDown' }, // [USB: 0x51]
+    0x29: { code: 'Select' }, // (Not in D3E)
+    0x2A: { code: 'Print' }, // (Not in D3E)
+    0x2B: { code: 'Execute' }, // [USB: 0x74] (Not in D3E)
+    0x2C: { code: 'PrintScreen' }, // [USB: 0x46]
+    0x2D: { code: 'Insert' }, // [USB: 0x49]
+    0x2E: { code: 'Delete' }, // [USB: 0x4c]
+    0x2F: { code: 'Help' }, // [USB: 0x75] ???
+
+    0x30: { code: 'Digit0', keyCap: '0' }, // [USB: 0x27] 0)
+    0x31: { code: 'Digit1', keyCap: '1' }, // [USB: 0x1e] 1!
+    0x32: { code: 'Digit2', keyCap: '2' }, // [USB: 0x1f] 2@
+    0x33: { code: 'Digit3', keyCap: '3' }, // [USB: 0x20] 3#
+    0x34: { code: 'Digit4', keyCap: '4' }, // [USB: 0x21] 4$
+    0x35: { code: 'Digit5', keyCap: '5' }, // [USB: 0x22] 5%
+    0x36: { code: 'Digit6', keyCap: '6' }, // [USB: 0x23] 6^
+    0x37: { code: 'Digit7', keyCap: '7' }, // [USB: 0x24] 7&
+    0x38: { code: 'Digit8', keyCap: '8' }, // [USB: 0x25] 8*
+    0x39: { code: 'Digit9', keyCap: '9' }, // [USB: 0x26] 9(
+    // 0x3A-0x40 - undefined
+
+    0x41: { code: 'KeyA', keyCap: 'a' }, // [USB: 0x04]
+    0x42: { code: 'KeyB', keyCap: 'b' }, // [USB: 0x05]
+    0x43: { code: 'KeyC', keyCap: 'c' }, // [USB: 0x06]
+    0x44: { code: 'KeyD', keyCap: 'd' }, // [USB: 0x07]
+    0x45: { code: 'KeyE', keyCap: 'e' }, // [USB: 0x08]
+    0x46: { code: 'KeyF', keyCap: 'f' }, // [USB: 0x09]
+    0x47: { code: 'KeyG', keyCap: 'g' }, // [USB: 0x0a]
+    0x48: { code: 'KeyH', keyCap: 'h' }, // [USB: 0x0b]
+    0x49: { code: 'KeyI', keyCap: 'i' }, // [USB: 0x0c]
+    0x4A: { code: 'KeyJ', keyCap: 'j' }, // [USB: 0x0d]
+    0x4B: { code: 'KeyK', keyCap: 'k' }, // [USB: 0x0e]
+    0x4C: { code: 'KeyL', keyCap: 'l' }, // [USB: 0x0f]
+    0x4D: { code: 'KeyM', keyCap: 'm' }, // [USB: 0x10]
+    0x4E: { code: 'KeyN', keyCap: 'n' }, // [USB: 0x11]
+    0x4F: { code: 'KeyO', keyCap: 'o' }, // [USB: 0x12]
+
+    0x50: { code: 'KeyP', keyCap: 'p' }, // [USB: 0x13]
+    0x51: { code: 'KeyQ', keyCap: 'q' }, // [USB: 0x14]
+    0x52: { code: 'KeyR', keyCap: 'r' }, // [USB: 0x15]
+    0x53: { code: 'KeyS', keyCap: 's' }, // [USB: 0x16]
+    0x54: { code: 'KeyT', keyCap: 't' }, // [USB: 0x17]
+    0x55: { code: 'KeyU', keyCap: 'u' }, // [USB: 0x18]
+    0x56: { code: 'KeyV', keyCap: 'v' }, // [USB: 0x19]
+    0x57: { code: 'KeyW', keyCap: 'w' }, // [USB: 0x1a]
+    0x58: { code: 'KeyX', keyCap: 'x' }, // [USB: 0x1b]
+    0x59: { code: 'KeyY', keyCap: 'y' }, // [USB: 0x1c]
+    0x5A: { code: 'KeyZ', keyCap: 'z' }, // [USB: 0x1d]
+    0x5B: { code: 'OSLeft', location: LEFT }, // [USB: 0xe3]
+    0x5C: { code: 'OSRight', location: RIGHT }, // [USB: 0xe7]
+    0x5D: { code: 'ContextMenu' }, // [USB: 0x65] Context Menu
+    // 0x5E - reserved
+    0x5F: { code: 'Standby' }, // [USB: 0x82] Sleep
+
+    0x60: { code: 'Numpad0', keyCap: '0', location: NUMPAD }, // [USB: 0x62]
+    0x61: { code: 'Numpad1', keyCap: '1', location: NUMPAD }, // [USB: 0x59]
+    0x62: { code: 'Numpad2', keyCap: '2', location: NUMPAD }, // [USB: 0x5a]
+    0x63: { code: 'Numpad3', keyCap: '3', location: NUMPAD }, // [USB: 0x5b]
+    0x64: { code: 'Numpad4', keyCap: '4', location: NUMPAD }, // [USB: 0x5c]
+    0x65: { code: 'Numpad5', keyCap: '5', location: NUMPAD }, // [USB: 0x5d]
+    0x66: { code: 'Numpad6', keyCap: '6', location: NUMPAD }, // [USB: 0x5e]
+    0x67: { code: 'Numpad7', keyCap: '7', location: NUMPAD }, // [USB: 0x5f]
+    0x68: { code: 'Numpad8', keyCap: '8', location: NUMPAD }, // [USB: 0x60]
+    0x69: { code: 'Numpad9', keyCap: '9', location: NUMPAD }, // [USB: 0x61]
+    0x6A: { code: 'NumpadMultiply', keyCap: '*', location: NUMPAD }, // [USB: 0x55]
+    0x6B: { code: 'NumpadAdd', keyCap: '+', location: NUMPAD }, // [USB: 0x57]
+    0x6C: { code: 'NumpadComma', keyCap: ',', location: NUMPAD }, // [USB: 0x85]
+    0x6D: { code: 'NumpadSubtract', keyCap: '-', location: NUMPAD }, // [USB: 0x56]
+    0x6E: { code: 'NumpadDecimal', keyCap: '.', location: NUMPAD }, // [USB: 0x63]
+    0x6F: { code: 'NumpadDivide', keyCap: '/', location: NUMPAD }, // [USB: 0x54]
+
+    0x70: { code: 'F1' }, // [USB: 0x3a]
+    0x71: { code: 'F2' }, // [USB: 0x3b]
+    0x72: { code: 'F3' }, // [USB: 0x3c]
+    0x73: { code: 'F4' }, // [USB: 0x3d]
+    0x74: { code: 'F5' }, // [USB: 0x3e]
+    0x75: { code: 'F6' }, // [USB: 0x3f]
+    0x76: { code: 'F7' }, // [USB: 0x40]
+    0x77: { code: 'F8' }, // [USB: 0x41]
+    0x78: { code: 'F9' }, // [USB: 0x42]
+    0x79: { code: 'F10' }, // [USB: 0x43]
+    0x7A: { code: 'F11' }, // [USB: 0x44]
+    0x7B: { code: 'F12' }, // [USB: 0x45]
+    0x7C: { code: 'F13' }, // [USB: 0x68]
+    0x7D: { code: 'F14' }, // [USB: 0x69]
+    0x7E: { code: 'F15' }, // [USB: 0x6a]
+    0x7F: { code: 'F16' }, // [USB: 0x6b]
+
+    0x80: { code: 'F17' }, // [USB: 0x6c]
+    0x81: { code: 'F18' }, // [USB: 0x6d]
+    0x82: { code: 'F19' }, // [USB: 0x6e]
+    0x83: { code: 'F20' }, // [USB: 0x6f]
+    0x84: { code: 'F21' }, // [USB: 0x70]
+    0x85: { code: 'F22' }, // [USB: 0x71]
+    0x86: { code: 'F23' }, // [USB: 0x72]
+    0x87: { code: 'F24' }, // [USB: 0x73]
+    // 0x88-0x8F - unassigned
+
+    0x90: { code: 'NumLock', location: NUMPAD }, // [USB: 0x53]
+    0x91: { code: 'ScrollLock' }, // [USB: 0x47]
+    // 0x92-0x96 - OEM specific
+    // 0x97-0x9F - unassigned
+
+    // NOTE: 0xA0-0xA5 usually mapped to 0x10-0x12 in browsers
+    0xA0: { code: 'ShiftLeft', location: LEFT }, // [USB: 0xe1]
+    0xA1: { code: 'ShiftRight', location: RIGHT }, // [USB: 0xe5]
+    0xA2: { code: 'ControlLeft', location: LEFT }, // [USB: 0xe0]
+    0xA3: { code: 'ControlRight', location: RIGHT }, // [USB: 0xe4]
+    0xA4: { code: 'AltLeft', location: LEFT }, // [USB: 0xe2]
+    0xA5: { code: 'AltRight', location: RIGHT }, // [USB: 0xe6]
+
+    0xA6: { code: 'BrowserBack' }, // [USB: 0x0c/0x0224]
+    0xA7: { code: 'BrowserForward' }, // [USB: 0x0c/0x0225]
+    0xA8: { code: 'BrowserRefresh' }, // [USB: 0x0c/0x0227]
+    0xA9: { code: 'BrowserStop' }, // [USB: 0x0c/0x0226]
+    0xAA: { code: 'BrowserSearch' }, // [USB: 0x0c/0x0221]
+    0xAB: { code: 'BrowserFavorites' }, // [USB: 0x0c/0x0228]
+    0xAC: { code: 'BrowserHome' }, // [USB: 0x0c/0x0222]
+    0xAD: { code: 'VolumeMute' }, // [USB: 0x7f]
+    0xAE: { code: 'VolumeDown' }, // [USB: 0x81]
+    0xAF: { code: 'VolumeUp' }, // [USB: 0x80]
+
+    0xB0: { code: 'MediaTrackNext' }, // [USB: 0x0c/0x00b5]
+    0xB1: { code: 'MediaTrackPrevious' }, // [USB: 0x0c/0x00b6]
+    0xB2: { code: 'MediaStop' }, // [USB: 0x0c/0x00b7]
+    0xB3: { code: 'MediaPlayPause' }, // [USB: 0x0c/0x00cd]
+    0xB4: { code: 'LaunchMail' }, // [USB: 0x0c/0x018a]
+    0xB5: { code: 'MediaSelect' },
+    0xB6: { code: 'LaunchApp1' },
+    0xB7: { code: 'LaunchApp2' },
+    // 0xB8-0xB9 - reserved
+    0xBA: { code: 'Semicolon',  keyCap: ';' }, // [USB: 0x33] ;: (US Standard 101)
+    0xBB: { code: 'Equal', keyCap: '=' }, // [USB: 0x2e] =+
+    0xBC: { code: 'Comma', keyCap: ',' }, // [USB: 0x36] ,<
+    0xBD: { code: 'Minus', keyCap: '-' }, // [USB: 0x2d] -_
+    0xBE: { code: 'Period', keyCap: '.' }, // [USB: 0x37] .>
+    0xBF: { code: 'Slash', keyCap: '/' }, // [USB: 0x38] /? (US Standard 101)
+
+    0xC0: { code: 'Backquote', keyCap: '`' }, // [USB: 0x35] `~ (US Standard 101)
+    // 0xC1-0xCF - reserved
+
+    // 0xD0-0xD7 - reserved
+    // 0xD8-0xDA - unassigned
+    0xDB: { code: 'BracketLeft', keyCap: '[' }, // [USB: 0x2f] [{ (US Standard 101)
+    0xDC: { code: 'Backslash',  keyCap: '\\' }, // [USB: 0x31] \| (US Standard 101)
+    0xDD: { code: 'BracketRight', keyCap: ']' }, // [USB: 0x30] ]} (US Standard 101)
+    0xDE: { code: 'Quote', keyCap: '\'' }, // [USB: 0x34] '" (US Standard 101)
+    // 0xDF - miscellaneous/varies
+
+    // 0xE0 - reserved
+    // 0xE1 - OEM specific
+    0xE2: { code: 'IntlBackslash',  keyCap: '\\' }, // [USB: 0x64] \| (UK Standard 102)
+    // 0xE3-0xE4 - OEM specific
+    0xE5: { code: 'Process' }, // (Not in D3E)
+    // 0xE6 - OEM specific
+    // 0xE7 - VK_PACKET
+    // 0xE8 - unassigned
+    // 0xE9-0xEF - OEM specific
+
+    // 0xF0-0xF5 - OEM specific
+    0xF6: { code: 'Attn' }, // [USB: 0x9a] (Not in D3E)
+    0xF7: { code: 'CrSel' }, // [USB: 0xa3] (Not in D3E)
+    0xF8: { code: 'ExSel' }, // [USB: 0xa4] (Not in D3E)
+    0xF9: { code: 'EraseEof' }, // (Not in D3E)
+    0xFA: { code: 'Play' }, // (Not in D3E)
+    0xFB: { code: 'ZoomToggle' }, // (Not in D3E)
+    // 0xFC - VK_NONAME - reserved
+    // 0xFD - VK_PA1
+    0xFE: { code: 'Clear' } // [USB: 0x9c] (Not in D3E)
+  };
+
+  // No legacy keyCode, but listed in D3E:
+
+  // code: usb
+  // 'IntlHash': 0x070032,
+  // 'IntlRo': 0x070087,
+  // 'IntlYen': 0x070089,
+  // 'NumpadBackspace': 0x0700bb,
+  // 'NumpadClear': 0x0700d8,
+  // 'NumpadClearEntry': 0x0700d9,
+  // 'NumpadMemoryAdd': 0x0700d3,
+  // 'NumpadMemoryClear': 0x0700d2,
+  // 'NumpadMemoryRecall': 0x0700d1,
+  // 'NumpadMemoryStore': 0x0700d0,
+  // 'NumpadMemorySubtract': 0x0700d4,
+  // 'NumpadParenLeft': 0x0700b6,
+  // 'NumpadParenRight': 0x0700b7,
+
+  //--------------------------------------------------------------------
+  //
+  // Browser/OS Specific Mappings
+  //
+  //--------------------------------------------------------------------
+
+  mergeIf(keyCodeToInfoTable,
+          'moz', {
+            0x3B: { code: 'Semicolon', keyCap: ';' }, // [USB: 0x33] ;: (US Standard 101)
+            0x3D: { code: 'Equal', keyCap: '=' }, // [USB: 0x2e] =+
+            0x6B: { code: 'Equal', keyCap: '=' }, // [USB: 0x2e] =+
+            0x6D: { code: 'Minus', keyCap: '-' }, // [USB: 0x2d] -_
+            0xBB: { code: 'NumpadAdd', keyCap: '+', location: NUMPAD }, // [USB: 0x57]
+            0xBD: { code: 'NumpadSubtract', keyCap: '-', location: NUMPAD } // [USB: 0x56]
+          });
+
+  mergeIf(keyCodeToInfoTable,
+          'moz-mac', {
+            0x0C: { code: 'NumLock', location: NUMPAD }, // [USB: 0x53]
+            0xAD: { code: 'Minus', keyCap: '-' } // [USB: 0x2d] -_
+          });
+
+  mergeIf(keyCodeToInfoTable,
+          'moz-win', {
+            0xAD: { code: 'Minus', keyCap: '-' } // [USB: 0x2d] -_
+          });
+
+  mergeIf(keyCodeToInfoTable,
+          'chrome-mac', {
+            0x5D: { code: 'OSRight', location: RIGHT } // [USB: 0xe7]
+          });
+
+  // Windows via Bootcamp (!)
+  if (0) {
+    mergeIf(keyCodeToInfoTable,
+            'chrome-win', {
+              0xC0: { code: 'Quote', keyCap: '\'' }, // [USB: 0x34] '" (US Standard 101)
+              0xDE: { code: 'Backslash',  keyCap: '\\' }, // [USB: 0x31] \| (US Standard 101)
+              0xDF: { code: 'Backquote', keyCap: '`' } // [USB: 0x35] `~ (US Standard 101)
+            });
+
+    mergeIf(keyCodeToInfoTable,
+            'ie', {
+              0xC0: { code: 'Quote', keyCap: '\'' }, // [USB: 0x34] '" (US Standard 101)
+              0xDE: { code: 'Backslash',  keyCap: '\\' }, // [USB: 0x31] \| (US Standard 101)
+              0xDF: { code: 'Backquote', keyCap: '`' } // [USB: 0x35] `~ (US Standard 101)
+            });
+  }
+
+  mergeIf(keyCodeToInfoTable,
+          'safari', {
+            0x03: { code: 'Enter' }, // [USB: 0x28] old Safari
+            0x19: { code: 'Tab' } // [USB: 0x2b] old Safari for Shift+Tab
+          });
+
+  mergeIf(keyCodeToInfoTable,
+          'ios', {
+            0x0A: { code: 'Enter', location: STANDARD } // [USB: 0x28]
+          });
+
+  mergeIf(keyCodeToInfoTable,
+          'safari-mac', {
+            0x5B: { code: 'OSLeft', location: LEFT }, // [USB: 0xe3]
+            0x5D: { code: 'OSRight', location: RIGHT }, // [USB: 0xe7]
+            0xE5: { code: 'KeyQ', keyCap: 'Q' } // [USB: 0x14] On alternate presses, Ctrl+Q sends this
+          });
+
+  //--------------------------------------------------------------------
+  //
+  // Identifier Mappings
+  //
+  //--------------------------------------------------------------------
+
+  // Cases where newer-ish browsers send keyIdentifier which can be
+  // used to disambiguate keys.
+
+  // keyIdentifierTable[keyIdentifier] -> keyInfo
+
+  var keyIdentifierTable = {};
+  if ('cros' === os) {
+    keyIdentifierTable['U+00A0'] = { code: 'ShiftLeft', location: LEFT };
+    keyIdentifierTable['U+00A1'] = { code: 'ShiftRight', location: RIGHT };
+    keyIdentifierTable['U+00A2'] = { code: 'ControlLeft', location: LEFT };
+    keyIdentifierTable['U+00A3'] = { code: 'ControlRight', location: RIGHT };
+    keyIdentifierTable['U+00A4'] = { code: 'AltLeft', location: LEFT };
+    keyIdentifierTable['U+00A5'] = { code: 'AltRight', location: RIGHT };
+  }
+  if ('chrome-mac' === browser_os) {
+    keyIdentifierTable['U+0010'] = { code: 'ContextMenu' };
+  }
+  if ('safari-mac' === browser_os) {
+    keyIdentifierTable['U+0010'] = { code: 'ContextMenu' };
+  }
+  if ('ios' === os) {
+    // These only generate keyup events
+    keyIdentifierTable['U+0010'] = { code: 'Function' };
+
+    keyIdentifierTable['U+001C'] = { code: 'ArrowLeft' };
+    keyIdentifierTable['U+001D'] = { code: 'ArrowRight' };
+    keyIdentifierTable['U+001E'] = { code: 'ArrowUp' };
+    keyIdentifierTable['U+001F'] = { code: 'ArrowDown' };
+
+    keyIdentifierTable['U+0001'] = { code: 'Home' }; // [USB: 0x4a] Fn + ArrowLeft
+    keyIdentifierTable['U+0004'] = { code: 'End' }; // [USB: 0x4d] Fn + ArrowRight
+    keyIdentifierTable['U+000B'] = { code: 'PageUp' }; // [USB: 0x4b] Fn + ArrowUp
+    keyIdentifierTable['U+000C'] = { code: 'PageDown' }; // [USB: 0x4e] Fn + ArrowDown
+  }
+
+  //--------------------------------------------------------------------
+  //
+  // Location Mappings
+  //
+  //--------------------------------------------------------------------
+
+  // Cases where newer-ish browsers send location/keyLocation which
+  // can be used to disambiguate keys.
+
+  // locationTable[location][keyCode] -> keyInfo
+  var locationTable = [];
+  locationTable[LEFT] = {
+    0x10: { code: 'ShiftLeft', location: LEFT }, // [USB: 0xe1]
+    0x11: { code: 'ControlLeft', location: LEFT }, // [USB: 0xe0]
+    0x12: { code: 'AltLeft', location: LEFT } // [USB: 0xe2]
+  };
+  locationTable[RIGHT] = {
+    0x10: { code: 'ShiftRight', location: RIGHT }, // [USB: 0xe5]
+    0x11: { code: 'ControlRight', location: RIGHT }, // [USB: 0xe4]
+    0x12: { code: 'AltRight', location: RIGHT } // [USB: 0xe6]
+  };
+  locationTable[NUMPAD] = {
+    0x0D: { code: 'NumpadEnter', location: NUMPAD } // [USB: 0x58]
+  };
+
+  mergeIf(locationTable[NUMPAD], 'moz', {
+    0x6D: { code: 'NumpadSubtract', location: NUMPAD }, // [USB: 0x56]
+    0x6B: { code: 'NumpadAdd', location: NUMPAD } // [USB: 0x57]
+  });
+  mergeIf(locationTable[LEFT], 'moz-mac', {
+    0xE0: { code: 'OSLeft', location: LEFT } // [USB: 0xe3]
+  });
+  mergeIf(locationTable[RIGHT], 'moz-mac', {
+    0xE0: { code: 'OSRight', location: RIGHT } // [USB: 0xe7]
+  });
+  mergeIf(locationTable[RIGHT], 'moz-win', {
+    0x5B: { code: 'OSRight', location: RIGHT } // [USB: 0xe7]
+  });
+
+
+  mergeIf(locationTable[RIGHT], 'mac', {
+    0x5D: { code: 'OSRight', location: RIGHT } // [USB: 0xe7]
+  });
+
+  mergeIf(locationTable[NUMPAD], 'chrome-mac', {
+    0x0C: { code: 'NumLock', location: NUMPAD } // [USB: 0x53]
+  });
+
+  mergeIf(locationTable[NUMPAD], 'safari-mac', {
+    0x0C: { code: 'NumLock', location: NUMPAD }, // [USB: 0x53]
+    0xBB: { code: 'NumpadAdd', location: NUMPAD }, // [USB: 0x57]
+    0xBD: { code: 'NumpadSubtract', location: NUMPAD }, // [USB: 0x56]
+    0xBE: { code: 'NumpadDecimal', location: NUMPAD }, // [USB: 0x63]
+    0xBF: { code: 'NumpadDivide', location: NUMPAD } // [USB: 0x54]
+  });
+
+
+  //--------------------------------------------------------------------
+  //
+  // Key Values
+  //
+  //--------------------------------------------------------------------
+
+  // Mapping from `code` values to `key` values. Values defined at:
+  // https://dvcs.w3.org/hg/dom3events/raw-file/tip/html/DOM3Events-key.html
+  // Entries are only provided when `key` differs from `code`. If
+  // printable, `shiftKey` has the shifted printable character. This
+  // assumes US Standard 101 layout
+
+  var codeToKeyTable = {
+    // Modifier Keys
+    ShiftLeft: { key: 'Shift' },
+    ShiftRight: { key: 'Shift' },
+    ControlLeft: { key: 'Control' },
+    ControlRight: { key: 'Control' },
+    AltLeft: { key: 'Alt' },
+    AltRight: { key: 'Alt' },
+    OSLeft: { key: 'OS' },
+    OSRight: { key: 'OS' },
+
+    // Whitespace Keys
+    NumpadEnter: { key: 'Enter' },
+    Space: { key: ' ' },
+
+    // Printable Keys
+    Digit0: { key: '0', shiftKey: ')' },
+    Digit1: { key: '1', shiftKey: '!' },
+    Digit2: { key: '2', shiftKey: '@' },
+    Digit3: { key: '3', shiftKey: '#' },
+    Digit4: { key: '4', shiftKey: '$' },
+    Digit5: { key: '5', shiftKey: '%' },
+    Digit6: { key: '6', shiftKey: '^' },
+    Digit7: { key: '7', shiftKey: '&' },
+    Digit8: { key: '8', shiftKey: '*' },
+    Digit9: { key: '9', shiftKey: '(' },
+    KeyA: { key: 'a', shiftKey: 'A' },
+    KeyB: { key: 'b', shiftKey: 'B' },
+    KeyC: { key: 'c', shiftKey: 'C' },
+    KeyD: { key: 'd', shiftKey: 'D' },
+    KeyE: { key: 'e', shiftKey: 'E' },
+    KeyF: { key: 'f', shiftKey: 'F' },
+    KeyG: { key: 'g', shiftKey: 'G' },
+    KeyH: { key: 'h', shiftKey: 'H' },
+    KeyI: { key: 'i', shiftKey: 'I' },
+    KeyJ: { key: 'j', shiftKey: 'J' },
+    KeyK: { key: 'k', shiftKey: 'K' },
+    KeyL: { key: 'l', shiftKey: 'L' },
+    KeyM: { key: 'm', shiftKey: 'M' },
+    KeyN: { key: 'n', shiftKey: 'N' },
+    KeyO: { key: 'o', shiftKey: 'O' },
+    KeyP: { key: 'p', shiftKey: 'P' },
+    KeyQ: { key: 'q', shiftKey: 'Q' },
+    KeyR: { key: 'r', shiftKey: 'R' },
+    KeyS: { key: 's', shiftKey: 'S' },
+    KeyT: { key: 't', shiftKey: 'T' },
+    KeyU: { key: 'u', shiftKey: 'U' },
+    KeyV: { key: 'v', shiftKey: 'V' },
+    KeyW: { key: 'w', shiftKey: 'W' },
+    KeyX: { key: 'x', shiftKey: 'X' },
+    KeyY: { key: 'y', shiftKey: 'Y' },
+    KeyZ: { key: 'z', shiftKey: 'Z' },
+    Numpad0: { key: '0' },
+    Numpad1: { key: '1' },
+    Numpad2: { key: '2' },
+    Numpad3: { key: '3' },
+    Numpad4: { key: '4' },
+    Numpad5: { key: '5' },
+    Numpad6: { key: '6' },
+    Numpad7: { key: '7' },
+    Numpad8: { key: '8' },
+    Numpad9: { key: '9' },
+    NumpadMultiply: { key: '*' },
+    NumpadAdd: { key: '+' },
+    NumpadComma: { key: ',' },
+    NumpadSubtract: { key: '-' },
+    NumpadDecimal: { key: '.' },
+    NumpadDivide: { key: '/' },
+    Semicolon: { key: ';', shiftKey: ':' },
+    Equal: { key: '=', shiftKey: '+' },
+    Comma: { key: ',', shiftKey: '<' },
+    Minus: { key: '-', shiftKey: '_' },
+    Period: { key: '.', shiftKey: '>' },
+    Slash: { key: '/', shiftKey: '?' },
+    Backquote: { key: '`', shiftKey: '~' },
+    BracketLeft: { key: '[', shiftKey: '{' },
+    Backslash: { key: '\\', shiftKey: '|' },
+    BracketRight: { key: ']', shiftKey: '}' },
+    Quote: { key: '\'', shiftKey: '"' },
+    IntlBackslash: { key: '\\', shiftKey: '|' }
+  };
+
+  mergeIf(codeToKeyTable, 'mac', {
+    OSLeft: { key: 'Meta' },
+    OSRight: { key: 'Meta' }
+  });
+
+  // Corrections for 'key' names in older browsers (e.g. FF36-)
+  // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.key#Key_values
+  var keyFixTable = {
+    Esc: 'Escape',
+    Nonconvert: 'NonConvert',
+    Left: 'ArrowLeft',
+    Up: 'ArrowUp',
+    Right: 'ArrowRight',
+    Down: 'ArrowDown',
+    Del: 'Delete',
+    Menu: 'ContextMenu',
+    MediaNextTrack: 'MediaTrackNext',
+    MediaPreviousTrack: 'MediaTrackPrevious',
+    SelectMedia: 'MediaSelect',
+    HalfWidth: 'Hankaku',
+    FullWidth: 'Zenkaku',
+    RomanCharacters: 'Romaji',
+    Crsel: 'CrSel',
+    Exsel: 'ExSel',
+    Zoom: 'ZoomToggle'
+  };
+
+  //--------------------------------------------------------------------
+  //
+  // Exported Functions
+  //
+  //--------------------------------------------------------------------
+
+
+  var codeTable = remap(keyCodeToInfoTable, 'code');
+
+  try {
+    var nativeLocation = nativeKeyboardEvent && ('location' in new KeyboardEvent(''));
+  } catch (_) {}
+
+  function keyInfoForEvent(event) {
+    var keyCode = 'keyCode' in event ? event.keyCode : 'which' in event ? event.which : 0;
+
+    var keyInfo = (function(){
+      if (nativeLocation || 'keyLocation' in event) {
+        var location = nativeLocation ? event.location : event.keyLocation;
+        if (location && keyCode in locationTable[location]) {
+          return locationTable[location][keyCode];
+        }
+      }
+      if ('keyIdentifier' in event && event.keyIdentifier in keyIdentifierTable) {
+        return keyIdentifierTable[event.keyIdentifier];
+      }
+      if (keyCode in keyCodeToInfoTable) {
+        return keyCodeToInfoTable[keyCode];
+      }
+      return null;
+    }());
+
+    // TODO: Track these down and move to general tables
+    if (0) {
+      // TODO: Map these for newerish browsers?
+      // TODO: iOS only?
+      // TODO: Override with more common keyIdentifier name?
+      switch (event.keyIdentifier) {
+      case 'U+0010': keyInfo = { code: 'Function' }; break;
+      case 'U+001C': keyInfo = { code: 'ArrowLeft' }; break;
+      case 'U+001D': keyInfo = { code: 'ArrowRight' }; break;
+      case 'U+001E': keyInfo = { code: 'ArrowUp' }; break;
+      case 'U+001F': keyInfo = { code: 'ArrowDown' }; break;
+      }
+    }
+
+    if (!keyInfo)
+      return null;
+
+    var key = (function() {
+      var entry = codeToKeyTable[keyInfo.code];
+      if (!entry) return keyInfo.code;
+      return (event.shiftKey && 'shiftKey' in entry) ? entry.shiftKey : entry.key;
+    }());
+
+    return {
+      code: keyInfo.code,
+      key: key,
+      location: keyInfo.location,
+      keyCap: keyInfo.keyCap
+    };
+  }
+
+  function queryKeyCap(code, locale) {
+    code = String(code);
+    if (!codeTable.hasOwnProperty(code)) return 'Undefined';
+    if (locale && String(locale).toLowerCase() !== 'en-us') throw Error('Unsupported locale');
+    var keyInfo = codeTable[code];
+    return keyInfo.keyCap || keyInfo.code || 'Undefined';
+  }
+
+  if ('KeyboardEvent' in global && 'defineProperty' in Object) {
+    (function() {
+      function define(o, p, v) {
+        if (p in o) return;
+        Object.defineProperty(o, p, v);
+      }
+
+      define(KeyboardEvent.prototype, 'code', { get: function() {
+        var keyInfo = keyInfoForEvent(this);
+        return keyInfo ? keyInfo.code : '';
+      }});
+
+      // Fix for nonstandard `key` values (FF36-)
+      if ('key' in KeyboardEvent.prototype) {
+        var desc = Object.getOwnPropertyDescriptor(KeyboardEvent.prototype, 'key');
+        Object.defineProperty(KeyboardEvent.prototype, 'key', { get: function() {
+          var key = desc.get.call(this);
+          return keyFixTable.hasOwnProperty(key) ? keyFixTable[key] : key;
+        }});
+      }
+
+      define(KeyboardEvent.prototype, 'key', { get: function() {
+        var keyInfo = keyInfoForEvent(this);
+        return (keyInfo && 'key' in keyInfo) ? keyInfo.key : 'Unidentified';
+      }});
+
+      define(KeyboardEvent.prototype, 'location', { get: function() {
+        var keyInfo = keyInfoForEvent(this);
+        return (keyInfo && 'location' in keyInfo) ? keyInfo.location : STANDARD;
+      }});
+
+      define(KeyboardEvent.prototype, 'locale', { get: function() {
+        return '';
+      }});
+    }());
+  }
+
+  if (!('queryKeyCap' in global.KeyboardEvent))
+    global.KeyboardEvent.queryKeyCap = queryKeyCap;
+
+  // Helper for IE8-
+  global.identifyKey = function(event) {
+    if ('code' in event)
+      return;
+
+    var keyInfo = keyInfoForEvent(event);
+    event.code = keyInfo ? keyInfo.code : '';
+    event.key = (keyInfo && 'key' in keyInfo) ? keyInfo.key : 'Unidentified';
+    event.location = ('location' in event) ? event.location :
+      ('keyLocation' in event) ? event.keyLocation :
+      (keyInfo && 'location' in keyInfo) ? keyInfo.location : STANDARD;
+    event.locale = '';
+  };
+
+} (window));
+
+},{}],5:[function(require,module,exports){
+var CANNON = require('cannon'),
+    math = require('./src/components/math');
+
+module.exports = {
+  'dynamic-body':   require('./src/components/body/dynamic-body'),
+  'static-body':    require('./src/components/body/static-body'),
+  'constraint':     require('./src/components/constraint'),
+  'system':         require('./src/system/physics'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    math.registerAll();
+    if (!AFRAME.systems.physics)            AFRAME.registerSystem('physics',         this.system);
+    if (!AFRAME.components['dynamic-body']) AFRAME.registerComponent('dynamic-body', this['dynamic-body']);
+    if (!AFRAME.components['static-body'])  AFRAME.registerComponent('static-body',  this['static-body']);
+    if (!AFRAME.components['constraint'])   AFRAME.registerComponent('constraint',   this['constraint']);
+
+    this._registered = true;
+  }
+};
+
+// Export CANNON.js.
+window.CANNON = window.CANNON || CANNON;
+
+},{"./src/components/body/dynamic-body":8,"./src/components/body/static-body":9,"./src/components/constraint":10,"./src/components/math":11,"./src/system/physics":15,"cannon":17}],6:[function(require,module,exports){
+/**
+ * CANNON.shape2mesh
+ *
+ * Source: http://schteppe.github.io/cannon.js/build/cannon.demo.js
+ * Author: @schteppe
+ */
+var CANNON = require('cannon');
+
+CANNON.shape2mesh = function(body){
+    var obj = new THREE.Object3D();
+
+    for (var l = 0; l < body.shapes.length; l++) {
+        var shape = body.shapes[l];
+
+        var mesh;
+
+        switch(shape.type){
+
+        case CANNON.Shape.types.SPHERE:
+            var sphere_geometry = new THREE.SphereGeometry( shape.radius, 8, 8);
+            mesh = new THREE.Mesh( sphere_geometry, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.PARTICLE:
+            mesh = new THREE.Mesh( this.particleGeo, this.particleMaterial );
+            var s = this.settings;
+            mesh.scale.set(s.particleSize,s.particleSize,s.particleSize);
+            break;
+
+        case CANNON.Shape.types.PLANE:
+            var geometry = new THREE.PlaneGeometry(10, 10, 4, 4);
+            mesh = new THREE.Object3D();
+            var submesh = new THREE.Object3D();
+            var ground = new THREE.Mesh( geometry, this.currentMaterial );
+            ground.scale.set(100, 100, 100);
+            submesh.add(ground);
+
+            ground.castShadow = true;
+            ground.receiveShadow = true;
+
+            mesh.add(submesh);
+            break;
+
+        case CANNON.Shape.types.BOX:
+            var box_geometry = new THREE.BoxGeometry(  shape.halfExtents.x*2,
+                                                        shape.halfExtents.y*2,
+                                                        shape.halfExtents.z*2 );
+            mesh = new THREE.Mesh( box_geometry, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.CONVEXPOLYHEDRON:
+            var geo = new THREE.Geometry();
+
+            // Add vertices
+            for (var i = 0; i < shape.vertices.length; i++) {
+                var v = shape.vertices[i];
+                geo.vertices.push(new THREE.Vector3(v.x, v.y, v.z));
+            }
+
+            for(var i=0; i < shape.faces.length; i++){
+                var face = shape.faces[i];
+
+                // add triangles
+                var a = face[0];
+                for (var j = 1; j < face.length - 1; j++) {
+                    var b = face[j];
+                    var c = face[j + 1];
+                    geo.faces.push(new THREE.Face3(a, b, c));
+                }
+            }
+            geo.computeBoundingSphere();
+            geo.computeFaceNormals();
+            mesh = new THREE.Mesh( geo, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.HEIGHTFIELD:
+            var geometry = new THREE.Geometry();
+
+            var v0 = new CANNON.Vec3();
+            var v1 = new CANNON.Vec3();
+            var v2 = new CANNON.Vec3();
+            for (var xi = 0; xi < shape.data.length - 1; xi++) {
+                for (var yi = 0; yi < shape.data[xi].length - 1; yi++) {
+                    for (var k = 0; k < 2; k++) {
+                        shape.getConvexTrianglePillar(xi, yi, k===0);
+                        v0.copy(shape.pillarConvex.vertices[0]);
+                        v1.copy(shape.pillarConvex.vertices[1]);
+                        v2.copy(shape.pillarConvex.vertices[2]);
+                        v0.vadd(shape.pillarOffset, v0);
+                        v1.vadd(shape.pillarOffset, v1);
+                        v2.vadd(shape.pillarOffset, v2);
+                        geometry.vertices.push(
+                            new THREE.Vector3(v0.x, v0.y, v0.z),
+                            new THREE.Vector3(v1.x, v1.y, v1.z),
+                            new THREE.Vector3(v2.x, v2.y, v2.z)
+                        );
+                        var i = geometry.vertices.length - 3;
+                        geometry.faces.push(new THREE.Face3(i, i+1, i+2));
+                    }
+                }
+            }
+            geometry.computeBoundingSphere();
+            geometry.computeFaceNormals();
+            mesh = new THREE.Mesh(geometry, this.currentMaterial);
+            break;
+
+        case CANNON.Shape.types.TRIMESH:
+            var geometry = new THREE.Geometry();
+
+            var v0 = new CANNON.Vec3();
+            var v1 = new CANNON.Vec3();
+            var v2 = new CANNON.Vec3();
+            for (var i = 0; i < shape.indices.length / 3; i++) {
+                shape.getTriangleVertices(i, v0, v1, v2);
+                geometry.vertices.push(
+                    new THREE.Vector3(v0.x, v0.y, v0.z),
+                    new THREE.Vector3(v1.x, v1.y, v1.z),
+                    new THREE.Vector3(v2.x, v2.y, v2.z)
+                );
+                var j = geometry.vertices.length - 3;
+                geometry.faces.push(new THREE.Face3(j, j+1, j+2));
+            }
+            geometry.computeBoundingSphere();
+            geometry.computeFaceNormals();
+            mesh = new THREE.Mesh(geometry, this.currentMaterial);
+            break;
+
+        default:
+            throw "Visual type not recognized: "+shape.type;
+        }
+
+        mesh.receiveShadow = true;
+        mesh.castShadow = true;
+        if(mesh.children){
+            for(var i=0; i<mesh.children.length; i++){
+                mesh.children[i].castShadow = true;
+                mesh.children[i].receiveShadow = true;
+                if(mesh.children[i]){
+                    for(var j=0; j<mesh.children[i].length; j++){
+                        mesh.children[i].children[j].castShadow = true;
+                        mesh.children[i].children[j].receiveShadow = true;
+                    }
+                }
+            }
+        }
+
+        var o = body.shapeOffsets[l];
+        var q = body.shapeOrientations[l];
+        mesh.position.set(o.x, o.y, o.z);
+        mesh.quaternion.set(q.x, q.y, q.z, q.w);
+
+        obj.add(mesh);
+    }
+
+    return obj;
+};
+
+module.exports = CANNON.shape2mesh;
+
+},{"cannon":17}],7:[function(require,module,exports){
+var CANNON = require('cannon'),
+    mesh2shape = require('three-to-cannon');
+
+require('../../../lib/CANNON-shape2mesh');
+
+module.exports = {
+  schema: {
+    shape: {default: 'auto', oneOf: ['auto', 'box', 'cylinder', 'sphere', 'hull', 'none']},
+    cylinderAxis: {default: 'y', oneOf: ['x', 'y', 'z']},
+    sphereRadius: {default: NaN}
+  },
+
+  /**
+   * Initializes a body component, assigning it to the physics system and binding listeners for
+   * parsing the elements geometry.
+   */
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+
+    if (this.el.sceneEl.hasLoaded) {
+      this.initBody();
+    } else {
+      this.el.sceneEl.addEventListener('loaded', this.initBody.bind(this));
+    }
+  },
+
+  /**
+   * Parses an element's geometry and component metadata to create a CANNON.Body instance for the
+   * component.
+   */
+  initBody: function () {
+    var shape,
+        el = this.el,
+        data = this.data,
+        pos = el.getAttribute('position');
+
+    this.body = new CANNON.Body({
+      mass: data.mass || 0,
+      material: this.system.material,
+      position: new CANNON.Vec3(pos.x, pos.y, pos.z),
+      linearDamping: data.linearDamping,
+      angularDamping: data.angularDamping
+    });
+
+    // Matrix World must be updated at root level, if scale is to be applied – updateMatrixWorld()
+    // only checks an object's parent, not the rest of the ancestors. Hence, a wrapping entity with
+    // scale="0.5 0.5 0.5" will be ignored.
+    // Reference: https://github.com/mrdoob/three.js/blob/master/src/core/Object3D.js#L511-L541
+    // Potential fix: https://github.com/mrdoob/three.js/pull/7019
+    this.el.object3D.updateMatrixWorld(true);
+
+    if(data.shape !== 'none') {
+      var options = data.shape === 'auto' ? undefined : AFRAME.utils.extend({}, this.data, {
+        type: mesh2shape.Type[data.shape.toUpperCase()]
+      });
+
+      shape = mesh2shape(this.el.object3D, options);
+
+      if (!shape) {
+        this.el.addEventListener('model-loaded', this.initBody.bind(this));
+        return;
+      }
+
+      this.body.addShape(shape, shape.offset, shape.orientation);
+
+      // Show wireframe
+      if (this.system.debug) {
+        this.createWireframe(this.body, shape);
+      }
+    }
+
+    // Apply rotation
+    var rot = el.getAttribute('rotation');
+    this.body.quaternion.setFromEuler(
+      THREE.Math.degToRad(rot.x),
+      THREE.Math.degToRad(rot.y),
+      THREE.Math.degToRad(rot.z),
+      'XYZ'
+    ).normalize();
+
+    this.el.body = this.body;
+    this.body.el = this.el;
+    this.isLoaded = true;
+
+    // If component wasn't initialized when play() was called, finish up.
+    if (this.isPlaying) {
+      this._play();
+    }
+
+    this.el.emit('body-loaded', {body: this.el.body});
+  },
+
+  /**
+   * Registers the component with the physics system, if ready.
+   */
+  play: function () {
+    if (this.isLoaded) this._play();
+  },
+
+  /**
+   * Internal helper to register component with physics system.
+   */
+  _play: function () {
+    this.system.addBehavior(this, this.system.Phase.SIMULATE);
+    this.system.addBody(this.body);
+    if (this.wireframe) this.el.sceneEl.object3D.add(this.wireframe);
+
+    this.syncToPhysics();
+  },
+
+  /**
+   * Unregisters the component with the physics system.
+   */
+  pause: function () {
+    if (!this.isLoaded) return;
+
+    this.system.removeBehavior(this, this.system.Phase.SIMULATE);
+    this.system.removeBody(this.body);
+    if (this.wireframe) this.el.sceneEl.object3D.remove(this.wireframe);
+  },
+
+  /**
+   * Removes the component and all physics and scene side effects.
+   */
+  remove: function () {
+    this.pause();
+    delete this.body.el;
+    delete this.body;
+    delete this.el.body;
+    delete this.wireframe;
+  },
+
+  /**
+   * Creates a wireframe for the body, for debugging.
+   * TODO(donmccurdy) – Refactor this into a standalone utility or component.
+   * @param  {CANNON.Body} body
+   * @param  {CANNON.Shape} shape
+   */
+  createWireframe: function (body, shape) {
+    var offset = shape.offset,
+        orientation = shape.orientation,
+        mesh = CANNON.shape2mesh(body).children[0];
+
+    this.wireframe = new THREE.LineSegments(
+      new THREE.EdgesGeometry(mesh.geometry),
+      new THREE.LineBasicMaterial({color: 0xff0000})
+    );
+
+    if (offset) {
+      this.wireframe.offset = offset.clone();
+    }
+
+    if (orientation) {
+      orientation.inverse(orientation);
+      this.wireframe.orientation = new THREE.Quaternion(
+        orientation.x,
+        orientation.y,
+        orientation.z,
+        orientation.w
+      );
+    }
+
+    this.syncWireframe();
+  },
+
+  /**
+   * Updates the debugging wireframe's position and rotation.
+   */
+  syncWireframe: function () {
+    var offset,
+        wireframe = this.wireframe;
+
+    if (!this.wireframe) return;
+
+    // Apply rotation. If the shape required custom orientation, also apply
+    // that on the wireframe.
+    wireframe.quaternion.copy(this.body.quaternion);
+    if (wireframe.orientation) {
+      wireframe.quaternion.multiply(wireframe.orientation);
+    }
+
+    // Apply position. If the shape required custom offset, also apply that on
+    // the wireframe.
+    wireframe.position.copy(this.body.position);
+    if (wireframe.offset) {
+      offset = wireframe.offset.clone().applyQuaternion(wireframe.quaternion);
+      wireframe.position.add(offset);
+    }
+
+    wireframe.updateMatrix();
+  },
+
+  /**
+   * Updates the CANNON.Body instance's position, velocity, and rotation, based on the scene.
+   */
+  syncToPhysics: (function () {
+    var q =  new THREE.Quaternion(),
+        v = new THREE.Vector3();
+    return function () {
+      var el = this.el,
+          parentEl = el.parentEl,
+          body = this.body;
+
+      if (!body) return;
+
+      if (el.components.velocity) body.velocity.copy(el.getAttribute('velocity'));
+
+      if (parentEl.isScene) {
+        body.quaternion.copy(el.object3D.quaternion);
+        body.position.copy(el.object3D.position);
+      } else {
+        el.object3D.getWorldQuaternion(q);
+        body.quaternion.copy(q);
+        el.object3D.getWorldPosition(v);
+        body.position.copy(v);
+      }
+
+      if (this.wireframe) this.syncWireframe();
+    };
+  }()),
+
+  /**
+   * Updates the scene object's position and rotation, based on the physics simulation.
+   */
+  syncFromPhysics: (function () {
+    var v = new THREE.Vector3(),
+        q1 = new THREE.Quaternion(),
+        q2 = new THREE.Quaternion();
+    return function () {
+      var el = this.el,
+          parentEl = el.parentEl,
+          body = this.body;
+
+      if (!body) return;
+
+      if (parentEl.isScene) {
+        el.setAttribute('quaternion', body.quaternion);
+        el.setAttribute('position', body.position);
+      } else {
+        // TODO - Nested rotation doesn't seem to be working as expected.
+        q1.copy(body.quaternion);
+        parentEl.object3D.getWorldQuaternion(q2);
+        q1.multiply(q2.inverse());
+        el.setAttribute('quaternion', {x: q1.x, y: q1.y, z: q1.z, w: q1.w});
+
+        v.copy(body.position);
+        parentEl.object3D.worldToLocal(v);
+        el.setAttribute('position', {x: v.x, y: v.y, z: v.z});
+      }
+
+      if (this.wireframe) this.syncWireframe();
+    };
+  }())
+};
+
+},{"../../../lib/CANNON-shape2mesh":6,"cannon":17,"three-to-cannon":73}],8:[function(require,module,exports){
+var Body = require('./body');
+
+/**
+ * Dynamic body.
+ *
+ * Moves according to physics simulation, and may collide with other objects.
+ */
+module.exports = AFRAME.utils.extend({}, Body, {
+  dependencies: ['quaternion', 'velocity'],
+
+  schema: AFRAME.utils.extend({}, Body.schema, {
+    mass:           { default: 5 },
+    linearDamping:  { default: 0.01 },
+    angularDamping: { default: 0.01 }
+  }),
+
+  step: function () {
+    this.syncFromPhysics();
+  }
+});
+
+},{"./body":7}],9:[function(require,module,exports){
+var Body = require('./body');
+
+/**
+ * Static body.
+ *
+ * Solid body with a fixed position. Unaffected by gravity and collisions, but
+ * other objects may collide with it.
+ */
+module.exports = AFRAME.utils.extend({}, Body, {
+  step: function () {
+    this.syncToPhysics();
+  }
+});
+
+},{"./body":7}],10:[function(require,module,exports){
+var CANNON = require('cannon');
+
+module.exports = {
+  dependencies: ['dynamic-body'],
+
+  multiple: true,
+
+  schema: {
+    // Type of constraint.
+    type: {default: 'lock', oneOf: ['coneTwist', 'distance', 'hinge', 'lock', 'pointToPoint']},
+
+    // Target (other) body for the constraint.
+    target: {type: 'selector'},
+
+    // Maximum force that should be applied to constraint the bodies.
+    maxForce: {default: 1e6, min: 0},
+
+    // If true, bodies can collide when they are connected.
+    collideConnected: {default: true},
+
+    // Wake up bodies when connected.
+    wakeUpBodies: {default: true},
+
+    // The distance to be kept between the bodies. If 0, will be set to current distance.
+    distance: {default: 0, min: 0},
+
+    // Offset of the hinge or point-to-point constraint, defined locally in the body.
+    pivot: {type: 'vec3'},
+    targetPivot: {type: 'vec3'},
+
+    // An axis that each body can rotate around, defined locally to that body.
+    axis: {type: 'vec3', default: { x: 0, y: 0, z: 1 }},
+    targetAxis: {type: 'vec3', default: { x: 0, y: 0, z: 1}}
+  },
+
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+    this.constraint = /* {CANNON.Constraint} */ null;
+  },
+
+  remove: function () {
+    if (!this.constraint) return;
+
+    this.system.world.removeConstraint(this.constraint);
+    this.constraint = null;
+  },
+
+  update: function () {
+    var el = this.el,
+        data = this.data;
+
+    this.remove();
+
+    if (!el.body || !data.target.body) {
+      (el.body ? data.target : el).addEventListener('body-loaded', this.update.bind(this, {}));
+      return;
+    }
+
+    this.constraint = this.createConstraint();
+    this.system.world.addConstraint(this.constraint);
+  },
+
+  /**
+   * Creates a new constraint, given current component data. The CANNON.js constructors are a bit
+   * different for each constraint type.
+   * @return {CANNON.Constraint}
+   */
+  createConstraint: function () {
+    var data = this.data,
+        pivot = new CANNON.Vec3(data.pivot.x, data.pivot.y, data.pivot.z),
+        targetPivot = new CANNON.Vec3(data.targetPivot.x, data.targetPivot.y, data.targetPivot.z),
+        axis = new CANNON.Vec3(data.axis.x, data.axis.y, data.axis.z),
+        targetAxis= new CANNON.Vec3(data.targetAxis.x, data.targetAxis.y, data.targetAxis.z);
+
+    var constraint;
+
+    switch (data.type) {
+      case 'lock':
+        constraint = new CANNON.LockConstraint(
+          this.el.body,
+          data.target.body,
+          {maxForce: data.maxForce}
+        );
+        break;
+
+      case 'distance':
+        constraint = new CANNON.DistanceConstraint(
+          this.el.body,
+          data.target.body,
+          data.distance,
+          data.maxForce
+        );
+        break;
+
+      case 'hinge':
+        constraint = new CANNON.HingeConstraint(
+          this.el.body,
+          data.target.body, {
+            pivotA: pivot,
+            pivotB: targetPivot,
+            axisA: axis,
+            axisB: targetAxis,
+            maxForce: data.maxForce
+          });
+        break;
+
+      case 'coneTwist':
+        constraint = new CANNON.ConeTwistConstraint(
+          this.el.body,
+          data.target.body, {
+            pivotA: pivot,
+            pivotB: targetPivot,
+            axisA: axis,
+            axisB: targetAxis,
+            maxForce: data.maxForce
+          });
+        break;
+
+      case 'pointToPoint':
+        constraint = new CANNON.PointToPointConstraint(
+          this.el.body,
+          pivot,
+          data.target.body,
+          targetPivot,
+          data.maxForce);
+        break;
+
+      default:
+        throw new Error('[constraint] Unexpected type: ' + data.type);
+    }
+
+    constraint.collideConnected = data.collideConnected;
+    return constraint;
+  }
+};
+
+},{"cannon":17}],11:[function(require,module,exports){
+module.exports = {
+  'velocity':   require('./velocity'),
+  'quaternion': require('./quaternion'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    if (!AFRAME.components['velocity'])    AFRAME.registerComponent('velocity',   this.velocity);
+    if (!AFRAME.components['quaternion'])  AFRAME.registerComponent('quaternion', this.quaternion);
+
+    this._registered = true;
+  }
+};
+
+},{"./quaternion":12,"./velocity":13}],12:[function(require,module,exports){
+/**
+ * Quaternion.
+ *
+ * Represents orientation of object in three dimensions. Similar to `rotation`
+ * component, but avoids problems of gimbal lock.
+ *
+ * See: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
+ */
+module.exports = {
+  schema: {type: 'vec4'},
+
+  play: function () {
+    var el = this.el,
+        q = el.object3D.quaternion;
+    if (el.hasAttribute('rotation')) {
+      el.components.rotation.update();
+      el.setAttribute('quaternion', {x: q.x, y: q.y, z: q.z, w: q.w});
+      el.removeAttribute('rotation');
+      this.update();
+    }
+  },
+
+  update: function () {
+    var data = this.data;
+    this.el.object3D.quaternion.set(data.x, data.y, data.z, data.w);
+  }
+};
+
+},{}],13:[function(require,module,exports){
+/**
+ * Velocity, in m/s.
+ */
+module.exports = {
+  schema: {type: 'vec3'},
+
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+
+    if (this.system) {
+      this.system.addBehavior(this, this.system.Phase.RENDER);
+    }
+  },
+
+  remove: function () {
+    if (this.system) {
+      this.system.removeBehavior(this, this.system.Phase.RENDER);
+    }
+  },
+
+  tick: function (t, dt) {
+    if (!dt) return;
+    if (this.system) return;
+    this.step(t, dt);
+  },
+
+  step: function (t, dt) {
+    if (!dt) return;
+
+    var physics = this.el.sceneEl.systems.physics || {data: {maxInterval: 1 / 60}},
+
+        // TODO - There's definitely a bug with getComputedAttribute and el.data.
+        velocity = this.el.getAttribute('velocity') || {x: 0, y: 0, z: 0},
+        position = this.el.getAttribute('position') || {x: 0, y: 0, z: 0};
+
+    dt = Math.min(dt, physics.data.maxInterval * 1000);
+
+    this.el.setAttribute('position', {
+      x: position.x + velocity.x * dt / 1000,
+      y: position.y + velocity.y * dt / 1000,
+      z: position.z + velocity.z * dt / 1000
+    });
+  }
+};
+
+},{}],14:[function(require,module,exports){
+module.exports = {
+  GRAVITY: -9.8,
+  MAX_INTERVAL: 4 / 60,
+  ITERATIONS: 10,
+  CONTACT_MATERIAL: {
+    friction:     0.01,
+    restitution:  0.3,
+    contactEquationStiffness: 1e8,
+    contactEquationRelaxation: 3,
+    frictionEquationStiffness: 1e8,
+    frictionEquationRegularization: 3
+  }
+};
+
+},{}],15:[function(require,module,exports){
+var CANNON = require('cannon'),
+    CONSTANTS = require('../constants'),
+    C_GRAV = CONSTANTS.GRAVITY,
+    C_MAT = CONSTANTS.CONTACT_MATERIAL;
+
+/**
+ * Physics system.
+ */
+module.exports = {
+  schema: {
+    gravity:                        { default: C_GRAV },
+    iterations:                     { default: CONSTANTS.ITERATIONS },
+    friction:                       { default: C_MAT.friction },
+    restitution:                    { default: C_MAT.restitution },
+    contactEquationStiffness:       { default: C_MAT.contactEquationStiffness },
+    contactEquationRelaxation:      { default: C_MAT.contactEquationRelaxation },
+    frictionEquationStiffness:      { default: C_MAT.frictionEquationStiffness },
+    frictionEquationRegularization: { default: C_MAT.frictionEquationRegularization },
+
+    // Never step more than four frames at once. Effectively pauses the scene
+    // when out of focus, and prevents weird "jumps" when focus returns.
+    maxInterval:                    { default: 4 / 60 },
+
+    // If true, show wireframes around physics bodies.
+    debug:                          { default: false },
+  },
+
+  /**
+   * Update phases, used to separate physics simulation from updates to A-Frame scene.
+   * @enum {string}
+   */
+  Phase: {
+    SIMULATE: 'sim',
+    RENDER:   'render'
+  },
+
+  /**
+   * Initializes the physics system.
+   */
+  init: function () {
+    var data = this.data;
+
+    // If true, show wireframes around physics bodies.
+    this.debug = data.debug;
+
+    this.children = {};
+    this.children[this.Phase.SIMULATE] = [];
+    this.children[this.Phase.RENDER] = [];
+
+    this.listeners = {};
+
+    this.world = new CANNON.World();
+    this.world.quatNormalizeSkip = 0;
+    this.world.quatNormalizeFast = false;
+    // this.world.solver.setSpookParams(300,10);
+    this.world.solver.iterations = data.iterations;
+    this.world.gravity.set(0, data.gravity, 0);
+    this.world.broadphase = new CANNON.NaiveBroadphase();
+
+    this.material = new CANNON.Material({name: 'defaultMaterial'});
+    this.contactMaterial = new CANNON.ContactMaterial(this.material, this.material, {
+        friction: data.friction,
+        restitution: data.restitution,
+        contactEquationStiffness: data.contactEquationStiffness,
+        contactEquationRelaxation: data.contactEquationRelaxation,
+        frictionEquationStiffness: data.frictionEquationStiffness,
+        frictionEquationRegularization: data.frictionEquationRegularization
+    });
+    this.world.addContactMaterial(this.contactMaterial);
+  },
+
+  /**
+   * Updates the physics world on each tick of the A-Frame scene. It would be
+   * entirely possible to separate the two – updating physics more or less
+   * frequently than the scene – if greater precision or performance were
+   * necessary.
+   * @param  {number} t
+   * @param  {number} dt
+   */
+  tick: function (t, dt) {
+    if (!dt) return;
+
+    this.world.step(Math.min(dt / 1000, this.data.maxInterval));
+
+    var i;
+    for (i = 0; i < this.children[this.Phase.SIMULATE].length; i++) {
+      this.children[this.Phase.SIMULATE][i].step(t, dt);
+    }
+
+    for (i = 0; i < this.children[this.Phase.RENDER].length; i++) {
+      this.children[this.Phase.RENDER][i].step(t, dt);
+    }
+  },
+
+  /**
+   * Adds a body to the scene, and binds collision events to the element.
+   * @param {CANNON.Body} body
+   */
+  addBody: function (body) {
+    this.listeners[body.id] = function (e) { body.el.emit('collide', e); };
+    body.addEventListener('collide', this.listeners[body.id]);
+    this.world.addBody(body);
+  },
+
+  /**
+   * Removes a body, and its listeners, from the scene.
+   * @param {CANNON.Body} body
+   */
+  removeBody: function (body) {
+    body.removeEventListener('collide', this.listeners[body.id]);
+    delete this.listeners[body.id];
+    this.world.removeBody(body);
+  },
+
+  /**
+   * Adds a component instance to the system, to be invoked on each tick during
+   * the given phase.
+   * @param {Component} component
+   * @param {string} phase
+   */
+  addBehavior: function (component, phase) {
+    this.children[phase].push(component);
+  },
+
+  /**
+   * Removes a component instance from the system.
+   * @param {Component} component
+   * @param {string} phase
+   */
+  removeBehavior: function (component, phase) {
+    this.children[phase].splice(this.children[phase].indexOf(component), 1);
+  },
+
+  /**
+   * Sets an option on the physics system, affecting future simulation steps.
+   * @param {string} opt
+   * @param {mixed} value
+   */
+  update: function (previousData) {
+    var data = this.data;
+
+    if (data.debug !== previousData.debug) {
+      console.warn('[physics] `debug` cannot be changed dynamically.');
+    }
+
+    if (data.maxInterval !== previousData.maxInterval); // noop;
+
+    if (data.gravity !== previousData.gravity) this.world.gravity.set(0, data.gravity, 0);
+
+    this.contactMaterial.friction = data.friction;
+    this.contactMaterial.restitution = data.restitution;
+    this.contactMaterial.contactEquationStiffness = data.contactEquationStiffness;
+    this.contactMaterial.contactEquationRelaxation = data.contactEquationRelaxation;
+    this.contactMaterial.frictionEquationStiffness = data.frictionEquationStiffness;
+    this.contactMaterial.frictionEquationRegularization = data.frictionEquationRegularization;
+  }
+};
+
+},{"../constants":14,"cannon":17}],16:[function(require,module,exports){
+module.exports={
+  "_from": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+  "_id": "cannon@0.6.2",
+  "_inBundle": false,
+  "_integrity": "sha1-kuhwtr7Hd8jqU3mcndOx2tmf0RU=",
+  "_location": "/cannon",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "git",
+    "raw": "cannon@github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "name": "cannon",
+    "escapedName": "cannon",
+    "rawSpec": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "saveSpec": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "fetchSpec": null,
+    "gitCommittish": "v0.6.2-dev1"
+  },
+  "_requiredBy": [
+    "/aframe-physics-system"
+  ],
+  "_resolved": "github:donmccurdy/cannon.js#022e8ba53fa83abf0ad8a0e4fd08623123838a17",
+  "_spec": "cannon@github:donmccurdy/cannon.js#v0.6.2-dev1",
+  "_where": "/Users/donmccurdy/Documents/Projects/aframe-extras/node_modules/aframe-physics-system",
+  "author": {
+    "name": "Stefan Hedman",
+    "email": "schteppe@gmail.com",
+    "url": "http://steffe.se"
+  },
+  "bugs": {
+    "url": "https://github.com/schteppe/cannon.js/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "A lightweight 3D physics engine written in JavaScript.",
+  "devDependencies": {
+    "browserify": "*",
+    "grunt": "~0.4.0",
+    "grunt-browserify": "^2.1.4",
+    "grunt-contrib-concat": "~0.1.3",
+    "grunt-contrib-jshint": "~0.1.1",
+    "grunt-contrib-nodeunit": "^0.4.1",
+    "grunt-contrib-uglify": "^0.5.1",
+    "grunt-contrib-yuidoc": "^0.5.2",
+    "jshint": "latest",
+    "nodeunit": "^0.9.0",
+    "uglify-js": "latest"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "homepage": "https://github.com/schteppe/cannon.js",
+  "keywords": [
+    "cannon.js",
+    "cannon",
+    "physics",
+    "engine",
+    "3d"
+  ],
+  "licenses": [
+    {
+      "type": "MIT"
+    }
+  ],
+  "main": "./src/Cannon.js",
+  "name": "cannon",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/schteppe/cannon.js.git"
+  },
+  "version": "0.6.2"
+}
+
+},{}],17:[function(require,module,exports){
+// Export classes
+module.exports = {
+    version :                       require('../package.json').version,
+
+    AABB :                          require('./collision/AABB'),
+    ArrayCollisionMatrix :          require('./collision/ArrayCollisionMatrix'),
+    Body :                          require('./objects/Body'),
+    Box :                           require('./shapes/Box'),
+    Broadphase :                    require('./collision/Broadphase'),
+    Constraint :                    require('./constraints/Constraint'),
+    ContactEquation :               require('./equations/ContactEquation'),
+    Narrowphase :                   require('./world/Narrowphase'),
+    ConeTwistConstraint :           require('./constraints/ConeTwistConstraint'),
+    ContactMaterial :               require('./material/ContactMaterial'),
+    ConvexPolyhedron :              require('./shapes/ConvexPolyhedron'),
+    Cylinder :                      require('./shapes/Cylinder'),
+    DistanceConstraint :            require('./constraints/DistanceConstraint'),
+    Equation :                      require('./equations/Equation'),
+    EventTarget :                   require('./utils/EventTarget'),
+    FrictionEquation :              require('./equations/FrictionEquation'),
+    GSSolver :                      require('./solver/GSSolver'),
+    GridBroadphase :                require('./collision/GridBroadphase'),
+    Heightfield :                   require('./shapes/Heightfield'),
+    HingeConstraint :               require('./constraints/HingeConstraint'),
+    LockConstraint :                require('./constraints/LockConstraint'),
+    Mat3 :                          require('./math/Mat3'),
+    Material :                      require('./material/Material'),
+    NaiveBroadphase :               require('./collision/NaiveBroadphase'),
+    ObjectCollisionMatrix :         require('./collision/ObjectCollisionMatrix'),
+    Pool :                          require('./utils/Pool'),
+    Particle :                      require('./shapes/Particle'),
+    Plane :                         require('./shapes/Plane'),
+    PointToPointConstraint :        require('./constraints/PointToPointConstraint'),
+    Quaternion :                    require('./math/Quaternion'),
+    Ray :                           require('./collision/Ray'),
+    RaycastVehicle :                require('./objects/RaycastVehicle'),
+    RaycastResult :                 require('./collision/RaycastResult'),
+    RigidVehicle :                  require('./objects/RigidVehicle'),
+    RotationalEquation :            require('./equations/RotationalEquation'),
+    RotationalMotorEquation :       require('./equations/RotationalMotorEquation'),
+    SAPBroadphase :                 require('./collision/SAPBroadphase'),
+    SPHSystem :                     require('./objects/SPHSystem'),
+    Shape :                         require('./shapes/Shape'),
+    Solver :                        require('./solver/Solver'),
+    Sphere :                        require('./shapes/Sphere'),
+    SplitSolver :                   require('./solver/SplitSolver'),
+    Spring :                        require('./objects/Spring'),
+    Transform :                     require('./math/Transform'),
+    Trimesh :                       require('./shapes/Trimesh'),
+    Vec3 :                          require('./math/Vec3'),
+    Vec3Pool :                      require('./utils/Vec3Pool'),
+    World :                         require('./world/World'),
+};
+
+},{"../package.json":16,"./collision/AABB":18,"./collision/ArrayCollisionMatrix":19,"./collision/Broadphase":20,"./collision/GridBroadphase":21,"./collision/NaiveBroadphase":22,"./collision/ObjectCollisionMatrix":23,"./collision/Ray":25,"./collision/RaycastResult":26,"./collision/SAPBroadphase":27,"./constraints/ConeTwistConstraint":28,"./constraints/Constraint":29,"./constraints/DistanceConstraint":30,"./constraints/HingeConstraint":31,"./constraints/LockConstraint":32,"./constraints/PointToPointConstraint":33,"./equations/ContactEquation":35,"./equations/Equation":36,"./equations/FrictionEquation":37,"./equations/RotationalEquation":38,"./equations/RotationalMotorEquation":39,"./material/ContactMaterial":40,"./material/Material":41,"./math/Mat3":43,"./math/Quaternion":44,"./math/Transform":45,"./math/Vec3":46,"./objects/Body":47,"./objects/RaycastVehicle":48,"./objects/RigidVehicle":49,"./objects/SPHSystem":50,"./objects/Spring":51,"./shapes/Box":53,"./shapes/ConvexPolyhedron":54,"./shapes/Cylinder":55,"./shapes/Heightfield":56,"./shapes/Particle":57,"./shapes/Plane":58,"./shapes/Shape":59,"./shapes/Sphere":60,"./shapes/Trimesh":61,"./solver/GSSolver":62,"./solver/Solver":63,"./solver/SplitSolver":64,"./utils/EventTarget":65,"./utils/Pool":67,"./utils/Vec3Pool":70,"./world/Narrowphase":71,"./world/World":72}],18:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+var Utils = require('../utils/Utils');
+
+module.exports = AABB;
+
+/**
+ * Axis aligned bounding box class.
+ * @class AABB
+ * @constructor
+ * @param {Object} [options]
+ * @param {Vec3}   [options.upperBound]
+ * @param {Vec3}   [options.lowerBound]
+ */
+function AABB(options){
+    options = options || {};
+
+    /**
+     * The lower bound of the bounding box.
+     * @property lowerBound
+     * @type {Vec3}
+     */
+    this.lowerBound = new Vec3();
+    if(options.lowerBound){
+        this.lowerBound.copy(options.lowerBound);
+    }
+
+    /**
+     * The upper bound of the bounding box.
+     * @property upperBound
+     * @type {Vec3}
+     */
+    this.upperBound = new Vec3();
+    if(options.upperBound){
+        this.upperBound.copy(options.upperBound);
+    }
+}
+
+var tmp = new Vec3();
+
+/**
+ * Set the AABB bounds from a set of points.
+ * @method setFromPoints
+ * @param {Array} points An array of Vec3's.
+ * @param {Vec3} position
+ * @param {Quaternion} quaternion
+ * @param {number} skinSize
+ * @return {AABB} The self object
+ */
+AABB.prototype.setFromPoints = function(points, position, quaternion, skinSize){
+    var l = this.lowerBound,
+        u = this.upperBound,
+        q = quaternion;
+
+    // Set to the first point
+    l.copy(points[0]);
+    if(q){
+        q.vmult(l, l);
+    }
+    u.copy(l);
+
+    for(var i = 1; i<points.length; i++){
+        var p = points[i];
+
+        if(q){
+            q.vmult(p, tmp);
+            p = tmp;
+        }
+
+        if(p.x > u.x){ u.x = p.x; }
+        if(p.x < l.x){ l.x = p.x; }
+        if(p.y > u.y){ u.y = p.y; }
+        if(p.y < l.y){ l.y = p.y; }
+        if(p.z > u.z){ u.z = p.z; }
+        if(p.z < l.z){ l.z = p.z; }
+    }
+
+    // Add offset
+    if (position) {
+        position.vadd(l, l);
+        position.vadd(u, u);
+    }
+
+    if(skinSize){
+        l.x -= skinSize;
+        l.y -= skinSize;
+        l.z -= skinSize;
+        u.x += skinSize;
+        u.y += skinSize;
+        u.z += skinSize;
+    }
+
+    return this;
+};
+
+/**
+ * Copy bounds from an AABB to this AABB
+ * @method copy
+ * @param  {AABB} aabb Source to copy from
+ * @return {AABB} The this object, for chainability
+ */
+AABB.prototype.copy = function(aabb){
+    this.lowerBound.copy(aabb.lowerBound);
+    this.upperBound.copy(aabb.upperBound);
+    return this;
+};
+
+/**
+ * Clone an AABB
+ * @method clone
+ */
+AABB.prototype.clone = function(){
+    return new AABB().copy(this);
+};
+
+/**
+ * Extend this AABB so that it covers the given AABB too.
+ * @method extend
+ * @param  {AABB} aabb
+ */
+AABB.prototype.extend = function(aabb){
+    this.lowerBound.x = Math.min(this.lowerBound.x, aabb.lowerBound.x);
+    this.upperBound.x = Math.max(this.upperBound.x, aabb.upperBound.x);
+    this.lowerBound.y = Math.min(this.lowerBound.y, aabb.lowerBound.y);
+    this.upperBound.y = Math.max(this.upperBound.y, aabb.upperBound.y);
+    this.lowerBound.z = Math.min(this.lowerBound.z, aabb.lowerBound.z);
+    this.upperBound.z = Math.max(this.upperBound.z, aabb.upperBound.z);
+};
+
+/**
+ * Returns true if the given AABB overlaps this AABB.
+ * @method overlaps
+ * @param  {AABB} aabb
+ * @return {Boolean}
+ */
+AABB.prototype.overlaps = function(aabb){
+    var l1 = this.lowerBound,
+        u1 = this.upperBound,
+        l2 = aabb.lowerBound,
+        u2 = aabb.upperBound;
+
+    //      l2        u2
+    //      |---------|
+    // |--------|
+    // l1       u1
+
+    var overlapsX = ((l2.x <= u1.x && u1.x <= u2.x) || (l1.x <= u2.x && u2.x <= u1.x));
+    var overlapsY = ((l2.y <= u1.y && u1.y <= u2.y) || (l1.y <= u2.y && u2.y <= u1.y));
+    var overlapsZ = ((l2.z <= u1.z && u1.z <= u2.z) || (l1.z <= u2.z && u2.z <= u1.z));
+
+    return overlapsX && overlapsY && overlapsZ;
+};
+
+// Mostly for debugging
+AABB.prototype.volume = function(){
+    var l = this.lowerBound,
+        u = this.upperBound;
+    return (u.x - l.x) * (u.y - l.y) * (u.z - l.z);
+};
+
+
+/**
+ * Returns true if the given AABB is fully contained in this AABB.
+ * @method contains
+ * @param {AABB} aabb
+ * @return {Boolean}
+ */
+AABB.prototype.contains = function(aabb){
+    var l1 = this.lowerBound,
+        u1 = this.upperBound,
+        l2 = aabb.lowerBound,
+        u2 = aabb.upperBound;
+
+    //      l2        u2
+    //      |---------|
+    // |---------------|
+    // l1              u1
+
+    return (
+        (l1.x <= l2.x && u1.x >= u2.x) &&
+        (l1.y <= l2.y && u1.y >= u2.y) &&
+        (l1.z <= l2.z && u1.z >= u2.z)
+    );
+};
+
+/**
+ * @method getCorners
+ * @param {Vec3} a
+ * @param {Vec3} b
+ * @param {Vec3} c
+ * @param {Vec3} d
+ * @param {Vec3} e
+ * @param {Vec3} f
+ * @param {Vec3} g
+ * @param {Vec3} h
+ */
+AABB.prototype.getCorners = function(a, b, c, d, e, f, g, h){
+    var l = this.lowerBound,
+        u = this.upperBound;
+
+    a.copy(l);
+    b.set( u.x, l.y, l.z );
+    c.set( u.x, u.y, l.z );
+    d.set( l.x, u.y, u.z );
+    e.set( u.x, l.y, l.z );
+    f.set( l.x, u.y, l.z );
+    g.set( l.x, l.y, u.z );
+    h.copy(u);
+};
+
+var transformIntoFrame_corners = [
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3()
+];
+
+/**
+ * Get the representation of an AABB in another frame.
+ * @method toLocalFrame
+ * @param  {Transform} frame
+ * @param  {AABB} target
+ * @return {AABB} The "target" AABB object.
+ */
+AABB.prototype.toLocalFrame = function(frame, target){
+
+    var corners = transformIntoFrame_corners;
+    var a = corners[0];
+    var b = corners[1];
+    var c = corners[2];
+    var d = corners[3];
+    var e = corners[4];
+    var f = corners[5];
+    var g = corners[6];
+    var h = corners[7];
+
+    // Get corners in current frame
+    this.getCorners(a, b, c, d, e, f, g, h);
+
+    // Transform them to new local frame
+    for(var i=0; i !== 8; i++){
+        var corner = corners[i];
+        frame.pointToLocal(corner, corner);
+    }
+
+    return target.setFromPoints(corners);
+};
+
+/**
+ * Get the representation of an AABB in the global frame.
+ * @method toWorldFrame
+ * @param  {Transform} frame
+ * @param  {AABB} target
+ * @return {AABB} The "target" AABB object.
+ */
+AABB.prototype.toWorldFrame = function(frame, target){
+
+    var corners = transformIntoFrame_corners;
+    var a = corners[0];
+    var b = corners[1];
+    var c = corners[2];
+    var d = corners[3];
+    var e = corners[4];
+    var f = corners[5];
+    var g = corners[6];
+    var h = corners[7];
+
+    // Get corners in current frame
+    this.getCorners(a, b, c, d, e, f, g, h);
+
+    // Transform them to new local frame
+    for(var i=0; i !== 8; i++){
+        var corner = corners[i];
+        frame.pointToWorld(corner, corner);
+    }
+
+    return target.setFromPoints(corners);
+};
+
+/**
+ * Check if the AABB is hit by a ray.
+ * @param  {Ray} ray
+ * @return {number}
+ */
+AABB.prototype.overlapsRay = function(ray){
+    var t = 0;
+
+    // ray.direction is unit direction vector of ray
+    var dirFracX = 1 / ray._direction.x;
+    var dirFracY = 1 / ray._direction.y;
+    var dirFracZ = 1 / ray._direction.z;
+
+    // this.lowerBound is the corner of AABB with minimal coordinates - left bottom, rt is maximal corner
+    var t1 = (this.lowerBound.x - ray.from.x) * dirFracX;
+    var t2 = (this.upperBound.x - ray.from.x) * dirFracX;
+    var t3 = (this.lowerBound.y - ray.from.y) * dirFracY;
+    var t4 = (this.upperBound.y - ray.from.y) * dirFracY;
+    var t5 = (this.lowerBound.z - ray.from.z) * dirFracZ;
+    var t6 = (this.upperBound.z - ray.from.z) * dirFracZ;
+
+    // var tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)));
+    // var tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)));
+    var tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)), Math.min(t5, t6));
+    var tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)), Math.max(t5, t6));
+
+    // if tmax < 0, ray (line) is intersecting AABB, but whole AABB is behing us
+    if (tmax < 0){
+        //t = tmax;
+        return false;
+    }
+
+    // if tmin > tmax, ray doesn't intersect AABB
+    if (tmin > tmax){
+        //t = tmax;
+        return false;
+    }
+
+    return true;
+};
+},{"../math/Vec3":46,"../utils/Utils":69}],19:[function(require,module,exports){
+module.exports = ArrayCollisionMatrix;
+
+/**
+ * Collision "matrix". It's actually a triangular-shaped array of whether two bodies are touching this step, for reference next step
+ * @class ArrayCollisionMatrix
+ * @constructor
+ */
+function ArrayCollisionMatrix() {
+
+    /**
+     * The matrix storage
+     * @property matrix
+     * @type {Array}
+     */
+    this.matrix = [];
+}
+
+/**
+ * Get an element
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+ArrayCollisionMatrix.prototype.get = function(i, j) {
+    i = i.index;
+    j = j.index;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return this.matrix[(i*(i + 1)>>1) + j-1];
+};
+
+/**
+ * Set an element
+ * @method set
+ * @param {Number} i
+ * @param {Number} j
+ * @param {Number} value
+ */
+ArrayCollisionMatrix.prototype.set = function(i, j, value) {
+    i = i.index;
+    j = j.index;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    this.matrix[(i*(i + 1)>>1) + j-1] = value ? 1 : 0;
+};
+
+/**
+ * Sets all elements to zero
+ * @method reset
+ */
+ArrayCollisionMatrix.prototype.reset = function() {
+    for (var i=0, l=this.matrix.length; i!==l; i++) {
+        this.matrix[i]=0;
+    }
+};
+
+/**
+ * Sets the max number of objects
+ * @method setNumObjects
+ * @param {Number} n
+ */
+ArrayCollisionMatrix.prototype.setNumObjects = function(n) {
+    this.matrix.length = n*(n-1)>>1;
+};
+
+},{}],20:[function(require,module,exports){
+var Body = require('../objects/Body');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Shape = require('../shapes/Shape');
+var Plane = require('../shapes/Plane');
+
+module.exports = Broadphase;
+
+/**
+ * Base class for broadphase implementations
+ * @class Broadphase
+ * @constructor
+ * @author schteppe
+ */
+function Broadphase(){
+    /**
+    * The world to search for collisions in.
+    * @property world
+    * @type {World}
+    */
+    this.world = null;
+
+    /**
+     * If set to true, the broadphase uses bounding boxes for intersection test, else it uses bounding spheres.
+     * @property useBoundingBoxes
+     * @type {Boolean}
+     */
+    this.useBoundingBoxes = false;
+
+    /**
+     * Set to true if the objects in the world moved.
+     * @property {Boolean} dirty
+     */
+    this.dirty = true;
+}
+
+/**
+ * Get the collision pairs from the world
+ * @method collisionPairs
+ * @param {World} world The world to search in
+ * @param {Array} p1 Empty array to be filled with body objects
+ * @param {Array} p2 Empty array to be filled with body objects
+ */
+Broadphase.prototype.collisionPairs = function(world,p1,p2){
+    throw new Error("collisionPairs not implemented for this BroadPhase class!");
+};
+
+/**
+ * Check if a body pair needs to be intersection tested at all.
+ * @method needBroadphaseCollision
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @return {bool}
+ */
+Broadphase.prototype.needBroadphaseCollision = function(bodyA,bodyB){
+
+    // Check collision filter masks
+    if( (bodyA.collisionFilterGroup & bodyB.collisionFilterMask)===0 || (bodyB.collisionFilterGroup & bodyA.collisionFilterMask)===0){
+        return false;
+    }
+
+    // Check types
+    if(((bodyA.type & Body.STATIC)!==0 || bodyA.sleepState === Body.SLEEPING) &&
+       ((bodyB.type & Body.STATIC)!==0 || bodyB.sleepState === Body.SLEEPING)) {
+        // Both bodies are static or sleeping. Skip.
+        return false;
+    }
+
+    return true;
+};
+
+/**
+ * Check if the bounding volumes of two bodies intersect.
+ * @method intersectionTest
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {array} pairs1
+ * @param {array} pairs2
+  */
+Broadphase.prototype.intersectionTest = function(bodyA, bodyB, pairs1, pairs2){
+    if(this.useBoundingBoxes){
+        this.doBoundingBoxBroadphase(bodyA,bodyB,pairs1,pairs2);
+    } else {
+        this.doBoundingSphereBroadphase(bodyA,bodyB,pairs1,pairs2);
+    }
+};
+
+/**
+ * Check if the bounding spheres of two bodies are intersecting.
+ * @method doBoundingSphereBroadphase
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Array} pairs1 bodyA is appended to this array if intersection
+ * @param {Array} pairs2 bodyB is appended to this array if intersection
+ */
+var Broadphase_collisionPairs_r = new Vec3(), // Temp objects
+    Broadphase_collisionPairs_normal =  new Vec3(),
+    Broadphase_collisionPairs_quat =  new Quaternion(),
+    Broadphase_collisionPairs_relpos  =  new Vec3();
+Broadphase.prototype.doBoundingSphereBroadphase = function(bodyA,bodyB,pairs1,pairs2){
+    var r = Broadphase_collisionPairs_r;
+    bodyB.position.vsub(bodyA.position,r);
+    var boundingRadiusSum2 = Math.pow(bodyA.boundingRadius + bodyB.boundingRadius, 2);
+    var norm2 = r.norm2();
+    if(norm2 < boundingRadiusSum2){
+        pairs1.push(bodyA);
+        pairs2.push(bodyB);
+    }
+};
+
+/**
+ * Check if the bounding boxes of two bodies are intersecting.
+ * @method doBoundingBoxBroadphase
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+Broadphase.prototype.doBoundingBoxBroadphase = function(bodyA,bodyB,pairs1,pairs2){
+    if(bodyA.aabbNeedsUpdate){
+        bodyA.computeAABB();
+    }
+    if(bodyB.aabbNeedsUpdate){
+        bodyB.computeAABB();
+    }
+
+    // Check AABB / AABB
+    if(bodyA.aabb.overlaps(bodyB.aabb)){
+        pairs1.push(bodyA);
+        pairs2.push(bodyB);
+    }
+};
+
+/**
+ * Removes duplicate pairs from the pair arrays.
+ * @method makePairsUnique
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+var Broadphase_makePairsUnique_temp = { keys:[] },
+    Broadphase_makePairsUnique_p1 = [],
+    Broadphase_makePairsUnique_p2 = [];
+Broadphase.prototype.makePairsUnique = function(pairs1,pairs2){
+    var t = Broadphase_makePairsUnique_temp,
+        p1 = Broadphase_makePairsUnique_p1,
+        p2 = Broadphase_makePairsUnique_p2,
+        N = pairs1.length;
+
+    for(var i=0; i!==N; i++){
+        p1[i] = pairs1[i];
+        p2[i] = pairs2[i];
+    }
+
+    pairs1.length = 0;
+    pairs2.length = 0;
+
+    for(var i=0; i!==N; i++){
+        var id1 = p1[i].id,
+            id2 = p2[i].id;
+        var key = id1 < id2 ? id1+","+id2 :  id2+","+id1;
+        t[key] = i;
+        t.keys.push(key);
+    }
+
+    for(var i=0; i!==t.keys.length; i++){
+        var key = t.keys.pop(),
+            pairIndex = t[key];
+        pairs1.push(p1[pairIndex]);
+        pairs2.push(p2[pairIndex]);
+        delete t[key];
+    }
+};
+
+/**
+ * To be implemented by subcasses
+ * @method setWorld
+ * @param {World} world
+ */
+Broadphase.prototype.setWorld = function(world){
+};
+
+/**
+ * Check if the bounding spheres of two bodies overlap.
+ * @method boundingSphereCheck
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @return {boolean}
+ */
+var bsc_dist = new Vec3();
+Broadphase.boundingSphereCheck = function(bodyA,bodyB){
+    var dist = bsc_dist;
+    bodyA.position.vsub(bodyB.position,dist);
+    return Math.pow(bodyA.shape.boundingSphereRadius + bodyB.shape.boundingSphereRadius,2) > dist.norm2();
+};
+
+/**
+ * Returns all the bodies within the AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param  {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+Broadphase.prototype.aabbQuery = function(world, aabb, result){
+    console.warn('.aabbQuery is not implemented in this Broadphase subclass.');
+    return [];
+};
+},{"../math/Quaternion":44,"../math/Vec3":46,"../objects/Body":47,"../shapes/Plane":58,"../shapes/Shape":59}],21:[function(require,module,exports){
+module.exports = GridBroadphase;
+
+var Broadphase = require('./Broadphase');
+var Vec3 = require('../math/Vec3');
+var Shape = require('../shapes/Shape');
+
+/**
+ * Axis aligned uniform grid broadphase.
+ * @class GridBroadphase
+ * @constructor
+ * @extends Broadphase
+ * @todo Needs support for more than just planes and spheres.
+ * @param {Vec3} aabbMin
+ * @param {Vec3} aabbMax
+ * @param {Number} nx Number of boxes along x
+ * @param {Number} ny Number of boxes along y
+ * @param {Number} nz Number of boxes along z
+ */
+function GridBroadphase(aabbMin,aabbMax,nx,ny,nz){
+    Broadphase.apply(this);
+    this.nx = nx || 10;
+    this.ny = ny || 10;
+    this.nz = nz || 10;
+    this.aabbMin = aabbMin || new Vec3(100,100,100);
+    this.aabbMax = aabbMax || new Vec3(-100,-100,-100);
+	var nbins = this.nx * this.ny * this.nz;
+	if (nbins <= 0) {
+		throw "GridBroadphase: Each dimension's n must be >0";
+	}
+    this.bins = [];
+	this.binLengths = []; //Rather than continually resizing arrays (thrashing the memory), just record length and allow them to grow
+	this.bins.length = nbins;
+	this.binLengths.length = nbins;
+	for (var i=0;i<nbins;i++) {
+		this.bins[i]=[];
+		this.binLengths[i]=0;
+	}
+}
+GridBroadphase.prototype = new Broadphase();
+GridBroadphase.prototype.constructor = GridBroadphase;
+
+/**
+ * Get all the collision pairs in the physics world
+ * @method collisionPairs
+ * @param {World} world
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+var GridBroadphase_collisionPairs_d = new Vec3();
+var GridBroadphase_collisionPairs_binPos = new Vec3();
+GridBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){
+    var N = world.numObjects(),
+        bodies = world.bodies;
+
+    var max = this.aabbMax,
+        min = this.aabbMin,
+        nx = this.nx,
+        ny = this.ny,
+        nz = this.nz;
+
+	var xstep = ny*nz;
+	var ystep = nz;
+	var zstep = 1;
+
+    var xmax = max.x,
+        ymax = max.y,
+        zmax = max.z,
+        xmin = min.x,
+        ymin = min.y,
+        zmin = min.z;
+
+    var xmult = nx / (xmax-xmin),
+        ymult = ny / (ymax-ymin),
+        zmult = nz / (zmax-zmin);
+
+    var binsizeX = (xmax - xmin) / nx,
+        binsizeY = (ymax - ymin) / ny,
+        binsizeZ = (zmax - zmin) / nz;
+
+	var binRadius = Math.sqrt(binsizeX*binsizeX + binsizeY*binsizeY + binsizeZ*binsizeZ) * 0.5;
+
+    var types = Shape.types;
+    var SPHERE =            types.SPHERE,
+        PLANE =             types.PLANE,
+        BOX =               types.BOX,
+        COMPOUND =          types.COMPOUND,
+        CONVEXPOLYHEDRON =  types.CONVEXPOLYHEDRON;
+
+    var bins=this.bins,
+		binLengths=this.binLengths,
+        Nbins=this.bins.length;
+
+    // Reset bins
+    for(var i=0; i!==Nbins; i++){
+        binLengths[i] = 0;
+    }
+
+    var ceil = Math.ceil;
+	var min = Math.min;
+	var max = Math.max;
+
+	function addBoxToBins(x0,y0,z0,x1,y1,z1,bi) {
+		var xoff0 = ((x0 - xmin) * xmult)|0,
+			yoff0 = ((y0 - ymin) * ymult)|0,
+			zoff0 = ((z0 - zmin) * zmult)|0,
+			xoff1 = ceil((x1 - xmin) * xmult),
+			yoff1 = ceil((y1 - ymin) * ymult),
+			zoff1 = ceil((z1 - zmin) * zmult);
+
+		if (xoff0 < 0) { xoff0 = 0; } else if (xoff0 >= nx) { xoff0 = nx - 1; }
+		if (yoff0 < 0) { yoff0 = 0; } else if (yoff0 >= ny) { yoff0 = ny - 1; }
+		if (zoff0 < 0) { zoff0 = 0; } else if (zoff0 >= nz) { zoff0 = nz - 1; }
+		if (xoff1 < 0) { xoff1 = 0; } else if (xoff1 >= nx) { xoff1 = nx - 1; }
+		if (yoff1 < 0) { yoff1 = 0; } else if (yoff1 >= ny) { yoff1 = ny - 1; }
+		if (zoff1 < 0) { zoff1 = 0; } else if (zoff1 >= nz) { zoff1 = nz - 1; }
+
+		xoff0 *= xstep;
+		yoff0 *= ystep;
+		zoff0 *= zstep;
+		xoff1 *= xstep;
+		yoff1 *= ystep;
+		zoff1 *= zstep;
+
+		for (var xoff = xoff0; xoff <= xoff1; xoff += xstep) {
+			for (var yoff = yoff0; yoff <= yoff1; yoff += ystep) {
+				for (var zoff = zoff0; zoff <= zoff1; zoff += zstep) {
+					var idx = xoff+yoff+zoff;
+					bins[idx][binLengths[idx]++] = bi;
+				}
+			}
+		}
+	}
+
+    // Put all bodies into the bins
+    for(var i=0; i!==N; i++){
+        var bi = bodies[i];
+        var si = bi.shape;
+
+        switch(si.type){
+        case SPHERE:
+            // Put in bin
+            // check if overlap with other bins
+            var x = bi.position.x,
+                y = bi.position.y,
+                z = bi.position.z;
+            var r = si.radius;
+
+			addBoxToBins(x-r, y-r, z-r, x+r, y+r, z+r, bi);
+            break;
+
+        case PLANE:
+            if(si.worldNormalNeedsUpdate){
+                si.computeWorldNormal(bi.quaternion);
+            }
+            var planeNormal = si.worldNormal;
+
+			//Relative position from origin of plane object to the first bin
+			//Incremented as we iterate through the bins
+			var xreset = xmin + binsizeX*0.5 - bi.position.x,
+				yreset = ymin + binsizeY*0.5 - bi.position.y,
+				zreset = zmin + binsizeZ*0.5 - bi.position.z;
+
+            var d = GridBroadphase_collisionPairs_d;
+			d.set(xreset, yreset, zreset);
+
+			for (var xi = 0, xoff = 0; xi !== nx; xi++, xoff += xstep, d.y = yreset, d.x += binsizeX) {
+				for (var yi = 0, yoff = 0; yi !== ny; yi++, yoff += ystep, d.z = zreset, d.y += binsizeY) {
+					for (var zi = 0, zoff = 0; zi !== nz; zi++, zoff += zstep, d.z += binsizeZ) {
+						if (d.dot(planeNormal) < binRadius) {
+							var idx = xoff + yoff + zoff;
+							bins[idx][binLengths[idx]++] = bi;
+						}
+					}
+				}
+			}
+            break;
+
+        default:
+			if (bi.aabbNeedsUpdate) {
+				bi.computeAABB();
+			}
+
+			addBoxToBins(
+				bi.aabb.lowerBound.x,
+				bi.aabb.lowerBound.y,
+				bi.aabb.lowerBound.z,
+				bi.aabb.upperBound.x,
+				bi.aabb.upperBound.y,
+				bi.aabb.upperBound.z,
+				bi);
+            break;
+        }
+    }
+
+    // Check each bin
+    for(var i=0; i!==Nbins; i++){
+		var binLength = binLengths[i];
+		//Skip bins with no potential collisions
+		if (binLength > 1) {
+			var bin = bins[i];
+
+			// Do N^2 broadphase inside
+			for(var xi=0; xi!==binLength; xi++){
+				var bi = bin[xi];
+				for(var yi=0; yi!==xi; yi++){
+					var bj = bin[yi];
+					if(this.needBroadphaseCollision(bi,bj)){
+						this.intersectionTest(bi,bj,pairs1,pairs2);
+					}
+				}
+			}
+		}
+    }
+
+//	for (var zi = 0, zoff=0; zi < nz; zi++, zoff+= zstep) {
+//		console.log("layer "+zi);
+//		for (var yi = 0, yoff=0; yi < ny; yi++, yoff += ystep) {
+//			var row = '';
+//			for (var xi = 0, xoff=0; xi < nx; xi++, xoff += xstep) {
+//				var idx = xoff + yoff + zoff;
+//				row += ' ' + binLengths[idx];
+//			}
+//			console.log(row);
+//		}
+//	}
+
+    this.makePairsUnique(pairs1,pairs2);
+};
+
+},{"../math/Vec3":46,"../shapes/Shape":59,"./Broadphase":20}],22:[function(require,module,exports){
+module.exports = NaiveBroadphase;
+
+var Broadphase = require('./Broadphase');
+var AABB = require('./AABB');
+
+/**
+ * Naive broadphase implementation, used in lack of better ones.
+ * @class NaiveBroadphase
+ * @constructor
+ * @description The naive broadphase looks at all possible pairs without restriction, therefore it has complexity N^2 (which is bad)
+ * @extends Broadphase
+ */
+function NaiveBroadphase(){
+    Broadphase.apply(this);
+}
+NaiveBroadphase.prototype = new Broadphase();
+NaiveBroadphase.prototype.constructor = NaiveBroadphase;
+
+/**
+ * Get all the collision pairs in the physics world
+ * @method collisionPairs
+ * @param {World} world
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+NaiveBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){
+    var bodies = world.bodies,
+        n = bodies.length,
+        i,j,bi,bj;
+
+    // Naive N^2 ftw!
+    for(i=0; i!==n; i++){
+        for(j=0; j!==i; j++){
+
+            bi = bodies[i];
+            bj = bodies[j];
+
+            if(!this.needBroadphaseCollision(bi,bj)){
+                continue;
+            }
+
+            this.intersectionTest(bi,bj,pairs1,pairs2);
+        }
+    }
+};
+
+var tmpAABB = new AABB();
+
+/**
+ * Returns all the bodies within an AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+NaiveBroadphase.prototype.aabbQuery = function(world, aabb, result){
+    result = result || [];
+
+    for(var i = 0; i < world.bodies.length; i++){
+        var b = world.bodies[i];
+
+        if(b.aabbNeedsUpdate){
+            b.computeAABB();
+        }
+
+        // Ugly hack until Body gets aabb
+        if(b.aabb.overlaps(aabb)){
+            result.push(b);
+        }
+    }
+
+    return result;
+};
+},{"./AABB":18,"./Broadphase":20}],23:[function(require,module,exports){
+module.exports = ObjectCollisionMatrix;
+
+/**
+ * Records what objects are colliding with each other
+ * @class ObjectCollisionMatrix
+ * @constructor
+ */
+function ObjectCollisionMatrix() {
+
+    /**
+     * The matrix storage
+     * @property matrix
+     * @type {Object}
+     */
+	this.matrix = {};
+}
+
+/**
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+ObjectCollisionMatrix.prototype.get = function(i, j) {
+	i = i.id;
+	j = j.id;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+	return i+'-'+j in this.matrix;
+};
+
+/**
+ * @method set
+ * @param  {Number} i
+ * @param  {Number} j
+ * @param {Number} value
+ */
+ObjectCollisionMatrix.prototype.set = function(i, j, value) {
+	i = i.id;
+	j = j.id;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+	}
+	if (value) {
+		this.matrix[i+'-'+j] = true;
+	}
+	else {
+		delete this.matrix[i+'-'+j];
+	}
+};
+
+/**
+ * Empty the matrix
+ * @method reset
+ */
+ObjectCollisionMatrix.prototype.reset = function() {
+	this.matrix = {};
+};
+
+/**
+ * Set max number of objects
+ * @method setNumObjects
+ * @param {Number} n
+ */
+ObjectCollisionMatrix.prototype.setNumObjects = function(n) {
+};
+
+},{}],24:[function(require,module,exports){
+module.exports = OverlapKeeper;
+
+/**
+ * @class OverlapKeeper
+ * @constructor
+ */
+function OverlapKeeper() {
+    this.current = [];
+    this.previous = [];
+}
+
+OverlapKeeper.prototype.getKey = function(i, j) {
+    if (j < i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return (i << 16) | j;
+};
+
+
+/**
+ * @method set
+ * @param {Number} i
+ * @param {Number} j
+ */
+OverlapKeeper.prototype.set = function(i, j) {
+    // Insertion sort. This way the diff will have linear complexity.
+    var key = this.getKey(i, j);
+    var current = this.current;
+    var index = 0;
+    while(key > current[index]){
+        index++;
+    }
+    if(key === current[index]){
+        return; // Pair was already added
+    }
+    for(var j=current.length-1; j>=index; j--){
+        current[j + 1] = current[j];
+    }
+    current[index] = key;
+};
+
+/**
+ * @method tick
+ */
+OverlapKeeper.prototype.tick = function() {
+    var tmp = this.current;
+    this.current = this.previous;
+    this.previous = tmp;
+    this.current.length = 0;
+};
+
+function unpackAndPush(array, key){
+    array.push((key & 0xFFFF0000) >> 16, key & 0x0000FFFF);
+}
+
+/**
+ * @method getDiff
+ * @param  {array} additions
+ * @param  {array} removals
+ */
+OverlapKeeper.prototype.getDiff = function(additions, removals) {
+    var a = this.current;
+    var b = this.previous;
+    var al = a.length;
+    var bl = b.length;
+
+    var j=0;
+    for (var i = 0; i < al; i++) {
+        var found = false;
+        var keyA = a[i];
+        while(keyA > b[j]){
+            j++;
+        }
+        found = keyA === b[j];
+
+        if(!found){
+            unpackAndPush(additions, keyA);
+        }
+    }
+    j = 0;
+    for (var i = 0; i < bl; i++) {
+        var found = false;
+        var keyB = b[i];
+        while(keyB > a[j]){
+            j++;
+        }
+        found = a[j] === keyB;
+
+        if(!found){
+            unpackAndPush(removals, keyB);
+        }
+    }
+};
+},{}],25:[function(require,module,exports){
+module.exports = Ray;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+var ConvexPolyhedron = require('../shapes/ConvexPolyhedron');
+var Box = require('../shapes/Box');
+var RaycastResult = require('../collision/RaycastResult');
+var Shape = require('../shapes/Shape');
+var AABB = require('../collision/AABB');
+
+/**
+ * A line in 3D space that intersects bodies and return points.
+ * @class Ray
+ * @constructor
+ * @param {Vec3} from
+ * @param {Vec3} to
+ */
+function Ray(from, to){
+    /**
+     * @property {Vec3} from
+     */
+    this.from = from ? from.clone() : new Vec3();
+
+    /**
+     * @property {Vec3} to
+     */
+    this.to = to ? to.clone() : new Vec3();
+
+    /**
+     * @private
+     * @property {Vec3} _direction
+     */
+    this._direction = new Vec3();
+
+    /**
+     * The precision of the ray. Used when checking parallelity etc.
+     * @property {Number} precision
+     */
+    this.precision = 0.0001;
+
+    /**
+     * Set to true if you want the Ray to take .collisionResponse flags into account on bodies and shapes.
+     * @property {Boolean} checkCollisionResponse
+     */
+    this.checkCollisionResponse = true;
+
+    /**
+     * If set to true, the ray skips any hits with normal.dot(rayDirection) < 0.
+     * @property {Boolean} skipBackfaces
+     */
+    this.skipBackfaces = false;
+
+    /**
+     * @property {number} collisionFilterMask
+     * @default -1
+     */
+    this.collisionFilterMask = -1;
+
+    /**
+     * @property {number} collisionFilterGroup
+     * @default -1
+     */
+    this.collisionFilterGroup = -1;
+
+    /**
+     * The intersection mode. Should be Ray.ANY, Ray.ALL or Ray.CLOSEST.
+     * @property {number} mode
+     */
+    this.mode = Ray.ANY;
+
+    /**
+     * Current result object.
+     * @property {RaycastResult} result
+     */
+    this.result = new RaycastResult();
+
+    /**
+     * Will be set to true during intersectWorld() if the ray hit anything.
+     * @property {Boolean} hasHit
+     */
+    this.hasHit = false;
+
+    /**
+     * Current, user-provided result callback. Will be used if mode is Ray.ALL.
+     * @property {Function} callback
+     */
+    this.callback = function(result){};
+}
+Ray.prototype.constructor = Ray;
+
+Ray.CLOSEST = 1;
+Ray.ANY = 2;
+Ray.ALL = 4;
+
+var tmpAABB = new AABB();
+var tmpArray = [];
+
+/**
+ * Do itersection against all bodies in the given World.
+ * @method intersectWorld
+ * @param  {World} world
+ * @param  {object} options
+ * @return {Boolean} True if the ray hit anything, otherwise false.
+ */
+Ray.prototype.intersectWorld = function (world, options) {
+    this.mode = options.mode || Ray.ANY;
+    this.result = options.result || new RaycastResult();
+    this.skipBackfaces = !!options.skipBackfaces;
+    this.collisionFilterMask = typeof(options.collisionFilterMask) !== 'undefined' ? options.collisionFilterMask : -1;
+    this.collisionFilterGroup = typeof(options.collisionFilterGroup) !== 'undefined' ? options.collisionFilterGroup : -1;
+    if(options.from){
+        this.from.copy(options.from);
+    }
+    if(options.to){
+        this.to.copy(options.to);
+    }
+    this.callback = options.callback || function(){};
+    this.hasHit = false;
+
+    this.result.reset();
+    this._updateDirection();
+
+    this.getAABB(tmpAABB);
+    tmpArray.length = 0;
+    world.broadphase.aabbQuery(world, tmpAABB, tmpArray);
+    this.intersectBodies(tmpArray);
+
+    return this.hasHit;
+};
+
+var v1 = new Vec3(),
+    v2 = new Vec3();
+
+/*
+ * As per "Barycentric Technique" as named here http://www.blackpawn.com/texts/pointinpoly/default.html But without the division
+ */
+Ray.pointInTriangle = pointInTriangle;
+function pointInTriangle(p, a, b, c) {
+    c.vsub(a,v0);
+    b.vsub(a,v1);
+    p.vsub(a,v2);
+
+    var dot00 = v0.dot( v0 );
+    var dot01 = v0.dot( v1 );
+    var dot02 = v0.dot( v2 );
+    var dot11 = v1.dot( v1 );
+    var dot12 = v1.dot( v2 );
+
+    var u,v;
+
+    return  ( (u = dot11 * dot02 - dot01 * dot12) >= 0 ) &&
+            ( (v = dot00 * dot12 - dot01 * dot02) >= 0 ) &&
+            ( u + v < ( dot00 * dot11 - dot01 * dot01 ) );
+}
+
+/**
+ * Shoot a ray at a body, get back information about the hit.
+ * @method intersectBody
+ * @private
+ * @param {Body} body
+ * @param {RaycastResult} [result] Deprecated - set the result property of the Ray instead.
+ */
+var intersectBody_xi = new Vec3();
+var intersectBody_qi = new Quaternion();
+Ray.prototype.intersectBody = function (body, result) {
+    if(result){
+        this.result = result;
+        this._updateDirection();
+    }
+    var checkCollisionResponse = this.checkCollisionResponse;
+
+    if(checkCollisionResponse && !body.collisionResponse){
+        return;
+    }
+
+    if((this.collisionFilterGroup & body.collisionFilterMask)===0 || (body.collisionFilterGroup & this.collisionFilterMask)===0){
+        return;
+    }
+
+    var xi = intersectBody_xi;
+    var qi = intersectBody_qi;
+
+    for (var i = 0, N = body.shapes.length; i < N; i++) {
+        var shape = body.shapes[i];
+
+        if(checkCollisionResponse && !shape.collisionResponse){
+            continue; // Skip
+        }
+
+        body.quaternion.mult(body.shapeOrientations[i], qi);
+        body.quaternion.vmult(body.shapeOffsets[i], xi);
+        xi.vadd(body.position, xi);
+
+        this.intersectShape(
+            shape,
+            qi,
+            xi,
+            body
+        );
+
+        if(this.result._shouldStop){
+            break;
+        }
+    }
+};
+
+/**
+ * @method intersectBodies
+ * @param {Array} bodies An array of Body objects.
+ * @param {RaycastResult} [result] Deprecated
+ */
+Ray.prototype.intersectBodies = function (bodies, result) {
+    if(result){
+        this.result = result;
+        this._updateDirection();
+    }
+
+    for ( var i = 0, l = bodies.length; !this.result._shouldStop && i < l; i ++ ) {
+        this.intersectBody(bodies[i]);
+    }
+};
+
+/**
+ * Updates the _direction vector.
+ * @private
+ * @method _updateDirection
+ */
+Ray.prototype._updateDirection = function(){
+    this.to.vsub(this.from, this._direction);
+    this._direction.normalize();
+};
+
+/**
+ * @method intersectShape
+ * @private
+ * @param {Shape} shape
+ * @param {Quaternion} quat
+ * @param {Vec3} position
+ * @param {Body} body
+ */
+Ray.prototype.intersectShape = function(shape, quat, position, body){
+    var from = this.from;
+
+
+    // Checking boundingSphere
+    var distance = distanceFromIntersection(from, this._direction, position);
+    if ( distance > shape.boundingSphereRadius ) {
+        return;
+    }
+
+    var intersectMethod = this[shape.type];
+    if(intersectMethod){
+        intersectMethod.call(this, shape, quat, position, body, shape);
+    }
+};
+
+var vector = new Vec3();
+var normal = new Vec3();
+var intersectPoint = new Vec3();
+
+var a = new Vec3();
+var b = new Vec3();
+var c = new Vec3();
+var d = new Vec3();
+
+var tmpRaycastResult = new RaycastResult();
+
+/**
+ * @method intersectBox
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectBox = function(shape, quat, position, body, reportedShape){
+    return this.intersectConvex(shape.convexPolyhedronRepresentation, quat, position, body, reportedShape);
+};
+Ray.prototype[Shape.types.BOX] = Ray.prototype.intersectBox;
+
+/**
+ * @method intersectPlane
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectPlane = function(shape, quat, position, body, reportedShape){
+    var from = this.from;
+    var to = this.to;
+    var direction = this._direction;
+
+    // Get plane normal
+    var worldNormal = new Vec3(0, 0, 1);
+    quat.vmult(worldNormal, worldNormal);
+
+    var len = new Vec3();
+    from.vsub(position, len);
+    var planeToFrom = len.dot(worldNormal);
+    to.vsub(position, len);
+    var planeToTo = len.dot(worldNormal);
+
+    if(planeToFrom * planeToTo > 0){
+        // "from" and "to" are on the same side of the plane... bail out
+        return;
+    }
+
+    if(from.distanceTo(to) < planeToFrom){
+        return;
+    }
+
+    var n_dot_dir = worldNormal.dot(direction);
+
+    if (Math.abs(n_dot_dir) < this.precision) {
+        // No intersection
+        return;
+    }
+
+    var planePointToFrom = new Vec3();
+    var dir_scaled_with_t = new Vec3();
+    var hitPointWorld = new Vec3();
+
+    from.vsub(position, planePointToFrom);
+    var t = -worldNormal.dot(planePointToFrom) / n_dot_dir;
+    direction.scale(t, dir_scaled_with_t);
+    from.vadd(dir_scaled_with_t, hitPointWorld);
+
+    this.reportIntersection(worldNormal, hitPointWorld, reportedShape, body, -1);
+};
+Ray.prototype[Shape.types.PLANE] = Ray.prototype.intersectPlane;
+
+/**
+ * Get the world AABB of the ray.
+ * @method getAABB
+ * @param  {AABB} aabb
+ */
+Ray.prototype.getAABB = function(result){
+    var to = this.to;
+    var from = this.from;
+    result.lowerBound.x = Math.min(to.x, from.x);
+    result.lowerBound.y = Math.min(to.y, from.y);
+    result.lowerBound.z = Math.min(to.z, from.z);
+    result.upperBound.x = Math.max(to.x, from.x);
+    result.upperBound.y = Math.max(to.y, from.y);
+    result.upperBound.z = Math.max(to.z, from.z);
+};
+
+var intersectConvexOptions = {
+    faceList: [0]
+};
+var worldPillarOffset = new Vec3();
+var intersectHeightfield_localRay = new Ray();
+var intersectHeightfield_index = [];
+var intersectHeightfield_minMax = [];
+
+/**
+ * @method intersectHeightfield
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectHeightfield = function(shape, quat, position, body, reportedShape){
+    var data = shape.data,
+        w = shape.elementSize;
+
+    // Convert the ray to local heightfield coordinates
+    var localRay = intersectHeightfield_localRay; //new Ray(this.from, this.to);
+    localRay.from.copy(this.from);
+    localRay.to.copy(this.to);
+    Transform.pointToLocalFrame(position, quat, localRay.from, localRay.from);
+    Transform.pointToLocalFrame(position, quat, localRay.to, localRay.to);
+    localRay._updateDirection();
+
+    // Get the index of the data points to test against
+    var index = intersectHeightfield_index;
+    var iMinX, iMinY, iMaxX, iMaxY;
+
+    // Set to max
+    iMinX = iMinY = 0;
+    iMaxX = iMaxY = shape.data.length - 1;
+
+    var aabb = new AABB();
+    localRay.getAABB(aabb);
+
+    shape.getIndexOfPosition(aabb.lowerBound.x, aabb.lowerBound.y, index, true);
+    iMinX = Math.max(iMinX, index[0]);
+    iMinY = Math.max(iMinY, index[1]);
+    shape.getIndexOfPosition(aabb.upperBound.x, aabb.upperBound.y, index, true);
+    iMaxX = Math.min(iMaxX, index[0] + 1);
+    iMaxY = Math.min(iMaxY, index[1] + 1);
+
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            if(this.result._shouldStop){
+                return;
+            }
+
+            shape.getAabbAtIndex(i, j, aabb);
+            if(!aabb.overlapsRay(localRay)){
+                continue;
+            }
+
+            // Lower triangle
+            shape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);
+            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, reportedShape, intersectConvexOptions);
+
+            if(this.result._shouldStop){
+                return;
+            }
+
+            // Upper triangle
+            shape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);
+            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, reportedShape, intersectConvexOptions);
+        }
+    }
+};
+Ray.prototype[Shape.types.HEIGHTFIELD] = Ray.prototype.intersectHeightfield;
+
+var Ray_intersectSphere_intersectionPoint = new Vec3();
+var Ray_intersectSphere_normal = new Vec3();
+
+/**
+ * @method intersectSphere
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectSphere = function(shape, quat, position, body, reportedShape){
+    var from = this.from,
+        to = this.to,
+        r = shape.radius;
+
+    var a = Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2) + Math.pow(to.z - from.z, 2);
+    var b = 2 * ((to.x - from.x) * (from.x - position.x) + (to.y - from.y) * (from.y - position.y) + (to.z - from.z) * (from.z - position.z));
+    var c = Math.pow(from.x - position.x, 2) + Math.pow(from.y - position.y, 2) + Math.pow(from.z - position.z, 2) - Math.pow(r, 2);
+
+    var delta = Math.pow(b, 2) - 4 * a * c;
+
+    var intersectionPoint = Ray_intersectSphere_intersectionPoint;
+    var normal = Ray_intersectSphere_normal;
+
+    if(delta < 0){
+        // No intersection
+        return;
+
+    } else if(delta === 0){
+        // single intersection point
+        from.lerp(to, delta, intersectionPoint);
+
+        intersectionPoint.vsub(position, normal);
+        normal.normalize();
+
+        this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+
+    } else {
+        var d1 = (- b - Math.sqrt(delta)) / (2 * a);
+        var d2 = (- b + Math.sqrt(delta)) / (2 * a);
+
+        if(d1 >= 0 && d1 <= 1){
+            from.lerp(to, d1, intersectionPoint);
+            intersectionPoint.vsub(position, normal);
+            normal.normalize();
+            this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+        }
+
+        if(this.result._shouldStop){
+            return;
+        }
+
+        if(d2 >= 0 && d2 <= 1){
+            from.lerp(to, d2, intersectionPoint);
+            intersectionPoint.vsub(position, normal);
+            normal.normalize();
+            this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+        }
+    }
+};
+Ray.prototype[Shape.types.SPHERE] = Ray.prototype.intersectSphere;
+
+
+var intersectConvex_normal = new Vec3();
+var intersectConvex_minDistNormal = new Vec3();
+var intersectConvex_minDistIntersect = new Vec3();
+var intersectConvex_vector = new Vec3();
+
+/**
+ * @method intersectConvex
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ * @param {object} [options]
+ * @param {array} [options.faceList]
+ */
+Ray.prototype.intersectConvex = function intersectConvex(
+    shape,
+    quat,
+    position,
+    body,
+    reportedShape,
+    options
+){
+    var minDistNormal = intersectConvex_minDistNormal;
+    var normal = intersectConvex_normal;
+    var vector = intersectConvex_vector;
+    var minDistIntersect = intersectConvex_minDistIntersect;
+    var faceList = (options && options.faceList) || null;
+
+    // Checking faces
+    var faces = shape.faces,
+        vertices = shape.vertices,
+        normals = shape.faceNormals;
+    var direction = this._direction;
+
+    var from = this.from;
+    var to = this.to;
+    var fromToDistance = from.distanceTo(to);
+
+    var minDist = -1;
+    var Nfaces = faceList ? faceList.length : faces.length;
+    var result = this.result;
+
+    for (var j = 0; !result._shouldStop && j < Nfaces; j++) {
+        var fi = faceList ? faceList[j] : j;
+
+        var face = faces[fi];
+        var faceNormal = normals[fi];
+        var q = quat;
+        var x = position;
+
+        // determine if ray intersects the plane of the face
+        // note: this works regardless of the direction of the face normal
+
+        // Get plane point in world coordinates...
+        vector.copy(vertices[face[0]]);
+        q.vmult(vector,vector);
+        vector.vadd(x,vector);
+
+        // ...but make it relative to the ray from. We'll fix this later.
+        vector.vsub(from,vector);
+
+        // Get plane normal
+        q.vmult(faceNormal,normal);
+
+        // If this dot product is negative, we have something interesting
+        var dot = direction.dot(normal);
+
+        // Bail out if ray and plane are parallel
+        if ( Math.abs( dot ) < this.precision ){
+            continue;
+        }
+
+        // calc distance to plane
+        var scalar = normal.dot(vector) / dot;
+
+        // if negative distance, then plane is behind ray
+        if (scalar < 0){
+            continue;
+        }
+
+        // if (dot < 0) {
+
+        // Intersection point is from + direction * scalar
+        direction.mult(scalar,intersectPoint);
+        intersectPoint.vadd(from,intersectPoint);
+
+        // a is the point we compare points b and c with.
+        a.copy(vertices[face[0]]);
+        q.vmult(a,a);
+        x.vadd(a,a);
+
+        for(var i = 1; !result._shouldStop && i < face.length - 1; i++){
+            // Transform 3 vertices to world coords
+            b.copy(vertices[face[i]]);
+            c.copy(vertices[face[i+1]]);
+            q.vmult(b,b);
+            q.vmult(c,c);
+            x.vadd(b,b);
+            x.vadd(c,c);
+
+            var distance = intersectPoint.distanceTo(from);
+
+            if(!(pointInTriangle(intersectPoint, a, b, c) || pointInTriangle(intersectPoint, b, a, c)) || distance > fromToDistance){
+                continue;
+            }
+
+            this.reportIntersection(normal, intersectPoint, reportedShape, body, fi);
+        }
+        // }
+    }
+};
+Ray.prototype[Shape.types.CONVEXPOLYHEDRON] = Ray.prototype.intersectConvex;
+
+var intersectTrimesh_normal = new Vec3();
+var intersectTrimesh_localDirection = new Vec3();
+var intersectTrimesh_localFrom = new Vec3();
+var intersectTrimesh_localTo = new Vec3();
+var intersectTrimesh_worldNormal = new Vec3();
+var intersectTrimesh_worldIntersectPoint = new Vec3();
+var intersectTrimesh_localAABB = new AABB();
+var intersectTrimesh_triangles = [];
+var intersectTrimesh_treeTransform = new Transform();
+
+/**
+ * @method intersectTrimesh
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ * @param {object} [options]
+ * @todo Optimize by transforming the world to local space first.
+ * @todo Use Octree lookup
+ */
+Ray.prototype.intersectTrimesh = function intersectTrimesh(
+    mesh,
+    quat,
+    position,
+    body,
+    reportedShape,
+    options
+){
+    var normal = intersectTrimesh_normal;
+    var triangles = intersectTrimesh_triangles;
+    var treeTransform = intersectTrimesh_treeTransform;
+    var minDistNormal = intersectConvex_minDistNormal;
+    var vector = intersectConvex_vector;
+    var minDistIntersect = intersectConvex_minDistIntersect;
+    var localAABB = intersectTrimesh_localAABB;
+    var localDirection = intersectTrimesh_localDirection;
+    var localFrom = intersectTrimesh_localFrom;
+    var localTo = intersectTrimesh_localTo;
+    var worldIntersectPoint = intersectTrimesh_worldIntersectPoint;
+    var worldNormal = intersectTrimesh_worldNormal;
+    var faceList = (options && options.faceList) || null;
+
+    // Checking faces
+    var indices = mesh.indices,
+        vertices = mesh.vertices,
+        normals = mesh.faceNormals;
+
+    var from = this.from;
+    var to = this.to;
+    var direction = this._direction;
+
+    var minDist = -1;
+    treeTransform.position.copy(position);
+    treeTransform.quaternion.copy(quat);
+
+    // Transform ray to local space!
+    Transform.vectorToLocalFrame(position, quat, direction, localDirection);
+    Transform.pointToLocalFrame(position, quat, from, localFrom);
+    Transform.pointToLocalFrame(position, quat, to, localTo);
+
+    localTo.x *= mesh.scale.x;
+    localTo.y *= mesh.scale.y;
+    localTo.z *= mesh.scale.z;
+    localFrom.x *= mesh.scale.x;
+    localFrom.y *= mesh.scale.y;
+    localFrom.z *= mesh.scale.z;
+
+    localTo.vsub(localFrom, localDirection);
+    localDirection.normalize();
+
+    var fromToDistanceSquared = localFrom.distanceSquared(localTo);
+
+    mesh.tree.rayQuery(this, treeTransform, triangles);
+
+    for (var i = 0, N = triangles.length; !this.result._shouldStop && i !== N; i++) {
+        var trianglesIndex = triangles[i];
+
+        mesh.getNormal(trianglesIndex, normal);
+
+        // determine if ray intersects the plane of the face
+        // note: this works regardless of the direction of the face normal
+
+        // Get plane point in world coordinates...
+        mesh.getVertex(indices[trianglesIndex * 3], a);
+
+        // ...but make it relative to the ray from. We'll fix this later.
+        a.vsub(localFrom,vector);
+
+        // If this dot product is negative, we have something interesting
+        var dot = localDirection.dot(normal);
+
+        // Bail out if ray and plane are parallel
+        // if (Math.abs( dot ) < this.precision){
+        //     continue;
+        // }
+
+        // calc distance to plane
+        var scalar = normal.dot(vector) / dot;
+
+        // if negative distance, then plane is behind ray
+        if (scalar < 0){
+            continue;
+        }
+
+        // Intersection point is from + direction * scalar
+        localDirection.scale(scalar,intersectPoint);
+        intersectPoint.vadd(localFrom,intersectPoint);
+
+        // Get triangle vertices
+        mesh.getVertex(indices[trianglesIndex * 3 + 1], b);
+        mesh.getVertex(indices[trianglesIndex * 3 + 2], c);
+
+        var squaredDistance = intersectPoint.distanceSquared(localFrom);
+
+        if(!(pointInTriangle(intersectPoint, b, a, c) || pointInTriangle(intersectPoint, a, b, c)) || squaredDistance > fromToDistanceSquared){
+            continue;
+        }
+
+        // transform intersectpoint and normal to world
+        Transform.vectorToWorldFrame(quat, normal, worldNormal);
+        Transform.pointToWorldFrame(position, quat, intersectPoint, worldIntersectPoint);
+        this.reportIntersection(worldNormal, worldIntersectPoint, reportedShape, body, trianglesIndex);
+    }
+    triangles.length = 0;
+};
+Ray.prototype[Shape.types.TRIMESH] = Ray.prototype.intersectTrimesh;
+
+
+/**
+ * @method reportIntersection
+ * @private
+ * @param  {Vec3} normal
+ * @param  {Vec3} hitPointWorld
+ * @param  {Shape} shape
+ * @param  {Body} body
+ * @return {boolean} True if the intersections should continue
+ */
+Ray.prototype.reportIntersection = function(normal, hitPointWorld, shape, body, hitFaceIndex){
+    var from = this.from;
+    var to = this.to;
+    var distance = from.distanceTo(hitPointWorld);
+    var result = this.result;
+
+    // Skip back faces?
+    if(this.skipBackfaces && normal.dot(this._direction) > 0){
+        return;
+    }
+
+    result.hitFaceIndex = typeof(hitFaceIndex) !== 'undefined' ? hitFaceIndex : -1;
+
+    switch(this.mode){
+    case Ray.ALL:
+        this.hasHit = true;
+        result.set(
+            from,
+            to,
+            normal,
+            hitPointWorld,
+            shape,
+            body,
+            distance
+        );
+        result.hasHit = true;
+        this.callback(result);
+        break;
+
+    case Ray.CLOSEST:
+
+        // Store if closer than current closest
+        if(distance < result.distance || !result.hasHit){
+            this.hasHit = true;
+            result.hasHit = true;
+            result.set(
+                from,
+                to,
+                normal,
+                hitPointWorld,
+                shape,
+                body,
+                distance
+            );
+        }
+        break;
+
+    case Ray.ANY:
+
+        // Report and stop.
+        this.hasHit = true;
+        result.hasHit = true;
+        result.set(
+            from,
+            to,
+            normal,
+            hitPointWorld,
+            shape,
+            body,
+            distance
+        );
+        result._shouldStop = true;
+        break;
+    }
+};
+
+var v0 = new Vec3(),
+    intersect = new Vec3();
+function distanceFromIntersection(from, direction, position) {
+
+    // v0 is vector from from to position
+    position.vsub(from,v0);
+    var dot = v0.dot(direction);
+
+    // intersect = direction*dot + from
+    direction.mult(dot,intersect);
+    intersect.vadd(from,intersect);
+
+    var distance = position.distanceTo(intersect);
+
+    return distance;
+}
+
+
+},{"../collision/AABB":18,"../collision/RaycastResult":26,"../math/Quaternion":44,"../math/Transform":45,"../math/Vec3":46,"../shapes/Box":53,"../shapes/ConvexPolyhedron":54,"../shapes/Shape":59}],26:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+
+module.exports = RaycastResult;
+
+/**
+ * Storage for Ray casting data.
+ * @class RaycastResult
+ * @constructor
+ */
+function RaycastResult(){
+
+	/**
+	 * @property {Vec3} rayFromWorld
+	 */
+	this.rayFromWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} rayToWorld
+	 */
+	this.rayToWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} hitNormalWorld
+	 */
+	this.hitNormalWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} hitPointWorld
+	 */
+	this.hitPointWorld = new Vec3();
+
+	/**
+	 * @property {boolean} hasHit
+	 */
+	this.hasHit = false;
+
+	/**
+	 * The hit shape, or null.
+	 * @property {Shape} shape
+	 */
+	this.shape = null;
+
+	/**
+	 * The hit body, or null.
+	 * @property {Body} body
+	 */
+	this.body = null;
+
+	/**
+	 * The index of the hit triangle, if the hit shape was a trimesh.
+	 * @property {number} hitFaceIndex
+	 * @default -1
+	 */
+	this.hitFaceIndex = -1;
+
+	/**
+	 * Distance to the hit. Will be set to -1 if there was no hit.
+	 * @property {number} distance
+	 * @default -1
+	 */
+	this.distance = -1;
+
+	/**
+	 * If the ray should stop traversing the bodies.
+	 * @private
+	 * @property {Boolean} _shouldStop
+	 * @default false
+	 */
+	this._shouldStop = false;
+}
+
+/**
+ * Reset all result data.
+ * @method reset
+ */
+RaycastResult.prototype.reset = function () {
+	this.rayFromWorld.setZero();
+	this.rayToWorld.setZero();
+	this.hitNormalWorld.setZero();
+	this.hitPointWorld.setZero();
+	this.hasHit = false;
+	this.shape = null;
+	this.body = null;
+	this.hitFaceIndex = -1;
+	this.distance = -1;
+	this._shouldStop = false;
+};
+
+/**
+ * @method abort
+ */
+RaycastResult.prototype.abort = function(){
+	this._shouldStop = true;
+};
+
+/**
+ * @method set
+ * @param {Vec3} rayFromWorld
+ * @param {Vec3} rayToWorld
+ * @param {Vec3} hitNormalWorld
+ * @param {Vec3} hitPointWorld
+ * @param {Shape} shape
+ * @param {Body} body
+ * @param {number} distance
+ */
+RaycastResult.prototype.set = function(
+	rayFromWorld,
+	rayToWorld,
+	hitNormalWorld,
+	hitPointWorld,
+	shape,
+	body,
+	distance
+){
+	this.rayFromWorld.copy(rayFromWorld);
+	this.rayToWorld.copy(rayToWorld);
+	this.hitNormalWorld.copy(hitNormalWorld);
+	this.hitPointWorld.copy(hitPointWorld);
+	this.shape = shape;
+	this.body = body;
+	this.distance = distance;
+};
+},{"../math/Vec3":46}],27:[function(require,module,exports){
+var Shape = require('../shapes/Shape');
+var Broadphase = require('../collision/Broadphase');
+
+module.exports = SAPBroadphase;
+
+/**
+ * Sweep and prune broadphase along one axis.
+ *
+ * @class SAPBroadphase
+ * @constructor
+ * @param {World} [world]
+ * @extends Broadphase
+ */
+function SAPBroadphase(world){
+    Broadphase.apply(this);
+
+    /**
+     * List of bodies currently in the broadphase.
+     * @property axisList
+     * @type {Array}
+     */
+    this.axisList = [];
+
+    /**
+     * The world to search in.
+     * @property world
+     * @type {World}
+     */
+    this.world = null;
+
+    /**
+     * Axis to sort the bodies along. Set to 0 for x axis, and 1 for y axis. For best performance, choose an axis that the bodies are spread out more on.
+     * @property axisIndex
+     * @type {Number}
+     */
+    this.axisIndex = 0;
+
+    var axisList = this.axisList;
+
+    this._addBodyHandler = function(e){
+        axisList.push(e.body);
+    };
+
+    this._removeBodyHandler = function(e){
+        var idx = axisList.indexOf(e.body);
+        if(idx !== -1){
+            axisList.splice(idx,1);
+        }
+    };
+
+    if(world){
+        this.setWorld(world);
+    }
+}
+SAPBroadphase.prototype = new Broadphase();
+
+/**
+ * Change the world
+ * @method setWorld
+ * @param  {World} world
+ */
+SAPBroadphase.prototype.setWorld = function(world){
+    // Clear the old axis array
+    this.axisList.length = 0;
+
+    // Add all bodies from the new world
+    for(var i=0; i<world.bodies.length; i++){
+        this.axisList.push(world.bodies[i]);
+    }
+
+    // Remove old handlers, if any
+    world.removeEventListener("addBody", this._addBodyHandler);
+    world.removeEventListener("removeBody", this._removeBodyHandler);
+
+    // Add handlers to update the list of bodies.
+    world.addEventListener("addBody", this._addBodyHandler);
+    world.addEventListener("removeBody", this._removeBodyHandler);
+
+    this.world = world;
+    this.dirty = true;
+};
+
+/**
+ * @static
+ * @method insertionSortX
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortX = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.x <= v.aabb.lowerBound.x){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * @static
+ * @method insertionSortY
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortY = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.y <= v.aabb.lowerBound.y){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * @static
+ * @method insertionSortZ
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortZ = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.z <= v.aabb.lowerBound.z){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * Collect all collision pairs
+ * @method collisionPairs
+ * @param  {World} world
+ * @param  {Array} p1
+ * @param  {Array} p2
+ */
+SAPBroadphase.prototype.collisionPairs = function(world,p1,p2){
+    var bodies = this.axisList,
+        N = bodies.length,
+        axisIndex = this.axisIndex,
+        i, j;
+
+    if(this.dirty){
+        this.sortList();
+        this.dirty = false;
+    }
+
+    // Look through the list
+    for(i=0; i !== N; i++){
+        var bi = bodies[i];
+
+        for(j=i+1; j < N; j++){
+            var bj = bodies[j];
+
+            if(!this.needBroadphaseCollision(bi,bj)){
+                continue;
+            }
+
+            if(!SAPBroadphase.checkBounds(bi,bj,axisIndex)){
+                break;
+            }
+
+            this.intersectionTest(bi,bj,p1,p2);
+        }
+    }
+};
+
+SAPBroadphase.prototype.sortList = function(){
+    var axisList = this.axisList;
+    var axisIndex = this.axisIndex;
+    var N = axisList.length;
+
+    // Update AABBs
+    for(var i = 0; i!==N; i++){
+        var bi = axisList[i];
+        if(bi.aabbNeedsUpdate){
+            bi.computeAABB();
+        }
+    }
+
+    // Sort the list
+    if(axisIndex === 0){
+        SAPBroadphase.insertionSortX(axisList);
+    } else if(axisIndex === 1){
+        SAPBroadphase.insertionSortY(axisList);
+    } else if(axisIndex === 2){
+        SAPBroadphase.insertionSortZ(axisList);
+    }
+};
+
+/**
+ * Check if the bounds of two bodies overlap, along the given SAP axis.
+ * @static
+ * @method checkBounds
+ * @param  {Body} bi
+ * @param  {Body} bj
+ * @param  {Number} axisIndex
+ * @return {Boolean}
+ */
+SAPBroadphase.checkBounds = function(bi, bj, axisIndex){
+    var biPos;
+    var bjPos;
+
+    if(axisIndex === 0){
+        biPos = bi.position.x;
+        bjPos = bj.position.x;
+    } else if(axisIndex === 1){
+        biPos = bi.position.y;
+        bjPos = bj.position.y;
+    } else if(axisIndex === 2){
+        biPos = bi.position.z;
+        bjPos = bj.position.z;
+    }
+
+    var ri = bi.boundingRadius,
+        rj = bj.boundingRadius,
+        boundA1 = biPos - ri,
+        boundA2 = biPos + ri,
+        boundB1 = bjPos - rj,
+        boundB2 = bjPos + rj;
+
+    return boundB1 < boundA2;
+};
+
+/**
+ * Computes the variance of the body positions and estimates the best
+ * axis to use. Will automatically set property .axisIndex.
+ * @method autoDetectAxis
+ */
+SAPBroadphase.prototype.autoDetectAxis = function(){
+    var sumX=0,
+        sumX2=0,
+        sumY=0,
+        sumY2=0,
+        sumZ=0,
+        sumZ2=0,
+        bodies = this.axisList,
+        N = bodies.length,
+        invN=1/N;
+
+    for(var i=0; i!==N; i++){
+        var b = bodies[i];
+
+        var centerX = b.position.x;
+        sumX += centerX;
+        sumX2 += centerX*centerX;
+
+        var centerY = b.position.y;
+        sumY += centerY;
+        sumY2 += centerY*centerY;
+
+        var centerZ = b.position.z;
+        sumZ += centerZ;
+        sumZ2 += centerZ*centerZ;
+    }
+
+    var varianceX = sumX2 - sumX*sumX*invN,
+        varianceY = sumY2 - sumY*sumY*invN,
+        varianceZ = sumZ2 - sumZ*sumZ*invN;
+
+    if(varianceX > varianceY){
+        if(varianceX > varianceZ){
+            this.axisIndex = 0;
+        } else{
+            this.axisIndex = 2;
+        }
+    } else if(varianceY > varianceZ){
+        this.axisIndex = 1;
+    } else{
+        this.axisIndex = 2;
+    }
+};
+
+/**
+ * Returns all the bodies within an AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+SAPBroadphase.prototype.aabbQuery = function(world, aabb, result){
+    result = result || [];
+
+    if(this.dirty){
+        this.sortList();
+        this.dirty = false;
+    }
+
+    var axisIndex = this.axisIndex, axis = 'x';
+    if(axisIndex === 1){ axis = 'y'; }
+    if(axisIndex === 2){ axis = 'z'; }
+
+    var axisList = this.axisList;
+    var lower = aabb.lowerBound[axis];
+    var upper = aabb.upperBound[axis];
+    for(var i = 0; i < axisList.length; i++){
+        var b = axisList[i];
+
+        if(b.aabbNeedsUpdate){
+            b.computeAABB();
+        }
+
+        if(b.aabb.overlaps(aabb)){
+            result.push(b);
+        }
+    }
+
+    return result;
+};
+},{"../collision/Broadphase":20,"../shapes/Shape":59}],28:[function(require,module,exports){
+module.exports = ConeTwistConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var ConeEquation = require('../equations/ConeEquation');
+var RotationalEquation = require('../equations/RotationalEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * @class ConeTwistConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Vec3} [options.pivotA]
+ * @param {Vec3} [options.pivotB]
+ * @param {Vec3} [options.axisA]
+ * @param {Vec3} [options.axisB]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function ConeTwistConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    // Set pivot point in between
+    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();
+    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3();
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3();
+
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    this.collideConnected = !!options.collideConnected;
+
+    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;
+
+    /**
+     * @property {ConeEquation} coneEquation
+     */
+    var c = this.coneEquation = new ConeEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} twistEquation
+     */
+    var t = this.twistEquation = new RotationalEquation(bodyA,bodyB,options);
+    this.twistAngle = typeof(options.twistAngle) !== 'undefined' ? options.twistAngle : 0;
+
+    // Make the cone equation push the bodies toward the cone axis, not outward
+    c.maxForce = 0;
+    c.minForce = -maxForce;
+
+    // Make the twist equation add torque toward the initial position
+    t.maxForce = 0;
+    t.minForce = -maxForce;
+
+    this.equations.push(c, t);
+}
+ConeTwistConstraint.prototype = new PointToPointConstraint();
+ConeTwistConstraint.constructor = ConeTwistConstraint;
+
+var ConeTwistConstraint_update_tmpVec1 = new Vec3();
+var ConeTwistConstraint_update_tmpVec2 = new Vec3();
+
+ConeTwistConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        cone = this.coneEquation,
+        twist = this.twistEquation;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // Update the axes to the cone constraint
+    bodyA.vectorToWorldFrame(this.axisA, cone.axisA);
+    bodyB.vectorToWorldFrame(this.axisB, cone.axisB);
+
+    // Update the world axes in the twist constraint
+    this.axisA.tangents(twist.axisA, twist.axisA);
+    bodyA.vectorToWorldFrame(twist.axisA, twist.axisA);
+
+    this.axisB.tangents(twist.axisB, twist.axisB);
+    bodyB.vectorToWorldFrame(twist.axisB, twist.axisB);
+
+    cone.angle = this.angle;
+    twist.maxAngle = this.twistAngle;
+};
+
+
+},{"../equations/ConeEquation":34,"../equations/ContactEquation":35,"../equations/RotationalEquation":38,"../math/Vec3":46,"./Constraint":29,"./PointToPointConstraint":33}],29:[function(require,module,exports){
+module.exports = Constraint;
+
+var Utils = require('../utils/Utils');
+
+/**
+ * Constraint base class
+ * @class Constraint
+ * @author schteppe
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {boolean} [options.collideConnected=true]
+ * @param {boolean} [options.wakeUpBodies=true]
+ */
+function Constraint(bodyA, bodyB, options){
+    options = Utils.defaults(options,{
+        collideConnected : true,
+        wakeUpBodies : true,
+    });
+
+    /**
+     * Equations to be solved in this constraint
+     * @property equations
+     * @type {Array}
+     */
+    this.equations = [];
+
+    /**
+     * @property {Body} bodyA
+     */
+    this.bodyA = bodyA;
+
+    /**
+     * @property {Body} bodyB
+     */
+    this.bodyB = bodyB;
+
+    /**
+     * @property {Number} id
+     */
+    this.id = Constraint.idCounter++;
+
+    /**
+     * Set to true if you want the bodies to collide when they are connected.
+     * @property collideConnected
+     * @type {boolean}
+     */
+    this.collideConnected = options.collideConnected;
+
+    if(options.wakeUpBodies){
+        if(bodyA){
+            bodyA.wakeUp();
+        }
+        if(bodyB){
+            bodyB.wakeUp();
+        }
+    }
+}
+
+/**
+ * Update all the equations with data.
+ * @method update
+ */
+Constraint.prototype.update = function(){
+    throw new Error("method update() not implmemented in this Constraint subclass!");
+};
+
+/**
+ * Enables all equations in the constraint.
+ * @method enable
+ */
+Constraint.prototype.enable = function(){
+    var eqs = this.equations;
+    for(var i=0; i<eqs.length; i++){
+        eqs[i].enabled = true;
+    }
+};
+
+/**
+ * Disables all equations in the constraint.
+ * @method disable
+ */
+Constraint.prototype.disable = function(){
+    var eqs = this.equations;
+    for(var i=0; i<eqs.length; i++){
+        eqs[i].enabled = false;
+    }
+};
+
+Constraint.idCounter = 0;
+
+},{"../utils/Utils":69}],30:[function(require,module,exports){
+module.exports = DistanceConstraint;
+
+var Constraint = require('./Constraint');
+var ContactEquation = require('../equations/ContactEquation');
+
+/**
+ * Constrains two bodies to be at a constant distance from each others center of mass.
+ * @class DistanceConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} [distance] The distance to keep. If undefined, it will be set to the current distance between bodyA and bodyB
+ * @param {Number} [maxForce=1e6]
+ * @extends Constraint
+ */
+function DistanceConstraint(bodyA,bodyB,distance,maxForce){
+    Constraint.call(this,bodyA,bodyB);
+
+    if(typeof(distance)==="undefined") {
+        distance = bodyA.position.distanceTo(bodyB.position);
+    }
+
+    if(typeof(maxForce)==="undefined") {
+        maxForce = 1e6;
+    }
+
+    /**
+     * @property {number} distance
+     */
+    this.distance = distance;
+
+    /**
+     * @property {ContactEquation} distanceEquation
+     */
+    var eq = this.distanceEquation = new ContactEquation(bodyA, bodyB);
+    this.equations.push(eq);
+
+    // Make it bidirectional
+    eq.minForce = -maxForce;
+    eq.maxForce =  maxForce;
+}
+DistanceConstraint.prototype = new Constraint();
+
+DistanceConstraint.prototype.update = function(){
+    var bodyA = this.bodyA;
+    var bodyB = this.bodyB;
+    var eq = this.distanceEquation;
+    var halfDist = this.distance * 0.5;
+    var normal = eq.ni;
+
+    bodyB.position.vsub(bodyA.position, normal);
+    normal.normalize();
+    normal.mult(halfDist, eq.ri);
+    normal.mult(-halfDist, eq.rj);
+};
+},{"../equations/ContactEquation":35,"./Constraint":29}],31:[function(require,module,exports){
+module.exports = HingeConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var RotationalEquation = require('../equations/RotationalEquation');
+var RotationalMotorEquation = require('../equations/RotationalMotorEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Hinge constraint. Think of it as a door hinge. It tries to keep the door in the correct place and with the correct orientation.
+ * @class HingeConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Vec3} [options.pivotA] A point defined locally in bodyA. This defines the offset of axisA.
+ * @param {Vec3} [options.axisA] An axis that bodyA can rotate around, defined locally in bodyA.
+ * @param {Vec3} [options.pivotB]
+ * @param {Vec3} [options.axisB]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function HingeConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();
+    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();
+
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    /**
+     * Rotation axis, defined locally in bodyA.
+     * @property {Vec3} axisA
+     */
+    var axisA = this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1,0,0);
+    axisA.normalize();
+
+    /**
+     * Rotation axis, defined locally in bodyB.
+     * @property {Vec3} axisB
+     */
+    var axisB = this.axisB = options.axisB ? options.axisB.clone() : new Vec3(1,0,0);
+    axisB.normalize();
+
+    /**
+     * @property {RotationalEquation} rotationalEquation1
+     */
+    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation2
+     */
+    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalMotorEquation} motorEquation
+     */
+    var motor = this.motorEquation = new RotationalMotorEquation(bodyA,bodyB,maxForce);
+    motor.enabled = false; // Not enabled by default
+
+    // Equations to be fed to the solver
+    this.equations.push(
+        r1, // rotational1
+        r2, // rotational2
+        motor
+    );
+}
+HingeConstraint.prototype = new PointToPointConstraint();
+HingeConstraint.constructor = HingeConstraint;
+
+/**
+ * @method enableMotor
+ */
+HingeConstraint.prototype.enableMotor = function(){
+    this.motorEquation.enabled = true;
+};
+
+/**
+ * @method disableMotor
+ */
+HingeConstraint.prototype.disableMotor = function(){
+    this.motorEquation.enabled = false;
+};
+
+/**
+ * @method setMotorSpeed
+ * @param {number} speed
+ */
+HingeConstraint.prototype.setMotorSpeed = function(speed){
+    this.motorEquation.targetVelocity = speed;
+};
+
+/**
+ * @method setMotorMaxForce
+ * @param {number} maxForce
+ */
+HingeConstraint.prototype.setMotorMaxForce = function(maxForce){
+    this.motorEquation.maxForce = maxForce;
+    this.motorEquation.minForce = -maxForce;
+};
+
+var HingeConstraint_update_tmpVec1 = new Vec3();
+var HingeConstraint_update_tmpVec2 = new Vec3();
+
+HingeConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        motor = this.motorEquation,
+        r1 = this.rotationalEquation1,
+        r2 = this.rotationalEquation2,
+        worldAxisA = HingeConstraint_update_tmpVec1,
+        worldAxisB = HingeConstraint_update_tmpVec2;
+
+    var axisA = this.axisA;
+    var axisB = this.axisB;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // Get world axes
+    bodyA.quaternion.vmult(axisA, worldAxisA);
+    bodyB.quaternion.vmult(axisB, worldAxisB);
+
+    worldAxisA.tangents(r1.axisA, r2.axisA);
+    r1.axisB.copy(worldAxisB);
+    r2.axisB.copy(worldAxisB);
+
+    if(this.motorEquation.enabled){
+        bodyA.quaternion.vmult(this.axisA, motor.axisA);
+        bodyB.quaternion.vmult(this.axisB, motor.axisB);
+    }
+};
+
+
+},{"../equations/ContactEquation":35,"../equations/RotationalEquation":38,"../equations/RotationalMotorEquation":39,"../math/Vec3":46,"./Constraint":29,"./PointToPointConstraint":33}],32:[function(require,module,exports){
+module.exports = LockConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var RotationalEquation = require('../equations/RotationalEquation');
+var RotationalMotorEquation = require('../equations/RotationalMotorEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Lock constraint. Will remove all degrees of freedom between the bodies.
+ * @class LockConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function LockConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    // Set pivot point in between
+    var pivotA = new Vec3();
+    var pivotB = new Vec3();
+    var halfWay = new Vec3();
+    bodyA.position.vadd(bodyB.position, halfWay);
+    halfWay.scale(0.5, halfWay);
+    bodyB.pointToLocalFrame(halfWay, pivotB);
+    bodyA.pointToLocalFrame(halfWay, pivotA);
+
+    // The point-to-point constraint will keep a point shared between the bodies
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    // Store initial rotation of the bodies as unit vectors in the local body spaces
+    this.xA = bodyA.vectorToLocalFrame(Vec3.UNIT_X);
+    this.xB = bodyB.vectorToLocalFrame(Vec3.UNIT_X);
+    this.yA = bodyA.vectorToLocalFrame(Vec3.UNIT_Y);
+    this.yB = bodyB.vectorToLocalFrame(Vec3.UNIT_Y);
+    this.zA = bodyA.vectorToLocalFrame(Vec3.UNIT_Z);
+    this.zB = bodyB.vectorToLocalFrame(Vec3.UNIT_Z);
+
+    // ...and the following rotational equations will keep all rotational DOF's in place
+
+    /**
+     * @property {RotationalEquation} rotationalEquation1
+     */
+    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation2
+     */
+    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation3
+     */
+    var r3 = this.rotationalEquation3 = new RotationalEquation(bodyA,bodyB,options);
+
+    this.equations.push(r1, r2, r3);
+}
+LockConstraint.prototype = new PointToPointConstraint();
+LockConstraint.constructor = LockConstraint;
+
+var LockConstraint_update_tmpVec1 = new Vec3();
+var LockConstraint_update_tmpVec2 = new Vec3();
+
+LockConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        motor = this.motorEquation,
+        r1 = this.rotationalEquation1,
+        r2 = this.rotationalEquation2,
+        r3 = this.rotationalEquation3,
+        worldAxisA = LockConstraint_update_tmpVec1,
+        worldAxisB = LockConstraint_update_tmpVec2;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // These vector pairs must be orthogonal
+    bodyA.vectorToWorldFrame(this.xA, r1.axisA);
+    bodyB.vectorToWorldFrame(this.yB, r1.axisB);
+
+    bodyA.vectorToWorldFrame(this.yA, r2.axisA);
+    bodyB.vectorToWorldFrame(this.zB, r2.axisB);
+
+    bodyA.vectorToWorldFrame(this.zA, r3.axisA);
+    bodyB.vectorToWorldFrame(this.xB, r3.axisB);
+};
+
+
+},{"../equations/ContactEquation":35,"../equations/RotationalEquation":38,"../equations/RotationalMotorEquation":39,"../math/Vec3":46,"./Constraint":29,"./PointToPointConstraint":33}],33:[function(require,module,exports){
+module.exports = PointToPointConstraint;
+
+var Constraint = require('./Constraint');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Connects two bodies at given offset points.
+ * @class PointToPointConstraint
+ * @extends Constraint
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Vec3} pivotA The point relative to the center of mass of bodyA which bodyA is constrained to.
+ * @param {Body} bodyB Body that will be constrained in a similar way to the same point as bodyA. We will therefore get a link between bodyA and bodyB. If not specified, bodyA will be constrained to a static point.
+ * @param {Vec3} pivotB See pivotA.
+ * @param {Number} maxForce The maximum force that should be applied to constrain the bodies.
+ *
+ * @example
+ *     var bodyA = new Body({ mass: 1 });
+ *     var bodyB = new Body({ mass: 1 });
+ *     bodyA.position.set(-1, 0, 0);
+ *     bodyB.position.set(1, 0, 0);
+ *     bodyA.addShape(shapeA);
+ *     bodyB.addShape(shapeB);
+ *     world.addBody(bodyA);
+ *     world.addBody(bodyB);
+ *     var localPivotA = new Vec3(1, 0, 0);
+ *     var localPivotB = new Vec3(-1, 0, 0);
+ *     var constraint = new PointToPointConstraint(bodyA, localPivotA, bodyB, localPivotB);
+ *     world.addConstraint(constraint);
+ */
+function PointToPointConstraint(bodyA,pivotA,bodyB,pivotB,maxForce){
+    Constraint.call(this,bodyA,bodyB);
+
+    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;
+
+    /**
+     * Pivot, defined locally in bodyA.
+     * @property {Vec3} pivotA
+     */
+    this.pivotA = pivotA ? pivotA.clone() : new Vec3();
+
+    /**
+     * Pivot, defined locally in bodyB.
+     * @property {Vec3} pivotB
+     */
+    this.pivotB = pivotB ? pivotB.clone() : new Vec3();
+
+    /**
+     * @property {ContactEquation} equationX
+     */
+    var x = this.equationX = new ContactEquation(bodyA,bodyB);
+
+    /**
+     * @property {ContactEquation} equationY
+     */
+    var y = this.equationY = new ContactEquation(bodyA,bodyB);
+
+    /**
+     * @property {ContactEquation} equationZ
+     */
+    var z = this.equationZ = new ContactEquation(bodyA,bodyB);
+
+    // Equations to be fed to the solver
+    this.equations.push(x, y, z);
+
+    // Make the equations bidirectional
+    x.minForce = y.minForce = z.minForce = -maxForce;
+    x.maxForce = y.maxForce = z.maxForce =  maxForce;
+
+    x.ni.set(1, 0, 0);
+    y.ni.set(0, 1, 0);
+    z.ni.set(0, 0, 1);
+}
+PointToPointConstraint.prototype = new Constraint();
+
+PointToPointConstraint.prototype.update = function(){
+    var bodyA = this.bodyA;
+    var bodyB = this.bodyB;
+    var x = this.equationX;
+    var y = this.equationY;
+    var z = this.equationZ;
+
+    // Rotate the pivots to world space
+    bodyA.quaternion.vmult(this.pivotA,x.ri);
+    bodyB.quaternion.vmult(this.pivotB,x.rj);
+
+    y.ri.copy(x.ri);
+    y.rj.copy(x.rj);
+    z.ri.copy(x.ri);
+    z.rj.copy(x.rj);
+};
+},{"../equations/ContactEquation":35,"../math/Vec3":46,"./Constraint":29}],34:[function(require,module,exports){
+module.exports = ConeEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Cone equation. Works to keep the given body world vectors aligned, or tilted within a given angle from each other.
+ * @class ConeEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Vec3} [options.axisA] Local axis in A
+ * @param {Vec3} [options.axisB] Local axis in B
+ * @param {Vec3} [options.angle] The "cone angle" to keep
+ * @param {number} [options.maxForce=1e6]
+ * @extends Equation
+ */
+function ConeEquation(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);
+
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);
+
+    /**
+     * The cone angle to keep
+     * @property {number} angle
+     */
+    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;
+}
+
+ConeEquation.prototype = new Equation();
+ConeEquation.prototype.constructor = ConeEquation;
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+
+ConeEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+
+        ni = this.axisA,
+        nj = this.axisB,
+
+        nixnj = tmpVec1,
+        njxni = tmpVec2,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // Caluclate cross products
+    ni.cross(nj, nixnj);
+    nj.cross(ni, njxni);
+
+    // The angle between two vector is:
+    // cos(theta) = a * b / (length(a) * length(b) = { len(a) = len(b) = 1 } = a * b
+
+    // g = a * b
+    // gdot = (b x a) * wi + (a x b) * wj
+    // G = [0 bxa 0 axb]
+    // W = [vi wi vj wj]
+    GA.rotational.copy(njxni);
+    GB.rotational.copy(nixnj);
+
+    var g = Math.cos(this.angle) - ni.dot(nj),
+        GW = this.computeGW(),
+        GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h * GiMf;
+
+    return B;
+};
+
+
+},{"../math/Mat3":43,"../math/Vec3":46,"./Equation":36}],35:[function(require,module,exports){
+module.exports = ContactEquation;
+
+var Equation = require('./Equation');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+
+/**
+ * Contact/non-penetration constraint equation
+ * @class ContactEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @extends Equation
+ */
+function ContactEquation(bodyA, bodyB, maxForce){
+    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;
+    Equation.call(this, bodyA, bodyB, 0, maxForce);
+
+    /**
+     * @property restitution
+     * @type {Number}
+     */
+    this.restitution = 0.0; // "bounciness": u1 = -e*u0
+
+    /**
+     * World-oriented vector that goes from the center of bi to the contact point.
+     * @property {Vec3} ri
+     */
+    this.ri = new Vec3();
+
+    /**
+     * World-oriented vector that starts in body j position and goes to the contact point.
+     * @property {Vec3} rj
+     */
+    this.rj = new Vec3();
+
+    /**
+     * Contact normal, pointing out of body i.
+     * @property {Vec3} ni
+     */
+    this.ni = new Vec3();
+}
+
+ContactEquation.prototype = new Equation();
+ContactEquation.prototype.constructor = ContactEquation;
+
+var ContactEquation_computeB_temp1 = new Vec3(); // Temp vectors
+var ContactEquation_computeB_temp2 = new Vec3();
+var ContactEquation_computeB_temp3 = new Vec3();
+ContactEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+        ri = this.ri,
+        rj = this.rj,
+        rixn = ContactEquation_computeB_temp1,
+        rjxn = ContactEquation_computeB_temp2,
+
+        vi = bi.velocity,
+        wi = bi.angularVelocity,
+        fi = bi.force,
+        taui = bi.torque,
+
+        vj = bj.velocity,
+        wj = bj.angularVelocity,
+        fj = bj.force,
+        tauj = bj.torque,
+
+        penetrationVec = ContactEquation_computeB_temp3,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+
+        n = this.ni;
+
+    // Caluclate cross products
+    ri.cross(n,rixn);
+    rj.cross(n,rjxn);
+
+    // g = xj+rj -(xi+ri)
+    // G = [ -ni  -rixn  ni  rjxn ]
+    n.negate(GA.spatial);
+    rixn.negate(GA.rotational);
+    GB.spatial.copy(n);
+    GB.rotational.copy(rjxn);
+
+    // Calculate the penetration vector
+    penetrationVec.copy(bj.position);
+    penetrationVec.vadd(rj,penetrationVec);
+    penetrationVec.vsub(bi.position,penetrationVec);
+    penetrationVec.vsub(ri,penetrationVec);
+
+    var g = n.dot(penetrationVec);
+
+    // Compute iteration
+    var ePlusOne = this.restitution + 1;
+    var GW = ePlusOne * vj.dot(n) - ePlusOne * vi.dot(n) + wj.dot(rjxn) - wi.dot(rixn);
+    var GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h*GiMf;
+
+    return B;
+};
+
+var ContactEquation_getImpactVelocityAlongNormal_vi = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_vj = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_xi = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_xj = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_relVel = new Vec3();
+
+/**
+ * Get the current relative velocity in the contact point.
+ * @method getImpactVelocityAlongNormal
+ * @return {number}
+ */
+ContactEquation.prototype.getImpactVelocityAlongNormal = function(){
+    var vi = ContactEquation_getImpactVelocityAlongNormal_vi;
+    var vj = ContactEquation_getImpactVelocityAlongNormal_vj;
+    var xi = ContactEquation_getImpactVelocityAlongNormal_xi;
+    var xj = ContactEquation_getImpactVelocityAlongNormal_xj;
+    var relVel = ContactEquation_getImpactVelocityAlongNormal_relVel;
+
+    this.bi.position.vadd(this.ri, xi);
+    this.bj.position.vadd(this.rj, xj);
+
+    this.bi.getVelocityAtWorldPoint(xi, vi);
+    this.bj.getVelocityAtWorldPoint(xj, vj);
+
+    vi.vsub(vj, relVel);
+
+    return this.ni.dot(relVel);
+};
+
+
+},{"../math/Mat3":43,"../math/Vec3":46,"./Equation":36}],36:[function(require,module,exports){
+module.exports = Equation;
+
+var JacobianElement = require('../math/JacobianElement'),
+    Vec3 = require('../math/Vec3');
+
+/**
+ * Equation base class
+ * @class Equation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bi
+ * @param {Body} bj
+ * @param {Number} minForce Minimum (read: negative max) force to be applied by the constraint.
+ * @param {Number} maxForce Maximum (read: positive max) force to be applied by the constraint.
+ */
+function Equation(bi,bj,minForce,maxForce){
+    this.id = Equation.id++;
+
+    /**
+     * @property {number} minForce
+     */
+    this.minForce = typeof(minForce)==="undefined" ? -1e6 : minForce;
+
+    /**
+     * @property {number} maxForce
+     */
+    this.maxForce = typeof(maxForce)==="undefined" ? 1e6 : maxForce;
+
+    /**
+     * @property bi
+     * @type {Body}
+     */
+    this.bi = bi;
+
+    /**
+     * @property bj
+     * @type {Body}
+     */
+    this.bj = bj;
+
+    /**
+     * SPOOK parameter
+     * @property {number} a
+     */
+    this.a = 0.0;
+
+    /**
+     * SPOOK parameter
+     * @property {number} b
+     */
+    this.b = 0.0;
+
+    /**
+     * SPOOK parameter
+     * @property {number} eps
+     */
+    this.eps = 0.0;
+
+    /**
+     * @property {JacobianElement} jacobianElementA
+     */
+    this.jacobianElementA = new JacobianElement();
+
+    /**
+     * @property {JacobianElement} jacobianElementB
+     */
+    this.jacobianElementB = new JacobianElement();
+
+    /**
+     * @property {boolean} enabled
+     * @default true
+     */
+    this.enabled = true;
+
+    /**
+     * A number, proportional to the force added to the bodies.
+     * @property {number} multiplier
+     * @readonly
+     */
+    this.multiplier = 0;
+
+    // Set typical spook params
+    this.setSpookParams(1e7,4,1/60);
+}
+Equation.prototype.constructor = Equation;
+
+Equation.id = 0;
+
+/**
+ * Recalculates a,b,eps.
+ * @method setSpookParams
+ */
+Equation.prototype.setSpookParams = function(stiffness,relaxation,timeStep){
+    var d = relaxation,
+        k = stiffness,
+        h = timeStep;
+    this.a = 4.0 / (h * (1 + 4 * d));
+    this.b = (4.0 * d) / (1 + 4 * d);
+    this.eps = 4.0 / (h * h * k * (1 + 4 * d));
+};
+
+/**
+ * Computes the RHS of the SPOOK equation
+ * @method computeB
+ * @return {Number}
+ */
+Equation.prototype.computeB = function(a,b,h){
+    var GW = this.computeGW(),
+        Gq = this.computeGq(),
+        GiMf = this.computeGiMf();
+    return - Gq * a - GW * b - GiMf*h;
+};
+
+/**
+ * Computes G*q, where q are the generalized body coordinates
+ * @method computeGq
+ * @return {Number}
+ */
+Equation.prototype.computeGq = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        xi = bi.position,
+        xj = bj.position;
+    return GA.spatial.dot(xi) + GB.spatial.dot(xj);
+};
+
+var zero = new Vec3();
+
+/**
+ * Computes G*W, where W are the body velocities
+ * @method computeGW
+ * @return {Number}
+ */
+Equation.prototype.computeGW = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        vi = bi.velocity,
+        vj = bj.velocity,
+        wi = bi.angularVelocity,
+        wj = bj.angularVelocity;
+    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);
+};
+
+
+/**
+ * Computes G*Wlambda, where W are the body velocities
+ * @method computeGWlambda
+ * @return {Number}
+ */
+Equation.prototype.computeGWlambda = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        vi = bi.vlambda,
+        vj = bj.vlambda,
+        wi = bi.wlambda,
+        wj = bj.wlambda;
+    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);
+};
+
+/**
+ * Computes G*inv(M)*f, where M is the mass matrix with diagonal blocks for each body, and f are the forces on the bodies.
+ * @method computeGiMf
+ * @return {Number}
+ */
+var iMfi = new Vec3(),
+    iMfj = new Vec3(),
+    invIi_vmult_taui = new Vec3(),
+    invIj_vmult_tauj = new Vec3();
+Equation.prototype.computeGiMf = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        fi = bi.force,
+        ti = bi.torque,
+        fj = bj.force,
+        tj = bj.torque,
+        invMassi = bi.invMassSolve,
+        invMassj = bj.invMassSolve;
+
+    fi.scale(invMassi,iMfi);
+    fj.scale(invMassj,iMfj);
+
+    bi.invInertiaWorldSolve.vmult(ti,invIi_vmult_taui);
+    bj.invInertiaWorldSolve.vmult(tj,invIj_vmult_tauj);
+
+    return GA.multiplyVectors(iMfi,invIi_vmult_taui) + GB.multiplyVectors(iMfj,invIj_vmult_tauj);
+};
+
+/**
+ * Computes G*inv(M)*G'
+ * @method computeGiMGt
+ * @return {Number}
+ */
+var tmp = new Vec3();
+Equation.prototype.computeGiMGt = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        invMassi = bi.invMassSolve,
+        invMassj = bj.invMassSolve,
+        invIi = bi.invInertiaWorldSolve,
+        invIj = bj.invInertiaWorldSolve,
+        result = invMassi + invMassj;
+
+    invIi.vmult(GA.rotational,tmp);
+    result += tmp.dot(GA.rotational);
+
+    invIj.vmult(GB.rotational,tmp);
+    result += tmp.dot(GB.rotational);
+
+    return  result;
+};
+
+var addToWlambda_temp = new Vec3(),
+    addToWlambda_Gi = new Vec3(),
+    addToWlambda_Gj = new Vec3(),
+    addToWlambda_ri = new Vec3(),
+    addToWlambda_rj = new Vec3(),
+    addToWlambda_Mdiag = new Vec3();
+
+/**
+ * Add constraint velocity to the bodies.
+ * @method addToWlambda
+ * @param {Number} deltalambda
+ */
+Equation.prototype.addToWlambda = function(deltalambda){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        temp = addToWlambda_temp;
+
+    // Add to linear velocity
+    // v_lambda += inv(M) * delta_lamba * G
+    bi.vlambda.addScaledVector(bi.invMassSolve * deltalambda, GA.spatial, bi.vlambda);
+    bj.vlambda.addScaledVector(bj.invMassSolve * deltalambda, GB.spatial, bj.vlambda);
+
+    // Add to angular velocity
+    bi.invInertiaWorldSolve.vmult(GA.rotational,temp);
+    bi.wlambda.addScaledVector(deltalambda, temp, bi.wlambda);
+
+    bj.invInertiaWorldSolve.vmult(GB.rotational,temp);
+    bj.wlambda.addScaledVector(deltalambda, temp, bj.wlambda);
+};
+
+/**
+ * Compute the denominator part of the SPOOK equation: C = G*inv(M)*G' + eps
+ * @method computeInvC
+ * @param  {Number} eps
+ * @return {Number}
+ */
+Equation.prototype.computeC = function(){
+    return this.computeGiMGt() + this.eps;
+};
+
+},{"../math/JacobianElement":42,"../math/Vec3":46}],37:[function(require,module,exports){
+module.exports = FrictionEquation;
+
+var Equation = require('./Equation');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+
+/**
+ * Constrains the slipping in a contact along a tangent
+ * @class FrictionEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g
+ * @extends Equation
+ */
+function FrictionEquation(bodyA, bodyB, slipForce){
+    Equation.call(this,bodyA, bodyB, -slipForce, slipForce);
+    this.ri = new Vec3();
+    this.rj = new Vec3();
+    this.t = new Vec3(); // tangent
+}
+
+FrictionEquation.prototype = new Equation();
+FrictionEquation.prototype.constructor = FrictionEquation;
+
+var FrictionEquation_computeB_temp1 = new Vec3();
+var FrictionEquation_computeB_temp2 = new Vec3();
+FrictionEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+        ri = this.ri,
+        rj = this.rj,
+        rixt = FrictionEquation_computeB_temp1,
+        rjxt = FrictionEquation_computeB_temp2,
+        t = this.t;
+
+    // Caluclate cross products
+    ri.cross(t,rixt);
+    rj.cross(t,rjxt);
+
+    // G = [-t -rixt t rjxt]
+    // And remember, this is a pure velocity constraint, g is always zero!
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+    t.negate(GA.spatial);
+    rixt.negate(GA.rotational);
+    GB.spatial.copy(t);
+    GB.rotational.copy(rjxt);
+
+    var GW = this.computeGW();
+    var GiMf = this.computeGiMf();
+
+    var B = - GW * b - h * GiMf;
+
+    return B;
+};
+
+},{"../math/Mat3":43,"../math/Vec3":46,"./Equation":36}],38:[function(require,module,exports){
+module.exports = RotationalEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Rotational constraint. Works to keep the local vectors orthogonal to each other in world space.
+ * @class RotationalEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Vec3} [options.axisA]
+ * @param {Vec3} [options.axisB]
+ * @param {number} [options.maxForce]
+ * @extends Equation
+ */
+function RotationalEquation(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);
+
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);
+
+    this.maxAngle = Math.PI / 2;
+}
+
+RotationalEquation.prototype = new Equation();
+RotationalEquation.prototype.constructor = RotationalEquation;
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+
+RotationalEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+
+        ni = this.axisA,
+        nj = this.axisB,
+
+        nixnj = tmpVec1,
+        njxni = tmpVec2,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // Caluclate cross products
+    ni.cross(nj, nixnj);
+    nj.cross(ni, njxni);
+
+    // g = ni * nj
+    // gdot = (nj x ni) * wi + (ni x nj) * wj
+    // G = [0 njxni 0 nixnj]
+    // W = [vi wi vj wj]
+    GA.rotational.copy(njxni);
+    GB.rotational.copy(nixnj);
+
+    var g = Math.cos(this.maxAngle) - ni.dot(nj),
+        GW = this.computeGW(),
+        GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h * GiMf;
+
+    return B;
+};
+
+
+},{"../math/Mat3":43,"../math/Vec3":46,"./Equation":36}],39:[function(require,module,exports){
+module.exports = RotationalMotorEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Rotational motor constraint. Tries to keep the relative angular velocity of the bodies to a given value.
+ * @class RotationalMotorEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} maxForce
+ * @extends Equation
+ */
+function RotationalMotorEquation(bodyA, bodyB, maxForce){
+    maxForce = typeof(maxForce)!=='undefined' ? maxForce : 1e6;
+    Equation.call(this,bodyA,bodyB,-maxForce,maxForce);
+
+    /**
+     * World oriented rotational axis
+     * @property {Vec3} axisA
+     */
+    this.axisA = new Vec3();
+
+    /**
+     * World oriented rotational axis
+     * @property {Vec3} axisB
+     */
+    this.axisB = new Vec3(); // World oriented rotational axis
+
+    /**
+     * Motor velocity
+     * @property {Number} targetVelocity
+     */
+    this.targetVelocity = 0;
+}
+
+RotationalMotorEquation.prototype = new Equation();
+RotationalMotorEquation.prototype.constructor = RotationalMotorEquation;
+
+RotationalMotorEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+
+        axisA = this.axisA,
+        axisB = this.axisB,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // g = 0
+    // gdot = axisA * wi - axisB * wj
+    // gdot = G * W = G * [vi wi vj wj]
+    // =>
+    // G = [0 axisA 0 -axisB]
+
+    GA.rotational.copy(axisA);
+    axisB.negate(GB.rotational);
+
+    var GW = this.computeGW() - this.targetVelocity,
+        GiMf = this.computeGiMf();
+
+    var B = - GW * b - h * GiMf;
+
+    return B;
+};
+
+},{"../math/Mat3":43,"../math/Vec3":46,"./Equation":36}],40:[function(require,module,exports){
+var Utils = require('../utils/Utils');
+
+module.exports = ContactMaterial;
+
+/**
+ * Defines what happens when two materials meet.
+ * @class ContactMaterial
+ * @constructor
+ * @param {Material} m1
+ * @param {Material} m2
+ * @param {object} [options]
+ * @param {Number} [options.friction=0.3]
+ * @param {Number} [options.restitution=0.3]
+ * @param {number} [options.contactEquationStiffness=1e7]
+ * @param {number} [options.contactEquationRelaxation=3]
+ * @param {number} [options.frictionEquationStiffness=1e7]
+ * @param {Number} [options.frictionEquationRelaxation=3]
+ */
+function ContactMaterial(m1, m2, options){
+    options = Utils.defaults(options, {
+        friction: 0.3,
+        restitution: 0.3,
+        contactEquationStiffness: 1e7,
+        contactEquationRelaxation: 3,
+        frictionEquationStiffness: 1e7,
+        frictionEquationRelaxation: 3
+    });
+
+    /**
+     * Identifier of this material
+     * @property {Number} id
+     */
+    this.id = ContactMaterial.idCounter++;
+
+    /**
+     * Participating materials
+     * @property {Array} materials
+     * @todo  Should be .materialA and .materialB instead
+     */
+    this.materials = [m1, m2];
+
+    /**
+     * Friction coefficient
+     * @property {Number} friction
+     */
+    this.friction = options.friction;
+
+    /**
+     * Restitution coefficient
+     * @property {Number} restitution
+     */
+    this.restitution = options.restitution;
+
+    /**
+     * Stiffness of the produced contact equations
+     * @property {Number} contactEquationStiffness
+     */
+    this.contactEquationStiffness = options.contactEquationStiffness;
+
+    /**
+     * Relaxation time of the produced contact equations
+     * @property {Number} contactEquationRelaxation
+     */
+    this.contactEquationRelaxation = options.contactEquationRelaxation;
+
+    /**
+     * Stiffness of the produced friction equations
+     * @property {Number} frictionEquationStiffness
+     */
+    this.frictionEquationStiffness = options.frictionEquationStiffness;
+
+    /**
+     * Relaxation time of the produced friction equations
+     * @property {Number} frictionEquationRelaxation
+     */
+    this.frictionEquationRelaxation = options.frictionEquationRelaxation;
+}
+
+ContactMaterial.idCounter = 0;
+
+},{"../utils/Utils":69}],41:[function(require,module,exports){
+module.exports = Material;
+
+/**
+ * Defines a physics material.
+ * @class Material
+ * @constructor
+ * @param {object} [options]
+ * @author schteppe
+ */
+function Material(options){
+    var name = '';
+    options = options || {};
+
+    // Backwards compatibility fix
+    if(typeof(options) === 'string'){
+        name = options;
+        options = {};
+    } else if(typeof(options) === 'object') {
+        name = '';
+    }
+
+    /**
+     * @property name
+     * @type {String}
+     */
+    this.name = name;
+
+    /**
+     * material id.
+     * @property id
+     * @type {number}
+     */
+    this.id = Material.idCounter++;
+
+    /**
+     * Friction for this material. If non-negative, it will be used instead of the friction given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.
+     * @property {number} friction
+     */
+    this.friction = typeof(options.friction) !== 'undefined' ? options.friction : -1;
+
+    /**
+     * Restitution for this material. If non-negative, it will be used instead of the restitution given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.
+     * @property {number} restitution
+     */
+    this.restitution = typeof(options.restitution) !== 'undefined' ? options.restitution : -1;
+}
+
+Material.idCounter = 0;
+
+},{}],42:[function(require,module,exports){
+module.exports = JacobianElement;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * An element containing 6 entries, 3 spatial and 3 rotational degrees of freedom.
+ * @class JacobianElement
+ * @constructor
+ */
+function JacobianElement(){
+
+    /**
+     * @property {Vec3} spatial
+     */
+    this.spatial = new Vec3();
+
+    /**
+     * @property {Vec3} rotational
+     */
+    this.rotational = new Vec3();
+}
+
+/**
+ * Multiply with other JacobianElement
+ * @method multiplyElement
+ * @param  {JacobianElement} element
+ * @return {Number}
+ */
+JacobianElement.prototype.multiplyElement = function(element){
+    return element.spatial.dot(this.spatial) + element.rotational.dot(this.rotational);
+};
+
+/**
+ * Multiply with two vectors
+ * @method multiplyVectors
+ * @param  {Vec3} spatial
+ * @param  {Vec3} rotational
+ * @return {Number}
+ */
+JacobianElement.prototype.multiplyVectors = function(spatial,rotational){
+    return spatial.dot(this.spatial) + rotational.dot(this.rotational);
+};
+
+},{"./Vec3":46}],43:[function(require,module,exports){
+module.exports = Mat3;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * A 3x3 matrix.
+ * @class Mat3
+ * @constructor
+ * @param array elements Array of nine elements. Optional.
+ * @author schteppe / http://github.com/schteppe
+ */
+function Mat3(elements){
+    /**
+     * A vector of length 9, containing all matrix elements
+     * @property {Array} elements
+     */
+    if(elements){
+        this.elements = elements;
+    } else {
+        this.elements = [0,0,0,0,0,0,0,0,0];
+    }
+}
+
+/**
+ * Sets the matrix to identity
+ * @method identity
+ * @todo Should perhaps be renamed to setIdentity() to be more clear.
+ * @todo Create another function that immediately creates an identity matrix eg. eye()
+ */
+Mat3.prototype.identity = function(){
+    var e = this.elements;
+    e[0] = 1;
+    e[1] = 0;
+    e[2] = 0;
+
+    e[3] = 0;
+    e[4] = 1;
+    e[5] = 0;
+
+    e[6] = 0;
+    e[7] = 0;
+    e[8] = 1;
+};
+
+/**
+ * Set all elements to zero
+ * @method setZero
+ */
+Mat3.prototype.setZero = function(){
+    var e = this.elements;
+    e[0] = 0;
+    e[1] = 0;
+    e[2] = 0;
+    e[3] = 0;
+    e[4] = 0;
+    e[5] = 0;
+    e[6] = 0;
+    e[7] = 0;
+    e[8] = 0;
+};
+
+/**
+ * Sets the matrix diagonal elements from a Vec3
+ * @method setTrace
+ * @param {Vec3} vec3
+ */
+Mat3.prototype.setTrace = function(vec3){
+    var e = this.elements;
+    e[0] = vec3.x;
+    e[4] = vec3.y;
+    e[8] = vec3.z;
+};
+
+/**
+ * Gets the matrix diagonal elements
+ * @method getTrace
+ * @return {Vec3}
+ */
+Mat3.prototype.getTrace = function(target){
+    var target = target || new Vec3();
+    var e = this.elements;
+    target.x = e[0];
+    target.y = e[4];
+    target.z = e[8];
+};
+
+/**
+ * Matrix-Vector multiplication
+ * @method vmult
+ * @param {Vec3} v The vector to multiply with
+ * @param {Vec3} target Optional, target to save the result in.
+ */
+Mat3.prototype.vmult = function(v,target){
+    target = target || new Vec3();
+
+    var e = this.elements,
+        x = v.x,
+        y = v.y,
+        z = v.z;
+    target.x = e[0]*x + e[1]*y + e[2]*z;
+    target.y = e[3]*x + e[4]*y + e[5]*z;
+    target.z = e[6]*x + e[7]*y + e[8]*z;
+
+    return target;
+};
+
+/**
+ * Matrix-scalar multiplication
+ * @method smult
+ * @param {Number} s
+ */
+Mat3.prototype.smult = function(s){
+    for(var i=0; i<this.elements.length; i++){
+        this.elements[i] *= s;
+    }
+};
+
+/**
+ * Matrix multiplication
+ * @method mmult
+ * @param {Mat3} m Matrix to multiply with from left side.
+ * @return {Mat3} The result.
+ */
+Mat3.prototype.mmult = function(m,target){
+    var r = target || new Mat3();
+    for(var i=0; i<3; i++){
+        for(var j=0; j<3; j++){
+            var sum = 0.0;
+            for(var k=0; k<3; k++){
+                sum += m.elements[i+k*3] * this.elements[k+j*3];
+            }
+            r.elements[i+j*3] = sum;
+        }
+    }
+    return r;
+};
+
+/**
+ * Scale each column of the matrix
+ * @method scale
+ * @param {Vec3} v
+ * @return {Mat3} The result.
+ */
+Mat3.prototype.scale = function(v,target){
+    target = target || new Mat3();
+    var e = this.elements,
+        t = target.elements;
+    for(var i=0; i!==3; i++){
+        t[3*i + 0] = v.x * e[3*i + 0];
+        t[3*i + 1] = v.y * e[3*i + 1];
+        t[3*i + 2] = v.z * e[3*i + 2];
+    }
+    return target;
+};
+
+/**
+ * Solve Ax=b
+ * @method solve
+ * @param {Vec3} b The right hand side
+ * @param {Vec3} target Optional. Target vector to save in.
+ * @return {Vec3} The solution x
+ * @todo should reuse arrays
+ */
+Mat3.prototype.solve = function(b,target){
+    target = target || new Vec3();
+
+    // Construct equations
+    var nr = 3; // num rows
+    var nc = 4; // num cols
+    var eqns = [];
+    for(var i=0; i<nr*nc; i++){
+        eqns.push(0);
+    }
+    var i,j;
+    for(i=0; i<3; i++){
+        for(j=0; j<3; j++){
+            eqns[i+nc*j] = this.elements[i+3*j];
+        }
+    }
+    eqns[3+4*0] = b.x;
+    eqns[3+4*1] = b.y;
+    eqns[3+4*2] = b.z;
+
+    // Compute right upper triangular version of the matrix - Gauss elimination
+    var n = 3, k = n, np;
+    var kp = 4; // num rows
+    var p, els;
+    do {
+        i = k - n;
+        if (eqns[i+nc*i] === 0) {
+            // the pivot is null, swap lines
+            for (j = i + 1; j < k; j++) {
+                if (eqns[i+nc*j] !== 0) {
+                    np = kp;
+                    do {  // do ligne( i ) = ligne( i ) + ligne( k )
+                        p = kp - np;
+                        eqns[p+nc*i] += eqns[p+nc*j];
+                    } while (--np);
+                    break;
+                }
+            }
+        }
+        if (eqns[i+nc*i] !== 0) {
+            for (j = i + 1; j < k; j++) {
+                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+                np = kp;
+                do {  // do ligne( k ) = ligne( k ) - multiplier * ligne( i )
+                    p = kp - np;
+                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+                } while (--np);
+            }
+        }
+    } while (--n);
+
+    // Get the solution
+    target.z = eqns[2*nc+3] / eqns[2*nc+2];
+    target.y = (eqns[1*nc+3] - eqns[1*nc+2]*target.z) / eqns[1*nc+1];
+    target.x = (eqns[0*nc+3] - eqns[0*nc+2]*target.z - eqns[0*nc+1]*target.y) / eqns[0*nc+0];
+
+    if(isNaN(target.x) || isNaN(target.y) || isNaN(target.z) || target.x===Infinity || target.y===Infinity || target.z===Infinity){
+        throw "Could not solve equation! Got x=["+target.toString()+"], b=["+b.toString()+"], A=["+this.toString()+"]";
+    }
+
+    return target;
+};
+
+/**
+ * Get an element in the matrix by index. Index starts at 0, not 1!!!
+ * @method e
+ * @param {Number} row
+ * @param {Number} column
+ * @param {Number} value Optional. If provided, the matrix element will be set to this value.
+ * @return {Number}
+ */
+Mat3.prototype.e = function( row , column ,value){
+    if(value===undefined){
+        return this.elements[column+3*row];
+    } else {
+        // Set value
+        this.elements[column+3*row] = value;
+    }
+};
+
+/**
+ * Copy another matrix into this matrix object.
+ * @method copy
+ * @param {Mat3} source
+ * @return {Mat3} this
+ */
+Mat3.prototype.copy = function(source){
+    for(var i=0; i < source.elements.length; i++){
+        this.elements[i] = source.elements[i];
+    }
+    return this;
+};
+
+/**
+ * Returns a string representation of the matrix.
+ * @method toString
+ * @return string
+ */
+Mat3.prototype.toString = function(){
+    var r = "";
+    var sep = ",";
+    for(var i=0; i<9; i++){
+        r += this.elements[i] + sep;
+    }
+    return r;
+};
+
+/**
+ * reverse the matrix
+ * @method reverse
+ * @param {Mat3} target Optional. Target matrix to save in.
+ * @return {Mat3} The solution x
+ */
+Mat3.prototype.reverse = function(target){
+
+    target = target || new Mat3();
+
+    // Construct equations
+    var nr = 3; // num rows
+    var nc = 6; // num cols
+    var eqns = [];
+    for(var i=0; i<nr*nc; i++){
+        eqns.push(0);
+    }
+    var i,j;
+    for(i=0; i<3; i++){
+        for(j=0; j<3; j++){
+            eqns[i+nc*j] = this.elements[i+3*j];
+        }
+    }
+    eqns[3+6*0] = 1;
+    eqns[3+6*1] = 0;
+    eqns[3+6*2] = 0;
+    eqns[4+6*0] = 0;
+    eqns[4+6*1] = 1;
+    eqns[4+6*2] = 0;
+    eqns[5+6*0] = 0;
+    eqns[5+6*1] = 0;
+    eqns[5+6*2] = 1;
+
+    // Compute right upper triangular version of the matrix - Gauss elimination
+    var n = 3, k = n, np;
+    var kp = nc; // num rows
+    var p;
+    do {
+        i = k - n;
+        if (eqns[i+nc*i] === 0) {
+            // the pivot is null, swap lines
+            for (j = i + 1; j < k; j++) {
+                if (eqns[i+nc*j] !== 0) {
+                    np = kp;
+                    do { // do line( i ) = line( i ) + line( k )
+                        p = kp - np;
+                        eqns[p+nc*i] += eqns[p+nc*j];
+                    } while (--np);
+                    break;
+                }
+            }
+        }
+        if (eqns[i+nc*i] !== 0) {
+            for (j = i + 1; j < k; j++) {
+                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+                np = kp;
+                do { // do line( k ) = line( k ) - multiplier * line( i )
+                    p = kp - np;
+                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+                } while (--np);
+            }
+        }
+    } while (--n);
+
+    // eliminate the upper left triangle of the matrix
+    i = 2;
+    do {
+        j = i-1;
+        do {
+            var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+            np = nc;
+            do {
+                p = nc - np;
+                eqns[p+nc*j] =  eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+            } while (--np);
+        } while (j--);
+    } while (--i);
+
+    // operations on the diagonal
+    i = 2;
+    do {
+        var multiplier = 1 / eqns[i+nc*i];
+        np = nc;
+        do {
+            p = nc - np;
+            eqns[p+nc*i] = eqns[p+nc*i] * multiplier ;
+        } while (--np);
+    } while (i--);
+
+    i = 2;
+    do {
+        j = 2;
+        do {
+            p = eqns[nr+j+nc*i];
+            if( isNaN( p ) || p ===Infinity ){
+                throw "Could not reverse! A=["+this.toString()+"]";
+            }
+            target.e( i , j , p );
+        } while (j--);
+    } while (i--);
+
+    return target;
+};
+
+/**
+ * Set the matrix from a quaterion
+ * @method setRotationFromQuaternion
+ * @param {Quaternion} q
+ */
+Mat3.prototype.setRotationFromQuaternion = function( q ) {
+    var x = q.x, y = q.y, z = q.z, w = q.w,
+        x2 = x + x, y2 = y + y, z2 = z + z,
+        xx = x * x2, xy = x * y2, xz = x * z2,
+        yy = y * y2, yz = y * z2, zz = z * z2,
+        wx = w * x2, wy = w * y2, wz = w * z2,
+        e = this.elements;
+
+    e[3*0 + 0] = 1 - ( yy + zz );
+    e[3*0 + 1] = xy - wz;
+    e[3*0 + 2] = xz + wy;
+
+    e[3*1 + 0] = xy + wz;
+    e[3*1 + 1] = 1 - ( xx + zz );
+    e[3*1 + 2] = yz - wx;
+
+    e[3*2 + 0] = xz - wy;
+    e[3*2 + 1] = yz + wx;
+    e[3*2 + 2] = 1 - ( xx + yy );
+
+    return this;
+};
+
+/**
+ * Transpose the matrix
+ * @method transpose
+ * @param  {Mat3} target Where to store the result.
+ * @return {Mat3} The target Mat3, or a new Mat3 if target was omitted.
+ */
+Mat3.prototype.transpose = function( target ) {
+    target = target || new Mat3();
+
+    var Mt = target.elements,
+        M = this.elements;
+
+    for(var i=0; i!==3; i++){
+        for(var j=0; j!==3; j++){
+            Mt[3*i + j] = M[3*j + i];
+        }
+    }
+
+    return target;
+};
+
+},{"./Vec3":46}],44:[function(require,module,exports){
+module.exports = Quaternion;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * A Quaternion describes a rotation in 3D space. The Quaternion is mathematically defined as Q = x*i + y*j + z*k + w, where (i,j,k) are imaginary basis vectors. (x,y,z) can be seen as a vector related to the axis of rotation, while the real multiplier, w, is related to the amount of rotation.
+ * @class Quaternion
+ * @constructor
+ * @param {Number} x Multiplier of the imaginary basis vector i.
+ * @param {Number} y Multiplier of the imaginary basis vector j.
+ * @param {Number} z Multiplier of the imaginary basis vector k.
+ * @param {Number} w Multiplier of the real part.
+ * @see http://en.wikipedia.org/wiki/Quaternion
+ */
+function Quaternion(x,y,z,w){
+    /**
+     * @property {Number} x
+     */
+    this.x = x!==undefined ? x : 0;
+
+    /**
+     * @property {Number} y
+     */
+    this.y = y!==undefined ? y : 0;
+
+    /**
+     * @property {Number} z
+     */
+    this.z = z!==undefined ? z : 0;
+
+    /**
+     * The multiplier of the real quaternion basis vector.
+     * @property {Number} w
+     */
+    this.w = w!==undefined ? w : 1;
+}
+
+/**
+ * Set the value of the quaternion.
+ * @method set
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @param {Number} w
+ */
+Quaternion.prototype.set = function(x,y,z,w){
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.w = w;
+    return this;
+};
+
+/**
+ * Convert to a readable format
+ * @method toString
+ * @return string
+ */
+Quaternion.prototype.toString = function(){
+    return this.x+","+this.y+","+this.z+","+this.w;
+};
+
+/**
+ * Convert to an Array
+ * @method toArray
+ * @return Array
+ */
+Quaternion.prototype.toArray = function(){
+    return [this.x, this.y, this.z, this.w];
+};
+
+/**
+ * Set the quaternion components given an axis and an angle.
+ * @method setFromAxisAngle
+ * @param {Vec3} axis
+ * @param {Number} angle in radians
+ */
+Quaternion.prototype.setFromAxisAngle = function(axis,angle){
+    var s = Math.sin(angle*0.5);
+    this.x = axis.x * s;
+    this.y = axis.y * s;
+    this.z = axis.z * s;
+    this.w = Math.cos(angle*0.5);
+    return this;
+};
+
+/**
+ * Converts the quaternion to axis/angle representation.
+ * @method toAxisAngle
+ * @param {Vec3} [targetAxis] A vector object to reuse for storing the axis.
+ * @return {Array} An array, first elemnt is the axis and the second is the angle in radians.
+ */
+Quaternion.prototype.toAxisAngle = function(targetAxis){
+    targetAxis = targetAxis || new Vec3();
+    this.normalize(); // if w>1 acos and sqrt will produce errors, this cant happen if quaternion is normalised
+    var angle = 2 * Math.acos(this.w);
+    var s = Math.sqrt(1-this.w*this.w); // assuming quaternion normalised then w is less than 1, so term always positive.
+    if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt
+        // if s close to zero then direction of axis not important
+        targetAxis.x = this.x; // if it is important that axis is normalised then replace with x=1; y=z=0;
+        targetAxis.y = this.y;
+        targetAxis.z = this.z;
+    } else {
+        targetAxis.x = this.x / s; // normalise axis
+        targetAxis.y = this.y / s;
+        targetAxis.z = this.z / s;
+    }
+    return [targetAxis,angle];
+};
+
+var sfv_t1 = new Vec3(),
+    sfv_t2 = new Vec3();
+
+/**
+ * Set the quaternion value given two vectors. The resulting rotation will be the needed rotation to rotate u to v.
+ * @method setFromVectors
+ * @param {Vec3} u
+ * @param {Vec3} v
+ */
+Quaternion.prototype.setFromVectors = function(u,v){
+    if(u.isAntiparallelTo(v)){
+        var t1 = sfv_t1;
+        var t2 = sfv_t2;
+
+        u.tangents(t1,t2);
+        this.setFromAxisAngle(t1,Math.PI);
+    } else {
+        var a = u.cross(v);
+        this.x = a.x;
+        this.y = a.y;
+        this.z = a.z;
+        this.w = Math.sqrt(Math.pow(u.norm(),2) * Math.pow(v.norm(),2)) + u.dot(v);
+        this.normalize();
+    }
+    return this;
+};
+
+/**
+ * Quaternion multiplication
+ * @method mult
+ * @param {Quaternion} q
+ * @param {Quaternion} target Optional.
+ * @return {Quaternion}
+ */
+var Quaternion_mult_va = new Vec3();
+var Quaternion_mult_vb = new Vec3();
+var Quaternion_mult_vaxvb = new Vec3();
+Quaternion.prototype.mult = function(q,target){
+    target = target || new Quaternion();
+
+    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
+        bx = q.x, by = q.y, bz = q.z, bw = q.w;
+
+    target.x = ax * bw + aw * bx + ay * bz - az * by;
+    target.y = ay * bw + aw * by + az * bx - ax * bz;
+    target.z = az * bw + aw * bz + ax * by - ay * bx;
+    target.w = aw * bw - ax * bx - ay * by - az * bz;
+
+    return target;
+};
+
+/**
+ * Get the inverse quaternion rotation.
+ * @method inverse
+ * @param {Quaternion} target
+ * @return {Quaternion}
+ */
+Quaternion.prototype.inverse = function(target){
+    var x = this.x, y = this.y, z = this.z, w = this.w;
+    target = target || new Quaternion();
+
+    this.conjugate(target);
+    var inorm2 = 1/(x*x + y*y + z*z + w*w);
+    target.x *= inorm2;
+    target.y *= inorm2;
+    target.z *= inorm2;
+    target.w *= inorm2;
+
+    return target;
+};
+
+/**
+ * Get the quaternion conjugate
+ * @method conjugate
+ * @param {Quaternion} target
+ * @return {Quaternion}
+ */
+Quaternion.prototype.conjugate = function(target){
+    target = target || new Quaternion();
+
+    target.x = -this.x;
+    target.y = -this.y;
+    target.z = -this.z;
+    target.w = this.w;
+
+    return target;
+};
+
+/**
+ * Normalize the quaternion. Note that this changes the values of the quaternion.
+ * @method normalize
+ */
+Quaternion.prototype.normalize = function(){
+    var l = Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);
+    if ( l === 0 ) {
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+        this.w = 0;
+    } else {
+        l = 1 / l;
+        this.x *= l;
+        this.y *= l;
+        this.z *= l;
+        this.w *= l;
+    }
+    return this;
+};
+
+/**
+ * Approximation of quaternion normalization. Works best when quat is already almost-normalized.
+ * @method normalizeFast
+ * @see http://jsperf.com/fast-quaternion-normalization
+ * @author unphased, https://github.com/unphased
+ */
+Quaternion.prototype.normalizeFast = function () {
+    var f = (3.0-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2.0;
+    if ( f === 0 ) {
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+        this.w = 0;
+    } else {
+        this.x *= f;
+        this.y *= f;
+        this.z *= f;
+        this.w *= f;
+    }
+    return this;
+};
+
+/**
+ * Multiply the quaternion by a vector
+ * @method vmult
+ * @param {Vec3} v
+ * @param {Vec3} target Optional
+ * @return {Vec3}
+ */
+Quaternion.prototype.vmult = function(v,target){
+    target = target || new Vec3();
+
+    var x = v.x,
+        y = v.y,
+        z = v.z;
+
+    var qx = this.x,
+        qy = this.y,
+        qz = this.z,
+        qw = this.w;
+
+    // q*v
+    var ix =  qw * x + qy * z - qz * y,
+    iy =  qw * y + qz * x - qx * z,
+    iz =  qw * z + qx * y - qy * x,
+    iw = -qx * x - qy * y - qz * z;
+
+    target.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
+    target.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
+    target.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+
+    return target;
+};
+
+/**
+ * Copies value of source to this quaternion.
+ * @method copy
+ * @param {Quaternion} source
+ * @return {Quaternion} this
+ */
+Quaternion.prototype.copy = function(source){
+    this.x = source.x;
+    this.y = source.y;
+    this.z = source.z;
+    this.w = source.w;
+    return this;
+};
+
+/**
+ * Convert the quaternion to euler angle representation. Order: YZX, as this page describes: http://www.euclideanspace.com/maths/standards/index.htm
+ * @method toEuler
+ * @param {Vec3} target
+ * @param string order Three-character string e.g. "YZX", which also is default.
+ */
+Quaternion.prototype.toEuler = function(target,order){
+    order = order || "YZX";
+
+    var heading, attitude, bank;
+    var x = this.x, y = this.y, z = this.z, w = this.w;
+
+    switch(order){
+    case "YZX":
+        var test = x*y + z*w;
+        if (test > 0.499) { // singularity at north pole
+            heading = 2 * Math.atan2(x,w);
+            attitude = Math.PI/2;
+            bank = 0;
+        }
+        if (test < -0.499) { // singularity at south pole
+            heading = -2 * Math.atan2(x,w);
+            attitude = - Math.PI/2;
+            bank = 0;
+        }
+        if(isNaN(heading)){
+            var sqx = x*x;
+            var sqy = y*y;
+            var sqz = z*z;
+            heading = Math.atan2(2*y*w - 2*x*z , 1 - 2*sqy - 2*sqz); // Heading
+            attitude = Math.asin(2*test); // attitude
+            bank = Math.atan2(2*x*w - 2*y*z , 1 - 2*sqx - 2*sqz); // bank
+        }
+        break;
+    default:
+        throw new Error("Euler order "+order+" not supported yet.");
+    }
+
+    target.y = heading;
+    target.z = attitude;
+    target.x = bank;
+};
+
+/**
+ * See http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
+ * @method setFromEuler
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @param {String} order The order to apply angles: 'XYZ' or 'YXZ' or any other combination
+ */
+Quaternion.prototype.setFromEuler = function ( x, y, z, order ) {
+    order = order || "XYZ";
+
+    var c1 = Math.cos( x / 2 );
+    var c2 = Math.cos( y / 2 );
+    var c3 = Math.cos( z / 2 );
+    var s1 = Math.sin( x / 2 );
+    var s2 = Math.sin( y / 2 );
+    var s3 = Math.sin( z / 2 );
+
+    if ( order === 'XYZ' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'YXZ' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    } else if ( order === 'ZXY' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'ZYX' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    } else if ( order === 'YZX' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'XZY' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    }
+
+    return this;
+};
+
+/**
+ * @method clone
+ * @return {Quaternion}
+ */
+Quaternion.prototype.clone = function(){
+    return new Quaternion(this.x, this.y, this.z, this.w);
+};
+
+/**
+ * Performs a spherical linear interpolation between two quat
+ *
+ * @method slerp
+ * @param {Quaternion} toQuat second operand
+ * @param {Number} t interpolation amount between the self quaternion and toQuat
+ * @param {Quaternion} [target] A quaternion to store the result in. If not provided, a new one will be created.
+ * @returns {Quaternion} The "target" object
+ */
+Quaternion.prototype.slerp = function (toQuat, t, target) {
+    target = target || new Quaternion();
+
+    var ax = this.x,
+        ay = this.y,
+        az = this.z,
+        aw = this.w,
+        bx = toQuat.x,
+        by = toQuat.y,
+        bz = toQuat.z,
+        bw = toQuat.w;
+
+    var omega, cosom, sinom, scale0, scale1;
+
+    // calc cosine
+    cosom = ax * bx + ay * by + az * bz + aw * bw;
+
+    // adjust signs (if necessary)
+    if ( cosom < 0.0 ) {
+        cosom = -cosom;
+        bx = - bx;
+        by = - by;
+        bz = - bz;
+        bw = - bw;
+    }
+
+    // calculate coefficients
+    if ( (1.0 - cosom) > 0.000001 ) {
+        // standard case (slerp)
+        omega  = Math.acos(cosom);
+        sinom  = Math.sin(omega);
+        scale0 = Math.sin((1.0 - t) * omega) / sinom;
+        scale1 = Math.sin(t * omega) / sinom;
+    } else {
+        // "from" and "to" quaternions are very close
+        //  ... so we can do a linear interpolation
+        scale0 = 1.0 - t;
+        scale1 = t;
+    }
+
+    // calculate final values
+    target.x = scale0 * ax + scale1 * bx;
+    target.y = scale0 * ay + scale1 * by;
+    target.z = scale0 * az + scale1 * bz;
+    target.w = scale0 * aw + scale1 * bw;
+
+    return target;
+};
+
+/**
+ * Rotate an absolute orientation quaternion given an angular velocity and a time step.
+ * @param  {Vec3} angularVelocity
+ * @param  {number} dt
+ * @param  {Vec3} angularFactor
+ * @param  {Quaternion} target
+ * @return {Quaternion} The "target" object
+ */
+Quaternion.prototype.integrate = function(angularVelocity, dt, angularFactor, target){
+    target = target || new Quaternion();
+
+    var ax = angularVelocity.x * angularFactor.x,
+        ay = angularVelocity.y * angularFactor.y,
+        az = angularVelocity.z * angularFactor.z,
+        bx = this.x,
+        by = this.y,
+        bz = this.z,
+        bw = this.w;
+
+    var half_dt = dt * 0.5;
+
+    target.x += half_dt * (ax * bw + ay * bz - az * by);
+    target.y += half_dt * (ay * bw + az * bx - ax * bz);
+    target.z += half_dt * (az * bw + ax * by - ay * bx);
+    target.w += half_dt * (- ax * bx - ay * by - az * bz);
+
+    return target;
+};
+},{"./Vec3":46}],45:[function(require,module,exports){
+var Vec3 = require('./Vec3');
+var Quaternion = require('./Quaternion');
+
+module.exports = Transform;
+
+/**
+ * @class Transform
+ * @constructor
+ */
+function Transform(options) {
+    options = options || {};
+
+	/**
+	 * @property {Vec3} position
+	 */
+	this.position = new Vec3();
+    if(options.position){
+        this.position.copy(options.position);
+    }
+
+	/**
+	 * @property {Quaternion} quaternion
+	 */
+	this.quaternion = new Quaternion();
+    if(options.quaternion){
+        this.quaternion.copy(options.quaternion);
+    }
+}
+
+var tmpQuat = new Quaternion();
+
+/**
+ * @static
+ * @method pointToLocaFrame
+ * @param {Vec3} position
+ * @param {Quaternion} quaternion
+ * @param {Vec3} worldPoint
+ * @param {Vec3} result
+ */
+Transform.pointToLocalFrame = function(position, quaternion, worldPoint, result){
+    var result = result || new Vec3();
+    worldPoint.vsub(position, result);
+    quaternion.conjugate(tmpQuat);
+    tmpQuat.vmult(result, result);
+    return result;
+};
+
+/**
+ * Get a global point in local transform coordinates.
+ * @method pointToLocal
+ * @param  {Vec3} point
+ * @param  {Vec3} result
+ * @return {Vec3} The "result" vector object
+ */
+Transform.prototype.pointToLocal = function(worldPoint, result){
+    return Transform.pointToLocalFrame(this.position, this.quaternion, worldPoint, result);
+};
+
+/**
+ * @static
+ * @method pointToWorldFrame
+ * @param {Vec3} position
+ * @param {Vec3} quaternion
+ * @param {Vec3} localPoint
+ * @param {Vec3} result
+ */
+Transform.pointToWorldFrame = function(position, quaternion, localPoint, result){
+    var result = result || new Vec3();
+    quaternion.vmult(localPoint, result);
+    result.vadd(position, result);
+    return result;
+};
+
+/**
+ * Get a local point in global transform coordinates.
+ * @method pointToWorld
+ * @param  {Vec3} point
+ * @param  {Vec3} result
+ * @return {Vec3} The "result" vector object
+ */
+Transform.prototype.pointToWorld = function(localPoint, result){
+    return Transform.pointToWorldFrame(this.position, this.quaternion, localPoint, result);
+};
+
+
+Transform.prototype.vectorToWorldFrame = function(localVector, result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localVector, result);
+    return result;
+};
+
+Transform.vectorToWorldFrame = function(quaternion, localVector, result){
+    quaternion.vmult(localVector, result);
+    return result;
+};
+
+Transform.vectorToLocalFrame = function(position, quaternion, worldVector, result){
+    var result = result || new Vec3();
+    quaternion.w *= -1;
+    quaternion.vmult(worldVector, result);
+    quaternion.w *= -1;
+    return result;
+};
+
+},{"./Quaternion":44,"./Vec3":46}],46:[function(require,module,exports){
+module.exports = Vec3;
+
+var Mat3 = require('./Mat3');
+
+/**
+ * 3-dimensional vector
+ * @class Vec3
+ * @constructor
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @author schteppe
+ * @example
+ *     var v = new Vec3(1, 2, 3);
+ *     console.log('x=' + v.x); // x=1
+ */
+function Vec3(x,y,z){
+    /**
+     * @property x
+     * @type {Number}
+     */
+    this.x = x||0.0;
+
+    /**
+     * @property y
+     * @type {Number}
+     */
+    this.y = y||0.0;
+
+    /**
+     * @property z
+     * @type {Number}
+     */
+    this.z = z||0.0;
+}
+
+/**
+ * @static
+ * @property {Vec3} ZERO
+ */
+Vec3.ZERO = new Vec3(0, 0, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_X
+ */
+Vec3.UNIT_X = new Vec3(1, 0, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_Y
+ */
+Vec3.UNIT_Y = new Vec3(0, 1, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_Z
+ */
+Vec3.UNIT_Z = new Vec3(0, 0, 1);
+
+/**
+ * Vector cross product
+ * @method cross
+ * @param {Vec3} v
+ * @param {Vec3} target Optional. Target to save in.
+ * @return {Vec3}
+ */
+Vec3.prototype.cross = function(v,target){
+    var vx=v.x, vy=v.y, vz=v.z, x=this.x, y=this.y, z=this.z;
+    target = target || new Vec3();
+
+    target.x = (y * vz) - (z * vy);
+    target.y = (z * vx) - (x * vz);
+    target.z = (x * vy) - (y * vx);
+
+    return target;
+};
+
+/**
+ * Set the vectors' 3 elements
+ * @method set
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @return Vec3
+ */
+Vec3.prototype.set = function(x,y,z){
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    return this;
+};
+
+/**
+ * Set all components of the vector to zero.
+ * @method setZero
+ */
+Vec3.prototype.setZero = function(){
+    this.x = this.y = this.z = 0;
+};
+
+/**
+ * Vector addition
+ * @method vadd
+ * @param {Vec3} v
+ * @param {Vec3} target Optional.
+ * @return {Vec3}
+ */
+Vec3.prototype.vadd = function(v,target){
+    if(target){
+        target.x = v.x + this.x;
+        target.y = v.y + this.y;
+        target.z = v.z + this.z;
+    } else {
+        return new Vec3(this.x + v.x,
+                               this.y + v.y,
+                               this.z + v.z);
+    }
+};
+
+/**
+ * Vector subtraction
+ * @method vsub
+ * @param {Vec3} v
+ * @param {Vec3} target Optional. Target to save in.
+ * @return {Vec3}
+ */
+Vec3.prototype.vsub = function(v,target){
+    if(target){
+        target.x = this.x - v.x;
+        target.y = this.y - v.y;
+        target.z = this.z - v.z;
+    } else {
+        return new Vec3(this.x-v.x,
+                               this.y-v.y,
+                               this.z-v.z);
+    }
+};
+
+/**
+ * Get the cross product matrix a_cross from a vector, such that a x b = a_cross * b = c
+ * @method crossmat
+ * @see http://www8.cs.umu.se/kurser/TDBD24/VT06/lectures/Lecture6.pdf
+ * @return {Mat3}
+ */
+Vec3.prototype.crossmat = function(){
+    return new Mat3([     0,  -this.z,   this.y,
+                            this.z,        0,  -this.x,
+                           -this.y,   this.x,        0]);
+};
+
+/**
+ * Normalize the vector. Note that this changes the values in the vector.
+ * @method normalize
+ * @return {Number} Returns the norm of the vector
+ */
+Vec3.prototype.normalize = function(){
+    var x=this.x, y=this.y, z=this.z;
+    var n = Math.sqrt(x*x + y*y + z*z);
+    if(n>0.0){
+        var invN = 1/n;
+        this.x *= invN;
+        this.y *= invN;
+        this.z *= invN;
+    } else {
+        // Make something up
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+    }
+    return n;
+};
+
+/**
+ * Get the version of this vector that is of length 1.
+ * @method unit
+ * @param {Vec3} target Optional target to save in
+ * @return {Vec3} Returns the unit vector
+ */
+Vec3.prototype.unit = function(target){
+    target = target || new Vec3();
+    var x=this.x, y=this.y, z=this.z;
+    var ninv = Math.sqrt(x*x + y*y + z*z);
+    if(ninv>0.0){
+        ninv = 1.0/ninv;
+        target.x = x * ninv;
+        target.y = y * ninv;
+        target.z = z * ninv;
+    } else {
+        target.x = 1;
+        target.y = 0;
+        target.z = 0;
+    }
+    return target;
+};
+
+/**
+ * Get the length of the vector
+ * @method norm
+ * @return {Number}
+ * @deprecated Use .length() instead
+ */
+Vec3.prototype.norm = function(){
+    var x=this.x, y=this.y, z=this.z;
+    return Math.sqrt(x*x + y*y + z*z);
+};
+
+/**
+ * Get the length of the vector
+ * @method length
+ * @return {Number}
+ */
+Vec3.prototype.length = Vec3.prototype.norm;
+
+/**
+ * Get the squared length of the vector
+ * @method norm2
+ * @return {Number}
+ * @deprecated Use .lengthSquared() instead.
+ */
+Vec3.prototype.norm2 = function(){
+    return this.dot(this);
+};
+
+/**
+ * Get the squared length of the vector.
+ * @method lengthSquared
+ * @return {Number}
+ */
+Vec3.prototype.lengthSquared = Vec3.prototype.norm2;
+
+/**
+ * Get distance from this point to another point
+ * @method distanceTo
+ * @param  {Vec3} p
+ * @return {Number}
+ */
+Vec3.prototype.distanceTo = function(p){
+    var x=this.x, y=this.y, z=this.z;
+    var px=p.x, py=p.y, pz=p.z;
+    return Math.sqrt((px-x)*(px-x)+
+                     (py-y)*(py-y)+
+                     (pz-z)*(pz-z));
+};
+
+/**
+ * Get squared distance from this point to another point
+ * @method distanceSquared
+ * @param  {Vec3} p
+ * @return {Number}
+ */
+Vec3.prototype.distanceSquared = function(p){
+    var x=this.x, y=this.y, z=this.z;
+    var px=p.x, py=p.y, pz=p.z;
+    return (px-x)*(px-x) + (py-y)*(py-y) + (pz-z)*(pz-z);
+};
+
+/**
+ * Multiply all the components of the vector with a scalar.
+ * @deprecated Use .scale instead
+ * @method mult
+ * @param {Number} scalar
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ * @deprecated Use .scale() instead
+ */
+Vec3.prototype.mult = function(scalar,target){
+    target = target || new Vec3();
+    var x = this.x,
+        y = this.y,
+        z = this.z;
+    target.x = scalar * x;
+    target.y = scalar * y;
+    target.z = scalar * z;
+    return target;
+};
+
+/**
+ * Multiply the vector with an other vector, component-wise.
+ * @method mult
+ * @param {Number} vector
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ */
+Vec3.prototype.vmul = function(vector, target){
+    target = target || new Vec3();
+    target.x = vector.x * this.x;
+    target.y = vector.y * this.y;
+    target.z = vector.z * this.z;
+    return target;
+};
+
+/**
+ * Multiply the vector with a scalar.
+ * @method scale
+ * @param {Number} scalar
+ * @param {Vec3} target
+ * @return {Vec3}
+ */
+Vec3.prototype.scale = Vec3.prototype.mult;
+
+/**
+ * Scale a vector and add it to this vector. Save the result in "target". (target = this + vector * scalar)
+ * @method addScaledVector
+ * @param {Number} scalar
+ * @param {Vec3} vector
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ */
+Vec3.prototype.addScaledVector = function(scalar, vector, target){
+    target = target || new Vec3();
+    target.x = this.x + scalar * vector.x;
+    target.y = this.y + scalar * vector.y;
+    target.z = this.z + scalar * vector.z;
+    return target;
+};
+
+/**
+ * Calculate dot product
+ * @method dot
+ * @param {Vec3} v
+ * @return {Number}
+ */
+Vec3.prototype.dot = function(v){
+    return this.x * v.x + this.y * v.y + this.z * v.z;
+};
+
+/**
+ * @method isZero
+ * @return bool
+ */
+Vec3.prototype.isZero = function(){
+    return this.x===0 && this.y===0 && this.z===0;
+};
+
+/**
+ * Make the vector point in the opposite direction.
+ * @method negate
+ * @param {Vec3} target Optional target to save in
+ * @return {Vec3}
+ */
+Vec3.prototype.negate = function(target){
+    target = target || new Vec3();
+    target.x = -this.x;
+    target.y = -this.y;
+    target.z = -this.z;
+    return target;
+};
+
+/**
+ * Compute two artificial tangents to the vector
+ * @method tangents
+ * @param {Vec3} t1 Vector object to save the first tangent in
+ * @param {Vec3} t2 Vector object to save the second tangent in
+ */
+var Vec3_tangents_n = new Vec3();
+var Vec3_tangents_randVec = new Vec3();
+Vec3.prototype.tangents = function(t1,t2){
+    var norm = this.norm();
+    if(norm>0.0){
+        var n = Vec3_tangents_n;
+        var inorm = 1/norm;
+        n.set(this.x*inorm,this.y*inorm,this.z*inorm);
+        var randVec = Vec3_tangents_randVec;
+        if(Math.abs(n.x) < 0.9){
+            randVec.set(1,0,0);
+            n.cross(randVec,t1);
+        } else {
+            randVec.set(0,1,0);
+            n.cross(randVec,t1);
+        }
+        n.cross(t1,t2);
+    } else {
+        // The normal length is zero, make something up
+        t1.set(1, 0, 0);
+        t2.set(0, 1, 0);
+    }
+};
+
+/**
+ * Converts to a more readable format
+ * @method toString
+ * @return string
+ */
+Vec3.prototype.toString = function(){
+    return this.x+","+this.y+","+this.z;
+};
+
+/**
+ * Converts to an array
+ * @method toArray
+ * @return Array
+ */
+Vec3.prototype.toArray = function(){
+    return [this.x, this.y, this.z];
+};
+
+/**
+ * Copies value of source to this vector.
+ * @method copy
+ * @param {Vec3} source
+ * @return {Vec3} this
+ */
+Vec3.prototype.copy = function(source){
+    this.x = source.x;
+    this.y = source.y;
+    this.z = source.z;
+    return this;
+};
+
+
+/**
+ * Do a linear interpolation between two vectors
+ * @method lerp
+ * @param {Vec3} v
+ * @param {Number} t A number between 0 and 1. 0 will make this function return u, and 1 will make it return v. Numbers in between will generate a vector in between them.
+ * @param {Vec3} target
+ */
+Vec3.prototype.lerp = function(v,t,target){
+    var x=this.x, y=this.y, z=this.z;
+    target.x = x + (v.x-x)*t;
+    target.y = y + (v.y-y)*t;
+    target.z = z + (v.z-z)*t;
+};
+
+/**
+ * Check if a vector equals is almost equal to another one.
+ * @method almostEquals
+ * @param {Vec3} v
+ * @param {Number} precision
+ * @return bool
+ */
+Vec3.prototype.almostEquals = function(v,precision){
+    if(precision===undefined){
+        precision = 1e-6;
+    }
+    if( Math.abs(this.x-v.x)>precision ||
+        Math.abs(this.y-v.y)>precision ||
+        Math.abs(this.z-v.z)>precision){
+        return false;
+    }
+    return true;
+};
+
+/**
+ * Check if a vector is almost zero
+ * @method almostZero
+ * @param {Number} precision
+ */
+Vec3.prototype.almostZero = function(precision){
+    if(precision===undefined){
+        precision = 1e-6;
+    }
+    if( Math.abs(this.x)>precision ||
+        Math.abs(this.y)>precision ||
+        Math.abs(this.z)>precision){
+        return false;
+    }
+    return true;
+};
+
+var antip_neg = new Vec3();
+
+/**
+ * Check if the vector is anti-parallel to another vector.
+ * @method isAntiparallelTo
+ * @param  {Vec3}  v
+ * @param  {Number}  precision Set to zero for exact comparisons
+ * @return {Boolean}
+ */
+Vec3.prototype.isAntiparallelTo = function(v,precision){
+    this.negate(antip_neg);
+    return antip_neg.almostEquals(v,precision);
+};
+
+/**
+ * Clone the vector
+ * @method clone
+ * @return {Vec3}
+ */
+Vec3.prototype.clone = function(){
+    return new Vec3(this.x, this.y, this.z);
+};
+},{"./Mat3":43}],47:[function(require,module,exports){
+module.exports = Body;
+
+var EventTarget = require('../utils/EventTarget');
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Quaternion = require('../math/Quaternion');
+var Material = require('../material/Material');
+var AABB = require('../collision/AABB');
+var Box = require('../shapes/Box');
+
+/**
+ * Base class for all body types.
+ * @class Body
+ * @constructor
+ * @extends EventTarget
+ * @param {object} [options]
+ * @param {Vec3} [options.position]
+ * @param {Vec3} [options.velocity]
+ * @param {Vec3} [options.angularVelocity]
+ * @param {Quaternion} [options.quaternion]
+ * @param {number} [options.mass]
+ * @param {Material} [options.material]
+ * @param {number} [options.type]
+ * @param {number} [options.linearDamping=0.01]
+ * @param {number} [options.angularDamping=0.01]
+ * @param {boolean} [options.allowSleep=true]
+ * @param {number} [options.sleepSpeedLimit=0.1]
+ * @param {number} [options.sleepTimeLimit=1]
+ * @param {number} [options.collisionFilterGroup=1]
+ * @param {number} [options.collisionFilterMask=1]
+ * @param {boolean} [options.fixedRotation=false]
+ * @param {Vec3} [options.linearFactor]
+ * @param {Vec3} [options.angularFactor]
+ * @param {Shape} [options.shape]
+ * @example
+ *     var body = new Body({
+ *         mass: 1
+ *     });
+ *     var shape = new Sphere(1);
+ *     body.addShape(shape);
+ *     world.addBody(body);
+ */
+function Body(options){
+    options = options || {};
+
+    EventTarget.apply(this);
+
+    this.id = Body.idCounter++;
+
+    /**
+     * Reference to the world the body is living in
+     * @property world
+     * @type {World}
+     */
+    this.world = null;
+
+    /**
+     * Callback function that is used BEFORE stepping the system. Use it to apply forces, for example. Inside the function, "this" will refer to this Body object.
+     * @property preStep
+     * @type {Function}
+     * @deprecated Use World events instead
+     */
+    this.preStep = null;
+
+    /**
+     * Callback function that is used AFTER stepping the system. Inside the function, "this" will refer to this Body object.
+     * @property postStep
+     * @type {Function}
+     * @deprecated Use World events instead
+     */
+    this.postStep = null;
+
+    this.vlambda = new Vec3();
+
+    /**
+     * @property {Number} collisionFilterGroup
+     */
+    this.collisionFilterGroup = typeof(options.collisionFilterGroup) === 'number' ? options.collisionFilterGroup : 1;
+
+    /**
+     * @property {Number} collisionFilterMask
+     */
+    this.collisionFilterMask = typeof(options.collisionFilterMask) === 'number' ? options.collisionFilterMask : 1;
+
+    /**
+     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.
+     * @property {Number} collisionResponse
+     */
+	this.collisionResponse = true;
+
+    /**
+     * @property position
+     * @type {Vec3}
+     */
+    this.position = new Vec3();
+
+    /**
+     * @property {Vec3} previousPosition
+     */
+    this.previousPosition = new Vec3();
+
+    /**
+     * Interpolated position of the body.
+     * @property {Vec3} interpolatedPosition
+     */
+    this.interpolatedPosition = new Vec3();
+
+    /**
+     * Initial position of the body
+     * @property initPosition
+     * @type {Vec3}
+     */
+    this.initPosition = new Vec3();
+
+    if(options.position){
+        this.position.copy(options.position);
+        this.previousPosition.copy(options.position);
+        this.interpolatedPosition.copy(options.position);
+        this.initPosition.copy(options.position);
+    }
+
+    /**
+     * @property velocity
+     * @type {Vec3}
+     */
+    this.velocity = new Vec3();
+
+    if(options.velocity){
+        this.velocity.copy(options.velocity);
+    }
+
+    /**
+     * @property initVelocity
+     * @type {Vec3}
+     */
+    this.initVelocity = new Vec3();
+
+    /**
+     * Linear force on the body
+     * @property force
+     * @type {Vec3}
+     */
+    this.force = new Vec3();
+
+    var mass = typeof(options.mass) === 'number' ? options.mass : 0;
+
+    /**
+     * @property mass
+     * @type {Number}
+     * @default 0
+     */
+    this.mass = mass;
+
+    /**
+     * @property invMass
+     * @type {Number}
+     */
+    this.invMass = mass > 0 ? 1.0 / mass : 0;
+
+    /**
+     * @property material
+     * @type {Material}
+     */
+    this.material = options.material || null;
+
+    /**
+     * @property linearDamping
+     * @type {Number}
+     */
+    this.linearDamping = typeof(options.linearDamping) === 'number' ? options.linearDamping : 0.01;
+
+    /**
+     * One of: Body.DYNAMIC, Body.STATIC and Body.KINEMATIC.
+     * @property type
+     * @type {Number}
+     */
+    this.type = (mass <= 0.0 ? Body.STATIC : Body.DYNAMIC);
+    if(typeof(options.type) === typeof(Body.STATIC)){
+        this.type = options.type;
+    }
+
+    /**
+     * If true, the body will automatically fall to sleep.
+     * @property allowSleep
+     * @type {Boolean}
+     * @default true
+     */
+    this.allowSleep = typeof(options.allowSleep) !== 'undefined' ? options.allowSleep : true;
+
+    /**
+     * Current sleep state.
+     * @property sleepState
+     * @type {Number}
+     */
+    this.sleepState = 0;
+
+    /**
+     * If the speed (the norm of the velocity) is smaller than this value, the body is considered sleepy.
+     * @property sleepSpeedLimit
+     * @type {Number}
+     * @default 0.1
+     */
+    this.sleepSpeedLimit = typeof(options.sleepSpeedLimit) !== 'undefined' ? options.sleepSpeedLimit : 0.1;
+
+    /**
+     * If the body has been sleepy for this sleepTimeLimit seconds, it is considered sleeping.
+     * @property sleepTimeLimit
+     * @type {Number}
+     * @default 1
+     */
+    this.sleepTimeLimit = typeof(options.sleepTimeLimit) !== 'undefined' ? options.sleepTimeLimit : 1;
+
+    this.timeLastSleepy = 0;
+
+    this._wakeUpAfterNarrowphase = false;
+
+
+    /**
+     * Rotational force on the body, around center of mass
+     * @property {Vec3} torque
+     */
+    this.torque = new Vec3();
+
+    /**
+     * Orientation of the body
+     * @property quaternion
+     * @type {Quaternion}
+     */
+    this.quaternion = new Quaternion();
+
+    /**
+     * @property initQuaternion
+     * @type {Quaternion}
+     */
+    this.initQuaternion = new Quaternion();
+
+    /**
+     * @property {Quaternion} previousQuaternion
+     */
+    this.previousQuaternion = new Quaternion();
+
+    /**
+     * Interpolated orientation of the body.
+     * @property {Quaternion} interpolatedQuaternion
+     */
+    this.interpolatedQuaternion = new Quaternion();
+
+    if(options.quaternion){
+        this.quaternion.copy(options.quaternion);
+        this.initQuaternion.copy(options.quaternion);
+        this.previousQuaternion.copy(options.quaternion);
+        this.interpolatedQuaternion.copy(options.quaternion);
+    }
+
+    /**
+     * @property angularVelocity
+     * @type {Vec3}
+     */
+    this.angularVelocity = new Vec3();
+
+    if(options.angularVelocity){
+        this.angularVelocity.copy(options.angularVelocity);
+    }
+
+    /**
+     * @property initAngularVelocity
+     * @type {Vec3}
+     */
+    this.initAngularVelocity = new Vec3();
+
+    /**
+     * @property shapes
+     * @type {array}
+     */
+    this.shapes = [];
+
+    /**
+     * @property shapeOffsets
+     * @type {array}
+     */
+    this.shapeOffsets = [];
+
+    /**
+     * @property shapeOrientations
+     * @type {array}
+     */
+    this.shapeOrientations = [];
+
+    /**
+     * @property inertia
+     * @type {Vec3}
+     */
+    this.inertia = new Vec3();
+
+    /**
+     * @property {Vec3} invInertia
+     */
+    this.invInertia = new Vec3();
+
+    /**
+     * @property {Mat3} invInertiaWorld
+     */
+    this.invInertiaWorld = new Mat3();
+
+    this.invMassSolve = 0;
+
+    /**
+     * @property {Vec3} invInertiaSolve
+     */
+    this.invInertiaSolve = new Vec3();
+
+    /**
+     * @property {Mat3} invInertiaWorldSolve
+     */
+    this.invInertiaWorldSolve = new Mat3();
+
+    /**
+     * Set to true if you don't want the body to rotate. Make sure to run .updateMassProperties() after changing this.
+     * @property {Boolean} fixedRotation
+     * @default false
+     */
+    this.fixedRotation = typeof(options.fixedRotation) !== "undefined" ? options.fixedRotation : false;
+
+    /**
+     * @property {Number} angularDamping
+     */
+    this.angularDamping = typeof(options.angularDamping) !== 'undefined' ? options.angularDamping : 0.01;
+
+    /**
+     * @property {Vec3} linearFactor
+     */
+    this.linearFactor = new Vec3(1,1,1);
+    if(options.linearFactor){
+        this.linearFactor.copy(options.linearFactor);
+    }
+
+    /**
+     * @property {Vec3} angularFactor
+     */
+    this.angularFactor = new Vec3(1,1,1);
+    if(options.angularFactor){
+        this.angularFactor.copy(options.angularFactor);
+    }
+
+    /**
+     * @property aabb
+     * @type {AABB}
+     */
+    this.aabb = new AABB();
+
+    /**
+     * Indicates if the AABB needs to be updated before use.
+     * @property aabbNeedsUpdate
+     * @type {Boolean}
+     */
+    this.aabbNeedsUpdate = true;
+
+    this.wlambda = new Vec3();
+
+    if(options.shape){
+        this.addShape(options.shape);
+    }
+
+    this.updateMassProperties();
+}
+Body.prototype = new EventTarget();
+Body.prototype.constructor = Body;
+
+/**
+ * Dispatched after two bodies collide. This event is dispatched on each
+ * of the two bodies involved in the collision.
+ * @event collide
+ * @param {Body} body The body that was involved in the collision.
+ * @param {ContactEquation} contact The details of the collision.
+ */
+Body.COLLIDE_EVENT_NAME = "collide";
+
+/**
+ * A dynamic body is fully simulated. Can be moved manually by the user, but normally they move according to forces. A dynamic body can collide with all body types. A dynamic body always has finite, non-zero mass.
+ * @static
+ * @property DYNAMIC
+ * @type {Number}
+ */
+Body.DYNAMIC = 1;
+
+/**
+ * A static body does not move during simulation and behaves as if it has infinite mass. Static bodies can be moved manually by setting the position of the body. The velocity of a static body is always zero. Static bodies do not collide with other static or kinematic bodies.
+ * @static
+ * @property STATIC
+ * @type {Number}
+ */
+Body.STATIC = 2;
+
+/**
+ * A kinematic body moves under simulation according to its velocity. They do not respond to forces. They can be moved manually, but normally a kinematic body is moved by setting its velocity. A kinematic body behaves as if it has infinite mass. Kinematic bodies do not collide with other static or kinematic bodies.
+ * @static
+ * @property KINEMATIC
+ * @type {Number}
+ */
+Body.KINEMATIC = 4;
+
+
+
+/**
+ * @static
+ * @property AWAKE
+ * @type {number}
+ */
+Body.AWAKE = 0;
+
+/**
+ * @static
+ * @property SLEEPY
+ * @type {number}
+ */
+Body.SLEEPY = 1;
+
+/**
+ * @static
+ * @property SLEEPING
+ * @type {number}
+ */
+Body.SLEEPING = 2;
+
+Body.idCounter = 0;
+
+/**
+ * Dispatched after a sleeping body has woken up.
+ * @event wakeup
+ */
+Body.wakeupEvent = {
+    type: "wakeup"
+};
+
+/**
+ * Wake the body up.
+ * @method wakeUp
+ */
+Body.prototype.wakeUp = function(){
+    var s = this.sleepState;
+    this.sleepState = 0;
+    this._wakeUpAfterNarrowphase = false;
+    if(s === Body.SLEEPING){
+        this.dispatchEvent(Body.wakeupEvent);
+    }
+};
+
+/**
+ * Force body sleep
+ * @method sleep
+ */
+Body.prototype.sleep = function(){
+    this.sleepState = Body.SLEEPING;
+    this.velocity.set(0,0,0);
+    this.angularVelocity.set(0,0,0);
+    this._wakeUpAfterNarrowphase = false;
+};
+
+/**
+ * Dispatched after a body has gone in to the sleepy state.
+ * @event sleepy
+ */
+Body.sleepyEvent = {
+    type: "sleepy"
+};
+
+/**
+ * Dispatched after a body has fallen asleep.
+ * @event sleep
+ */
+Body.sleepEvent = {
+    type: "sleep"
+};
+
+/**
+ * Called every timestep to update internal sleep timer and change sleep state if needed.
+ * @method sleepTick
+ * @param {Number} time The world time in seconds
+ */
+Body.prototype.sleepTick = function(time){
+    if(this.allowSleep){
+        var sleepState = this.sleepState;
+        var speedSquared = this.velocity.norm2() + this.angularVelocity.norm2();
+        var speedLimitSquared = Math.pow(this.sleepSpeedLimit,2);
+        if(sleepState===Body.AWAKE && speedSquared < speedLimitSquared){
+            this.sleepState = Body.SLEEPY; // Sleepy
+            this.timeLastSleepy = time;
+            this.dispatchEvent(Body.sleepyEvent);
+        } else if(sleepState===Body.SLEEPY && speedSquared > speedLimitSquared){
+            this.wakeUp(); // Wake up
+        } else if(sleepState===Body.SLEEPY && (time - this.timeLastSleepy ) > this.sleepTimeLimit){
+            this.sleep(); // Sleeping
+            this.dispatchEvent(Body.sleepEvent);
+        }
+    }
+};
+
+/**
+ * If the body is sleeping, it should be immovable / have infinite mass during solve. We solve it by having a separate "solve mass".
+ * @method updateSolveMassProperties
+ */
+Body.prototype.updateSolveMassProperties = function(){
+    if(this.sleepState === Body.SLEEPING || this.type === Body.KINEMATIC){
+        this.invMassSolve = 0;
+        this.invInertiaSolve.setZero();
+        this.invInertiaWorldSolve.setZero();
+    } else {
+        this.invMassSolve = this.invMass;
+        this.invInertiaSolve.copy(this.invInertia);
+        this.invInertiaWorldSolve.copy(this.invInertiaWorld);
+    }
+};
+
+/**
+ * Convert a world point to local body frame.
+ * @method pointToLocalFrame
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.pointToLocalFrame = function(worldPoint,result){
+    var result = result || new Vec3();
+    worldPoint.vsub(this.position,result);
+    this.quaternion.conjugate().vmult(result,result);
+    return result;
+};
+
+/**
+ * Convert a world vector to local body frame.
+ * @method vectorToLocalFrame
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.vectorToLocalFrame = function(worldVector, result){
+    var result = result || new Vec3();
+    this.quaternion.conjugate().vmult(worldVector,result);
+    return result;
+};
+
+/**
+ * Convert a local body point to world frame.
+ * @method pointToWorldFrame
+ * @param  {Vec3} localPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.pointToWorldFrame = function(localPoint,result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localPoint,result);
+    result.vadd(this.position,result);
+    return result;
+};
+
+/**
+ * Convert a local body point to world frame.
+ * @method vectorToWorldFrame
+ * @param  {Vec3} localVector
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.vectorToWorldFrame = function(localVector, result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localVector, result);
+    return result;
+};
+
+var tmpVec = new Vec3();
+var tmpQuat = new Quaternion();
+
+/**
+ * Add a shape to the body with a local offset and orientation.
+ * @method addShape
+ * @param {Shape} shape
+ * @param {Vec3} [_offset]
+ * @param {Quaternion} [_orientation]
+ * @return {Body} The body object, for chainability.
+ */
+Body.prototype.addShape = function(shape, _offset, _orientation){
+    var offset = new Vec3();
+    var orientation = new Quaternion();
+
+    if(_offset){
+        offset.copy(_offset);
+    }
+    if(_orientation){
+        orientation.copy(_orientation);
+    }
+
+    this.shapes.push(shape);
+    this.shapeOffsets.push(offset);
+    this.shapeOrientations.push(orientation);
+    this.updateMassProperties();
+    this.updateBoundingRadius();
+
+    this.aabbNeedsUpdate = true;
+
+    shape.body = this;
+
+    return this;
+};
+
+/**
+ * Update the bounding radius of the body. Should be done if any of the shapes are changed.
+ * @method updateBoundingRadius
+ */
+Body.prototype.updateBoundingRadius = function(){
+    var shapes = this.shapes,
+        shapeOffsets = this.shapeOffsets,
+        N = shapes.length,
+        radius = 0;
+
+    for(var i=0; i!==N; i++){
+        var shape = shapes[i];
+        shape.updateBoundingSphereRadius();
+        var offset = shapeOffsets[i].norm(),
+            r = shape.boundingSphereRadius;
+        if(offset + r > radius){
+            radius = offset + r;
+        }
+    }
+
+    this.boundingRadius = radius;
+};
+
+var computeAABB_shapeAABB = new AABB();
+
+/**
+ * Updates the .aabb
+ * @method computeAABB
+ * @todo rename to updateAABB()
+ */
+Body.prototype.computeAABB = function(){
+    var shapes = this.shapes,
+        shapeOffsets = this.shapeOffsets,
+        shapeOrientations = this.shapeOrientations,
+        N = shapes.length,
+        offset = tmpVec,
+        orientation = tmpQuat,
+        bodyQuat = this.quaternion,
+        aabb = this.aabb,
+        shapeAABB = computeAABB_shapeAABB;
+
+    for(var i=0; i!==N; i++){
+        var shape = shapes[i];
+
+        // Get shape world position
+        bodyQuat.vmult(shapeOffsets[i], offset);
+        offset.vadd(this.position, offset);
+
+        // Get shape world quaternion
+        shapeOrientations[i].mult(bodyQuat, orientation);
+
+        // Get shape AABB
+        shape.calculateWorldAABB(offset, orientation, shapeAABB.lowerBound, shapeAABB.upperBound);
+
+        if(i === 0){
+            aabb.copy(shapeAABB);
+        } else {
+            aabb.extend(shapeAABB);
+        }
+    }
+
+    this.aabbNeedsUpdate = false;
+};
+
+var uiw_m1 = new Mat3(),
+    uiw_m2 = new Mat3(),
+    uiw_m3 = new Mat3();
+
+/**
+ * Update .inertiaWorld and .invInertiaWorld
+ * @method updateInertiaWorld
+ */
+Body.prototype.updateInertiaWorld = function(force){
+    var I = this.invInertia;
+    if (I.x === I.y && I.y === I.z && !force) {
+        // If inertia M = s*I, where I is identity and s a scalar, then
+        //    R*M*R' = R*(s*I)*R' = s*R*I*R' = s*R*R' = s*I = M
+        // where R is the rotation matrix.
+        // In other words, we don't have to transform the inertia if all
+        // inertia diagonal entries are equal.
+    } else {
+        var m1 = uiw_m1,
+            m2 = uiw_m2,
+            m3 = uiw_m3;
+        m1.setRotationFromQuaternion(this.quaternion);
+        m1.transpose(m2);
+        m1.scale(I,m1);
+        m1.mmult(m2,this.invInertiaWorld);
+    }
+};
+
+/**
+ * Apply force to a world point. This could for example be a point on the Body surface. Applying force this way will add to Body.force and Body.torque.
+ * @method applyForce
+ * @param  {Vec3} force The amount of force to add.
+ * @param  {Vec3} relativePoint A point relative to the center of mass to apply the force on.
+ */
+var Body_applyForce_r = new Vec3();
+var Body_applyForce_rotForce = new Vec3();
+Body.prototype.applyForce = function(force,relativePoint){
+    if(this.type !== Body.DYNAMIC){ // Needed?
+        return;
+    }
+
+    // Compute produced rotational force
+    var rotForce = Body_applyForce_rotForce;
+    relativePoint.cross(force,rotForce);
+
+    // Add linear force
+    this.force.vadd(force,this.force);
+
+    // Add rotational force
+    this.torque.vadd(rotForce,this.torque);
+};
+
+/**
+ * Apply force to a local point in the body.
+ * @method applyLocalForce
+ * @param  {Vec3} force The force vector to apply, defined locally in the body frame.
+ * @param  {Vec3} localPoint A local point in the body to apply the force on.
+ */
+var Body_applyLocalForce_worldForce = new Vec3();
+var Body_applyLocalForce_relativePointWorld = new Vec3();
+Body.prototype.applyLocalForce = function(localForce, localPoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    var worldForce = Body_applyLocalForce_worldForce;
+    var relativePointWorld = Body_applyLocalForce_relativePointWorld;
+
+    // Transform the force vector to world space
+    this.vectorToWorldFrame(localForce, worldForce);
+    this.vectorToWorldFrame(localPoint, relativePointWorld);
+
+    this.applyForce(worldForce, relativePointWorld);
+};
+
+/**
+ * Apply impulse to a world point. This could for example be a point on the Body surface. An impulse is a force added to a body during a short period of time (impulse = force * time). Impulses will be added to Body.velocity and Body.angularVelocity.
+ * @method applyImpulse
+ * @param  {Vec3} impulse The amount of impulse to add.
+ * @param  {Vec3} relativePoint A point relative to the center of mass to apply the force on.
+ */
+var Body_applyImpulse_r = new Vec3();
+var Body_applyImpulse_velo = new Vec3();
+var Body_applyImpulse_rotVelo = new Vec3();
+Body.prototype.applyImpulse = function(impulse, relativePoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    // Compute point position relative to the body center
+    var r = relativePoint;
+
+    // Compute produced central impulse velocity
+    var velo = Body_applyImpulse_velo;
+    velo.copy(impulse);
+    velo.mult(this.invMass,velo);
+
+    // Add linear impulse
+    this.velocity.vadd(velo, this.velocity);
+
+    // Compute produced rotational impulse velocity
+    var rotVelo = Body_applyImpulse_rotVelo;
+    r.cross(impulse,rotVelo);
+
+    /*
+    rotVelo.x *= this.invInertia.x;
+    rotVelo.y *= this.invInertia.y;
+    rotVelo.z *= this.invInertia.z;
+    */
+    this.invInertiaWorld.vmult(rotVelo,rotVelo);
+
+    // Add rotational Impulse
+    this.angularVelocity.vadd(rotVelo, this.angularVelocity);
+};
+
+/**
+ * Apply locally-defined impulse to a local point in the body.
+ * @method applyLocalImpulse
+ * @param  {Vec3} force The force vector to apply, defined locally in the body frame.
+ * @param  {Vec3} localPoint A local point in the body to apply the force on.
+ */
+var Body_applyLocalImpulse_worldImpulse = new Vec3();
+var Body_applyLocalImpulse_relativePoint = new Vec3();
+Body.prototype.applyLocalImpulse = function(localImpulse, localPoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    var worldImpulse = Body_applyLocalImpulse_worldImpulse;
+    var relativePointWorld = Body_applyLocalImpulse_relativePoint;
+
+    // Transform the force vector to world space
+    this.vectorToWorldFrame(localImpulse, worldImpulse);
+    this.vectorToWorldFrame(localPoint, relativePointWorld);
+
+    this.applyImpulse(worldImpulse, relativePointWorld);
+};
+
+var Body_updateMassProperties_halfExtents = new Vec3();
+
+/**
+ * Should be called whenever you change the body shape or mass.
+ * @method updateMassProperties
+ */
+Body.prototype.updateMassProperties = function(){
+    var halfExtents = Body_updateMassProperties_halfExtents;
+
+    this.invMass = this.mass > 0 ? 1.0 / this.mass : 0;
+    var I = this.inertia;
+    var fixed = this.fixedRotation;
+
+    // Approximate with AABB box
+    this.computeAABB();
+    halfExtents.set(
+        (this.aabb.upperBound.x-this.aabb.lowerBound.x) / 2,
+        (this.aabb.upperBound.y-this.aabb.lowerBound.y) / 2,
+        (this.aabb.upperBound.z-this.aabb.lowerBound.z) / 2
+    );
+    Box.calculateInertia(halfExtents, this.mass, I);
+
+    this.invInertia.set(
+        I.x > 0 && !fixed ? 1.0 / I.x : 0,
+        I.y > 0 && !fixed ? 1.0 / I.y : 0,
+        I.z > 0 && !fixed ? 1.0 / I.z : 0
+    );
+    this.updateInertiaWorld(true);
+};
+
+/**
+ * Get world velocity of a point in the body.
+ * @method getVelocityAtWorldPoint
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3} The result vector.
+ */
+Body.prototype.getVelocityAtWorldPoint = function(worldPoint, result){
+    var r = new Vec3();
+    worldPoint.vsub(this.position, r);
+    this.angularVelocity.cross(r, result);
+    this.velocity.vadd(result, result);
+    return result;
+};
+
+var torque = new Vec3();
+var invI_tau_dt = new Vec3();
+var w = new Quaternion();
+var wq = new Quaternion();
+
+/**
+ * Move the body forward in time.
+ * @param {number} dt Time step
+ * @param {boolean} quatNormalize Set to true to normalize the body quaternion
+ * @param {boolean} quatNormalizeFast If the quaternion should be normalized using "fast" quaternion normalization
+ */
+Body.prototype.integrate = function(dt, quatNormalize, quatNormalizeFast){
+
+    // Save previous position
+    this.previousPosition.copy(this.position);
+    this.previousQuaternion.copy(this.quaternion);
+
+    if(!(this.type === Body.DYNAMIC || this.type === Body.KINEMATIC) || this.sleepState === Body.SLEEPING){ // Only for dynamic
+        return;
+    }
+
+    var velo = this.velocity,
+        angularVelo = this.angularVelocity,
+        pos = this.position,
+        force = this.force,
+        torque = this.torque,
+        quat = this.quaternion,
+        invMass = this.invMass,
+        invInertia = this.invInertiaWorld,
+        linearFactor = this.linearFactor;
+
+    var iMdt = invMass * dt;
+    velo.x += force.x * iMdt * linearFactor.x;
+    velo.y += force.y * iMdt * linearFactor.y;
+    velo.z += force.z * iMdt * linearFactor.z;
+
+    var e = invInertia.elements;
+    var angularFactor = this.angularFactor;
+    var tx = torque.x * angularFactor.x;
+    var ty = torque.y * angularFactor.y;
+    var tz = torque.z * angularFactor.z;
+    angularVelo.x += dt * (e[0] * tx + e[1] * ty + e[2] * tz);
+    angularVelo.y += dt * (e[3] * tx + e[4] * ty + e[5] * tz);
+    angularVelo.z += dt * (e[6] * tx + e[7] * ty + e[8] * tz);
+
+    // Use new velocity  - leap frog
+    pos.x += velo.x * dt;
+    pos.y += velo.y * dt;
+    pos.z += velo.z * dt;
+
+    quat.integrate(this.angularVelocity, dt, this.angularFactor, quat);
+
+    if(quatNormalize){
+        if(quatNormalizeFast){
+            quat.normalizeFast();
+        } else {
+            quat.normalize();
+        }
+    }
+
+    this.aabbNeedsUpdate = true;
+
+    // Update world inertia
+    this.updateInertiaWorld();
+};
+
+},{"../collision/AABB":18,"../material/Material":41,"../math/Mat3":43,"../math/Quaternion":44,"../math/Vec3":46,"../shapes/Box":53,"../shapes/Shape":59,"../utils/EventTarget":65}],48:[function(require,module,exports){
+var Body = require('./Body');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var RaycastResult = require('../collision/RaycastResult');
+var Ray = require('../collision/Ray');
+var WheelInfo = require('../objects/WheelInfo');
+
+module.exports = RaycastVehicle;
+
+/**
+ * Vehicle helper class that casts rays from the wheel positions towards the ground and applies forces.
+ * @class RaycastVehicle
+ * @constructor
+ * @param {object} [options]
+ * @param {Body} [options.chassisBody] The car chassis body.
+ * @param {integer} [options.indexRightAxis] Axis to use for right. x=0, y=1, z=2
+ * @param {integer} [options.indexLeftAxis]
+ * @param {integer} [options.indexUpAxis]
+ */
+function RaycastVehicle(options){
+
+    /**
+     * @property {Body} chassisBody
+     */
+    this.chassisBody = options.chassisBody;
+
+    /**
+     * An array of WheelInfo objects.
+     * @property {array} wheelInfos
+     */
+    this.wheelInfos = [];
+
+    /**
+     * Will be set to true if the car is sliding.
+     * @property {boolean} sliding
+     */
+    this.sliding = false;
+
+    /**
+     * @property {World} world
+     */
+    this.world = null;
+
+    /**
+     * Index of the right axis, 0=x, 1=y, 2=z
+     * @property {integer} indexRightAxis
+     * @default 1
+     */
+    this.indexRightAxis = typeof(options.indexRightAxis) !== 'undefined' ? options.indexRightAxis : 1;
+
+    /**
+     * Index of the forward axis, 0=x, 1=y, 2=z
+     * @property {integer} indexForwardAxis
+     * @default 0
+     */
+    this.indexForwardAxis = typeof(options.indexForwardAxis) !== 'undefined' ? options.indexForwardAxis : 0;
+
+    /**
+     * Index of the up axis, 0=x, 1=y, 2=z
+     * @property {integer} indexUpAxis
+     * @default 2
+     */
+    this.indexUpAxis = typeof(options.indexUpAxis) !== 'undefined' ? options.indexUpAxis : 2;
+}
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+var tmpVec3 = new Vec3();
+var tmpVec4 = new Vec3();
+var tmpVec5 = new Vec3();
+var tmpVec6 = new Vec3();
+var tmpRay = new Ray();
+
+/**
+ * Add a wheel. For information about the options, see WheelInfo.
+ * @method addWheel
+ * @param {object} [options]
+ */
+RaycastVehicle.prototype.addWheel = function(options){
+    options = options || {};
+
+    var info = new WheelInfo(options);
+    var index = this.wheelInfos.length;
+    this.wheelInfos.push(info);
+
+    return index;
+};
+
+/**
+ * Set the steering value of a wheel.
+ * @method setSteeringValue
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RaycastVehicle.prototype.setSteeringValue = function(value, wheelIndex){
+    var wheel = this.wheelInfos[wheelIndex];
+    wheel.steering = value;
+};
+
+var torque = new Vec3();
+
+/**
+ * Set the wheel force to apply on one of the wheels each time step
+ * @method applyEngineForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RaycastVehicle.prototype.applyEngineForce = function(value, wheelIndex){
+    this.wheelInfos[wheelIndex].engineForce = value;
+};
+
+/**
+ * Set the braking force of a wheel
+ * @method setBrake
+ * @param {number} brake
+ * @param {integer} wheelIndex
+ */
+RaycastVehicle.prototype.setBrake = function(brake, wheelIndex){
+    this.wheelInfos[wheelIndex].brake = brake;
+};
+
+/**
+ * Add the vehicle including its constraints to the world.
+ * @method addToWorld
+ * @param {World} world
+ */
+RaycastVehicle.prototype.addToWorld = function(world){
+    var constraints = this.constraints;
+    world.addBody(this.chassisBody);
+    var that = this;
+    this.preStepCallback = function(){
+        that.updateVehicle(world.dt);
+    };
+    world.addEventListener('preStep', this.preStepCallback);
+    this.world = world;
+};
+
+/**
+ * Get one of the wheel axles, world-oriented.
+ * @private
+ * @method getVehicleAxisWorld
+ * @param  {integer} axisIndex
+ * @param  {Vec3} result
+ */
+RaycastVehicle.prototype.getVehicleAxisWorld = function(axisIndex, result){
+    result.set(
+        axisIndex === 0 ? 1 : 0,
+        axisIndex === 1 ? 1 : 0,
+        axisIndex === 2 ? 1 : 0
+    );
+    this.chassisBody.vectorToWorldFrame(result, result);
+};
+
+RaycastVehicle.prototype.updateVehicle = function(timeStep){
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+    var chassisBody = this.chassisBody;
+
+    for (var i = 0; i < numWheels; i++) {
+        this.updateWheelTransform(i);
+    }
+
+    this.currentVehicleSpeedKmHour = 3.6 * chassisBody.velocity.norm();
+
+    var forwardWorld = new Vec3();
+    this.getVehicleAxisWorld(this.indexForwardAxis, forwardWorld);
+
+    if (forwardWorld.dot(chassisBody.velocity) < 0){
+        this.currentVehicleSpeedKmHour *= -1;
+    }
+
+    // simulate suspension
+    for (var i = 0; i < numWheels; i++) {
+        this.castRay(wheelInfos[i]);
+    }
+
+    this.updateSuspension(timeStep);
+
+    var impulse = new Vec3();
+    var relpos = new Vec3();
+    for (var i = 0; i < numWheels; i++) {
+        //apply suspension force
+        var wheel = wheelInfos[i];
+        var suspensionForce = wheel.suspensionForce;
+        if (suspensionForce > wheel.maxSuspensionForce) {
+            suspensionForce = wheel.maxSuspensionForce;
+        }
+        wheel.raycastResult.hitNormalWorld.scale(suspensionForce * timeStep, impulse);
+
+        wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, relpos);
+        chassisBody.applyImpulse(impulse, relpos);
+    }
+
+    this.updateFriction(timeStep);
+
+    var hitNormalWorldScaledWithProj = new Vec3();
+    var fwd  = new Vec3();
+    var vel = new Vec3();
+    for (i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+        //var relpos = new Vec3();
+        //wheel.chassisConnectionPointWorld.vsub(chassisBody.position, relpos);
+        chassisBody.getVelocityAtWorldPoint(wheel.chassisConnectionPointWorld, vel);
+
+        // Hack to get the rotation in the correct direction
+        var m = 1;
+        switch(this.indexUpAxis){
+        case 1:
+            m = -1;
+            break;
+        }
+
+        if (wheel.isInContact) {
+
+            this.getVehicleAxisWorld(this.indexForwardAxis, fwd);
+            var proj = fwd.dot(wheel.raycastResult.hitNormalWorld);
+            wheel.raycastResult.hitNormalWorld.scale(proj, hitNormalWorldScaledWithProj);
+
+            fwd.vsub(hitNormalWorldScaledWithProj, fwd);
+
+            var proj2 = fwd.dot(vel);
+            wheel.deltaRotation = m * proj2 * timeStep / wheel.radius;
+        }
+
+        if((wheel.sliding || !wheel.isInContact) && wheel.engineForce !== 0 && wheel.useCustomSlidingRotationalSpeed){
+            // Apply custom rotation when accelerating and sliding
+            wheel.deltaRotation = (wheel.engineForce > 0 ? 1 : -1) * wheel.customSlidingRotationalSpeed * timeStep;
+        }
+
+        // Lock wheels
+        if(Math.abs(wheel.brake) > Math.abs(wheel.engineForce)){
+            wheel.deltaRotation = 0;
+        }
+
+        wheel.rotation += wheel.deltaRotation; // Use the old value
+        wheel.deltaRotation *= 0.99; // damping of rotation when not in contact
+    }
+};
+
+RaycastVehicle.prototype.updateSuspension = function(deltaTime) {
+    var chassisBody = this.chassisBody;
+    var chassisMass = chassisBody.mass;
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+
+    for (var w_it = 0; w_it < numWheels; w_it++){
+        var wheel = wheelInfos[w_it];
+
+        if (wheel.isInContact){
+            var force;
+
+            // Spring
+            var susp_length = wheel.suspensionRestLength;
+            var current_length = wheel.suspensionLength;
+            var length_diff = (susp_length - current_length);
+
+            force = wheel.suspensionStiffness * length_diff * wheel.clippedInvContactDotSuspension;
+
+            // Damper
+            var projected_rel_vel = wheel.suspensionRelativeVelocity;
+            var susp_damping;
+            if (projected_rel_vel < 0) {
+                susp_damping = wheel.dampingCompression;
+            } else {
+                susp_damping = wheel.dampingRelaxation;
+            }
+            force -= susp_damping * projected_rel_vel;
+
+            wheel.suspensionForce = force * chassisMass;
+            if (wheel.suspensionForce < 0) {
+                wheel.suspensionForce = 0;
+            }
+        } else {
+            wheel.suspensionForce = 0;
+        }
+    }
+};
+
+/**
+ * Remove the vehicle including its constraints from the world.
+ * @method removeFromWorld
+ * @param {World} world
+ */
+RaycastVehicle.prototype.removeFromWorld = function(world){
+    var constraints = this.constraints;
+    world.remove(this.chassisBody);
+    world.removeEventListener('preStep', this.preStepCallback);
+    this.world = null;
+};
+
+var castRay_rayvector = new Vec3();
+var castRay_target = new Vec3();
+RaycastVehicle.prototype.castRay = function(wheel) {
+    var rayvector = castRay_rayvector;
+    var target = castRay_target;
+
+    this.updateWheelTransformWorld(wheel);
+    var chassisBody = this.chassisBody;
+
+    var depth = -1;
+
+    var raylen = wheel.suspensionRestLength + wheel.radius;
+
+    wheel.directionWorld.scale(raylen, rayvector);
+    var source = wheel.chassisConnectionPointWorld;
+    source.vadd(rayvector, target);
+    var raycastResult = wheel.raycastResult;
+
+    var param = 0;
+
+    raycastResult.reset();
+    // Turn off ray collision with the chassis temporarily
+    var oldState = chassisBody.collisionResponse;
+    chassisBody.collisionResponse = false;
+
+    // Cast ray against world
+    this.world.rayTest(source, target, raycastResult);
+    chassisBody.collisionResponse = oldState;
+
+    var object = raycastResult.body;
+
+    wheel.raycastResult.groundObject = 0;
+
+    if (object) {
+        depth = raycastResult.distance;
+        wheel.raycastResult.hitNormalWorld  = raycastResult.hitNormalWorld;
+        wheel.isInContact = true;
+
+        var hitDistance = raycastResult.distance;
+        wheel.suspensionLength = hitDistance - wheel.radius;
+
+        // clamp on max suspension travel
+        var minSuspensionLength = wheel.suspensionRestLength - wheel.maxSuspensionTravel;
+        var maxSuspensionLength = wheel.suspensionRestLength + wheel.maxSuspensionTravel;
+        if (wheel.suspensionLength < minSuspensionLength) {
+            wheel.suspensionLength = minSuspensionLength;
+        }
+        if (wheel.suspensionLength > maxSuspensionLength) {
+            wheel.suspensionLength = maxSuspensionLength;
+            wheel.raycastResult.reset();
+        }
+
+        var denominator = wheel.raycastResult.hitNormalWorld.dot(wheel.directionWorld);
+
+        var chassis_velocity_at_contactPoint = new Vec3();
+        chassisBody.getVelocityAtWorldPoint(wheel.raycastResult.hitPointWorld, chassis_velocity_at_contactPoint);
+
+        var projVel = wheel.raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );
+
+        if (denominator >= -0.1) {
+            wheel.suspensionRelativeVelocity = 0;
+            wheel.clippedInvContactDotSuspension = 1 / 0.1;
+        } else {
+            var inv = -1 / denominator;
+            wheel.suspensionRelativeVelocity = projVel * inv;
+            wheel.clippedInvContactDotSuspension = inv;
+        }
+
+    } else {
+
+        //put wheel info as in rest position
+        wheel.suspensionLength = wheel.suspensionRestLength + 0 * wheel.maxSuspensionTravel;
+        wheel.suspensionRelativeVelocity = 0.0;
+        wheel.directionWorld.scale(-1, wheel.raycastResult.hitNormalWorld);
+        wheel.clippedInvContactDotSuspension = 1.0;
+    }
+
+    return depth;
+};
+
+RaycastVehicle.prototype.updateWheelTransformWorld = function(wheel){
+    wheel.isInContact = false;
+    var chassisBody = this.chassisBody;
+    chassisBody.pointToWorldFrame(wheel.chassisConnectionPointLocal, wheel.chassisConnectionPointWorld);
+    chassisBody.vectorToWorldFrame(wheel.directionLocal, wheel.directionWorld);
+    chassisBody.vectorToWorldFrame(wheel.axleLocal, wheel.axleWorld);
+};
+
+
+/**
+ * Update one of the wheel transform.
+ * Note when rendering wheels: during each step, wheel transforms are updated BEFORE the chassis; ie. their position becomes invalid after the step. Thus when you render wheels, you must update wheel transforms before rendering them. See raycastVehicle demo for an example.
+ * @method updateWheelTransform
+ * @param {integer} wheelIndex The wheel index to update.
+ */
+RaycastVehicle.prototype.updateWheelTransform = function(wheelIndex){
+    var up = tmpVec4;
+    var right = tmpVec5;
+    var fwd = tmpVec6;
+
+    var wheel = this.wheelInfos[wheelIndex];
+    this.updateWheelTransformWorld(wheel);
+
+    wheel.directionLocal.scale(-1, up);
+    right.copy(wheel.axleLocal);
+    up.cross(right, fwd);
+    fwd.normalize();
+    right.normalize();
+
+    // Rotate around steering over the wheelAxle
+    var steering = wheel.steering;
+    var steeringOrn = new Quaternion();
+    steeringOrn.setFromAxisAngle(up, steering);
+
+    var rotatingOrn = new Quaternion();
+    rotatingOrn.setFromAxisAngle(right, wheel.rotation);
+
+    // World rotation of the wheel
+    var q = wheel.worldTransform.quaternion;
+    this.chassisBody.quaternion.mult(steeringOrn, q);
+    q.mult(rotatingOrn, q);
+
+    q.normalize();
+
+    // world position of the wheel
+    var p = wheel.worldTransform.position;
+    p.copy(wheel.directionWorld);
+    p.scale(wheel.suspensionLength, p);
+    p.vadd(wheel.chassisConnectionPointWorld, p);
+};
+
+var directions = [
+    new Vec3(1, 0, 0),
+    new Vec3(0, 1, 0),
+    new Vec3(0, 0, 1)
+];
+
+/**
+ * Get the world transform of one of the wheels
+ * @method getWheelTransformWorld
+ * @param  {integer} wheelIndex
+ * @return {Transform}
+ */
+RaycastVehicle.prototype.getWheelTransformWorld = function(wheelIndex) {
+    return this.wheelInfos[wheelIndex].worldTransform;
+};
+
+
+var updateFriction_surfNormalWS_scaled_proj = new Vec3();
+var updateFriction_axle = [];
+var updateFriction_forwardWS = [];
+var sideFrictionStiffness2 = 1;
+RaycastVehicle.prototype.updateFriction = function(timeStep) {
+    var surfNormalWS_scaled_proj = updateFriction_surfNormalWS_scaled_proj;
+
+    //calculate the impulse, so that the wheels don't move sidewards
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+    var chassisBody = this.chassisBody;
+    var forwardWS = updateFriction_forwardWS;
+    var axle = updateFriction_axle;
+
+    var numWheelsOnGround = 0;
+
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+
+        var groundObject = wheel.raycastResult.body;
+        if (groundObject){
+            numWheelsOnGround++;
+        }
+
+        wheel.sideImpulse = 0;
+        wheel.forwardImpulse = 0;
+        if(!forwardWS[i]){
+            forwardWS[i] = new Vec3();
+        }
+        if(!axle[i]){
+            axle[i] = new Vec3();
+        }
+    }
+
+    for (var i = 0; i < numWheels; i++){
+        var wheel = wheelInfos[i];
+
+        var groundObject = wheel.raycastResult.body;
+
+        if (groundObject) {
+            var axlei = axle[i];
+            var wheelTrans = this.getWheelTransformWorld(i);
+
+            // Get world axle
+            wheelTrans.vectorToWorldFrame(directions[this.indexRightAxis], axlei);
+
+            var surfNormalWS = wheel.raycastResult.hitNormalWorld;
+            var proj = axlei.dot(surfNormalWS);
+            surfNormalWS.scale(proj, surfNormalWS_scaled_proj);
+            axlei.vsub(surfNormalWS_scaled_proj, axlei);
+            axlei.normalize();
+
+            surfNormalWS.cross(axlei, forwardWS[i]);
+            forwardWS[i].normalize();
+
+            wheel.sideImpulse = resolveSingleBilateral(
+                chassisBody,
+                wheel.raycastResult.hitPointWorld,
+                groundObject,
+                wheel.raycastResult.hitPointWorld,
+                axlei
+            );
+
+            wheel.sideImpulse *= sideFrictionStiffness2;
+        }
+    }
+
+    var sideFactor = 1;
+    var fwdFactor = 0.5;
+
+    this.sliding = false;
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+        var groundObject = wheel.raycastResult.body;
+
+        var rollingFriction = 0;
+
+        wheel.slipInfo = 1;
+        if (groundObject) {
+            var defaultRollingFrictionImpulse = 0;
+            var maxImpulse = wheel.brake ? wheel.brake : defaultRollingFrictionImpulse;
+
+            // btWheelContactPoint contactPt(chassisBody,groundObject,wheelInfraycastInfo.hitPointWorld,forwardWS[wheel],maxImpulse);
+            // rollingFriction = calcRollingFriction(contactPt);
+            rollingFriction = calcRollingFriction(chassisBody, groundObject, wheel.raycastResult.hitPointWorld, forwardWS[i], maxImpulse);
+
+            rollingFriction += wheel.engineForce * timeStep;
+
+            // rollingFriction = 0;
+            var factor = maxImpulse / rollingFriction;
+            wheel.slipInfo *= factor;
+        }
+
+        //switch between active rolling (throttle), braking and non-active rolling friction (nthrottle/break)
+
+        wheel.forwardImpulse = 0;
+        wheel.skidInfo = 1;
+
+        if (groundObject) {
+            wheel.skidInfo = 1;
+
+            var maximp = wheel.suspensionForce * timeStep * wheel.frictionSlip;
+            var maximpSide = maximp;
+
+            var maximpSquared = maximp * maximpSide;
+
+            wheel.forwardImpulse = rollingFriction;//wheelInfo.engineForce* timeStep;
+
+            var x = wheel.forwardImpulse * fwdFactor;
+            var y = wheel.sideImpulse * sideFactor;
+
+            var impulseSquared = x * x + y * y;
+
+            wheel.sliding = false;
+            if (impulseSquared > maximpSquared) {
+                this.sliding = true;
+                wheel.sliding = true;
+
+                var factor = maximp / Math.sqrt(impulseSquared);
+
+                wheel.skidInfo *= factor;
+            }
+        }
+    }
+
+    if (this.sliding) {
+        for (var i = 0; i < numWheels; i++) {
+            var wheel = wheelInfos[i];
+            if (wheel.sideImpulse !== 0) {
+                if (wheel.skidInfo < 1){
+                    wheel.forwardImpulse *= wheel.skidInfo;
+                    wheel.sideImpulse *= wheel.skidInfo;
+                }
+            }
+        }
+    }
+
+    // apply the impulses
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+
+        var rel_pos = new Vec3();
+        wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, rel_pos);
+        // cannons applyimpulse is using world coord for the position
+        //rel_pos.copy(wheel.raycastResult.hitPointWorld);
+
+        if (wheel.forwardImpulse !== 0) {
+            var impulse = new Vec3();
+            forwardWS[i].scale(wheel.forwardImpulse, impulse);
+            chassisBody.applyImpulse(impulse, rel_pos);
+        }
+
+        if (wheel.sideImpulse !== 0){
+            var groundObject = wheel.raycastResult.body;
+
+            var rel_pos2 = new Vec3();
+            wheel.raycastResult.hitPointWorld.vsub(groundObject.position, rel_pos2);
+            //rel_pos2.copy(wheel.raycastResult.hitPointWorld);
+            var sideImp = new Vec3();
+            axle[i].scale(wheel.sideImpulse, sideImp);
+
+            // Scale the relative position in the up direction with rollInfluence.
+            // If rollInfluence is 1, the impulse will be applied on the hitPoint (easy to roll over), if it is zero it will be applied in the same plane as the center of mass (not easy to roll over).
+            chassisBody.vectorToLocalFrame(rel_pos, rel_pos);
+            rel_pos['xyz'[this.indexUpAxis]] *= wheel.rollInfluence;
+            chassisBody.vectorToWorldFrame(rel_pos, rel_pos);
+            chassisBody.applyImpulse(sideImp, rel_pos);
+
+            //apply friction impulse on the ground
+            sideImp.scale(-1, sideImp);
+            groundObject.applyImpulse(sideImp, rel_pos2);
+        }
+    }
+};
+
+var calcRollingFriction_vel1 = new Vec3();
+var calcRollingFriction_vel2 = new Vec3();
+var calcRollingFriction_vel = new Vec3();
+
+function calcRollingFriction(body0, body1, frictionPosWorld, frictionDirectionWorld, maxImpulse) {
+    var j1 = 0;
+    var contactPosWorld = frictionPosWorld;
+
+    // var rel_pos1 = new Vec3();
+    // var rel_pos2 = new Vec3();
+    var vel1 = calcRollingFriction_vel1;
+    var vel2 = calcRollingFriction_vel2;
+    var vel = calcRollingFriction_vel;
+    // contactPosWorld.vsub(body0.position, rel_pos1);
+    // contactPosWorld.vsub(body1.position, rel_pos2);
+
+    body0.getVelocityAtWorldPoint(contactPosWorld, vel1);
+    body1.getVelocityAtWorldPoint(contactPosWorld, vel2);
+    vel1.vsub(vel2, vel);
+
+    var vrel = frictionDirectionWorld.dot(vel);
+
+    var denom0 = computeImpulseDenominator(body0, frictionPosWorld, frictionDirectionWorld);
+    var denom1 = computeImpulseDenominator(body1, frictionPosWorld, frictionDirectionWorld);
+    var relaxation = 1;
+    var jacDiagABInv = relaxation / (denom0 + denom1);
+
+    // calculate j that moves us to zero relative velocity
+    j1 = -vrel * jacDiagABInv;
+
+    if (maxImpulse < j1) {
+        j1 = maxImpulse;
+    }
+    if (j1 < -maxImpulse) {
+        j1 = -maxImpulse;
+    }
+
+    return j1;
+}
+
+var computeImpulseDenominator_r0 = new Vec3();
+var computeImpulseDenominator_c0 = new Vec3();
+var computeImpulseDenominator_vec = new Vec3();
+var computeImpulseDenominator_m = new Vec3();
+function computeImpulseDenominator(body, pos, normal) {
+    var r0 = computeImpulseDenominator_r0;
+    var c0 = computeImpulseDenominator_c0;
+    var vec = computeImpulseDenominator_vec;
+    var m = computeImpulseDenominator_m;
+
+    pos.vsub(body.position, r0);
+    r0.cross(normal, c0);
+    body.invInertiaWorld.vmult(c0, m);
+    m.cross(r0, vec);
+
+    return body.invMass + normal.dot(vec);
+}
+
+
+var resolveSingleBilateral_vel1 = new Vec3();
+var resolveSingleBilateral_vel2 = new Vec3();
+var resolveSingleBilateral_vel = new Vec3();
+
+//bilateral constraint between two dynamic objects
+function resolveSingleBilateral(body1, pos1, body2, pos2, normal, impulse){
+    var normalLenSqr = normal.norm2();
+    if (normalLenSqr > 1.1){
+        return 0; // no impulse
+    }
+    // var rel_pos1 = new Vec3();
+    // var rel_pos2 = new Vec3();
+    // pos1.vsub(body1.position, rel_pos1);
+    // pos2.vsub(body2.position, rel_pos2);
+
+    var vel1 = resolveSingleBilateral_vel1;
+    var vel2 = resolveSingleBilateral_vel2;
+    var vel = resolveSingleBilateral_vel;
+    body1.getVelocityAtWorldPoint(pos1, vel1);
+    body2.getVelocityAtWorldPoint(pos2, vel2);
+
+    vel1.vsub(vel2, vel);
+
+    var rel_vel = normal.dot(vel);
+
+    var contactDamping = 0.2;
+    var massTerm = 1 / (body1.invMass + body2.invMass);
+    var impulse = - contactDamping * rel_vel * massTerm;
+
+    return impulse;
+}
+},{"../collision/Ray":25,"../collision/RaycastResult":26,"../math/Quaternion":44,"../math/Vec3":46,"../objects/WheelInfo":52,"./Body":47}],49:[function(require,module,exports){
+var Body = require('./Body');
+var Sphere = require('../shapes/Sphere');
+var Box = require('../shapes/Box');
+var Vec3 = require('../math/Vec3');
+var HingeConstraint = require('../constraints/HingeConstraint');
+
+module.exports = RigidVehicle;
+
+/**
+ * Simple vehicle helper class with spherical rigid body wheels.
+ * @class RigidVehicle
+ * @constructor
+ * @param {Body} [options.chassisBody]
+ */
+function RigidVehicle(options){
+    this.wheelBodies = [];
+
+    /**
+     * @property coordinateSystem
+     * @type {Vec3}
+     */
+    this.coordinateSystem = typeof(options.coordinateSystem)==='undefined' ? new Vec3(1, 2, 3) : options.coordinateSystem.clone();
+
+    /**
+     * @property {Body} chassisBody
+     */
+    this.chassisBody = options.chassisBody;
+
+    if(!this.chassisBody){
+        // No chassis body given. Create it!
+        var chassisShape = new Box(new Vec3(5, 2, 0.5));
+        this.chassisBody = new Body(1, chassisShape);
+    }
+
+    /**
+     * @property constraints
+     * @type {Array}
+     */
+    this.constraints = [];
+
+    this.wheelAxes = [];
+    this.wheelForces = [];
+}
+
+/**
+ * Add a wheel
+ * @method addWheel
+ * @param {object} options
+ * @param {boolean} [options.isFrontWheel]
+ * @param {Vec3} [options.position] Position of the wheel, locally in the chassis body.
+ * @param {Vec3} [options.direction] Slide direction of the wheel along the suspension.
+ * @param {Vec3} [options.axis] Axis of rotation of the wheel, locally defined in the chassis.
+ * @param {Body} [options.body] The wheel body.
+ */
+RigidVehicle.prototype.addWheel = function(options){
+    options = options || {};
+    var wheelBody = options.body;
+    if(!wheelBody){
+        wheelBody =  new Body(1, new Sphere(1.2));
+    }
+    this.wheelBodies.push(wheelBody);
+    this.wheelForces.push(0);
+
+    // Position constrain wheels
+    var zero = new Vec3();
+    var position = typeof(options.position) !== 'undefined' ? options.position.clone() : new Vec3();
+
+    // Set position locally to the chassis
+    var worldPosition = new Vec3();
+    this.chassisBody.pointToWorldFrame(position, worldPosition);
+    wheelBody.position.set(worldPosition.x, worldPosition.y, worldPosition.z);
+
+    // Constrain wheel
+    var axis = typeof(options.axis) !== 'undefined' ? options.axis.clone() : new Vec3(0, 1, 0);
+    this.wheelAxes.push(axis);
+
+    var hingeConstraint = new HingeConstraint(this.chassisBody, wheelBody, {
+        pivotA: position,
+        axisA: axis,
+        pivotB: Vec3.ZERO,
+        axisB: axis,
+        collideConnected: false
+    });
+    this.constraints.push(hingeConstraint);
+
+    return this.wheelBodies.length - 1;
+};
+
+/**
+ * Set the steering value of a wheel.
+ * @method setSteeringValue
+ * @param {number} value
+ * @param {integer} wheelIndex
+ * @todo check coordinateSystem
+ */
+RigidVehicle.prototype.setSteeringValue = function(value, wheelIndex){
+    // Set angle of the hinge axis
+    var axis = this.wheelAxes[wheelIndex];
+
+    var c = Math.cos(value),
+        s = Math.sin(value),
+        x = axis.x,
+        y = axis.y;
+    this.constraints[wheelIndex].axisA.set(
+        c*x -s*y,
+        s*x +c*y,
+        0
+    );
+};
+
+/**
+ * Set the target rotational speed of the hinge constraint.
+ * @method setMotorSpeed
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.setMotorSpeed = function(value, wheelIndex){
+    var hingeConstraint = this.constraints[wheelIndex];
+    hingeConstraint.enableMotor();
+    hingeConstraint.motorTargetVelocity = value;
+};
+
+/**
+ * Set the target rotational speed of the hinge constraint.
+ * @method disableMotor
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.disableMotor = function(wheelIndex){
+    var hingeConstraint = this.constraints[wheelIndex];
+    hingeConstraint.disableMotor();
+};
+
+var torque = new Vec3();
+
+/**
+ * Set the wheel force to apply on one of the wheels each time step
+ * @method setWheelForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RigidVehicle.prototype.setWheelForce = function(value, wheelIndex){
+    this.wheelForces[wheelIndex] = value;
+};
+
+/**
+ * Apply a torque on one of the wheels.
+ * @method applyWheelForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RigidVehicle.prototype.applyWheelForce = function(value, wheelIndex){
+    var axis = this.wheelAxes[wheelIndex];
+    var wheelBody = this.wheelBodies[wheelIndex];
+    var bodyTorque = wheelBody.torque;
+
+    axis.scale(value, torque);
+    wheelBody.vectorToWorldFrame(torque, torque);
+    bodyTorque.vadd(torque, bodyTorque);
+};
+
+/**
+ * Add the vehicle including its constraints to the world.
+ * @method addToWorld
+ * @param {World} world
+ */
+RigidVehicle.prototype.addToWorld = function(world){
+    var constraints = this.constraints;
+    var bodies = this.wheelBodies.concat([this.chassisBody]);
+
+    for (var i = 0; i < bodies.length; i++) {
+        world.addBody(bodies[i]);
+    }
+
+    for (var i = 0; i < constraints.length; i++) {
+        world.addConstraint(constraints[i]);
+    }
+
+    world.addEventListener('preStep', this._update.bind(this));
+};
+
+RigidVehicle.prototype._update = function(){
+    var wheelForces = this.wheelForces;
+    for (var i = 0; i < wheelForces.length; i++) {
+        this.applyWheelForce(wheelForces[i], i);
+    }
+};
+
+/**
+ * Remove the vehicle including its constraints from the world.
+ * @method removeFromWorld
+ * @param {World} world
+ */
+RigidVehicle.prototype.removeFromWorld = function(world){
+    var constraints = this.constraints;
+    var bodies = this.wheelBodies.concat([this.chassisBody]);
+
+    for (var i = 0; i < bodies.length; i++) {
+        world.remove(bodies[i]);
+    }
+
+    for (var i = 0; i < constraints.length; i++) {
+        world.removeConstraint(constraints[i]);
+    }
+};
+
+var worldAxis = new Vec3();
+
+/**
+ * Get current rotational velocity of a wheel
+ * @method getWheelSpeed
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.getWheelSpeed = function(wheelIndex){
+    var axis = this.wheelAxes[wheelIndex];
+    var wheelBody = this.wheelBodies[wheelIndex];
+    var w = wheelBody.angularVelocity;
+    this.chassisBody.vectorToWorldFrame(axis, worldAxis);
+    return w.dot(worldAxis);
+};
+
+},{"../constraints/HingeConstraint":31,"../math/Vec3":46,"../shapes/Box":53,"../shapes/Sphere":60,"./Body":47}],50:[function(require,module,exports){
+module.exports = SPHSystem;
+
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Particle = require('../shapes/Particle');
+var Body = require('../objects/Body');
+var Material = require('../material/Material');
+
+/**
+ * Smoothed-particle hydrodynamics system
+ * @class SPHSystem
+ * @constructor
+ */
+function SPHSystem(){
+    this.particles = [];
+	
+    /**
+     * Density of the system (kg/m3).
+     * @property {number} density
+     */
+    this.density = 1;
+	
+    /**
+     * Distance below which two particles are considered to be neighbors.
+     * It should be adjusted so there are about 15-20 neighbor particles within this radius.
+     * @property {number} smoothingRadius
+     */
+    this.smoothingRadius = 1;
+    this.speedOfSound = 1;
+	
+    /**
+     * Viscosity of the system.
+     * @property {number} viscosity
+     */
+    this.viscosity = 0.01;
+    this.eps = 0.000001;
+
+    // Stuff Computed per particle
+    this.pressures = [];
+    this.densities = [];
+    this.neighbors = [];
+}
+
+/**
+ * Add a particle to the system.
+ * @method add
+ * @param {Body} particle
+ */
+SPHSystem.prototype.add = function(particle){
+    this.particles.push(particle);
+    if(this.neighbors.length < this.particles.length){
+        this.neighbors.push([]);
+    }
+};
+
+/**
+ * Remove a particle from the system.
+ * @method remove
+ * @param {Body} particle
+ */
+SPHSystem.prototype.remove = function(particle){
+    var idx = this.particles.indexOf(particle);
+    if(idx !== -1){
+        this.particles.splice(idx,1);
+        if(this.neighbors.length > this.particles.length){
+            this.neighbors.pop();
+        }
+    }
+};
+
+/**
+ * Get neighbors within smoothing volume, save in the array neighbors
+ * @method getNeighbors
+ * @param {Body} particle
+ * @param {Array} neighbors
+ */
+var SPHSystem_getNeighbors_dist = new Vec3();
+SPHSystem.prototype.getNeighbors = function(particle,neighbors){
+    var N = this.particles.length,
+        id = particle.id,
+        R2 = this.smoothingRadius * this.smoothingRadius,
+        dist = SPHSystem_getNeighbors_dist;
+    for(var i=0; i!==N; i++){
+        var p = this.particles[i];
+        p.position.vsub(particle.position,dist);
+        if(id!==p.id && dist.norm2() < R2){
+            neighbors.push(p);
+        }
+    }
+};
+
+// Temp vectors for calculation
+var SPHSystem_update_dist = new Vec3(),
+    SPHSystem_update_a_pressure = new Vec3(),
+    SPHSystem_update_a_visc = new Vec3(),
+    SPHSystem_update_gradW = new Vec3(),
+    SPHSystem_update_r_vec = new Vec3(),
+    SPHSystem_update_u = new Vec3(); // Relative velocity
+SPHSystem.prototype.update = function(){
+    var N = this.particles.length,
+        dist = SPHSystem_update_dist,
+        cs = this.speedOfSound,
+        eps = this.eps;
+
+    for(var i=0; i!==N; i++){
+        var p = this.particles[i]; // Current particle
+        var neighbors = this.neighbors[i];
+
+        // Get neighbors
+        neighbors.length = 0;
+        this.getNeighbors(p,neighbors);
+        neighbors.push(this.particles[i]); // Add current too
+        var numNeighbors = neighbors.length;
+
+        // Accumulate density for the particle
+        var sum = 0.0;
+        for(var j=0; j!==numNeighbors; j++){
+
+            //printf("Current particle has position %f %f %f\n",objects[id].pos.x(),objects[id].pos.y(),objects[id].pos.z());
+            p.position.vsub(neighbors[j].position, dist);
+            var len = dist.norm();
+
+            var weight = this.w(len);
+            sum += neighbors[j].mass * weight;
+        }
+
+        // Save
+        this.densities[i] = sum;
+        this.pressures[i] = cs * cs * (this.densities[i] - this.density);
+    }
+
+    // Add forces
+
+    // Sum to these accelerations
+    var a_pressure= SPHSystem_update_a_pressure;
+    var a_visc =    SPHSystem_update_a_visc;
+    var gradW =     SPHSystem_update_gradW;
+    var r_vec =     SPHSystem_update_r_vec;
+    var u =         SPHSystem_update_u;
+
+    for(var i=0; i!==N; i++){
+
+        var particle = this.particles[i];
+
+        a_pressure.set(0,0,0);
+        a_visc.set(0,0,0);
+
+        // Init vars
+        var Pij;
+        var nabla;
+        var Vij;
+
+        // Sum up for all other neighbors
+        var neighbors = this.neighbors[i];
+        var numNeighbors = neighbors.length;
+
+        //printf("Neighbors: ");
+        for(var j=0; j!==numNeighbors; j++){
+
+            var neighbor = neighbors[j];
+            //printf("%d ",nj);
+
+            // Get r once for all..
+            particle.position.vsub(neighbor.position,r_vec);
+            var r = r_vec.norm();
+
+            // Pressure contribution
+            Pij = -neighbor.mass * (this.pressures[i] / (this.densities[i]*this.densities[i] + eps) + this.pressures[j] / (this.densities[j]*this.densities[j] + eps));
+            this.gradw(r_vec, gradW);
+            // Add to pressure acceleration
+            gradW.mult(Pij , gradW);
+            a_pressure.vadd(gradW, a_pressure);
+
+            // Viscosity contribution
+            neighbor.velocity.vsub(particle.velocity, u);
+            u.mult( 1.0 / (0.0001+this.densities[i] * this.densities[j]) * this.viscosity * neighbor.mass , u );
+            nabla = this.nablaw(r);
+            u.mult(nabla,u);
+            // Add to viscosity acceleration
+            a_visc.vadd( u, a_visc );
+        }
+
+        // Calculate force
+        a_visc.mult(particle.mass, a_visc);
+        a_pressure.mult(particle.mass, a_pressure);
+
+        // Add force to particles
+        particle.force.vadd(a_visc, particle.force);
+        particle.force.vadd(a_pressure, particle.force);
+    }
+};
+
+// Calculate the weight using the W(r) weightfunction
+SPHSystem.prototype.w = function(r){
+    // 315
+    var h = this.smoothingRadius;
+    return 315.0/(64.0*Math.PI*Math.pow(h,9)) * Math.pow(h*h-r*r,3);
+};
+
+// calculate gradient of the weight function
+SPHSystem.prototype.gradw = function(rVec,resultVec){
+    var r = rVec.norm(),
+        h = this.smoothingRadius;
+    rVec.mult(945.0/(32.0*Math.PI*Math.pow(h,9)) * Math.pow((h*h-r*r),2) , resultVec);
+};
+
+// Calculate nabla(W)
+SPHSystem.prototype.nablaw = function(r){
+    var h = this.smoothingRadius;
+    var nabla = 945.0/(32.0*Math.PI*Math.pow(h,9)) * (h*h-r*r)*(7*r*r - 3*h*h);
+    return nabla;
+};
+
+},{"../material/Material":41,"../math/Quaternion":44,"../math/Vec3":46,"../objects/Body":47,"../shapes/Particle":57,"../shapes/Shape":59}],51:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+
+module.exports = Spring;
+
+/**
+ * A spring, connecting two bodies.
+ *
+ * @class Spring
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Object} [options]
+ * @param {number} [options.restLength]   A number > 0. Default: 1
+ * @param {number} [options.stiffness]    A number >= 0. Default: 100
+ * @param {number} [options.damping]      A number >= 0. Default: 1
+ * @param {Vec3}  [options.worldAnchorA] Where to hook the spring to body A, in world coordinates.
+ * @param {Vec3}  [options.worldAnchorB]
+ * @param {Vec3}  [options.localAnchorA] Where to hook the spring to body A, in local body coordinates.
+ * @param {Vec3}  [options.localAnchorB]
+ */
+function Spring(bodyA,bodyB,options){
+    options = options || {};
+
+    /**
+     * Rest length of the spring.
+     * @property restLength
+     * @type {number}
+     */
+    this.restLength = typeof(options.restLength) === "number" ? options.restLength : 1;
+
+    /**
+     * Stiffness of the spring.
+     * @property stiffness
+     * @type {number}
+     */
+    this.stiffness = options.stiffness || 100;
+
+    /**
+     * Damping of the spring.
+     * @property damping
+     * @type {number}
+     */
+    this.damping = options.damping || 1;
+
+    /**
+     * First connected body.
+     * @property bodyA
+     * @type {Body}
+     */
+    this.bodyA = bodyA;
+
+    /**
+     * Second connected body.
+     * @property bodyB
+     * @type {Body}
+     */
+    this.bodyB = bodyB;
+
+    /**
+     * Anchor for bodyA in local bodyA coordinates.
+     * @property localAnchorA
+     * @type {Vec3}
+     */
+    this.localAnchorA = new Vec3();
+
+    /**
+     * Anchor for bodyB in local bodyB coordinates.
+     * @property localAnchorB
+     * @type {Vec3}
+     */
+    this.localAnchorB = new Vec3();
+
+    if(options.localAnchorA){
+        this.localAnchorA.copy(options.localAnchorA);
+    }
+    if(options.localAnchorB){
+        this.localAnchorB.copy(options.localAnchorB);
+    }
+    if(options.worldAnchorA){
+        this.setWorldAnchorA(options.worldAnchorA);
+    }
+    if(options.worldAnchorB){
+        this.setWorldAnchorB(options.worldAnchorB);
+    }
+}
+
+/**
+ * Set the anchor point on body A, using world coordinates.
+ * @method setWorldAnchorA
+ * @param {Vec3} worldAnchorA
+ */
+Spring.prototype.setWorldAnchorA = function(worldAnchorA){
+    this.bodyA.pointToLocalFrame(worldAnchorA,this.localAnchorA);
+};
+
+/**
+ * Set the anchor point on body B, using world coordinates.
+ * @method setWorldAnchorB
+ * @param {Vec3} worldAnchorB
+ */
+Spring.prototype.setWorldAnchorB = function(worldAnchorB){
+    this.bodyB.pointToLocalFrame(worldAnchorB,this.localAnchorB);
+};
+
+/**
+ * Get the anchor point on body A, in world coordinates.
+ * @method getWorldAnchorA
+ * @param {Vec3} result The vector to store the result in.
+ */
+Spring.prototype.getWorldAnchorA = function(result){
+    this.bodyA.pointToWorldFrame(this.localAnchorA,result);
+};
+
+/**
+ * Get the anchor point on body B, in world coordinates.
+ * @method getWorldAnchorB
+ * @param {Vec3} result The vector to store the result in.
+ */
+Spring.prototype.getWorldAnchorB = function(result){
+    this.bodyB.pointToWorldFrame(this.localAnchorB,result);
+};
+
+var applyForce_r =              new Vec3(),
+    applyForce_r_unit =         new Vec3(),
+    applyForce_u =              new Vec3(),
+    applyForce_f =              new Vec3(),
+    applyForce_worldAnchorA =   new Vec3(),
+    applyForce_worldAnchorB =   new Vec3(),
+    applyForce_ri =             new Vec3(),
+    applyForce_rj =             new Vec3(),
+    applyForce_ri_x_f =         new Vec3(),
+    applyForce_rj_x_f =         new Vec3(),
+    applyForce_tmp =            new Vec3();
+
+/**
+ * Apply the spring force to the connected bodies.
+ * @method applyForce
+ */
+Spring.prototype.applyForce = function(){
+    var k = this.stiffness,
+        d = this.damping,
+        l = this.restLength,
+        bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        r = applyForce_r,
+        r_unit = applyForce_r_unit,
+        u = applyForce_u,
+        f = applyForce_f,
+        tmp = applyForce_tmp;
+
+    var worldAnchorA = applyForce_worldAnchorA,
+        worldAnchorB = applyForce_worldAnchorB,
+        ri = applyForce_ri,
+        rj = applyForce_rj,
+        ri_x_f = applyForce_ri_x_f,
+        rj_x_f = applyForce_rj_x_f;
+
+    // Get world anchors
+    this.getWorldAnchorA(worldAnchorA);
+    this.getWorldAnchorB(worldAnchorB);
+
+    // Get offset points
+    worldAnchorA.vsub(bodyA.position,ri);
+    worldAnchorB.vsub(bodyB.position,rj);
+
+    // Compute distance vector between world anchor points
+    worldAnchorB.vsub(worldAnchorA,r);
+    var rlen = r.norm();
+    r_unit.copy(r);
+    r_unit.normalize();
+
+    // Compute relative velocity of the anchor points, u
+    bodyB.velocity.vsub(bodyA.velocity,u);
+    // Add rotational velocity
+
+    bodyB.angularVelocity.cross(rj,tmp);
+    u.vadd(tmp,u);
+    bodyA.angularVelocity.cross(ri,tmp);
+    u.vsub(tmp,u);
+
+    // F = - k * ( x - L ) - D * ( u )
+    r_unit.mult(-k*(rlen-l) - d*u.dot(r_unit), f);
+
+    // Add forces to bodies
+    bodyA.force.vsub(f,bodyA.force);
+    bodyB.force.vadd(f,bodyB.force);
+
+    // Angular force
+    ri.cross(f,ri_x_f);
+    rj.cross(f,rj_x_f);
+    bodyA.torque.vsub(ri_x_f,bodyA.torque);
+    bodyB.torque.vadd(rj_x_f,bodyB.torque);
+};
+
+},{"../math/Vec3":46}],52:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+var Transform = require('../math/Transform');
+var RaycastResult = require('../collision/RaycastResult');
+var Utils = require('../utils/Utils');
+
+module.exports = WheelInfo;
+
+/**
+ * @class WheelInfo
+ * @constructor
+ * @param {Object} [options]
+ *
+ * @param {Vec3} [options.chassisConnectionPointLocal]
+ * @param {Vec3} [options.chassisConnectionPointWorld]
+ * @param {Vec3} [options.directionLocal]
+ * @param {Vec3} [options.directionWorld]
+ * @param {Vec3} [options.axleLocal]
+ * @param {Vec3} [options.axleWorld]
+ * @param {number} [options.suspensionRestLength=1]
+ * @param {number} [options.suspensionMaxLength=2]
+ * @param {number} [options.radius=1]
+ * @param {number} [options.suspensionStiffness=100]
+ * @param {number} [options.dampingCompression=10]
+ * @param {number} [options.dampingRelaxation=10]
+ * @param {number} [options.frictionSlip=10000]
+ * @param {number} [options.steering=0]
+ * @param {number} [options.rotation=0]
+ * @param {number} [options.deltaRotation=0]
+ * @param {number} [options.rollInfluence=0.01]
+ * @param {number} [options.maxSuspensionForce]
+ * @param {boolean} [options.isFrontWheel=true]
+ * @param {number} [options.clippedInvContactDotSuspension=1]
+ * @param {number} [options.suspensionRelativeVelocity=0]
+ * @param {number} [options.suspensionForce=0]
+ * @param {number} [options.skidInfo=0]
+ * @param {number} [options.suspensionLength=0]
+ * @param {number} [options.maxSuspensionTravel=1]
+ * @param {boolean} [options.useCustomSlidingRotationalSpeed=false]
+ * @param {number} [options.customSlidingRotationalSpeed=-0.1]
+ */
+function WheelInfo(options){
+    options = Utils.defaults(options, {
+        chassisConnectionPointLocal: new Vec3(),
+        chassisConnectionPointWorld: new Vec3(),
+        directionLocal: new Vec3(),
+        directionWorld: new Vec3(),
+        axleLocal: new Vec3(),
+        axleWorld: new Vec3(),
+        suspensionRestLength: 1,
+        suspensionMaxLength: 2,
+        radius: 1,
+        suspensionStiffness: 100,
+        dampingCompression: 10,
+        dampingRelaxation: 10,
+        frictionSlip: 10000,
+        steering: 0,
+        rotation: 0,
+        deltaRotation: 0,
+        rollInfluence: 0.01,
+        maxSuspensionForce: Number.MAX_VALUE,
+        isFrontWheel: true,
+        clippedInvContactDotSuspension: 1,
+        suspensionRelativeVelocity: 0,
+        suspensionForce: 0,
+        skidInfo: 0,
+        suspensionLength: 0,
+        maxSuspensionTravel: 1,
+        useCustomSlidingRotationalSpeed: false,
+        customSlidingRotationalSpeed: -0.1
+    });
+
+    /**
+     * Max travel distance of the suspension, in meters.
+     * @property {number} maxSuspensionTravel
+     */
+    this.maxSuspensionTravel = options.maxSuspensionTravel;
+
+    /**
+     * Speed to apply to the wheel rotation when the wheel is sliding.
+     * @property {number} customSlidingRotationalSpeed
+     */
+    this.customSlidingRotationalSpeed = options.customSlidingRotationalSpeed;
+
+    /**
+     * If the customSlidingRotationalSpeed should be used.
+     * @property {Boolean} useCustomSlidingRotationalSpeed
+     */
+    this.useCustomSlidingRotationalSpeed = options.useCustomSlidingRotationalSpeed;
+
+    /**
+     * @property {Boolean} sliding
+     */
+    this.sliding = false;
+
+    /**
+     * Connection point, defined locally in the chassis body frame.
+     * @property {Vec3} chassisConnectionPointLocal
+     */
+    this.chassisConnectionPointLocal = options.chassisConnectionPointLocal.clone();
+
+    /**
+     * @property {Vec3} chassisConnectionPointWorld
+     */
+    this.chassisConnectionPointWorld = options.chassisConnectionPointWorld.clone();
+
+    /**
+     * @property {Vec3} directionLocal
+     */
+    this.directionLocal = options.directionLocal.clone();
+
+    /**
+     * @property {Vec3} directionWorld
+     */
+    this.directionWorld = options.directionWorld.clone();
+
+    /**
+     * @property {Vec3} axleLocal
+     */
+    this.axleLocal = options.axleLocal.clone();
+
+    /**
+     * @property {Vec3} axleWorld
+     */
+    this.axleWorld = options.axleWorld.clone();
+
+    /**
+     * @property {number} suspensionRestLength
+     */
+    this.suspensionRestLength = options.suspensionRestLength;
+
+    /**
+     * @property {number} suspensionMaxLength
+     */
+    this.suspensionMaxLength = options.suspensionMaxLength;
+
+    /**
+     * @property {number} radius
+     */
+    this.radius = options.radius;
+
+    /**
+     * @property {number} suspensionStiffness
+     */
+    this.suspensionStiffness = options.suspensionStiffness;
+
+    /**
+     * @property {number} dampingCompression
+     */
+    this.dampingCompression = options.dampingCompression;
+
+    /**
+     * @property {number} dampingRelaxation
+     */
+    this.dampingRelaxation = options.dampingRelaxation;
+
+    /**
+     * @property {number} frictionSlip
+     */
+    this.frictionSlip = options.frictionSlip;
+
+    /**
+     * @property {number} steering
+     */
+    this.steering = 0;
+
+    /**
+     * Rotation value, in radians.
+     * @property {number} rotation
+     */
+    this.rotation = 0;
+
+    /**
+     * @property {number} deltaRotation
+     */
+    this.deltaRotation = 0;
+
+    /**
+     * @property {number} rollInfluence
+     */
+    this.rollInfluence = options.rollInfluence;
+
+    /**
+     * @property {number} maxSuspensionForce
+     */
+    this.maxSuspensionForce = options.maxSuspensionForce;
+
+    /**
+     * @property {number} engineForce
+     */
+    this.engineForce = 0;
+
+    /**
+     * @property {number} brake
+     */
+    this.brake = 0;
+
+    /**
+     * @property {number} isFrontWheel
+     */
+    this.isFrontWheel = options.isFrontWheel;
+
+    /**
+     * @property {number} clippedInvContactDotSuspension
+     */
+    this.clippedInvContactDotSuspension = 1;
+
+    /**
+     * @property {number} suspensionRelativeVelocity
+     */
+    this.suspensionRelativeVelocity = 0;
+
+    /**
+     * @property {number} suspensionForce
+     */
+    this.suspensionForce = 0;
+
+    /**
+     * @property {number} skidInfo
+     */
+    this.skidInfo = 0;
+
+    /**
+     * @property {number} suspensionLength
+     */
+    this.suspensionLength = 0;
+
+    /**
+     * @property {number} sideImpulse
+     */
+    this.sideImpulse = 0;
+
+    /**
+     * @property {number} forwardImpulse
+     */
+    this.forwardImpulse = 0;
+
+    /**
+     * The result from raycasting
+     * @property {RaycastResult} raycastResult
+     */
+    this.raycastResult = new RaycastResult();
+
+    /**
+     * Wheel world transform
+     * @property {Transform} worldTransform
+     */
+    this.worldTransform = new Transform();
+
+    /**
+     * @property {boolean} isInContact
+     */
+    this.isInContact = false;
+}
+
+var chassis_velocity_at_contactPoint = new Vec3();
+var relpos = new Vec3();
+var chassis_velocity_at_contactPoint = new Vec3();
+WheelInfo.prototype.updateWheel = function(chassis){
+    var raycastResult = this.raycastResult;
+
+    if (this.isInContact){
+        var project= raycastResult.hitNormalWorld.dot(raycastResult.directionWorld);
+        raycastResult.hitPointWorld.vsub(chassis.position, relpos);
+        chassis.getVelocityAtWorldPoint(relpos, chassis_velocity_at_contactPoint);
+        var projVel = raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );
+        if (project >= -0.1) {
+            this.suspensionRelativeVelocity = 0.0;
+            this.clippedInvContactDotSuspension = 1.0 / 0.1;
+        } else {
+            var inv = -1 / project;
+            this.suspensionRelativeVelocity = projVel * inv;
+            this.clippedInvContactDotSuspension = inv;
+        }
+
+    } else {
+        // Not in contact : position wheel in a nice (rest length) position
+        raycastResult.suspensionLength = this.suspensionRestLength;
+        this.suspensionRelativeVelocity = 0.0;
+        raycastResult.directionWorld.scale(-1, raycastResult.hitNormalWorld);
+        this.clippedInvContactDotSuspension = 1.0;
+    }
+};
+},{"../collision/RaycastResult":26,"../math/Transform":45,"../math/Vec3":46,"../utils/Utils":69}],53:[function(require,module,exports){
+module.exports = Box;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+
+/**
+ * A 3d box shape.
+ * @class Box
+ * @constructor
+ * @param {Vec3} halfExtents
+ * @author schteppe
+ * @extends Shape
+ */
+function Box(halfExtents){
+    Shape.call(this);
+
+    this.type = Shape.types.BOX;
+
+    /**
+     * @property halfExtents
+     * @type {Vec3}
+     */
+    this.halfExtents = halfExtents;
+
+    /**
+     * Used by the contact generator to make contacts with other convex polyhedra for example
+     * @property convexPolyhedronRepresentation
+     * @type {ConvexPolyhedron}
+     */
+    this.convexPolyhedronRepresentation = null;
+
+    this.updateConvexPolyhedronRepresentation();
+    this.updateBoundingSphereRadius();
+}
+Box.prototype = new Shape();
+Box.prototype.constructor = Box;
+
+/**
+ * Updates the local convex polyhedron representation used for some collisions.
+ * @method updateConvexPolyhedronRepresentation
+ */
+Box.prototype.updateConvexPolyhedronRepresentation = function(){
+    var sx = this.halfExtents.x;
+    var sy = this.halfExtents.y;
+    var sz = this.halfExtents.z;
+    var V = Vec3;
+
+    var vertices = [
+        new V(-sx,-sy,-sz),
+        new V( sx,-sy,-sz),
+        new V( sx, sy,-sz),
+        new V(-sx, sy,-sz),
+        new V(-sx,-sy, sz),
+        new V( sx,-sy, sz),
+        new V( sx, sy, sz),
+        new V(-sx, sy, sz)
+    ];
+
+    var indices = [
+        [3,2,1,0], // -z
+        [4,5,6,7], // +z
+        [5,4,0,1], // -y
+        [2,3,7,6], // +y
+        [0,4,7,3], // -x
+        [1,2,6,5], // +x
+    ];
+
+    var axes = [
+        new V(0, 0, 1),
+        new V(0, 1, 0),
+        new V(1, 0, 0)
+    ];
+
+    var h = new ConvexPolyhedron(vertices, indices);
+    this.convexPolyhedronRepresentation = h;
+    h.material = this.material;
+};
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+Box.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    Box.calculateInertia(this.halfExtents, mass, target);
+    return target;
+};
+
+Box.calculateInertia = function(halfExtents,mass,target){
+    var e = halfExtents;
+    target.x = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.z*2*e.z );
+    target.y = 1.0 / 12.0 * mass * (   2*e.x*2*e.x + 2*e.z*2*e.z );
+    target.z = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.x*2*e.x );
+};
+
+/**
+ * Get the box 6 side normals
+ * @method getSideNormals
+ * @param {array}      sixTargetVectors An array of 6 vectors, to store the resulting side normals in.
+ * @param {Quaternion} quat             Orientation to apply to the normal vectors. If not provided, the vectors will be in respect to the local frame.
+ * @return {array}
+ */
+Box.prototype.getSideNormals = function(sixTargetVectors,quat){
+    var sides = sixTargetVectors;
+    var ex = this.halfExtents;
+    sides[0].set(  ex.x,     0,     0);
+    sides[1].set(     0,  ex.y,     0);
+    sides[2].set(     0,     0,  ex.z);
+    sides[3].set( -ex.x,     0,     0);
+    sides[4].set(     0, -ex.y,     0);
+    sides[5].set(     0,     0, -ex.z);
+
+    if(quat!==undefined){
+        for(var i=0; i!==sides.length; i++){
+            quat.vmult(sides[i],sides[i]);
+        }
+    }
+
+    return sides;
+};
+
+Box.prototype.volume = function(){
+    return 8.0 * this.halfExtents.x * this.halfExtents.y * this.halfExtents.z;
+};
+
+Box.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = this.halfExtents.norm();
+};
+
+var worldCornerTempPos = new Vec3();
+var worldCornerTempNeg = new Vec3();
+Box.prototype.forEachWorldCorner = function(pos,quat,callback){
+
+    var e = this.halfExtents;
+    var corners = [[  e.x,  e.y,  e.z],
+                   [ -e.x,  e.y,  e.z],
+                   [ -e.x, -e.y,  e.z],
+                   [ -e.x, -e.y, -e.z],
+                   [  e.x, -e.y, -e.z],
+                   [  e.x,  e.y, -e.z],
+                   [ -e.x,  e.y, -e.z],
+                   [  e.x, -e.y,  e.z]];
+    for(var i=0; i<corners.length; i++){
+        worldCornerTempPos.set(corners[i][0],corners[i][1],corners[i][2]);
+        quat.vmult(worldCornerTempPos,worldCornerTempPos);
+        pos.vadd(worldCornerTempPos,worldCornerTempPos);
+        callback(worldCornerTempPos.x,
+                 worldCornerTempPos.y,
+                 worldCornerTempPos.z);
+    }
+};
+
+var worldCornersTemp = [
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3()
+];
+Box.prototype.calculateWorldAABB = function(pos,quat,min,max){
+
+    var e = this.halfExtents;
+    worldCornersTemp[0].set(e.x, e.y, e.z);
+    worldCornersTemp[1].set(-e.x,  e.y, e.z);
+    worldCornersTemp[2].set(-e.x, -e.y, e.z);
+    worldCornersTemp[3].set(-e.x, -e.y, -e.z);
+    worldCornersTemp[4].set(e.x, -e.y, -e.z);
+    worldCornersTemp[5].set(e.x,  e.y, -e.z);
+    worldCornersTemp[6].set(-e.x,  e.y, -e.z);
+    worldCornersTemp[7].set(e.x, -e.y,  e.z);
+
+    var wc = worldCornersTemp[0];
+    quat.vmult(wc, wc);
+    pos.vadd(wc, wc);
+    max.copy(wc);
+    min.copy(wc);
+    for(var i=1; i<8; i++){
+        var wc = worldCornersTemp[i];
+        quat.vmult(wc, wc);
+        pos.vadd(wc, wc);
+        var x = wc.x;
+        var y = wc.y;
+        var z = wc.z;
+        if(x > max.x){
+            max.x = x;
+        }
+        if(y > max.y){
+            max.y = y;
+        }
+        if(z > max.z){
+            max.z = z;
+        }
+
+        if(x < min.x){
+            min.x = x;
+        }
+        if(y < min.y){
+            min.y = y;
+        }
+        if(z < min.z){
+            min.z = z;
+        }
+    }
+
+    // Get each axis max
+    // min.set(Infinity,Infinity,Infinity);
+    // max.set(-Infinity,-Infinity,-Infinity);
+    // this.forEachWorldCorner(pos,quat,function(x,y,z){
+    //     if(x > max.x){
+    //         max.x = x;
+    //     }
+    //     if(y > max.y){
+    //         max.y = y;
+    //     }
+    //     if(z > max.z){
+    //         max.z = z;
+    //     }
+
+    //     if(x < min.x){
+    //         min.x = x;
+    //     }
+    //     if(y < min.y){
+    //         min.y = y;
+    //     }
+    //     if(z < min.z){
+    //         min.z = z;
+    //     }
+    // });
+};
+
+},{"../math/Vec3":46,"./ConvexPolyhedron":54,"./Shape":59}],54:[function(require,module,exports){
+module.exports = ConvexPolyhedron;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+
+/**
+ * A set of polygons describing a convex shape.
+ * @class ConvexPolyhedron
+ * @constructor
+ * @extends Shape
+ * @description The shape MUST be convex for the code to work properly. No polygons may be coplanar (contained
+ * in the same 3D plane), instead these should be merged into one polygon.
+ *
+ * @param {array} points An array of Vec3's
+ * @param {array} faces Array of integer arrays, describing which vertices that is included in each face.
+ *
+ * @author qiao / https://github.com/qiao (original author, see https://github.com/qiao/three.js/commit/85026f0c769e4000148a67d45a9e9b9c5108836f)
+ * @author schteppe / https://github.com/schteppe
+ * @see http://www.altdevblogaday.com/2011/05/13/contact-generation-between-3d-convex-meshes/
+ * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+ *
+ * @todo Move the clipping functions to ContactGenerator?
+ * @todo Automatically merge coplanar polygons in constructor.
+ */
+function ConvexPolyhedron(points, faces, uniqueAxes) {
+    var that = this;
+    Shape.call(this);
+    this.type = Shape.types.CONVEXPOLYHEDRON;
+
+    /**
+     * Array of Vec3
+     * @property vertices
+     * @type {Array}
+     */
+    this.vertices = points||[];
+
+    this.worldVertices = []; // World transformed version of .vertices
+    this.worldVerticesNeedsUpdate = true;
+
+    /**
+     * Array of integer arrays, indicating which vertices each face consists of
+     * @property faces
+     * @type {Array}
+     */
+    this.faces = faces||[];
+
+    /**
+     * Array of Vec3
+     * @property faceNormals
+     * @type {Array}
+     */
+    this.faceNormals = [];
+    this.computeNormals();
+
+    this.worldFaceNormalsNeedsUpdate = true;
+    this.worldFaceNormals = []; // World transformed version of .faceNormals
+
+    /**
+     * Array of Vec3
+     * @property uniqueEdges
+     * @type {Array}
+     */
+    this.uniqueEdges = [];
+
+    /**
+     * If given, these locally defined, normalized axes are the only ones being checked when doing separating axis check.
+     * @property {Array} uniqueAxes
+     */
+    this.uniqueAxes = uniqueAxes ? uniqueAxes.slice() : null;
+
+    this.computeEdges();
+    this.updateBoundingSphereRadius();
+}
+ConvexPolyhedron.prototype = new Shape();
+ConvexPolyhedron.prototype.constructor = ConvexPolyhedron;
+
+var computeEdges_tmpEdge = new Vec3();
+/**
+ * Computes uniqueEdges
+ * @method computeEdges
+ */
+ConvexPolyhedron.prototype.computeEdges = function(){
+    var faces = this.faces;
+    var vertices = this.vertices;
+    var nv = vertices.length;
+    var edges = this.uniqueEdges;
+
+    edges.length = 0;
+
+    var edge = computeEdges_tmpEdge;
+
+    for(var i=0; i !== faces.length; i++){
+        var face = faces[i];
+        var numVertices = face.length;
+        for(var j = 0; j !== numVertices; j++){
+            var k = ( j+1 ) % numVertices;
+            vertices[face[j]].vsub(vertices[face[k]], edge);
+            edge.normalize();
+            var found = false;
+            for(var p=0; p !== edges.length; p++){
+                if (edges[p].almostEquals(edge) || edges[p].almostEquals(edge)){
+                    found = true;
+                    break;
+                }
+            }
+
+            if (!found){
+                edges.push(edge.clone());
+            }
+        }
+    }
+};
+
+/**
+ * Compute the normals of the faces. Will reuse existing Vec3 objects in the .faceNormals array if they exist.
+ * @method computeNormals
+ */
+ConvexPolyhedron.prototype.computeNormals = function(){
+    this.faceNormals.length = this.faces.length;
+
+    // Generate normals
+    for(var i=0; i<this.faces.length; i++){
+
+        // Check so all vertices exists for this face
+        for(var j=0; j<this.faces[i].length; j++){
+            if(!this.vertices[this.faces[i][j]]){
+                throw new Error("Vertex "+this.faces[i][j]+" not found!");
+            }
+        }
+
+        var n = this.faceNormals[i] || new Vec3();
+        this.getFaceNormal(i,n);
+        n.negate(n);
+        this.faceNormals[i] = n;
+        var vertex = this.vertices[this.faces[i][0]];
+        if(n.dot(vertex) < 0){
+            console.error(".faceNormals[" + i + "] = Vec3("+n.toString()+") looks like it points into the shape? The vertices follow. Make sure they are ordered CCW around the normal, using the right hand rule.");
+            for(var j=0; j<this.faces[i].length; j++){
+                console.warn(".vertices["+this.faces[i][j]+"] = Vec3("+this.vertices[this.faces[i][j]].toString()+")");
+            }
+        }
+    }
+};
+
+/**
+ * Get face normal given 3 vertices
+ * @static
+ * @method getFaceNormal
+ * @param {Vec3} va
+ * @param {Vec3} vb
+ * @param {Vec3} vc
+ * @param {Vec3} target
+ */
+var cb = new Vec3();
+var ab = new Vec3();
+ConvexPolyhedron.computeNormal = function ( va, vb, vc, target ) {
+    vb.vsub(va,ab);
+    vc.vsub(vb,cb);
+    cb.cross(ab,target);
+    if ( !target.isZero() ) {
+        target.normalize();
+    }
+};
+
+/**
+ * Compute the normal of a face from its vertices
+ * @method getFaceNormal
+ * @param  {Number} i
+ * @param  {Vec3} target
+ */
+ConvexPolyhedron.prototype.getFaceNormal = function(i,target){
+    var f = this.faces[i];
+    var va = this.vertices[f[0]];
+    var vb = this.vertices[f[1]];
+    var vc = this.vertices[f[2]];
+    return ConvexPolyhedron.computeNormal(va,vb,vc,target);
+};
+
+/**
+ * @method clipAgainstHull
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @param {Vec3} separatingNormal
+ * @param {Number} minDist Clamp distance
+ * @param {Number} maxDist
+ * @param {array} result The an array of contact point objects, see clipFaceAgainstHull
+ * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+ */
+var cah_WorldNormal = new Vec3();
+ConvexPolyhedron.prototype.clipAgainstHull = function(posA,quatA,hullB,posB,quatB,separatingNormal,minDist,maxDist,result){
+    var WorldNormal = cah_WorldNormal;
+    var hullA = this;
+    var curMaxDist = maxDist;
+    var closestFaceB = -1;
+    var dmax = -Number.MAX_VALUE;
+    for(var face=0; face < hullB.faces.length; face++){
+        WorldNormal.copy(hullB.faceNormals[face]);
+        quatB.vmult(WorldNormal,WorldNormal);
+        //posB.vadd(WorldNormal,WorldNormal);
+        var d = WorldNormal.dot(separatingNormal);
+        if (d > dmax){
+            dmax = d;
+            closestFaceB = face;
+        }
+    }
+    var worldVertsB1 = [];
+    var polyB = hullB.faces[closestFaceB];
+    var numVertices = polyB.length;
+    for(var e0=0; e0<numVertices; e0++){
+        var b = hullB.vertices[polyB[e0]];
+        var worldb = new Vec3();
+        worldb.copy(b);
+        quatB.vmult(worldb,worldb);
+        posB.vadd(worldb,worldb);
+        worldVertsB1.push(worldb);
+    }
+
+    if (closestFaceB>=0){
+        this.clipFaceAgainstHull(separatingNormal,
+                                 posA,
+                                 quatA,
+                                 worldVertsB1,
+                                 minDist,
+                                 maxDist,
+                                 result);
+    }
+};
+
+/**
+ * Find the separating axis between this hull and another
+ * @method findSeparatingAxis
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @param {Vec3} target The target vector to save the axis in
+ * @return {bool} Returns false if a separation is found, else true
+ */
+var fsa_faceANormalWS3 = new Vec3(),
+    fsa_Worldnormal1 = new Vec3(),
+    fsa_deltaC = new Vec3(),
+    fsa_worldEdge0 = new Vec3(),
+    fsa_worldEdge1 = new Vec3(),
+    fsa_Cross = new Vec3();
+ConvexPolyhedron.prototype.findSeparatingAxis = function(hullB,posA,quatA,posB,quatB,target, faceListA, faceListB){
+    var faceANormalWS3 = fsa_faceANormalWS3,
+        Worldnormal1 = fsa_Worldnormal1,
+        deltaC = fsa_deltaC,
+        worldEdge0 = fsa_worldEdge0,
+        worldEdge1 = fsa_worldEdge1,
+        Cross = fsa_Cross;
+
+    var dmin = Number.MAX_VALUE;
+    var hullA = this;
+    var curPlaneTests=0;
+
+    if(!hullA.uniqueAxes){
+
+        var numFacesA = faceListA ? faceListA.length : hullA.faces.length;
+
+        // Test face normals from hullA
+        for(var i=0; i<numFacesA; i++){
+            var fi = faceListA ? faceListA[i] : i;
+
+            // Get world face normal
+            faceANormalWS3.copy(hullA.faceNormals[fi]);
+            quatA.vmult(faceANormalWS3,faceANormalWS3);
+
+            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(faceANormalWS3);
+            }
+        }
+
+    } else {
+
+        // Test unique axes
+        for(var i = 0; i !== hullA.uniqueAxes.length; i++){
+
+            // Get world axis
+            quatA.vmult(hullA.uniqueAxes[i],faceANormalWS3);
+
+            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(faceANormalWS3);
+            }
+        }
+    }
+
+    if(!hullB.uniqueAxes){
+
+        // Test face normals from hullB
+        var numFacesB = faceListB ? faceListB.length : hullB.faces.length;
+        for(var i=0;i<numFacesB;i++){
+
+            var fi = faceListB ? faceListB[i] : i;
+
+            Worldnormal1.copy(hullB.faceNormals[fi]);
+            quatB.vmult(Worldnormal1,Worldnormal1);
+            curPlaneTests++;
+            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(Worldnormal1);
+            }
+        }
+    } else {
+
+        // Test unique axes in B
+        for(var i = 0; i !== hullB.uniqueAxes.length; i++){
+            quatB.vmult(hullB.uniqueAxes[i],Worldnormal1);
+
+            curPlaneTests++;
+            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(Worldnormal1);
+            }
+        }
+    }
+
+    // Test edges
+    for(var e0=0; e0 !== hullA.uniqueEdges.length; e0++){
+
+        // Get world edge
+        quatA.vmult(hullA.uniqueEdges[e0],worldEdge0);
+
+        for(var e1=0; e1 !== hullB.uniqueEdges.length; e1++){
+
+            // Get world edge 2
+            quatB.vmult(hullB.uniqueEdges[e1], worldEdge1);
+            worldEdge0.cross(worldEdge1,Cross);
+
+            if(!Cross.almostZero()){
+                Cross.normalize();
+                var dist = hullA.testSepAxis(Cross, hullB, posA, quatA, posB, quatB);
+                if(dist === false){
+                    return false;
+                }
+                if(dist < dmin){
+                    dmin = dist;
+                    target.copy(Cross);
+                }
+            }
+        }
+    }
+
+    posB.vsub(posA,deltaC);
+    if((deltaC.dot(target))>0.0){
+        target.negate(target);
+    }
+
+    return true;
+};
+
+var maxminA=[], maxminB=[];
+
+/**
+ * Test separating axis against two hulls. Both hulls are projected onto the axis and the overlap size is returned if there is one.
+ * @method testSepAxis
+ * @param {Vec3} axis
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @return {number} The overlap depth, or FALSE if no penetration.
+ */
+ConvexPolyhedron.prototype.testSepAxis = function(axis, hullB, posA, quatA, posB, quatB){
+    var hullA=this;
+    ConvexPolyhedron.project(hullA, axis, posA, quatA, maxminA);
+    ConvexPolyhedron.project(hullB, axis, posB, quatB, maxminB);
+    var maxA = maxminA[0];
+    var minA = maxminA[1];
+    var maxB = maxminB[0];
+    var minB = maxminB[1];
+    if(maxA<minB || maxB<minA){
+        return false; // Separated
+    }
+    var d0 = maxA - minB;
+    var d1 = maxB - minA;
+    var depth = d0<d1 ? d0:d1;
+    return depth;
+};
+
+var cli_aabbmin = new Vec3(),
+    cli_aabbmax = new Vec3();
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ */
+ConvexPolyhedron.prototype.calculateLocalInertia = function(mass,target){
+    // Approximate with box inertia
+    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it
+    this.computeLocalAABB(cli_aabbmin,cli_aabbmax);
+    var x = cli_aabbmax.x - cli_aabbmin.x,
+        y = cli_aabbmax.y - cli_aabbmin.y,
+        z = cli_aabbmax.z - cli_aabbmin.z;
+    target.x = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z );
+    target.y = 1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z );
+    target.z = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x );
+};
+
+/**
+ * @method getPlaneConstantOfFace
+ * @param  {Number} face_i Index of the face
+ * @return {Number}
+ */
+ConvexPolyhedron.prototype.getPlaneConstantOfFace = function(face_i){
+    var f = this.faces[face_i];
+    var n = this.faceNormals[face_i];
+    var v = this.vertices[f[0]];
+    var c = -n.dot(v);
+    return c;
+};
+
+/**
+ * Clip a face against a hull.
+ * @method clipFaceAgainstHull
+ * @param {Vec3} separatingNormal
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Array} worldVertsB1 An array of Vec3 with vertices in the world frame.
+ * @param {Number} minDist Distance clamping
+ * @param {Number} maxDist
+ * @param Array result Array to store resulting contact points in. Will be objects with properties: point, depth, normal. These are represented in world coordinates.
+ */
+var cfah_faceANormalWS = new Vec3(),
+    cfah_edge0 = new Vec3(),
+    cfah_WorldEdge0 = new Vec3(),
+    cfah_worldPlaneAnormal1 = new Vec3(),
+    cfah_planeNormalWS1 = new Vec3(),
+    cfah_worldA1 = new Vec3(),
+    cfah_localPlaneNormal = new Vec3(),
+    cfah_planeNormalWS = new Vec3();
+ConvexPolyhedron.prototype.clipFaceAgainstHull = function(separatingNormal, posA, quatA, worldVertsB1, minDist, maxDist,result){
+    var faceANormalWS = cfah_faceANormalWS,
+        edge0 = cfah_edge0,
+        WorldEdge0 = cfah_WorldEdge0,
+        worldPlaneAnormal1 = cfah_worldPlaneAnormal1,
+        planeNormalWS1 = cfah_planeNormalWS1,
+        worldA1 = cfah_worldA1,
+        localPlaneNormal = cfah_localPlaneNormal,
+        planeNormalWS = cfah_planeNormalWS;
+
+    var hullA = this;
+    var worldVertsB2 = [];
+    var pVtxIn = worldVertsB1;
+    var pVtxOut = worldVertsB2;
+    // Find the face with normal closest to the separating axis
+    var closestFaceA = -1;
+    var dmin = Number.MAX_VALUE;
+    for(var face=0; face<hullA.faces.length; face++){
+        faceANormalWS.copy(hullA.faceNormals[face]);
+        quatA.vmult(faceANormalWS,faceANormalWS);
+        //posA.vadd(faceANormalWS,faceANormalWS);
+        var d = faceANormalWS.dot(separatingNormal);
+        if (d < dmin){
+            dmin = d;
+            closestFaceA = face;
+        }
+    }
+    if (closestFaceA < 0){
+        // console.log("--- did not find any closest face... ---");
+        return;
+    }
+    //console.log("closest A: ",closestFaceA);
+    // Get the face and construct connected faces
+    var polyA = hullA.faces[closestFaceA];
+    polyA.connectedFaces = [];
+    for(var i=0; i<hullA.faces.length; i++){
+        for(var j=0; j<hullA.faces[i].length; j++){
+            if(polyA.indexOf(hullA.faces[i][j])!==-1 /* Sharing a vertex*/ && i!==closestFaceA /* Not the one we are looking for connections from */ && polyA.connectedFaces.indexOf(i)===-1 /* Not already added */ ){
+                polyA.connectedFaces.push(i);
+            }
+        }
+    }
+    // Clip the polygon to the back of the planes of all faces of hull A, that are adjacent to the witness face
+    var numContacts = pVtxIn.length;
+    var numVerticesA = polyA.length;
+    var res = [];
+    for(var e0=0; e0<numVerticesA; e0++){
+        var a = hullA.vertices[polyA[e0]];
+        var b = hullA.vertices[polyA[(e0+1)%numVerticesA]];
+        a.vsub(b,edge0);
+        WorldEdge0.copy(edge0);
+        quatA.vmult(WorldEdge0,WorldEdge0);
+        posA.vadd(WorldEdge0,WorldEdge0);
+        worldPlaneAnormal1.copy(this.faceNormals[closestFaceA]);//transA.getBasis()* btVector3(polyA.m_plane[0],polyA.m_plane[1],polyA.m_plane[2]);
+        quatA.vmult(worldPlaneAnormal1,worldPlaneAnormal1);
+        posA.vadd(worldPlaneAnormal1,worldPlaneAnormal1);
+        WorldEdge0.cross(worldPlaneAnormal1,planeNormalWS1);
+        planeNormalWS1.negate(planeNormalWS1);
+        worldA1.copy(a);
+        quatA.vmult(worldA1,worldA1);
+        posA.vadd(worldA1,worldA1);
+        var planeEqWS1 = -worldA1.dot(planeNormalWS1);
+        var planeEqWS;
+        if(true){
+            var otherFace = polyA.connectedFaces[e0];
+            localPlaneNormal.copy(this.faceNormals[otherFace]);
+            var localPlaneEq = this.getPlaneConstantOfFace(otherFace);
+
+            planeNormalWS.copy(localPlaneNormal);
+            quatA.vmult(planeNormalWS,planeNormalWS);
+            //posA.vadd(planeNormalWS,planeNormalWS);
+            var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);
+        } else  {
+            planeNormalWS.copy(planeNormalWS1);
+            planeEqWS = planeEqWS1;
+        }
+
+        // Clip face against our constructed plane
+        this.clipFaceAgainstPlane(pVtxIn, pVtxOut, planeNormalWS, planeEqWS);
+
+        // Throw away all clipped points, but save the reamining until next clip
+        while(pVtxIn.length){
+            pVtxIn.shift();
+        }
+        while(pVtxOut.length){
+            pVtxIn.push(pVtxOut.shift());
+        }
+    }
+
+    //console.log("Resulting points after clip:",pVtxIn);
+
+    // only keep contact points that are behind the witness face
+    localPlaneNormal.copy(this.faceNormals[closestFaceA]);
+
+    var localPlaneEq = this.getPlaneConstantOfFace(closestFaceA);
+    planeNormalWS.copy(localPlaneNormal);
+    quatA.vmult(planeNormalWS,planeNormalWS);
+
+    var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);
+    for (var i=0; i<pVtxIn.length; i++){
+        var depth = planeNormalWS.dot(pVtxIn[i]) + planeEqWS; //???
+        /*console.log("depth calc from normal=",planeNormalWS.toString()," and constant "+planeEqWS+" and vertex ",pVtxIn[i].toString()," gives "+depth);*/
+        if (depth <=minDist){
+            console.log("clamped: depth="+depth+" to minDist="+(minDist+""));
+            depth = minDist;
+        }
+
+        if (depth <=maxDist){
+            var point = pVtxIn[i];
+            if(depth<=0){
+                /*console.log("Got contact point ",point.toString(),
+                  ", depth=",depth,
+                  "contact normal=",separatingNormal.toString(),
+                  "plane",planeNormalWS.toString(),
+                  "planeConstant",planeEqWS);*/
+                var p = {
+                    point:point,
+                    normal:planeNormalWS,
+                    depth: depth,
+                };
+                result.push(p);
+            }
+        }
+    }
+};
+
+/**
+ * Clip a face in a hull against the back of a plane.
+ * @method clipFaceAgainstPlane
+ * @param {Array} inVertices
+ * @param {Array} outVertices
+ * @param {Vec3} planeNormal
+ * @param {Number} planeConstant The constant in the mathematical plane equation
+ */
+ConvexPolyhedron.prototype.clipFaceAgainstPlane = function(inVertices,outVertices, planeNormal, planeConstant){
+    var n_dot_first, n_dot_last;
+    var numVerts = inVertices.length;
+
+    if(numVerts < 2){
+        return outVertices;
+    }
+
+    var firstVertex = inVertices[inVertices.length-1],
+        lastVertex =   inVertices[0];
+
+    n_dot_first = planeNormal.dot(firstVertex) + planeConstant;
+
+    for(var vi = 0; vi < numVerts; vi++){
+        lastVertex = inVertices[vi];
+        n_dot_last = planeNormal.dot(lastVertex) + planeConstant;
+        if(n_dot_first < 0){
+            if(n_dot_last < 0){
+                // Start < 0, end < 0, so output lastVertex
+                var newv = new Vec3();
+                newv.copy(lastVertex);
+                outVertices.push(newv);
+            } else {
+                // Start < 0, end >= 0, so output intersection
+                var newv = new Vec3();
+                firstVertex.lerp(lastVertex,
+                                 n_dot_first / (n_dot_first - n_dot_last),
+                                 newv);
+                outVertices.push(newv);
+            }
+        } else {
+            if(n_dot_last<0){
+                // Start >= 0, end < 0 so output intersection and end
+                var newv = new Vec3();
+                firstVertex.lerp(lastVertex,
+                                 n_dot_first / (n_dot_first - n_dot_last),
+                                 newv);
+                outVertices.push(newv);
+                outVertices.push(lastVertex);
+            }
+        }
+        firstVertex = lastVertex;
+        n_dot_first = n_dot_last;
+    }
+    return outVertices;
+};
+
+// Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.
+ConvexPolyhedron.prototype.computeWorldVertices = function(position,quat){
+    var N = this.vertices.length;
+    while(this.worldVertices.length < N){
+        this.worldVertices.push( new Vec3() );
+    }
+
+    var verts = this.vertices,
+        worldVerts = this.worldVertices;
+    for(var i=0; i!==N; i++){
+        quat.vmult( verts[i] , worldVerts[i] );
+        position.vadd( worldVerts[i] , worldVerts[i] );
+    }
+
+    this.worldVerticesNeedsUpdate = false;
+};
+
+var computeLocalAABB_worldVert = new Vec3();
+ConvexPolyhedron.prototype.computeLocalAABB = function(aabbmin,aabbmax){
+    var n = this.vertices.length,
+        vertices = this.vertices,
+        worldVert = computeLocalAABB_worldVert;
+
+    aabbmin.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
+    aabbmax.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
+
+    for(var i=0; i<n; i++){
+        var v = vertices[i];
+        if     (v.x < aabbmin.x){
+            aabbmin.x = v.x;
+        } else if(v.x > aabbmax.x){
+            aabbmax.x = v.x;
+        }
+        if     (v.y < aabbmin.y){
+            aabbmin.y = v.y;
+        } else if(v.y > aabbmax.y){
+            aabbmax.y = v.y;
+        }
+        if     (v.z < aabbmin.z){
+            aabbmin.z = v.z;
+        } else if(v.z > aabbmax.z){
+            aabbmax.z = v.z;
+        }
+    }
+};
+
+/**
+ * Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.
+ * @method computeWorldFaceNormals
+ * @param  {Quaternion} quat
+ */
+ConvexPolyhedron.prototype.computeWorldFaceNormals = function(quat){
+    var N = this.faceNormals.length;
+    while(this.worldFaceNormals.length < N){
+        this.worldFaceNormals.push( new Vec3() );
+    }
+
+    var normals = this.faceNormals,
+        worldNormals = this.worldFaceNormals;
+    for(var i=0; i!==N; i++){
+        quat.vmult( normals[i] , worldNormals[i] );
+    }
+
+    this.worldFaceNormalsNeedsUpdate = false;
+};
+
+/**
+ * @method updateBoundingSphereRadius
+ */
+ConvexPolyhedron.prototype.updateBoundingSphereRadius = function(){
+    // Assume points are distributed with local (0,0,0) as center
+    var max2 = 0;
+    var verts = this.vertices;
+    for(var i=0, N=verts.length; i!==N; i++) {
+        var norm2 = verts[i].norm2();
+        if(norm2 > max2){
+            max2 = norm2;
+        }
+    }
+    this.boundingSphereRadius = Math.sqrt(max2);
+};
+
+var tempWorldVertex = new Vec3();
+
+/**
+ * @method calculateWorldAABB
+ * @param {Vec3}        pos
+ * @param {Quaternion}  quat
+ * @param {Vec3}        min
+ * @param {Vec3}        max
+ */
+ConvexPolyhedron.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    var n = this.vertices.length, verts = this.vertices;
+    var minx,miny,minz,maxx,maxy,maxz;
+    for(var i=0; i<n; i++){
+        tempWorldVertex.copy(verts[i]);
+        quat.vmult(tempWorldVertex,tempWorldVertex);
+        pos.vadd(tempWorldVertex,tempWorldVertex);
+        var v = tempWorldVertex;
+        if     (v.x < minx || minx===undefined){
+            minx = v.x;
+        } else if(v.x > maxx || maxx===undefined){
+            maxx = v.x;
+        }
+
+        if     (v.y < miny || miny===undefined){
+            miny = v.y;
+        } else if(v.y > maxy || maxy===undefined){
+            maxy = v.y;
+        }
+
+        if     (v.z < minz || minz===undefined){
+            minz = v.z;
+        } else if(v.z > maxz || maxz===undefined){
+            maxz = v.z;
+        }
+    }
+    min.set(minx,miny,minz);
+    max.set(maxx,maxy,maxz);
+};
+
+/**
+ * Get approximate convex volume
+ * @method volume
+ * @return {Number}
+ */
+ConvexPolyhedron.prototype.volume = function(){
+    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;
+};
+
+/**
+ * Get an average of all the vertices positions
+ * @method getAveragePointLocal
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+ConvexPolyhedron.prototype.getAveragePointLocal = function(target){
+    target = target || new Vec3();
+    var n = this.vertices.length,
+        verts = this.vertices;
+    for(var i=0; i<n; i++){
+        target.vadd(verts[i],target);
+    }
+    target.mult(1/n,target);
+    return target;
+};
+
+/**
+ * Transform all local points. Will change the .vertices
+ * @method transformAllPoints
+ * @param  {Vec3} offset
+ * @param  {Quaternion} quat
+ */
+ConvexPolyhedron.prototype.transformAllPoints = function(offset,quat){
+    var n = this.vertices.length,
+        verts = this.vertices;
+
+    // Apply rotation
+    if(quat){
+        // Rotate vertices
+        for(var i=0; i<n; i++){
+            var v = verts[i];
+            quat.vmult(v,v);
+        }
+        // Rotate face normals
+        for(var i=0; i<this.faceNormals.length; i++){
+            var v = this.faceNormals[i];
+            quat.vmult(v,v);
+        }
+        /*
+        // Rotate edges
+        for(var i=0; i<this.uniqueEdges.length; i++){
+            var v = this.uniqueEdges[i];
+            quat.vmult(v,v);
+        }*/
+    }
+
+    // Apply offset
+    if(offset){
+        for(var i=0; i<n; i++){
+            var v = verts[i];
+            v.vadd(offset,v);
+        }
+    }
+};
+
+/**
+ * Checks whether p is inside the polyhedra. Must be in local coords. The point lies outside of the convex hull of the other points if and only if the direction of all the vectors from it to those other points are on less than one half of a sphere around it.
+ * @method pointIsInside
+ * @param  {Vec3} p      A point given in local coordinates
+ * @return {Boolean}
+ */
+var ConvexPolyhedron_pointIsInside = new Vec3();
+var ConvexPolyhedron_vToP = new Vec3();
+var ConvexPolyhedron_vToPointInside = new Vec3();
+ConvexPolyhedron.prototype.pointIsInside = function(p){
+    var n = this.vertices.length,
+        verts = this.vertices,
+        faces = this.faces,
+        normals = this.faceNormals;
+    var positiveResult = null;
+    var N = this.faces.length;
+    var pointInside = ConvexPolyhedron_pointIsInside;
+    this.getAveragePointLocal(pointInside);
+    for(var i=0; i<N; i++){
+        var numVertices = this.faces[i].length;
+        var n = normals[i];
+        var v = verts[faces[i][0]]; // We only need one point in the face
+
+        // This dot product determines which side of the edge the point is
+        var vToP = ConvexPolyhedron_vToP;
+        p.vsub(v,vToP);
+        var r1 = n.dot(vToP);
+
+        var vToPointInside = ConvexPolyhedron_vToPointInside;
+        pointInside.vsub(v,vToPointInside);
+        var r2 = n.dot(vToPointInside);
+
+        if((r1<0 && r2>0) || (r1>0 && r2<0)){
+            return false; // Encountered some other sign. Exit.
+        } else {
+        }
+    }
+
+    // If we got here, all dot products were of the same sign.
+    return positiveResult ? 1 : -1;
+};
+
+/**
+ * Get max and min dot product of a convex hull at position (pos,quat) projected onto an axis. Results are saved in the array maxmin.
+ * @static
+ * @method project
+ * @param {ConvexPolyhedron} hull
+ * @param {Vec3} axis
+ * @param {Vec3} pos
+ * @param {Quaternion} quat
+ * @param {array} result result[0] and result[1] will be set to maximum and minimum, respectively.
+ */
+var project_worldVertex = new Vec3();
+var project_localAxis = new Vec3();
+var project_localOrigin = new Vec3();
+ConvexPolyhedron.project = function(hull, axis, pos, quat, result){
+    var n = hull.vertices.length,
+        worldVertex = project_worldVertex,
+        localAxis = project_localAxis,
+        max = 0,
+        min = 0,
+        localOrigin = project_localOrigin,
+        vs = hull.vertices;
+
+    localOrigin.setZero();
+
+    // Transform the axis to local
+    Transform.vectorToLocalFrame(pos, quat, axis, localAxis);
+    Transform.pointToLocalFrame(pos, quat, localOrigin, localOrigin);
+    var add = localOrigin.dot(localAxis);
+
+    min = max = vs[0].dot(localAxis);
+
+    for(var i = 1; i < n; i++){
+        var val = vs[i].dot(localAxis);
+
+        if(val > max){
+            max = val;
+        }
+
+        if(val < min){
+            min = val;
+        }
+    }
+
+    min -= add;
+    max -= add;
+
+    if(min > max){
+        // Inconsistent - swap
+        var temp = min;
+        min = max;
+        max = temp;
+    }
+    // Output
+    result[0] = max;
+    result[1] = min;
+};
+
+},{"../math/Quaternion":44,"../math/Transform":45,"../math/Vec3":46,"./Shape":59}],55:[function(require,module,exports){
+module.exports = Cylinder;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+
+/**
+ * @class Cylinder
+ * @constructor
+ * @extends ConvexPolyhedron
+ * @author schteppe / https://github.com/schteppe
+ * @param {Number} radiusTop
+ * @param {Number} radiusBottom
+ * @param {Number} height
+ * @param {Number} numSegments The number of segments to build the cylinder out of
+ */
+function Cylinder( radiusTop, radiusBottom, height , numSegments ) {
+    var N = numSegments,
+        verts = [],
+        axes = [],
+        faces = [],
+        bottomface = [],
+        topface = [],
+        cos = Math.cos,
+        sin = Math.sin;
+
+    // First bottom point
+    verts.push(new Vec3(radiusBottom*cos(0),
+                               radiusBottom*sin(0),
+                               -height*0.5));
+    bottomface.push(0);
+
+    // First top point
+    verts.push(new Vec3(radiusTop*cos(0),
+                               radiusTop*sin(0),
+                               height*0.5));
+    topface.push(1);
+
+    for(var i=0; i<N; i++){
+        var theta = 2*Math.PI/N * (i+1);
+        var thetaN = 2*Math.PI/N * (i+0.5);
+        if(i<N-1){
+            // Bottom
+            verts.push(new Vec3(radiusBottom*cos(theta),
+                                       radiusBottom*sin(theta),
+                                       -height*0.5));
+            bottomface.push(2*i+2);
+            // Top
+            verts.push(new Vec3(radiusTop*cos(theta),
+                                       radiusTop*sin(theta),
+                                       height*0.5));
+            topface.push(2*i+3);
+
+            // Face
+            faces.push([2*i+2, 2*i+3, 2*i+1,2*i]);
+        } else {
+            faces.push([0,1, 2*i+1, 2*i]); // Connect
+        }
+
+        // Axis: we can cut off half of them if we have even number of segments
+        if(N % 2 === 1 || i < N / 2){
+            axes.push(new Vec3(cos(thetaN), sin(thetaN), 0));
+        }
+    }
+    faces.push(topface);
+    axes.push(new Vec3(0,0,1));
+
+    // Reorder bottom face
+    var temp = [];
+    for(var i=0; i<bottomface.length; i++){
+        temp.push(bottomface[bottomface.length - i - 1]);
+    }
+    faces.push(temp);
+
+    this.type = Shape.types.CONVEXPOLYHEDRON;
+    ConvexPolyhedron.call( this, verts, faces, axes );
+}
+
+Cylinder.prototype = new ConvexPolyhedron();
+
+},{"../math/Quaternion":44,"../math/Vec3":46,"./ConvexPolyhedron":54,"./Shape":59}],56:[function(require,module,exports){
+var Shape = require('./Shape');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+var Vec3 = require('../math/Vec3');
+var Utils = require('../utils/Utils');
+
+module.exports = Heightfield;
+
+/**
+ * Heightfield shape class. Height data is given as an array. These data points are spread out evenly with a given distance.
+ * @class Heightfield
+ * @extends Shape
+ * @constructor
+ * @param {Array} data An array of Y values that will be used to construct the terrain.
+ * @param {object} options
+ * @param {Number} [options.minValue] Minimum value of the data points in the data array. Will be computed automatically if not given.
+ * @param {Number} [options.maxValue] Maximum value.
+ * @param {Number} [options.elementSize=0.1] World spacing between the data points in X direction.
+ * @todo Should be possible to use along all axes, not just y
+ * @todo should be possible to scale along all axes
+ *
+ * @example
+ *     // Generate some height data (y-values).
+ *     var data = [];
+ *     for(var i = 0; i < 1000; i++){
+ *         var y = 0.5 * Math.cos(0.2 * i);
+ *         data.push(y);
+ *     }
+ *
+ *     // Create the heightfield shape
+ *     var heightfieldShape = new Heightfield(data, {
+ *         elementSize: 1 // Distance between the data points in X and Y directions
+ *     });
+ *     var heightfieldBody = new Body();
+ *     heightfieldBody.addShape(heightfieldShape);
+ *     world.addBody(heightfieldBody);
+ */
+function Heightfield(data, options){
+    options = Utils.defaults(options, {
+        maxValue : null,
+        minValue : null,
+        elementSize : 1
+    });
+
+    /**
+     * An array of numbers, or height values, that are spread out along the x axis.
+     * @property {array} data
+     */
+    this.data = data;
+
+    /**
+     * Max value of the data
+     * @property {number} maxValue
+     */
+    this.maxValue = options.maxValue;
+
+    /**
+     * Max value of the data
+     * @property {number} minValue
+     */
+    this.minValue = options.minValue;
+
+    /**
+     * The width of each element
+     * @property {number} elementSize
+     * @todo elementSizeX and Y
+     */
+    this.elementSize = options.elementSize;
+
+    if(options.minValue === null){
+        this.updateMinValue();
+    }
+    if(options.maxValue === null){
+        this.updateMaxValue();
+    }
+
+    this.cacheEnabled = true;
+
+    Shape.call(this);
+
+    this.pillarConvex = new ConvexPolyhedron();
+    this.pillarOffset = new Vec3();
+
+    this.type = Shape.types.HEIGHTFIELD;
+    this.updateBoundingSphereRadius();
+
+    // "i_j_isUpper" => { convex: ..., offset: ... }
+    // for example:
+    // _cachedPillars["0_2_1"]
+    this._cachedPillars = {};
+}
+Heightfield.prototype = new Shape();
+
+/**
+ * Call whenever you change the data array.
+ * @method update
+ */
+Heightfield.prototype.update = function(){
+    this._cachedPillars = {};
+};
+
+/**
+ * Update the .minValue property
+ * @method updateMinValue
+ */
+Heightfield.prototype.updateMinValue = function(){
+    var data = this.data;
+    var minValue = data[0][0];
+    for(var i=0; i !== data.length; i++){
+        for(var j=0; j !== data[i].length; j++){
+            var v = data[i][j];
+            if(v < minValue){
+                minValue = v;
+            }
+        }
+    }
+    this.minValue = minValue;
+};
+
+/**
+ * Update the .maxValue property
+ * @method updateMaxValue
+ */
+Heightfield.prototype.updateMaxValue = function(){
+    var data = this.data;
+    var maxValue = data[0][0];
+    for(var i=0; i !== data.length; i++){
+        for(var j=0; j !== data[i].length; j++){
+            var v = data[i][j];
+            if(v > maxValue){
+                maxValue = v;
+            }
+        }
+    }
+    this.maxValue = maxValue;
+};
+
+/**
+ * Set the height value at an index. Don't forget to update maxValue and minValue after you're done.
+ * @method setHeightValueAtIndex
+ * @param {integer} xi
+ * @param {integer} yi
+ * @param {number} value
+ */
+Heightfield.prototype.setHeightValueAtIndex = function(xi, yi, value){
+    var data = this.data;
+    data[xi][yi] = value;
+
+    // Invalidate cache
+    this.clearCachedConvexTrianglePillar(xi, yi, false);
+    if(xi > 0){
+        this.clearCachedConvexTrianglePillar(xi - 1, yi, true);
+        this.clearCachedConvexTrianglePillar(xi - 1, yi, false);
+    }
+    if(yi > 0){
+        this.clearCachedConvexTrianglePillar(xi, yi - 1, true);
+        this.clearCachedConvexTrianglePillar(xi, yi - 1, false);
+    }
+    if(yi > 0 && xi > 0){
+        this.clearCachedConvexTrianglePillar(xi - 1, yi - 1, true);
+    }
+};
+
+/**
+ * Get max/min in a rectangle in the matrix data
+ * @method getRectMinMax
+ * @param  {integer} iMinX
+ * @param  {integer} iMinY
+ * @param  {integer} iMaxX
+ * @param  {integer} iMaxY
+ * @param  {array} [result] An array to store the results in.
+ * @return {array} The result array, if it was passed in. Minimum will be at position 0 and max at 1.
+ */
+Heightfield.prototype.getRectMinMax = function (iMinX, iMinY, iMaxX, iMaxY, result) {
+    result = result || [];
+
+    // Get max and min of the data
+    var data = this.data,
+        max = this.minValue; // Set first value
+    for(var i = iMinX; i <= iMaxX; i++){
+        for(var j = iMinY; j <= iMaxY; j++){
+            var height = data[i][j];
+            if(height > max){
+                max = height;
+            }
+        }
+    }
+
+    result[0] = this.minValue;
+    result[1] = max;
+};
+
+
+
+/**
+ * Get the index of a local position on the heightfield. The indexes indicate the rectangles, so if your terrain is made of N x N height data points, you will have rectangle indexes ranging from 0 to N-1.
+ * @method getIndexOfPosition
+ * @param  {number} x
+ * @param  {number} y
+ * @param  {array} result Two-element array
+ * @param  {boolean} clamp If the position should be clamped to the heightfield edge.
+ * @return {boolean}
+ */
+Heightfield.prototype.getIndexOfPosition = function (x, y, result, clamp) {
+
+    // Get the index of the data points to test against
+    var w = this.elementSize;
+    var data = this.data;
+    var xi = Math.floor(x / w);
+    var yi = Math.floor(y / w);
+
+    result[0] = xi;
+    result[1] = yi;
+
+    if(clamp){
+        // Clamp index to edges
+        if(xi < 0){ xi = 0; }
+        if(yi < 0){ yi = 0; }
+        if(xi >= data.length - 1){ xi = data.length - 1; }
+        if(yi >= data[0].length - 1){ yi = data[0].length - 1; }
+    }
+
+    // Bail out if we are out of the terrain
+    if(xi < 0 || yi < 0 || xi >= data.length-1 || yi >= data[0].length-1){
+        return false;
+    }
+
+    return true;
+};
+
+
+var getHeightAt_idx = [];
+var getHeightAt_weights = new Vec3();
+var getHeightAt_a = new Vec3();
+var getHeightAt_b = new Vec3();
+var getHeightAt_c = new Vec3();
+
+Heightfield.prototype.getTriangleAt = function(x, y, edgeClamp, a, b, c){
+    var idx = getHeightAt_idx;
+    this.getIndexOfPosition(x, y, idx, edgeClamp);
+    var xi = idx[0];
+    var yi = idx[1];
+
+    var data = this.data;
+    if(edgeClamp){
+        xi = Math.min(data.length - 2, Math.max(0, xi));
+        yi = Math.min(data[0].length - 2, Math.max(0, yi));
+    }
+
+    var elementSize = this.elementSize;
+    var lowerDist2 = Math.pow(x / elementSize - xi, 2) + Math.pow(y / elementSize - yi, 2);
+    var upperDist2 = Math.pow(x / elementSize - (xi + 1), 2) + Math.pow(y / elementSize - (yi + 1), 2);
+    var upper = lowerDist2 > upperDist2;
+    this.getTriangle(xi, yi, upper, a, b, c);
+    return upper;
+};
+
+var getNormalAt_a = new Vec3();
+var getNormalAt_b = new Vec3();
+var getNormalAt_c = new Vec3();
+var getNormalAt_e0 = new Vec3();
+var getNormalAt_e1 = new Vec3();
+Heightfield.prototype.getNormalAt = function(x, y, edgeClamp, result){
+    var a = getNormalAt_a;
+    var b = getNormalAt_b;
+    var c = getNormalAt_c;
+    var e0 = getNormalAt_e0;
+    var e1 = getNormalAt_e1;
+    this.getTriangleAt(x, y, edgeClamp, a, b, c);
+    b.vsub(a, e0);
+    c.vsub(a, e1);
+    e0.cross(e1, result);
+    result.normalize();
+};
+
+
+/**
+ * Get an AABB of a square in the heightfield
+ * @param  {number} xi
+ * @param  {number} yi
+ * @param  {AABB} result
+ */
+Heightfield.prototype.getAabbAtIndex = function(xi, yi, result){
+    var data = this.data;
+    var elementSize = this.elementSize;
+
+    result.lowerBound.set(
+        xi * elementSize,
+        yi * elementSize,
+        data[xi][yi]
+    );
+    result.upperBound.set(
+        (xi + 1) * elementSize,
+        (yi + 1) * elementSize,
+        data[xi + 1][yi + 1]
+    );
+};
+
+
+/**
+ * Get the height in the heightfield at a given position
+ * @param  {number} x
+ * @param  {number} y
+ * @param  {boolean} edgeClamp
+ * @return {number}
+ */
+Heightfield.prototype.getHeightAt = function(x, y, edgeClamp){
+    var data = this.data;
+    var a = getHeightAt_a;
+    var b = getHeightAt_b;
+    var c = getHeightAt_c;
+    var idx = getHeightAt_idx;
+
+    this.getIndexOfPosition(x, y, idx, edgeClamp);
+    var xi = idx[0];
+    var yi = idx[1];
+    if(edgeClamp){
+        xi = Math.min(data.length - 2, Math.max(0, xi));
+        yi = Math.min(data[0].length - 2, Math.max(0, yi));
+    }
+    var upper = this.getTriangleAt(x, y, edgeClamp, a, b, c);
+    barycentricWeights(x, y, a.x, a.y, b.x, b.y, c.x, c.y, getHeightAt_weights);
+
+    var w = getHeightAt_weights;
+
+    if(upper){
+
+        // Top triangle verts
+        return data[xi + 1][yi + 1] * w.x + data[xi][yi + 1] * w.y + data[xi + 1][yi] * w.z;
+
+    } else {
+
+        // Top triangle verts
+        return data[xi][yi] * w.x + data[xi + 1][yi] * w.y + data[xi][yi + 1] * w.z;
+    }
+};
+
+// from https://en.wikipedia.org/wiki/Barycentric_coordinate_system
+function barycentricWeights(x, y, ax, ay, bx, by, cx, cy, result){
+    result.x = ((by - cy) * (x - cx) + (cx - bx) * (y - cy)) / ((by - cy) * (ax - cx) + (cx - bx) * (ay - cy));
+    result.y = ((cy - ay) * (x - cx) + (ax - cx) * (y - cy)) / ((by - cy) * (ax - cx) + (cx - bx) * (ay - cy));
+    result.z = 1 - result.x - result.y;
+}
+
+Heightfield.prototype.getCacheConvexTrianglePillarKey = function(xi, yi, getUpperTriangle){
+    return xi + '_' + yi + '_' + (getUpperTriangle ? 1 : 0);
+};
+
+Heightfield.prototype.getCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    return this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];
+};
+
+Heightfield.prototype.setCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle, convex, offset){
+    this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)] = {
+        convex: convex,
+        offset: offset
+    };
+};
+
+Heightfield.prototype.clearCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];
+};
+
+/**
+ * Get a triangle from the heightfield
+ * @param  {number} xi
+ * @param  {number} yi
+ * @param  {boolean} upper
+ * @param  {Vec3} a
+ * @param  {Vec3} b
+ * @param  {Vec3} c
+ */
+Heightfield.prototype.getTriangle = function(xi, yi, upper, a, b, c){
+    var data = this.data;
+    var elementSize = this.elementSize;
+
+    if(upper){
+
+        // Top triangle verts
+        a.set(
+            (xi + 1) * elementSize,
+            (yi + 1) * elementSize,
+            data[xi + 1][yi + 1]
+        );
+        b.set(
+            xi * elementSize,
+            (yi + 1) * elementSize,
+            data[xi][yi + 1]
+        );
+        c.set(
+            (xi + 1) * elementSize,
+            yi * elementSize,
+            data[xi + 1][yi]
+        );
+
+    } else {
+
+        // Top triangle verts
+        a.set(
+            xi * elementSize,
+            yi * elementSize,
+            data[xi][yi]
+        );
+        b.set(
+            (xi + 1) * elementSize,
+            yi * elementSize,
+            data[xi + 1][yi]
+        );
+        c.set(
+            xi * elementSize,
+            (yi + 1) * elementSize,
+            data[xi][yi + 1]
+        );
+    }
+};
+
+/**
+ * Get a triangle in the terrain in the form of a triangular convex shape.
+ * @method getConvexTrianglePillar
+ * @param  {integer} i
+ * @param  {integer} j
+ * @param  {boolean} getUpperTriangle
+ */
+Heightfield.prototype.getConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    var result = this.pillarConvex;
+    var offsetResult = this.pillarOffset;
+
+    if(this.cacheEnabled){
+        var data = this.getCachedConvexTrianglePillar(xi, yi, getUpperTriangle);
+        if(data){
+            this.pillarConvex = data.convex;
+            this.pillarOffset = data.offset;
+            return;
+        }
+
+        result = new ConvexPolyhedron();
+        offsetResult = new Vec3();
+
+        this.pillarConvex = result;
+        this.pillarOffset = offsetResult;
+    }
+
+    var data = this.data;
+    var elementSize = this.elementSize;
+    var faces = result.faces;
+
+    // Reuse verts if possible
+    result.vertices.length = 6;
+    for (var i = 0; i < 6; i++) {
+        if(!result.vertices[i]){
+            result.vertices[i] = new Vec3();
+        }
+    }
+
+    // Reuse faces if possible
+    faces.length = 5;
+    for (var i = 0; i < 5; i++) {
+        if(!faces[i]){
+            faces[i] = [];
+        }
+    }
+
+    var verts = result.vertices;
+
+    var h = (Math.min(
+        data[xi][yi],
+        data[xi+1][yi],
+        data[xi][yi+1],
+        data[xi+1][yi+1]
+    ) - this.minValue ) / 2 + this.minValue;
+
+    if (!getUpperTriangle) {
+
+        // Center of the triangle pillar - all polygons are given relative to this one
+        offsetResult.set(
+            (xi + 0.25) * elementSize, // sort of center of a triangle
+            (yi + 0.25) * elementSize,
+            h // vertical center
+        );
+
+        // Top triangle verts
+        verts[0].set(
+            -0.25 * elementSize,
+            -0.25 * elementSize,
+            data[xi][yi] - h
+        );
+        verts[1].set(
+            0.75 * elementSize,
+            -0.25 * elementSize,
+            data[xi + 1][yi] - h
+        );
+        verts[2].set(
+            -0.25 * elementSize,
+            0.75 * elementSize,
+            data[xi][yi + 1] - h
+        );
+
+        // bottom triangle verts
+        verts[3].set(
+            -0.25 * elementSize,
+            -0.25 * elementSize,
+            -h-1
+        );
+        verts[4].set(
+            0.75 * elementSize,
+            -0.25 * elementSize,
+            -h-1
+        );
+        verts[5].set(
+            -0.25 * elementSize,
+            0.75  * elementSize,
+            -h-1
+        );
+
+        // top triangle
+        faces[0][0] = 0;
+        faces[0][1] = 1;
+        faces[0][2] = 2;
+
+        // bottom triangle
+        faces[1][0] = 5;
+        faces[1][1] = 4;
+        faces[1][2] = 3;
+
+        // -x facing quad
+        faces[2][0] = 0;
+        faces[2][1] = 2;
+        faces[2][2] = 5;
+        faces[2][3] = 3;
+
+        // -y facing quad
+        faces[3][0] = 1;
+        faces[3][1] = 0;
+        faces[3][2] = 3;
+        faces[3][3] = 4;
+
+        // +xy facing quad
+        faces[4][0] = 4;
+        faces[4][1] = 5;
+        faces[4][2] = 2;
+        faces[4][3] = 1;
+
+
+    } else {
+
+        // Center of the triangle pillar - all polygons are given relative to this one
+        offsetResult.set(
+            (xi + 0.75) * elementSize, // sort of center of a triangle
+            (yi + 0.75) * elementSize,
+            h // vertical center
+        );
+
+        // Top triangle verts
+        verts[0].set(
+            0.25 * elementSize,
+            0.25 * elementSize,
+            data[xi + 1][yi + 1] - h
+        );
+        verts[1].set(
+            -0.75 * elementSize,
+            0.25 * elementSize,
+            data[xi][yi + 1] - h
+        );
+        verts[2].set(
+            0.25 * elementSize,
+            -0.75 * elementSize,
+            data[xi + 1][yi] - h
+        );
+
+        // bottom triangle verts
+        verts[3].set(
+            0.25 * elementSize,
+            0.25 * elementSize,
+            - h-1
+        );
+        verts[4].set(
+            -0.75 * elementSize,
+            0.25 * elementSize,
+            - h-1
+        );
+        verts[5].set(
+            0.25 * elementSize,
+            -0.75 * elementSize,
+            - h-1
+        );
+
+        // Top triangle
+        faces[0][0] = 0;
+        faces[0][1] = 1;
+        faces[0][2] = 2;
+
+        // bottom triangle
+        faces[1][0] = 5;
+        faces[1][1] = 4;
+        faces[1][2] = 3;
+
+        // +x facing quad
+        faces[2][0] = 2;
+        faces[2][1] = 5;
+        faces[2][2] = 3;
+        faces[2][3] = 0;
+
+        // +y facing quad
+        faces[3][0] = 3;
+        faces[3][1] = 4;
+        faces[3][2] = 1;
+        faces[3][3] = 0;
+
+        // -xy facing quad
+        faces[4][0] = 1;
+        faces[4][1] = 4;
+        faces[4][2] = 5;
+        faces[4][3] = 2;
+    }
+
+    result.computeNormals();
+    result.computeEdges();
+    result.updateBoundingSphereRadius();
+
+    this.setCachedConvexTrianglePillar(xi, yi, getUpperTriangle, result, offsetResult);
+};
+
+Heightfield.prototype.calculateLocalInertia = function(mass, target){
+    target = target || new Vec3();
+    target.set(0, 0, 0);
+    return target;
+};
+
+Heightfield.prototype.volume = function(){
+    return Number.MAX_VALUE; // The terrain is infinite
+};
+
+Heightfield.prototype.calculateWorldAABB = function(pos, quat, min, max){
+    // TODO: do it properly
+    min.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
+    max.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
+};
+
+Heightfield.prototype.updateBoundingSphereRadius = function(){
+    // Use the bounding box of the min/max values
+    var data = this.data,
+        s = this.elementSize;
+    this.boundingSphereRadius = new Vec3(data.length * s, data[0].length * s, Math.max(Math.abs(this.maxValue), Math.abs(this.minValue))).norm();
+};
+
+/**
+ * Sets the height values from an image. Currently only supported in browser.
+ * @method setHeightsFromImage
+ * @param {Image} image
+ * @param {Vec3} scale
+ */
+Heightfield.prototype.setHeightsFromImage = function(image, scale){
+    var canvas = document.createElement('canvas');
+    canvas.width = image.width;
+    canvas.height = image.height;
+    var context = canvas.getContext('2d');
+    context.drawImage(image, 0, 0);
+    var imageData = context.getImageData(0, 0, image.width, image.height);
+
+    var matrix = this.data;
+    matrix.length = 0;
+    this.elementSize = Math.abs(scale.x) / imageData.width;
+    for(var i=0; i<imageData.height; i++){
+        var row = [];
+        for(var j=0; j<imageData.width; j++){
+            var a = imageData.data[(i*imageData.height + j) * 4];
+            var b = imageData.data[(i*imageData.height + j) * 4 + 1];
+            var c = imageData.data[(i*imageData.height + j) * 4 + 2];
+            var height = (a + b + c) / 4 / 255 * scale.z;
+            if(scale.x < 0){
+                row.push(height);
+            } else {
+                row.unshift(height);
+            }
+        }
+        if(scale.y < 0){
+            matrix.unshift(row);
+        } else {
+            matrix.push(row);
+        }
+    }
+    this.updateMaxValue();
+    this.updateMinValue();
+    this.update();
+};
+},{"../math/Vec3":46,"../utils/Utils":69,"./ConvexPolyhedron":54,"./Shape":59}],57:[function(require,module,exports){
+module.exports = Particle;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Particle shape.
+ * @class Particle
+ * @constructor
+ * @author schteppe
+ * @extends Shape
+ */
+function Particle(){
+    Shape.call(this);
+
+    this.type = Shape.types.PARTICLE;
+}
+Particle.prototype = new Shape();
+Particle.prototype.constructor = Particle;
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+Particle.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    target.set(0, 0, 0);
+    return target;
+};
+
+Particle.prototype.volume = function(){
+    return 0;
+};
+
+Particle.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = 0;
+};
+
+Particle.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    // Get each axis max
+    min.copy(pos);
+    max.copy(pos);
+};
+
+},{"../math/Vec3":46,"./Shape":59}],58:[function(require,module,exports){
+module.exports = Plane;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * A plane, facing in the Z direction. The plane has its surface at z=0 and everything below z=0 is assumed to be solid plane. To make the plane face in some other direction than z, you must put it inside a RigidBody and rotate that body. See the demos.
+ * @class Plane
+ * @constructor
+ * @extends Shape
+ * @author schteppe
+ */
+function Plane(){
+    Shape.call(this);
+    this.type = Shape.types.PLANE;
+
+    // World oriented normal
+    this.worldNormal = new Vec3();
+    this.worldNormalNeedsUpdate = true;
+
+    this.boundingSphereRadius = Number.MAX_VALUE;
+}
+Plane.prototype = new Shape();
+Plane.prototype.constructor = Plane;
+
+Plane.prototype.computeWorldNormal = function(quat){
+    var n = this.worldNormal;
+    n.set(0,0,1);
+    quat.vmult(n,n);
+    this.worldNormalNeedsUpdate = false;
+};
+
+Plane.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    return target;
+};
+
+Plane.prototype.volume = function(){
+    return Number.MAX_VALUE; // The plane is infinite...
+};
+
+var tempNormal = new Vec3();
+Plane.prototype.calculateWorldAABB = function(pos, quat, min, max){
+    // The plane AABB is infinite, except if the normal is pointing along any axis
+    tempNormal.set(0,0,1); // Default plane normal is z
+    quat.vmult(tempNormal,tempNormal);
+    var maxVal = Number.MAX_VALUE;
+    min.set(-maxVal, -maxVal, -maxVal);
+    max.set(maxVal, maxVal, maxVal);
+
+    if(tempNormal.x === 1){ max.x = pos.x; }
+    if(tempNormal.y === 1){ max.y = pos.y; }
+    if(tempNormal.z === 1){ max.z = pos.z; }
+
+    if(tempNormal.x === -1){ min.x = pos.x; }
+    if(tempNormal.y === -1){ min.y = pos.y; }
+    if(tempNormal.z === -1){ min.z = pos.z; }
+};
+
+Plane.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = Number.MAX_VALUE;
+};
+},{"../math/Vec3":46,"./Shape":59}],59:[function(require,module,exports){
+module.exports = Shape;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Material = require('../material/Material');
+
+/**
+ * Base class for shapes
+ * @class Shape
+ * @constructor
+ * @author schteppe
+ * @todo Should have a mechanism for caching bounding sphere radius instead of calculating it each time
+ */
+function Shape(){
+
+    /**
+     * Identifyer of the Shape.
+     * @property {number} id
+     */
+    this.id = Shape.idCounter++;
+
+    /**
+     * The type of this shape. Must be set to an int > 0 by subclasses.
+     * @property type
+     * @type {Number}
+     * @see Shape.types
+     */
+    this.type = 0;
+
+    /**
+     * The local bounding sphere radius of this shape.
+     * @property {Number} boundingSphereRadius
+     */
+    this.boundingSphereRadius = 0;
+
+    /**
+     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.
+     * @property {boolean} collisionResponse
+     */
+    this.collisionResponse = true;
+
+    /**
+     * @property {Material} material
+     */
+    this.material = null;
+
+    /**
+     * @property {Body} body
+     */
+    this.body = null;
+}
+Shape.prototype.constructor = Shape;
+
+/**
+ * Computes the bounding sphere radius. The result is stored in the property .boundingSphereRadius
+ * @method updateBoundingSphereRadius
+ */
+Shape.prototype.updateBoundingSphereRadius = function(){
+    throw "computeBoundingSphereRadius() not implemented for shape type "+this.type;
+};
+
+/**
+ * Get the volume of this shape
+ * @method volume
+ * @return {Number}
+ */
+Shape.prototype.volume = function(){
+    throw "volume() not implemented for shape type "+this.type;
+};
+
+/**
+ * Calculates the inertia in the local frame for this shape.
+ * @method calculateLocalInertia
+ * @param {Number} mass
+ * @param {Vec3} target
+ * @see http://en.wikipedia.org/wiki/List_of_moments_of_inertia
+ */
+Shape.prototype.calculateLocalInertia = function(mass,target){
+    throw "calculateLocalInertia() not implemented for shape type "+this.type;
+};
+
+Shape.idCounter = 0;
+
+/**
+ * The available shape types.
+ * @static
+ * @property types
+ * @type {Object}
+ */
+Shape.types = {
+    SPHERE:1,
+    PLANE:2,
+    BOX:4,
+    COMPOUND:8,
+    CONVEXPOLYHEDRON:16,
+    HEIGHTFIELD:32,
+    PARTICLE:64,
+    CYLINDER:128,
+    TRIMESH:256
+};
+
+
+},{"../material/Material":41,"../math/Quaternion":44,"../math/Vec3":46,"./Shape":59}],60:[function(require,module,exports){
+module.exports = Sphere;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Spherical shape
+ * @class Sphere
+ * @constructor
+ * @extends Shape
+ * @param {Number} radius The radius of the sphere, a non-negative number.
+ * @author schteppe / http://github.com/schteppe
+ */
+function Sphere(radius){
+    Shape.call(this);
+
+    /**
+     * @property {Number} radius
+     */
+    this.radius = radius!==undefined ? Number(radius) : 1.0;
+    this.type = Shape.types.SPHERE;
+
+    if(this.radius < 0){
+        throw new Error('The sphere radius cannot be negative.');
+    }
+
+    this.updateBoundingSphereRadius();
+}
+Sphere.prototype = new Shape();
+Sphere.prototype.constructor = Sphere;
+
+Sphere.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    var I = 2.0*mass*this.radius*this.radius/5.0;
+    target.x = I;
+    target.y = I;
+    target.z = I;
+    return target;
+};
+
+Sphere.prototype.volume = function(){
+    return 4.0 * Math.PI * this.radius / 3.0;
+};
+
+Sphere.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = this.radius;
+};
+
+Sphere.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    var r = this.radius;
+    var axes = ['x','y','z'];
+    for(var i=0; i<axes.length; i++){
+        var ax = axes[i];
+        min[ax] = pos[ax] - r;
+        max[ax] = pos[ax] + r;
+    }
+};
+
+},{"../math/Vec3":46,"./Shape":59}],61:[function(require,module,exports){
+module.exports = Trimesh;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+var AABB = require('../collision/AABB');
+var Octree = require('../utils/Octree');
+
+/**
+ * @class Trimesh
+ * @constructor
+ * @param {array} vertices
+ * @param {array} indices
+ * @extends Shape
+ * @example
+ *     // How to make a mesh with a single triangle
+ *     var vertices = [
+ *         0, 0, 0, // vertex 0
+ *         1, 0, 0, // vertex 1
+ *         0, 1, 0  // vertex 2
+ *     ];
+ *     var indices = [
+ *         0, 1, 2  // triangle 0
+ *     ];
+ *     var trimeshShape = new Trimesh(vertices, indices);
+ */
+function Trimesh(vertices, indices) {
+    Shape.call(this);
+    this.type = Shape.types.TRIMESH;
+
+    /**
+     * @property vertices
+     * @type {Array}
+     */
+    this.vertices = new Float32Array(vertices);
+
+    /**
+     * Array of integers, indicating which vertices each triangle consists of. The length of this array is thus 3 times the number of triangles.
+     * @property indices
+     * @type {Array}
+     */
+    this.indices = new Int16Array(indices);
+
+    /**
+     * The normals data.
+     * @property normals
+     * @type {Array}
+     */
+    this.normals = new Float32Array(indices.length);
+
+    /**
+     * The local AABB of the mesh.
+     * @property aabb
+     * @type {Array}
+     */
+    this.aabb = new AABB();
+
+    /**
+     * References to vertex pairs, making up all unique edges in the trimesh.
+     * @property {array} edges
+     */
+    this.edges = null;
+
+    /**
+     * Local scaling of the mesh. Use .setScale() to set it.
+     * @property {Vec3} scale
+     */
+    this.scale = new Vec3(1, 1, 1);
+
+    /**
+     * The indexed triangles. Use .updateTree() to update it.
+     * @property {Octree} tree
+     */
+    this.tree = new Octree();
+
+    this.updateEdges();
+    this.updateNormals();
+    this.updateAABB();
+    this.updateBoundingSphereRadius();
+    this.updateTree();
+}
+Trimesh.prototype = new Shape();
+Trimesh.prototype.constructor = Trimesh;
+
+var computeNormals_n = new Vec3();
+
+/**
+ * @method updateTree
+ */
+Trimesh.prototype.updateTree = function(){
+    var tree = this.tree;
+
+    tree.reset();
+    tree.aabb.copy(this.aabb);
+    var scale = this.scale; // The local mesh AABB is scaled, but the octree AABB should be unscaled
+    tree.aabb.lowerBound.x *= 1 / scale.x;
+    tree.aabb.lowerBound.y *= 1 / scale.y;
+    tree.aabb.lowerBound.z *= 1 / scale.z;
+    tree.aabb.upperBound.x *= 1 / scale.x;
+    tree.aabb.upperBound.y *= 1 / scale.y;
+    tree.aabb.upperBound.z *= 1 / scale.z;
+
+    // Insert all triangles
+    var triangleAABB = new AABB();
+    var a = new Vec3();
+    var b = new Vec3();
+    var c = new Vec3();
+    var points = [a, b, c];
+    for (var i = 0; i < this.indices.length / 3; i++) {
+        //this.getTriangleVertices(i, a, b, c);
+
+        // Get unscaled triangle verts
+        var i3 = i * 3;
+        this._getUnscaledVertex(this.indices[i3], a);
+        this._getUnscaledVertex(this.indices[i3 + 1], b);
+        this._getUnscaledVertex(this.indices[i3 + 2], c);
+
+        triangleAABB.setFromPoints(points);
+        tree.insert(triangleAABB, i);
+    }
+    tree.removeEmptyNodes();
+};
+
+var unscaledAABB = new AABB();
+
+/**
+ * Get triangles in a local AABB from the trimesh.
+ * @method getTrianglesInAABB
+ * @param  {AABB} aabb
+ * @param  {array} result An array of integers, referencing the queried triangles.
+ */
+Trimesh.prototype.getTrianglesInAABB = function(aabb, result){
+    unscaledAABB.copy(aabb);
+
+    // Scale it to local
+    var scale = this.scale;
+    var isx = scale.x;
+    var isy = scale.y;
+    var isz = scale.z;
+    var l = unscaledAABB.lowerBound;
+    var u = unscaledAABB.upperBound;
+    l.x /= isx;
+    l.y /= isy;
+    l.z /= isz;
+    u.x /= isx;
+    u.y /= isy;
+    u.z /= isz;
+
+    return this.tree.aabbQuery(unscaledAABB, result);
+};
+
+/**
+ * @method setScale
+ * @param {Vec3} scale
+ */
+Trimesh.prototype.setScale = function(scale){
+    var wasUniform = this.scale.x === this.scale.y === this.scale.z;
+    var isUniform = scale.x === scale.y === scale.z;
+
+    if(!(wasUniform && isUniform)){
+        // Non-uniform scaling. Need to update normals.
+        this.updateNormals();
+    }
+    this.scale.copy(scale);
+    this.updateAABB();
+    this.updateBoundingSphereRadius();
+};
+
+/**
+ * Compute the normals of the faces. Will save in the .normals array.
+ * @method updateNormals
+ */
+Trimesh.prototype.updateNormals = function(){
+    var n = computeNormals_n;
+
+    // Generate normals
+    var normals = this.normals;
+    for(var i=0; i < this.indices.length / 3; i++){
+        var i3 = i * 3;
+
+        var a = this.indices[i3],
+            b = this.indices[i3 + 1],
+            c = this.indices[i3 + 2];
+
+        this.getVertex(a, va);
+        this.getVertex(b, vb);
+        this.getVertex(c, vc);
+
+        Trimesh.computeNormal(vb, va, vc, n);
+
+        normals[i3] = n.x;
+        normals[i3 + 1] = n.y;
+        normals[i3 + 2] = n.z;
+    }
+};
+
+/**
+ * Update the .edges property
+ * @method updateEdges
+ */
+Trimesh.prototype.updateEdges = function(){
+    var edges = {};
+    var add = function(indexA, indexB){
+        var key = a < b ? a + '_' + b : b + '_' + a;
+        edges[key] = true;
+    };
+    for(var i=0; i < this.indices.length / 3; i++){
+        var i3 = i * 3;
+        var a = this.indices[i3],
+            b = this.indices[i3 + 1],
+            c = this.indices[i3 + 2];
+        add(a,b);
+        add(b,c);
+        add(c,a);
+    }
+    var keys = Object.keys(edges);
+    this.edges = new Int16Array(keys.length * 2);
+    for (var i = 0; i < keys.length; i++) {
+        var indices = keys[i].split('_');
+        this.edges[2 * i] = parseInt(indices[0], 10);
+        this.edges[2 * i + 1] = parseInt(indices[1], 10);
+    }
+};
+
+/**
+ * Get an edge vertex
+ * @method getEdgeVertex
+ * @param  {number} edgeIndex
+ * @param  {number} firstOrSecond 0 or 1, depending on which one of the vertices you need.
+ * @param  {Vec3} vertexStore Where to store the result
+ */
+Trimesh.prototype.getEdgeVertex = function(edgeIndex, firstOrSecond, vertexStore){
+    var vertexIndex = this.edges[edgeIndex * 2 + (firstOrSecond ? 1 : 0)];
+    this.getVertex(vertexIndex, vertexStore);
+};
+
+var getEdgeVector_va = new Vec3();
+var getEdgeVector_vb = new Vec3();
+
+/**
+ * Get a vector along an edge.
+ * @method getEdgeVector
+ * @param  {number} edgeIndex
+ * @param  {Vec3} vectorStore
+ */
+Trimesh.prototype.getEdgeVector = function(edgeIndex, vectorStore){
+    var va = getEdgeVector_va;
+    var vb = getEdgeVector_vb;
+    this.getEdgeVertex(edgeIndex, 0, va);
+    this.getEdgeVertex(edgeIndex, 1, vb);
+    vb.vsub(va, vectorStore);
+};
+
+/**
+ * Get face normal given 3 vertices
+ * @static
+ * @method computeNormal
+ * @param {Vec3} va
+ * @param {Vec3} vb
+ * @param {Vec3} vc
+ * @param {Vec3} target
+ */
+var cb = new Vec3();
+var ab = new Vec3();
+Trimesh.computeNormal = function ( va, vb, vc, target ) {
+    vb.vsub(va,ab);
+    vc.vsub(vb,cb);
+    cb.cross(ab,target);
+    if ( !target.isZero() ) {
+        target.normalize();
+    }
+};
+
+var va = new Vec3();
+var vb = new Vec3();
+var vc = new Vec3();
+
+/**
+ * Get vertex i.
+ * @method getVertex
+ * @param  {number} i
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype.getVertex = function(i, out){
+    var scale = this.scale;
+    this._getUnscaledVertex(i, out);
+    out.x *= scale.x;
+    out.y *= scale.y;
+    out.z *= scale.z;
+    return out;
+};
+
+/**
+ * Get raw vertex i
+ * @private
+ * @method _getUnscaledVertex
+ * @param  {number} i
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype._getUnscaledVertex = function(i, out){
+    var i3 = i * 3;
+    var vertices = this.vertices;
+    return out.set(
+        vertices[i3],
+        vertices[i3 + 1],
+        vertices[i3 + 2]
+    );
+};
+
+/**
+ * Get a vertex from the trimesh,transformed by the given position and quaternion.
+ * @method getWorldVertex
+ * @param  {number} i
+ * @param  {Vec3} pos
+ * @param  {Quaternion} quat
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype.getWorldVertex = function(i, pos, quat, out){
+    this.getVertex(i, out);
+    Transform.pointToWorldFrame(pos, quat, out, out);
+    return out;
+};
+
+/**
+ * Get the three vertices for triangle i.
+ * @method getTriangleVertices
+ * @param  {number} i
+ * @param  {Vec3} a
+ * @param  {Vec3} b
+ * @param  {Vec3} c
+ */
+Trimesh.prototype.getTriangleVertices = function(i, a, b, c){
+    var i3 = i * 3;
+    this.getVertex(this.indices[i3], a);
+    this.getVertex(this.indices[i3 + 1], b);
+    this.getVertex(this.indices[i3 + 2], c);
+};
+
+/**
+ * Compute the normal of triangle i.
+ * @method getNormal
+ * @param  {Number} i
+ * @param  {Vec3} target
+ * @return {Vec3} The "target" vector object
+ */
+Trimesh.prototype.getNormal = function(i, target){
+    var i3 = i * 3;
+    return target.set(
+        this.normals[i3],
+        this.normals[i3 + 1],
+        this.normals[i3 + 2]
+    );
+};
+
+var cli_aabb = new AABB();
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3} The "target" vector object
+ */
+Trimesh.prototype.calculateLocalInertia = function(mass,target){
+    // Approximate with box inertia
+    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it
+    this.computeLocalAABB(cli_aabb);
+    var x = cli_aabb.upperBound.x - cli_aabb.lowerBound.x,
+        y = cli_aabb.upperBound.y - cli_aabb.lowerBound.y,
+        z = cli_aabb.upperBound.z - cli_aabb.lowerBound.z;
+    return target.set(
+        1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z ),
+        1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z ),
+        1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x )
+    );
+};
+
+var computeLocalAABB_worldVert = new Vec3();
+
+/**
+ * Compute the local AABB for the trimesh
+ * @method computeLocalAABB
+ * @param  {AABB} aabb
+ */
+Trimesh.prototype.computeLocalAABB = function(aabb){
+    var l = aabb.lowerBound,
+        u = aabb.upperBound,
+        n = this.vertices.length,
+        vertices = this.vertices,
+        v = computeLocalAABB_worldVert;
+
+    this.getVertex(0, v);
+    l.copy(v);
+    u.copy(v);
+
+    for(var i=0; i !== n; i++){
+        this.getVertex(i, v);
+
+        if(v.x < l.x){
+            l.x = v.x;
+        } else if(v.x > u.x){
+            u.x = v.x;
+        }
+
+        if(v.y < l.y){
+            l.y = v.y;
+        } else if(v.y > u.y){
+            u.y = v.y;
+        }
+
+        if(v.z < l.z){
+            l.z = v.z;
+        } else if(v.z > u.z){
+            u.z = v.z;
+        }
+    }
+};
+
+
+/**
+ * Update the .aabb property
+ * @method updateAABB
+ */
+Trimesh.prototype.updateAABB = function(){
+    this.computeLocalAABB(this.aabb);
+};
+
+/**
+ * Will update the .boundingSphereRadius property
+ * @method updateBoundingSphereRadius
+ */
+Trimesh.prototype.updateBoundingSphereRadius = function(){
+    // Assume points are distributed with local (0,0,0) as center
+    var max2 = 0;
+    var vertices = this.vertices;
+    var v = new Vec3();
+    for(var i=0, N=vertices.length / 3; i !== N; i++) {
+        this.getVertex(i, v);
+        var norm2 = v.norm2();
+        if(norm2 > max2){
+            max2 = norm2;
+        }
+    }
+    this.boundingSphereRadius = Math.sqrt(max2);
+};
+
+var tempWorldVertex = new Vec3();
+var calculateWorldAABB_frame = new Transform();
+var calculateWorldAABB_aabb = new AABB();
+
+/**
+ * @method calculateWorldAABB
+ * @param {Vec3}        pos
+ * @param {Quaternion}  quat
+ * @param {Vec3}        min
+ * @param {Vec3}        max
+ */
+Trimesh.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    /*
+    var n = this.vertices.length / 3,
+        verts = this.vertices;
+    var minx,miny,minz,maxx,maxy,maxz;
+
+    var v = tempWorldVertex;
+    for(var i=0; i<n; i++){
+        this.getVertex(i, v);
+        quat.vmult(v, v);
+        pos.vadd(v, v);
+        if (v.x < minx || minx===undefined){
+            minx = v.x;
+        } else if(v.x > maxx || maxx===undefined){
+            maxx = v.x;
+        }
+
+        if (v.y < miny || miny===undefined){
+            miny = v.y;
+        } else if(v.y > maxy || maxy===undefined){
+            maxy = v.y;
+        }
+
+        if (v.z < minz || minz===undefined){
+            minz = v.z;
+        } else if(v.z > maxz || maxz===undefined){
+            maxz = v.z;
+        }
+    }
+    min.set(minx,miny,minz);
+    max.set(maxx,maxy,maxz);
+    */
+
+    // Faster approximation using local AABB
+    var frame = calculateWorldAABB_frame;
+    var result = calculateWorldAABB_aabb;
+    frame.position = pos;
+    frame.quaternion = quat;
+    this.aabb.toWorldFrame(frame, result);
+    min.copy(result.lowerBound);
+    max.copy(result.upperBound);
+};
+
+/**
+ * Get approximate volume
+ * @method volume
+ * @return {Number}
+ */
+Trimesh.prototype.volume = function(){
+    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;
+};
+
+/**
+ * Create a Trimesh instance, shaped as a torus.
+ * @static
+ * @method createTorus
+ * @param  {number} [radius=1]
+ * @param  {number} [tube=0.5]
+ * @param  {number} [radialSegments=8]
+ * @param  {number} [tubularSegments=6]
+ * @param  {number} [arc=6.283185307179586]
+ * @return {Trimesh} A torus
+ */
+Trimesh.createTorus = function (radius, tube, radialSegments, tubularSegments, arc) {
+    radius = radius || 1;
+    tube = tube || 0.5;
+    radialSegments = radialSegments || 8;
+    tubularSegments = tubularSegments || 6;
+    arc = arc || Math.PI * 2;
+
+    var vertices = [];
+    var indices = [];
+
+    for ( var j = 0; j <= radialSegments; j ++ ) {
+        for ( var i = 0; i <= tubularSegments; i ++ ) {
+            var u = i / tubularSegments * arc;
+            var v = j / radialSegments * Math.PI * 2;
+
+            var x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
+            var y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
+            var z = tube * Math.sin( v );
+
+            vertices.push( x, y, z );
+        }
+    }
+
+    for ( var j = 1; j <= radialSegments; j ++ ) {
+        for ( var i = 1; i <= tubularSegments; i ++ ) {
+            var a = ( tubularSegments + 1 ) * j + i - 1;
+            var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
+            var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
+            var d = ( tubularSegments + 1 ) * j + i;
+
+            indices.push(a, b, d);
+            indices.push(b, c, d);
+        }
+    }
+
+    return new Trimesh(vertices, indices);
+};
+
+},{"../collision/AABB":18,"../math/Quaternion":44,"../math/Transform":45,"../math/Vec3":46,"../utils/Octree":66,"./Shape":59}],62:[function(require,module,exports){
+module.exports = GSSolver;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('./Solver');
+
+/**
+ * Constraint equation Gauss-Seidel solver.
+ * @class GSSolver
+ * @constructor
+ * @todo The spook parameters should be specified for each constraint, not globally.
+ * @author schteppe / https://github.com/schteppe
+ * @see https://www8.cs.umu.se/kurser/5DV058/VT09/lectures/spooknotes.pdf
+ * @extends Solver
+ */
+function GSSolver(){
+    Solver.call(this);
+
+    /**
+     * The number of solver iterations determines quality of the constraints in the world. The more iterations, the more correct simulation. More iterations need more computations though. If you have a large gravity force in your world, you will need more iterations.
+     * @property iterations
+     * @type {Number}
+     * @todo write more about solver and iterations in the wiki
+     */
+    this.iterations = 10;
+
+    /**
+     * When tolerance is reached, the system is assumed to be converged.
+     * @property tolerance
+     * @type {Number}
+     */
+    this.tolerance = 1e-7;
+}
+GSSolver.prototype = new Solver();
+
+var GSSolver_solve_lambda = []; // Just temporary number holders that we want to reuse each solve.
+var GSSolver_solve_invCs = [];
+var GSSolver_solve_Bs = [];
+GSSolver.prototype.solve = function(dt,world){
+    var iter = 0,
+        maxIter = this.iterations,
+        tolSquared = this.tolerance*this.tolerance,
+        equations = this.equations,
+        Neq = equations.length,
+        bodies = world.bodies,
+        Nbodies = bodies.length,
+        h = dt,
+        q, B, invC, deltalambda, deltalambdaTot, GWlambda, lambdaj;
+
+    // Update solve mass
+    if(Neq !== 0){
+        for(var i=0; i!==Nbodies; i++){
+            bodies[i].updateSolveMassProperties();
+        }
+    }
+
+    // Things that does not change during iteration can be computed once
+    var invCs = GSSolver_solve_invCs,
+        Bs = GSSolver_solve_Bs,
+        lambda = GSSolver_solve_lambda;
+    invCs.length = Neq;
+    Bs.length = Neq;
+    lambda.length = Neq;
+    for(var i=0; i!==Neq; i++){
+        var c = equations[i];
+        lambda[i] = 0.0;
+        Bs[i] = c.computeB(h);
+        invCs[i] = 1.0 / c.computeC();
+    }
+
+    if(Neq !== 0){
+
+        // Reset vlambda
+        for(var i=0; i!==Nbodies; i++){
+            var b=bodies[i],
+                vlambda=b.vlambda,
+                wlambda=b.wlambda;
+            vlambda.set(0,0,0);
+            wlambda.set(0,0,0);
+        }
+
+        // Iterate over equations
+        for(iter=0; iter!==maxIter; iter++){
+
+            // Accumulate the total error for each iteration.
+            deltalambdaTot = 0.0;
+
+            for(var j=0; j!==Neq; j++){
+
+                var c = equations[j];
+
+                // Compute iteration
+                B = Bs[j];
+                invC = invCs[j];
+                lambdaj = lambda[j];
+                GWlambda = c.computeGWlambda();
+                deltalambda = invC * ( B - GWlambda - c.eps * lambdaj );
+
+                // Clamp if we are not within the min/max interval
+                if(lambdaj + deltalambda < c.minForce){
+                    deltalambda = c.minForce - lambdaj;
+                } else if(lambdaj + deltalambda > c.maxForce){
+                    deltalambda = c.maxForce - lambdaj;
+                }
+                lambda[j] += deltalambda;
+
+                deltalambdaTot += deltalambda > 0.0 ? deltalambda : -deltalambda; // abs(deltalambda)
+
+                c.addToWlambda(deltalambda);
+            }
+
+            // If the total error is small enough - stop iterate
+            if(deltalambdaTot*deltalambdaTot < tolSquared){
+                break;
+            }
+        }
+
+        // Add result to velocity
+        for(var i=0; i!==Nbodies; i++){
+            var b=bodies[i],
+                v=b.velocity,
+                w=b.angularVelocity;
+
+            b.vlambda.vmul(b.linearFactor, b.vlambda);
+            v.vadd(b.vlambda, v);
+
+            b.wlambda.vmul(b.angularFactor, b.wlambda);
+            w.vadd(b.wlambda, w);
+        }
+
+        // Set the .multiplier property of each equation
+        var l = equations.length;
+        var invDt = 1 / h;
+        while(l--){
+            equations[l].multiplier = lambda[l] * invDt;
+        }
+    }
+
+    return iter;
+};
+
+},{"../math/Quaternion":44,"../math/Vec3":46,"./Solver":63}],63:[function(require,module,exports){
+module.exports = Solver;
+
+/**
+ * Constraint equation solver base class.
+ * @class Solver
+ * @constructor
+ * @author schteppe / https://github.com/schteppe
+ */
+function Solver(){
+    /**
+     * All equations to be solved
+     * @property {Array} equations
+     */
+    this.equations = [];
+}
+
+/**
+ * Should be implemented in subclasses!
+ * @method solve
+ * @param  {Number} dt
+ * @param  {World} world
+ */
+Solver.prototype.solve = function(dt,world){
+    // Should return the number of iterations done!
+    return 0;
+};
+
+/**
+ * Add an equation
+ * @method addEquation
+ * @param {Equation} eq
+ */
+Solver.prototype.addEquation = function(eq){
+    if (eq.enabled) {
+        this.equations.push(eq);
+    }
+};
+
+/**
+ * Remove an equation
+ * @method removeEquation
+ * @param {Equation} eq
+ */
+Solver.prototype.removeEquation = function(eq){
+    var eqs = this.equations;
+    var i = eqs.indexOf(eq);
+    if(i !== -1){
+        eqs.splice(i,1);
+    }
+};
+
+/**
+ * Add all equations
+ * @method removeAllEquations
+ */
+Solver.prototype.removeAllEquations = function(){
+    this.equations.length = 0;
+};
+
+
+},{}],64:[function(require,module,exports){
+module.exports = SplitSolver;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('./Solver');
+var Body = require('../objects/Body');
+
+/**
+ * Splits the equations into islands and solves them independently. Can improve performance.
+ * @class SplitSolver
+ * @constructor
+ * @extends Solver
+ * @param {Solver} subsolver
+ */
+function SplitSolver(subsolver){
+    Solver.call(this);
+    this.iterations = 10;
+    this.tolerance = 1e-7;
+    this.subsolver = subsolver;
+    this.nodes = [];
+    this.nodePool = [];
+
+    // Create needed nodes, reuse if possible
+    while(this.nodePool.length < 128){
+        this.nodePool.push(this.createNode());
+    }
+}
+SplitSolver.prototype = new Solver();
+
+// Returns the number of subsystems
+var SplitSolver_solve_nodes = []; // All allocated node objects
+var SplitSolver_solve_nodePool = []; // All allocated node objects
+var SplitSolver_solve_eqs = [];   // Temp array
+var SplitSolver_solve_bds = [];   // Temp array
+var SplitSolver_solve_dummyWorld = {bodies:[]}; // Temp object
+
+var STATIC = Body.STATIC;
+function getUnvisitedNode(nodes){
+    var Nnodes = nodes.length;
+    for(var i=0; i!==Nnodes; i++){
+        var node = nodes[i];
+        if(!node.visited && !(node.body.type & STATIC)){
+            return node;
+        }
+    }
+    return false;
+}
+
+var queue = [];
+function bfs(root,visitFunc,bds,eqs){
+    queue.push(root);
+    root.visited = true;
+    visitFunc(root,bds,eqs);
+    while(queue.length) {
+        var node = queue.pop();
+        // Loop over unvisited child nodes
+        var child;
+        while((child = getUnvisitedNode(node.children))) {
+            child.visited = true;
+            visitFunc(child,bds,eqs);
+            queue.push(child);
+        }
+    }
+}
+
+function visitFunc(node,bds,eqs){
+    bds.push(node.body);
+    var Neqs = node.eqs.length;
+    for(var i=0; i!==Neqs; i++){
+        var eq = node.eqs[i];
+        if(eqs.indexOf(eq) === -1){
+            eqs.push(eq);
+        }
+    }
+}
+
+SplitSolver.prototype.createNode = function(){
+    return { body:null, children:[], eqs:[], visited:false };
+};
+
+/**
+ * Solve the subsystems
+ * @method solve
+ * @param  {Number} dt
+ * @param  {World} world
+ */
+SplitSolver.prototype.solve = function(dt,world){
+    var nodes=SplitSolver_solve_nodes,
+        nodePool=this.nodePool,
+        bodies=world.bodies,
+        equations=this.equations,
+        Neq=equations.length,
+        Nbodies=bodies.length,
+        subsolver=this.subsolver;
+
+    // Create needed nodes, reuse if possible
+    while(nodePool.length < Nbodies){
+        nodePool.push(this.createNode());
+    }
+    nodes.length = Nbodies;
+    for (var i = 0; i < Nbodies; i++) {
+        nodes[i] = nodePool[i];
+    }
+
+    // Reset node values
+    for(var i=0; i!==Nbodies; i++){
+        var node = nodes[i];
+        node.body = bodies[i];
+        node.children.length = 0;
+        node.eqs.length = 0;
+        node.visited = false;
+    }
+    for(var k=0; k!==Neq; k++){
+        var eq=equations[k],
+            i=bodies.indexOf(eq.bi),
+            j=bodies.indexOf(eq.bj),
+            ni=nodes[i],
+            nj=nodes[j];
+        ni.children.push(nj);
+        ni.eqs.push(eq);
+        nj.children.push(ni);
+        nj.eqs.push(eq);
+    }
+
+    var child, n=0, eqs=SplitSolver_solve_eqs;
+
+    subsolver.tolerance = this.tolerance;
+    subsolver.iterations = this.iterations;
+
+    var dummyWorld = SplitSolver_solve_dummyWorld;
+    while((child = getUnvisitedNode(nodes))){
+        eqs.length = 0;
+        dummyWorld.bodies.length = 0;
+        bfs(child, visitFunc, dummyWorld.bodies, eqs);
+
+        var Neqs = eqs.length;
+
+        eqs = eqs.sort(sortById);
+
+        for(var i=0; i!==Neqs; i++){
+            subsolver.addEquation(eqs[i]);
+        }
+
+        var iter = subsolver.solve(dt,dummyWorld);
+        subsolver.removeAllEquations();
+        n++;
+    }
+
+    return n;
+};
+
+function sortById(a, b){
+    return b.id - a.id;
+}
+},{"../math/Quaternion":44,"../math/Vec3":46,"../objects/Body":47,"./Solver":63}],65:[function(require,module,exports){
+/**
+ * Base class for objects that dispatches events.
+ * @class EventTarget
+ * @constructor
+ */
+var EventTarget = function () {
+
+};
+
+module.exports = EventTarget;
+
+EventTarget.prototype = {
+    constructor: EventTarget,
+
+    /**
+     * Add an event listener
+     * @method addEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {EventTarget} The self object, for chainability.
+     */
+    addEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ this._listeners = {}; }
+        var listeners = this._listeners;
+        if ( listeners[ type ] === undefined ) {
+            listeners[ type ] = [];
+        }
+        if ( listeners[ type ].indexOf( listener ) === - 1 ) {
+            listeners[ type ].push( listener );
+        }
+        return this;
+    },
+
+    /**
+     * Check if an event listener is added
+     * @method hasEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {Boolean}
+     */
+    hasEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ return false; }
+        var listeners = this._listeners;
+        if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * Check if any event listener of the given type is added
+     * @method hasAnyEventListener
+     * @param  {String} type
+     * @return {Boolean}
+     */
+    hasAnyEventListener: function ( type ) {
+        if ( this._listeners === undefined ){ return false; }
+        var listeners = this._listeners;
+        return ( listeners[ type ] !== undefined );
+    },
+
+    /**
+     * Remove an event listener
+     * @method removeEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {EventTarget} The self object, for chainability.
+     */
+    removeEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ return this; }
+        var listeners = this._listeners;
+        if ( listeners[type] === undefined ){ return this; }
+        var index = listeners[ type ].indexOf( listener );
+        if ( index !== - 1 ) {
+            listeners[ type ].splice( index, 1 );
+        }
+        return this;
+    },
+
+    /**
+     * Emit an event.
+     * @method dispatchEvent
+     * @param  {Object} event
+     * @param  {String} event.type
+     * @return {EventTarget} The self object, for chainability.
+     */
+    dispatchEvent: function ( event ) {
+        if ( this._listeners === undefined ){ return this; }
+        var listeners = this._listeners;
+        var listenerArray = listeners[ event.type ];
+        if ( listenerArray !== undefined ) {
+            event.target = this;
+            for ( var i = 0, l = listenerArray.length; i < l; i ++ ) {
+                listenerArray[ i ].call( this, event );
+            }
+        }
+        return this;
+    }
+};
+
+},{}],66:[function(require,module,exports){
+var AABB = require('../collision/AABB');
+var Vec3 = require('../math/Vec3');
+
+module.exports = Octree;
+
+/**
+ * @class OctreeNode
+ * @param {object} [options]
+ * @param {Octree} [options.root]
+ * @param {AABB} [options.aabb]
+ */
+function OctreeNode(options){
+    options = options || {};
+
+    /**
+     * The root node
+     * @property {OctreeNode} root
+     */
+    this.root = options.root || null;
+
+    /**
+     * Boundary of this node
+     * @property {AABB} aabb
+     */
+    this.aabb = options.aabb ? options.aabb.clone() : new AABB();
+
+    /**
+     * Contained data at the current node level.
+     * @property {Array} data
+     */
+    this.data = [];
+
+    /**
+     * Children to this node
+     * @property {Array} children
+     */
+    this.children = [];
+}
+
+/**
+ * @class Octree
+ * @param {AABB} aabb The total AABB of the tree
+ * @param {object} [options]
+ * @param {number} [options.maxDepth=8]
+ * @extends OctreeNode
+ */
+function Octree(aabb, options){
+    options = options || {};
+    options.root = null;
+    options.aabb = aabb;
+    OctreeNode.call(this, options);
+
+    /**
+     * Maximum subdivision depth
+     * @property {number} maxDepth
+     */
+    this.maxDepth = typeof(options.maxDepth) !== 'undefined' ? options.maxDepth : 8;
+}
+Octree.prototype = new OctreeNode();
+
+OctreeNode.prototype.reset = function(aabb, options){
+    this.children.length = this.data.length = 0;
+};
+
+/**
+ * Insert data into this node
+ * @method insert
+ * @param  {AABB} aabb
+ * @param  {object} elementData
+ * @return {boolean} True if successful, otherwise false
+ */
+OctreeNode.prototype.insert = function(aabb, elementData, level){
+    var nodeData = this.data;
+    level = level || 0;
+
+    // Ignore objects that do not belong in this node
+    if (!this.aabb.contains(aabb)){
+        return false; // object cannot be added
+    }
+
+    var children = this.children;
+
+    if(level < (this.maxDepth || this.root.maxDepth)){
+        // Subdivide if there are no children yet
+        var subdivided = false;
+        if (!children.length){
+            this.subdivide();
+            subdivided = true;
+        }
+
+        // add to whichever node will accept it
+        for (var i = 0; i !== 8; i++) {
+            if (children[i].insert(aabb, elementData, level + 1)){
+                return true;
+            }
+        }
+
+        if(subdivided){
+            // No children accepted! Might as well just remove em since they contain none
+            children.length = 0;
+        }
+    }
+
+    // Too deep, or children didnt want it. add it in current node
+    nodeData.push(elementData);
+
+    return true;
+};
+
+var halfDiagonal = new Vec3();
+
+/**
+ * Create 8 equally sized children nodes and put them in the .children array.
+ * @method subdivide
+ */
+OctreeNode.prototype.subdivide = function() {
+    var aabb = this.aabb;
+    var l = aabb.lowerBound;
+    var u = aabb.upperBound;
+
+    var children = this.children;
+
+    children.push(
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,0) }) })
+    );
+
+    u.vsub(l, halfDiagonal);
+    halfDiagonal.scale(0.5, halfDiagonal);
+
+    var root = this.root || this;
+
+    for (var i = 0; i !== 8; i++) {
+        var child = children[i];
+
+        // Set current node as root
+        child.root = root;
+
+        // Compute bounds
+        var lowerBound = child.aabb.lowerBound;
+        lowerBound.x *= halfDiagonal.x;
+        lowerBound.y *= halfDiagonal.y;
+        lowerBound.z *= halfDiagonal.z;
+
+        lowerBound.vadd(l, lowerBound);
+
+        // Upper bound is always lower bound + halfDiagonal
+        lowerBound.vadd(halfDiagonal, child.aabb.upperBound);
+    }
+};
+
+/**
+ * Get all data, potentially within an AABB
+ * @method aabbQuery
+ * @param  {AABB} aabb
+ * @param  {array} result
+ * @return {array} The "result" object
+ */
+OctreeNode.prototype.aabbQuery = function(aabb, result) {
+
+    var nodeData = this.data;
+
+    // abort if the range does not intersect this node
+    // if (!this.aabb.overlaps(aabb)){
+    //     return result;
+    // }
+
+    // Add objects at this level
+    // Array.prototype.push.apply(result, nodeData);
+
+    // Add child data
+    // @todo unwrap recursion into a queue / loop, that's faster in JS
+    var children = this.children;
+
+
+    // for (var i = 0, N = this.children.length; i !== N; i++) {
+    //     children[i].aabbQuery(aabb, result);
+    // }
+
+    var queue = [this];
+    while (queue.length) {
+        var node = queue.pop();
+        if (node.aabb.overlaps(aabb)){
+            Array.prototype.push.apply(result, node.data);
+        }
+        Array.prototype.push.apply(queue, node.children);
+    }
+
+    return result;
+};
+
+var tmpAABB = new AABB();
+
+/**
+ * Get all data, potentially intersected by a ray.
+ * @method rayQuery
+ * @param  {Ray} ray
+ * @param  {Transform} treeTransform
+ * @param  {array} result
+ * @return {array} The "result" object
+ */
+OctreeNode.prototype.rayQuery = function(ray, treeTransform, result) {
+
+    // Use aabb query for now.
+    // @todo implement real ray query which needs less lookups
+    ray.getAABB(tmpAABB);
+    tmpAABB.toLocalFrame(treeTransform, tmpAABB);
+    this.aabbQuery(tmpAABB, result);
+
+    return result;
+};
+
+/**
+ * @method removeEmptyNodes
+ */
+OctreeNode.prototype.removeEmptyNodes = function() {
+    var queue = [this];
+    while (queue.length) {
+        var node = queue.pop();
+        for (var i = node.children.length - 1; i >= 0; i--) {
+            if(!node.children[i].data.length){
+                node.children.splice(i, 1);
+            }
+        }
+        Array.prototype.push.apply(queue, node.children);
+    }
+};
+
+},{"../collision/AABB":18,"../math/Vec3":46}],67:[function(require,module,exports){
+module.exports = Pool;
+
+/**
+ * For pooling objects that can be reused.
+ * @class Pool
+ * @constructor
+ */
+function Pool(){
+    /**
+     * The pooled objects
+     * @property {Array} objects
+     */
+    this.objects = [];
+
+    /**
+     * Constructor of the objects
+     * @property {mixed} type
+     */
+    this.type = Object;
+}
+
+/**
+ * Release an object after use
+ * @method release
+ * @param {Object} obj
+ */
+Pool.prototype.release = function(){
+    var Nargs = arguments.length;
+    for(var i=0; i!==Nargs; i++){
+        this.objects.push(arguments[i]);
+    }
+    return this;
+};
+
+/**
+ * Get an object
+ * @method get
+ * @return {mixed}
+ */
+Pool.prototype.get = function(){
+    if(this.objects.length===0){
+        return this.constructObject();
+    } else {
+        return this.objects.pop();
+    }
+};
+
+/**
+ * Construct an object. Should be implmented in each subclass.
+ * @method constructObject
+ * @return {mixed}
+ */
+Pool.prototype.constructObject = function(){
+    throw new Error("constructObject() not implemented in this Pool subclass yet!");
+};
+
+/**
+ * @method resize
+ * @param {number} size
+ * @return {Pool} Self, for chaining
+ */
+Pool.prototype.resize = function (size) {
+    var objects = this.objects;
+
+    while (objects.length > size) {
+        objects.pop();
+    }
+
+    while (objects.length < size) {
+        objects.push(this.constructObject());
+    }
+
+    return this;
+};
+
+
+},{}],68:[function(require,module,exports){
+module.exports = TupleDictionary;
+
+/**
+ * @class TupleDictionary
+ * @constructor
+ */
+function TupleDictionary() {
+
+    /**
+     * The data storage
+     * @property data
+     * @type {Object}
+     */
+    this.data = { keys:[] };
+}
+
+/**
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+TupleDictionary.prototype.get = function(i, j) {
+    if (i > j) {
+        // swap
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return this.data[i+'-'+j];
+};
+
+/**
+ * @method set
+ * @param  {Number} i
+ * @param  {Number} j
+ * @param {Number} value
+ */
+TupleDictionary.prototype.set = function(i, j, value) {
+    if (i > j) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    var key = i+'-'+j;
+
+    // Check if key already exists
+    if(!this.get(i,j)){
+        this.data.keys.push(key);
+    }
+
+    this.data[key] = value;
+};
+
+/**
+ * @method reset
+ */
+TupleDictionary.prototype.reset = function() {
+    var data = this.data,
+        keys = data.keys;
+    while(keys.length > 0){
+        var key = keys.pop();
+        delete data[key];
+    }
+};
+
+},{}],69:[function(require,module,exports){
+function Utils(){}
+
+module.exports = Utils;
+
+/**
+ * Extend an options object with default values.
+ * @static
+ * @method defaults
+ * @param  {object} options The options object. May be falsy: in this case, a new object is created and returned.
+ * @param  {object} defaults An object containing default values.
+ * @return {object} The modified options object.
+ */
+Utils.defaults = function(options, defaults){
+    options = options || {};
+
+    for(var key in defaults){
+        if(!(key in options)){
+            options[key] = defaults[key];
+        }
+    }
+
+    return options;
+};
+
+},{}],70:[function(require,module,exports){
+module.exports = Vec3Pool;
+
+var Vec3 = require('../math/Vec3');
+var Pool = require('./Pool');
+
+/**
+ * @class Vec3Pool
+ * @constructor
+ * @extends Pool
+ */
+function Vec3Pool(){
+    Pool.call(this);
+    this.type = Vec3;
+}
+Vec3Pool.prototype = new Pool();
+
+/**
+ * Construct a vector
+ * @method constructObject
+ * @return {Vec3}
+ */
+Vec3Pool.prototype.constructObject = function(){
+    return new Vec3();
+};
+
+},{"../math/Vec3":46,"./Pool":67}],71:[function(require,module,exports){
+module.exports = Narrowphase;
+
+var AABB = require('../collision/AABB');
+var Body = require('../objects/Body');
+var Shape = require('../shapes/Shape');
+var Ray = require('../collision/Ray');
+var Vec3 = require('../math/Vec3');
+var Transform = require('../math/Transform');
+var ConvexPolyhedron = require('../shapes/ConvexPolyhedron');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('../solver/Solver');
+var Vec3Pool = require('../utils/Vec3Pool');
+var ContactEquation = require('../equations/ContactEquation');
+var FrictionEquation = require('../equations/FrictionEquation');
+
+/**
+ * Helper class for the World. Generates ContactEquations.
+ * @class Narrowphase
+ * @constructor
+ * @todo Sphere-ConvexPolyhedron contacts
+ * @todo Contact reduction
+ * @todo  should move methods to prototype
+ */
+function Narrowphase(world){
+
+    /**
+     * Internal storage of pooled contact points.
+     * @property {Array} contactPointPool
+     */
+    this.contactPointPool = [];
+
+    this.frictionEquationPool = [];
+
+    this.result = [];
+    this.frictionResult = [];
+
+    /**
+     * Pooled vectors.
+     * @property {Vec3Pool} v3pool
+     */
+    this.v3pool = new Vec3Pool();
+
+    this.world = world;
+    this.currentContactMaterial = null;
+
+    /**
+     * @property {Boolean} enableFrictionReduction
+     */
+    this.enableFrictionReduction = false;
+}
+
+/**
+ * Make a contact object, by using the internal pool or creating a new one.
+ * @method createContactEquation
+ * @param {Body} bi
+ * @param {Body} bj
+ * @param {Shape} si
+ * @param {Shape} sj
+ * @param {Shape} overrideShapeA
+ * @param {Shape} overrideShapeB
+ * @return {ContactEquation}
+ */
+Narrowphase.prototype.createContactEquation = function(bi, bj, si, sj, overrideShapeA, overrideShapeB){
+    var c;
+    if(this.contactPointPool.length){
+        c = this.contactPointPool.pop();
+        c.bi = bi;
+        c.bj = bj;
+    } else {
+        c = new ContactEquation(bi, bj);
+    }
+
+    c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;
+
+    var cm = this.currentContactMaterial;
+
+    c.restitution = cm.restitution;
+
+    c.setSpookParams(
+        cm.contactEquationStiffness,
+        cm.contactEquationRelaxation,
+        this.world.dt
+    );
+
+    var matA = si.material || bi.material;
+    var matB = sj.material || bj.material;
+    if(matA && matB && matA.restitution >= 0 && matB.restitution >= 0){
+        c.restitution = matA.restitution * matB.restitution;
+    }
+
+    c.si = overrideShapeA || si;
+    c.sj = overrideShapeB || sj;
+
+    return c;
+};
+
+Narrowphase.prototype.createFrictionEquationsFromContact = function(contactEquation, outArray){
+    var bodyA = contactEquation.bi;
+    var bodyB = contactEquation.bj;
+    var shapeA = contactEquation.si;
+    var shapeB = contactEquation.sj;
+
+    var world = this.world;
+    var cm = this.currentContactMaterial;
+
+    // If friction or restitution were specified in the material, use them
+    var friction = cm.friction;
+    var matA = shapeA.material || bodyA.material;
+    var matB = shapeB.material || bodyB.material;
+    if(matA && matB && matA.friction >= 0 && matB.friction >= 0){
+        friction = matA.friction * matB.friction;
+    }
+
+    if(friction > 0){
+
+        // Create 2 tangent equations
+        var mug = friction * world.gravity.length();
+        var reducedMass = (bodyA.invMass + bodyB.invMass);
+        if(reducedMass > 0){
+            reducedMass = 1/reducedMass;
+        }
+        var pool = this.frictionEquationPool;
+        var c1 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);
+        var c2 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);
+
+        c1.bi = c2.bi = bodyA;
+        c1.bj = c2.bj = bodyB;
+        c1.minForce = c2.minForce = -mug*reducedMass;
+        c1.maxForce = c2.maxForce = mug*reducedMass;
+
+        // Copy over the relative vectors
+        c1.ri.copy(contactEquation.ri);
+        c1.rj.copy(contactEquation.rj);
+        c2.ri.copy(contactEquation.ri);
+        c2.rj.copy(contactEquation.rj);
+
+        // Construct tangents
+        contactEquation.ni.tangents(c1.t, c2.t);
+
+        // Set spook params
+        c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);
+        c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);
+
+        c1.enabled = c2.enabled = contactEquation.enabled;
+
+        outArray.push(c1, c2);
+
+        return true;
+    }
+
+    return false;
+};
+
+var averageNormal = new Vec3();
+var averageContactPointA = new Vec3();
+var averageContactPointB = new Vec3();
+
+// Take the average N latest contact point on the plane.
+Narrowphase.prototype.createFrictionFromAverage = function(numContacts){
+    // The last contactEquation
+    var c = this.result[this.result.length - 1];
+
+    // Create the result: two "average" friction equations
+    if (!this.createFrictionEquationsFromContact(c, this.frictionResult) || numContacts === 1) {
+        return;
+    }
+
+    var f1 = this.frictionResult[this.frictionResult.length - 2];
+    var f2 = this.frictionResult[this.frictionResult.length - 1];
+
+    averageNormal.setZero();
+    averageContactPointA.setZero();
+    averageContactPointB.setZero();
+
+    var bodyA = c.bi;
+    var bodyB = c.bj;
+    for(var i=0; i!==numContacts; i++){
+        c = this.result[this.result.length - 1 - i];
+        if(c.bodyA !== bodyA){
+            averageNormal.vadd(c.ni, averageNormal);
+            averageContactPointA.vadd(c.ri, averageContactPointA);
+            averageContactPointB.vadd(c.rj, averageContactPointB);
+        } else {
+            averageNormal.vsub(c.ni, averageNormal);
+            averageContactPointA.vadd(c.rj, averageContactPointA);
+            averageContactPointB.vadd(c.ri, averageContactPointB);
+        }
+    }
+
+    var invNumContacts = 1 / numContacts;
+    averageContactPointA.scale(invNumContacts, f1.ri);
+    averageContactPointB.scale(invNumContacts, f1.rj);
+    f2.ri.copy(f1.ri); // Should be the same
+    f2.rj.copy(f1.rj);
+    averageNormal.normalize();
+    averageNormal.tangents(f1.t, f2.t);
+    // return eq;
+};
+
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+var tmpQuat1 = new Quaternion();
+var tmpQuat2 = new Quaternion();
+
+/**
+ * Generate all contacts between a list of body pairs
+ * @method getContacts
+ * @param {array} p1 Array of body indices
+ * @param {array} p2 Array of body indices
+ * @param {World} world
+ * @param {array} result Array to store generated contacts
+ * @param {array} oldcontacts Optional. Array of reusable contact objects
+ */
+Narrowphase.prototype.getContacts = function(p1, p2, world, result, oldcontacts, frictionResult, frictionPool){
+    // Save old contact objects
+    this.contactPointPool = oldcontacts;
+    this.frictionEquationPool = frictionPool;
+    this.result = result;
+    this.frictionResult = frictionResult;
+
+    var qi = tmpQuat1;
+    var qj = tmpQuat2;
+    var xi = tmpVec1;
+    var xj = tmpVec2;
+
+    for(var k=0, N=p1.length; k!==N; k++){
+
+        // Get current collision bodies
+        var bi = p1[k],
+            bj = p2[k];
+
+        // Get contact material
+        var bodyContactMaterial = null;
+        if(bi.material && bj.material){
+            bodyContactMaterial = world.getContactMaterial(bi.material,bj.material) || null;
+        }
+
+        var justTest = (
+            (
+                (bi.type & Body.KINEMATIC) && (bj.type & Body.STATIC)
+            ) || (
+                (bi.type & Body.STATIC) && (bj.type & Body.KINEMATIC)
+            ) || (
+                (bi.type & Body.KINEMATIC) && (bj.type & Body.KINEMATIC)
+            )
+        );
+
+        for (var i = 0; i < bi.shapes.length; i++) {
+            bi.quaternion.mult(bi.shapeOrientations[i], qi);
+            bi.quaternion.vmult(bi.shapeOffsets[i], xi);
+            xi.vadd(bi.position, xi);
+            var si = bi.shapes[i];
+
+            for (var j = 0; j < bj.shapes.length; j++) {
+
+                // Compute world transform of shapes
+                bj.quaternion.mult(bj.shapeOrientations[j], qj);
+                bj.quaternion.vmult(bj.shapeOffsets[j], xj);
+                xj.vadd(bj.position, xj);
+                var sj = bj.shapes[j];
+
+                if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+                    continue;
+                }
+
+                // Get collision material
+                var shapeContactMaterial = null;
+                if(si.material && sj.material){
+                    shapeContactMaterial = world.getContactMaterial(si.material,sj.material) || null;
+                }
+
+                this.currentContactMaterial = shapeContactMaterial || bodyContactMaterial || world.defaultContactMaterial;
+
+                // Get contacts
+                var resolver = this[si.type | sj.type];
+                if(resolver){
+                    var retval = false;
+                    if (si.type < sj.type) {
+                        retval = resolver.call(this, si, sj, xi, xj, qi, qj, bi, bj, si, sj, justTest);
+                    } else {
+                        retval = resolver.call(this, sj, si, xj, xi, qj, qi, bj, bi, si, sj, justTest);
+                    }
+
+                    if(retval && justTest){
+                        // Register overlap
+                        world.shapeOverlapKeeper.set(si.id, sj.id);
+                        world.bodyOverlapKeeper.set(bi.id, bj.id);
+                    }
+                }
+            }
+        }
+    }
+};
+
+var numWarnings = 0;
+var maxWarnings = 10;
+
+function warn(msg){
+    if(numWarnings > maxWarnings){
+        return;
+    }
+
+    numWarnings++;
+
+    console.warn(msg);
+}
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.BOX] =
+Narrowphase.prototype.boxBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    sj.convexPolyhedronRepresentation.material = sj.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;
+    return this.convexConvex(si.convexPolyhedronRepresentation,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.boxConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexConvex(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.PARTICLE] =
+Narrowphase.prototype.boxParticle = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexParticle(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+/**
+ * @method sphereSphere
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE] =
+Narrowphase.prototype.sphereSphere = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    if(justTest){
+        return xi.distanceSquared(xj) < Math.pow(si.radius + sj.radius, 2);
+    }
+
+    // We will have only one contact in this case
+    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+    // Contact normal
+    xj.vsub(xi, r.ni);
+    r.ni.normalize();
+
+    // Contact point locations
+    r.ri.copy(r.ni);
+    r.rj.copy(r.ni);
+    r.ri.mult(si.radius, r.ri);
+    r.rj.mult(-sj.radius, r.rj);
+
+    r.ri.vadd(xi, r.ri);
+    r.ri.vsub(bi.position, r.ri);
+
+    r.rj.vadd(xj, r.rj);
+    r.rj.vsub(bj.position, r.rj);
+
+    this.result.push(r);
+
+    this.createFrictionEquationsFromContact(r, this.frictionResult);
+};
+
+/**
+ * @method planeTrimesh
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+var planeTrimesh_normal = new Vec3();
+var planeTrimesh_relpos = new Vec3();
+var planeTrimesh_projected = new Vec3();
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.TRIMESH] =
+Narrowphase.prototype.planeTrimesh = function(
+    planeShape,
+    trimeshShape,
+    planePos,
+    trimeshPos,
+    planeQuat,
+    trimeshQuat,
+    planeBody,
+    trimeshBody,
+    rsi,
+    rsj,
+    justTest
+){
+    // Make contacts!
+    var v = new Vec3();
+
+    var normal = planeTrimesh_normal;
+    normal.set(0,0,1);
+    planeQuat.vmult(normal,normal); // Turn normal according to plane
+
+    for(var i=0; i<trimeshShape.vertices.length / 3; i++){
+
+        // Get world vertex from trimesh
+        trimeshShape.getVertex(i, v);
+
+        // Safe up
+        var v2 = new Vec3();
+        v2.copy(v);
+        Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);
+
+        // Check plane side
+        var relpos = planeTrimesh_relpos;
+        v.vsub(planePos, relpos);
+        var dot = normal.dot(relpos);
+
+        if(dot <= 0.0){
+            if(justTest){
+                return true;
+            }
+
+            var r = this.createContactEquation(planeBody,trimeshBody,planeShape,trimeshShape,rsi,rsj);
+
+            r.ni.copy(normal); // Contact normal is the plane normal
+
+            // Get vertex position projected on plane
+            var projected = planeTrimesh_projected;
+            normal.scale(relpos.dot(normal), projected);
+            v.vsub(projected,projected);
+
+            // ri is the projected world position minus plane position
+            r.ri.copy(projected);
+            r.ri.vsub(planeBody.position, r.ri);
+
+            r.rj.copy(v);
+            r.rj.vsub(trimeshBody.position, r.rj);
+
+            // Store result
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        }
+    }
+};
+
+/**
+ * @method sphereTrimesh
+ * @param  {Shape}      sphereShape
+ * @param  {Shape}      trimeshShape
+ * @param  {Vec3}       spherePos
+ * @param  {Vec3}       trimeshPos
+ * @param  {Quaternion} sphereQuat
+ * @param  {Quaternion} trimeshQuat
+ * @param  {Body}       sphereBody
+ * @param  {Body}       trimeshBody
+ */
+var sphereTrimesh_normal = new Vec3();
+var sphereTrimesh_relpos = new Vec3();
+var sphereTrimesh_projected = new Vec3();
+var sphereTrimesh_v = new Vec3();
+var sphereTrimesh_v2 = new Vec3();
+var sphereTrimesh_edgeVertexA = new Vec3();
+var sphereTrimesh_edgeVertexB = new Vec3();
+var sphereTrimesh_edgeVector = new Vec3();
+var sphereTrimesh_edgeVectorUnit = new Vec3();
+var sphereTrimesh_localSpherePos = new Vec3();
+var sphereTrimesh_tmp = new Vec3();
+var sphereTrimesh_va = new Vec3();
+var sphereTrimesh_vb = new Vec3();
+var sphereTrimesh_vc = new Vec3();
+var sphereTrimesh_localSphereAABB = new AABB();
+var sphereTrimesh_triangles = [];
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.TRIMESH] =
+Narrowphase.prototype.sphereTrimesh = function (
+    sphereShape,
+    trimeshShape,
+    spherePos,
+    trimeshPos,
+    sphereQuat,
+    trimeshQuat,
+    sphereBody,
+    trimeshBody,
+    rsi,
+    rsj,
+    justTest
+) {
+
+    var edgeVertexA = sphereTrimesh_edgeVertexA;
+    var edgeVertexB = sphereTrimesh_edgeVertexB;
+    var edgeVector = sphereTrimesh_edgeVector;
+    var edgeVectorUnit = sphereTrimesh_edgeVectorUnit;
+    var localSpherePos = sphereTrimesh_localSpherePos;
+    var tmp = sphereTrimesh_tmp;
+    var localSphereAABB = sphereTrimesh_localSphereAABB;
+    var v2 = sphereTrimesh_v2;
+    var relpos = sphereTrimesh_relpos;
+    var triangles = sphereTrimesh_triangles;
+
+    // Convert sphere position to local in the trimesh
+    Transform.pointToLocalFrame(trimeshPos, trimeshQuat, spherePos, localSpherePos);
+
+    // Get the aabb of the sphere locally in the trimesh
+    var sphereRadius = sphereShape.radius;
+    localSphereAABB.lowerBound.set(
+        localSpherePos.x - sphereRadius,
+        localSpherePos.y - sphereRadius,
+        localSpherePos.z - sphereRadius
+    );
+    localSphereAABB.upperBound.set(
+        localSpherePos.x + sphereRadius,
+        localSpherePos.y + sphereRadius,
+        localSpherePos.z + sphereRadius
+    );
+
+    trimeshShape.getTrianglesInAABB(localSphereAABB, triangles);
+    //for (var i = 0; i < trimeshShape.indices.length / 3; i++) triangles.push(i); // All
+
+    // Vertices
+    var v = sphereTrimesh_v;
+    var radiusSquared = sphereShape.radius * sphereShape.radius;
+    for(var i=0; i<triangles.length; i++){
+        for (var j = 0; j < 3; j++) {
+
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], v);
+
+            // Check vertex overlap in sphere
+            v.vsub(localSpherePos, relpos);
+
+            if(relpos.norm2() <= radiusSquared){
+
+                // Safe up
+                v2.copy(v);
+                Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);
+
+                v.vsub(spherePos, relpos);
+
+                if(justTest){
+                    return true;
+                }
+
+                var r = this.createContactEquation(sphereBody,trimeshBody,sphereShape,trimeshShape,rsi,rsj);
+                r.ni.copy(relpos);
+                r.ni.normalize();
+
+                // ri is the vector from sphere center to the sphere surface
+                r.ri.copy(r.ni);
+                r.ri.scale(sphereShape.radius, r.ri);
+                r.ri.vadd(spherePos, r.ri);
+                r.ri.vsub(sphereBody.position, r.ri);
+
+                r.rj.copy(v);
+                r.rj.vsub(trimeshBody.position, r.rj);
+
+                // Store result
+                this.result.push(r);
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+    }
+
+    // Check all edges
+    for(var i=0; i<triangles.length; i++){
+        for (var j = 0; j < 3; j++) {
+
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], edgeVertexA);
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + ((j+1)%3)], edgeVertexB);
+            edgeVertexB.vsub(edgeVertexA, edgeVector);
+
+            // Project sphere position to the edge
+            localSpherePos.vsub(edgeVertexB, tmp);
+            var positionAlongEdgeB = tmp.dot(edgeVector);
+
+            localSpherePos.vsub(edgeVertexA, tmp);
+            var positionAlongEdgeA = tmp.dot(edgeVector);
+
+            if(positionAlongEdgeA > 0 && positionAlongEdgeB < 0){
+
+                // Now check the orthogonal distance from edge to sphere center
+                localSpherePos.vsub(edgeVertexA, tmp);
+
+                edgeVectorUnit.copy(edgeVector);
+                edgeVectorUnit.normalize();
+                positionAlongEdgeA = tmp.dot(edgeVectorUnit);
+
+                edgeVectorUnit.scale(positionAlongEdgeA, tmp);
+                tmp.vadd(edgeVertexA, tmp);
+
+                // tmp is now the sphere center position projected to the edge, defined locally in the trimesh frame
+                var dist = tmp.distanceTo(localSpherePos);
+                if(dist < sphereShape.radius){
+
+                    if(justTest){
+                        return true;
+                    }
+
+                    var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape,rsi,rsj);
+
+                    tmp.vsub(localSpherePos, r.ni);
+                    r.ni.normalize();
+                    r.ni.scale(sphereShape.radius, r.ri);
+
+                    Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);
+                    tmp.vsub(trimeshBody.position, r.rj);
+
+                    Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);
+                    Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);
+
+                    this.result.push(r);
+                    this.createFrictionEquationsFromContact(r, this.frictionResult);
+                }
+            }
+        }
+    }
+
+    // Triangle faces
+    var va = sphereTrimesh_va;
+    var vb = sphereTrimesh_vb;
+    var vc = sphereTrimesh_vc;
+    var normal = sphereTrimesh_normal;
+    for(var i=0, N = triangles.length; i !== N; i++){
+        trimeshShape.getTriangleVertices(triangles[i], va, vb, vc);
+        trimeshShape.getNormal(triangles[i], normal);
+        localSpherePos.vsub(va, tmp);
+        var dist = tmp.dot(normal);
+        normal.scale(dist, tmp);
+        localSpherePos.vsub(tmp, tmp);
+
+        // tmp is now the sphere position projected to the triangle plane
+        dist = tmp.distanceTo(localSpherePos);
+        if(Ray.pointInTriangle(tmp, va, vb, vc) && dist < sphereShape.radius){
+            if(justTest){
+                return true;
+            }
+            var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape,rsi,rsj);
+
+            tmp.vsub(localSpherePos, r.ni);
+            r.ni.normalize();
+            r.ni.scale(sphereShape.radius, r.ri);
+
+            Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);
+            tmp.vsub(trimeshBody.position, r.rj);
+
+            Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);
+            Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        }
+    }
+
+    triangles.length = 0;
+};
+
+var point_on_plane_to_sphere = new Vec3();
+var plane_to_sphere_ortho = new Vec3();
+
+/**
+ * @method spherePlane
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.PLANE] =
+Narrowphase.prototype.spherePlane = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    // We will have one contact in this case
+    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+    // Contact normal
+    r.ni.set(0,0,1);
+    qj.vmult(r.ni, r.ni);
+    r.ni.negate(r.ni); // body i is the sphere, flip normal
+    r.ni.normalize(); // Needed?
+
+    // Vector from sphere center to contact point
+    r.ni.mult(si.radius, r.ri);
+
+    // Project down sphere on plane
+    xi.vsub(xj, point_on_plane_to_sphere);
+    r.ni.mult(r.ni.dot(point_on_plane_to_sphere), plane_to_sphere_ortho);
+    point_on_plane_to_sphere.vsub(plane_to_sphere_ortho,r.rj); // The sphere position projected to plane
+
+    if(-point_on_plane_to_sphere.dot(r.ni) <= si.radius){
+
+        if(justTest){
+            return true;
+        }
+
+        // Make it relative to the body
+        var ri = r.ri;
+        var rj = r.rj;
+        ri.vadd(xi, ri);
+        ri.vsub(bi.position, ri);
+        rj.vadd(xj, rj);
+        rj.vsub(bj.position, rj);
+
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+// See http://bulletphysics.com/Bullet/BulletFull/SphereTriangleDetector_8cpp_source.html
+var pointInPolygon_edge = new Vec3();
+var pointInPolygon_edge_x_normal = new Vec3();
+var pointInPolygon_vtp = new Vec3();
+function pointInPolygon(verts, normal, p){
+    var positiveResult = null;
+    var N = verts.length;
+    for(var i=0; i!==N; i++){
+        var v = verts[i];
+
+        // Get edge to the next vertex
+        var edge = pointInPolygon_edge;
+        verts[(i+1) % (N)].vsub(v,edge);
+
+        // Get cross product between polygon normal and the edge
+        var edge_x_normal = pointInPolygon_edge_x_normal;
+        //var edge_x_normal = new Vec3();
+        edge.cross(normal,edge_x_normal);
+
+        // Get vector between point and current vertex
+        var vertex_to_p = pointInPolygon_vtp;
+        p.vsub(v,vertex_to_p);
+
+        // This dot product determines which side of the edge the point is
+        var r = edge_x_normal.dot(vertex_to_p);
+
+        // If all such dot products have same sign, we are inside the polygon.
+        if(positiveResult===null || (r>0 && positiveResult===true) || (r<=0 && positiveResult===false)){
+            if(positiveResult===null){
+                positiveResult = r>0;
+            }
+            continue;
+        } else {
+            return false; // Encountered some other sign. Exit.
+        }
+    }
+
+    // If we got here, all dot products were of the same sign.
+    return true;
+}
+
+var box_to_sphere = new Vec3();
+var sphereBox_ns = new Vec3();
+var sphereBox_ns1 = new Vec3();
+var sphereBox_ns2 = new Vec3();
+var sphereBox_sides = [new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3()];
+var sphereBox_sphere_to_corner = new Vec3();
+var sphereBox_side_ns = new Vec3();
+var sphereBox_side_ns1 = new Vec3();
+var sphereBox_side_ns2 = new Vec3();
+
+/**
+ * @method sphereBox
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.BOX] =
+Narrowphase.prototype.sphereBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    var v3pool = this.v3pool;
+
+    // we refer to the box as body j
+    var sides = sphereBox_sides;
+    xi.vsub(xj,box_to_sphere);
+    sj.getSideNormals(sides,qj);
+    var R =     si.radius;
+    var penetrating_sides = [];
+
+    // Check side (plane) intersections
+    var found = false;
+
+    // Store the resulting side penetration info
+    var side_ns = sphereBox_side_ns;
+    var side_ns1 = sphereBox_side_ns1;
+    var side_ns2 = sphereBox_side_ns2;
+    var side_h = null;
+    var side_penetrations = 0;
+    var side_dot1 = 0;
+    var side_dot2 = 0;
+    var side_distance = null;
+    for(var idx=0,nsides=sides.length; idx!==nsides && found===false; idx++){
+        // Get the plane side normal (ns)
+        var ns = sphereBox_ns;
+        ns.copy(sides[idx]);
+
+        var h = ns.norm();
+        ns.normalize();
+
+        // The normal/distance dot product tells which side of the plane we are
+        var dot = box_to_sphere.dot(ns);
+
+        if(dot<h+R && dot>0){
+            // Intersects plane. Now check the other two dimensions
+            var ns1 = sphereBox_ns1;
+            var ns2 = sphereBox_ns2;
+            ns1.copy(sides[(idx+1)%3]);
+            ns2.copy(sides[(idx+2)%3]);
+            var h1 = ns1.norm();
+            var h2 = ns2.norm();
+            ns1.normalize();
+            ns2.normalize();
+            var dot1 = box_to_sphere.dot(ns1);
+            var dot2 = box_to_sphere.dot(ns2);
+            if(dot1<h1 && dot1>-h1 && dot2<h2 && dot2>-h2){
+                var dist = Math.abs(dot-h-R);
+                if(side_distance===null || dist < side_distance){
+                    side_distance = dist;
+                    side_dot1 = dot1;
+                    side_dot2 = dot2;
+                    side_h = h;
+                    side_ns.copy(ns);
+                    side_ns1.copy(ns1);
+                    side_ns2.copy(ns2);
+                    side_penetrations++;
+
+                    if(justTest){
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+    if(side_penetrations){
+        found = true;
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        side_ns.mult(-R,r.ri); // Sphere r
+        r.ni.copy(side_ns);
+        r.ni.negate(r.ni); // Normal should be out of sphere
+        side_ns.mult(side_h,side_ns);
+        side_ns1.mult(side_dot1,side_ns1);
+        side_ns.vadd(side_ns1,side_ns);
+        side_ns2.mult(side_dot2,side_ns2);
+        side_ns.vadd(side_ns2,r.rj);
+
+        // Make relative to bodies
+        r.ri.vadd(xi, r.ri);
+        r.ri.vsub(bi.position, r.ri);
+        r.rj.vadd(xj, r.rj);
+        r.rj.vsub(bj.position, r.rj);
+
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+
+    // Check corners
+    var rj = v3pool.get();
+    var sphere_to_corner = sphereBox_sphere_to_corner;
+    for(var j=0; j!==2 && !found; j++){
+        for(var k=0; k!==2 && !found; k++){
+            for(var l=0; l!==2 && !found; l++){
+                rj.set(0,0,0);
+                if(j){
+                    rj.vadd(sides[0],rj);
+                } else {
+                    rj.vsub(sides[0],rj);
+                }
+                if(k){
+                    rj.vadd(sides[1],rj);
+                } else {
+                    rj.vsub(sides[1],rj);
+                }
+                if(l){
+                    rj.vadd(sides[2],rj);
+                } else {
+                    rj.vsub(sides[2],rj);
+                }
+
+                // World position of corner
+                xj.vadd(rj,sphere_to_corner);
+                sphere_to_corner.vsub(xi,sphere_to_corner);
+
+                if(sphere_to_corner.norm2() < R*R){
+                    if(justTest){
+                        return true;
+                    }
+                    found = true;
+                    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                    r.ri.copy(sphere_to_corner);
+                    r.ri.normalize();
+                    r.ni.copy(r.ri);
+                    r.ri.mult(R,r.ri);
+                    r.rj.copy(rj);
+
+                    // Make relative to bodies
+                    r.ri.vadd(xi, r.ri);
+                    r.ri.vsub(bi.position, r.ri);
+                    r.rj.vadd(xj, r.rj);
+                    r.rj.vsub(bj.position, r.rj);
+
+                    this.result.push(r);
+                    this.createFrictionEquationsFromContact(r, this.frictionResult);
+                }
+            }
+        }
+    }
+    v3pool.release(rj);
+    rj = null;
+
+    // Check edges
+    var edgeTangent = v3pool.get();
+    var edgeCenter = v3pool.get();
+    var r = v3pool.get(); // r = edge center to sphere center
+    var orthogonal = v3pool.get();
+    var dist = v3pool.get();
+    var Nsides = sides.length;
+    for(var j=0; j!==Nsides && !found; j++){
+        for(var k=0; k!==Nsides && !found; k++){
+            if(j%3 !== k%3){
+                // Get edge tangent
+                sides[k].cross(sides[j],edgeTangent);
+                edgeTangent.normalize();
+                sides[j].vadd(sides[k], edgeCenter);
+                r.copy(xi);
+                r.vsub(edgeCenter,r);
+                r.vsub(xj,r);
+                var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction
+                edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction
+
+                // Find the third side orthogonal to this one
+                var l = 0;
+                while(l===j%3 || l===k%3){
+                    l++;
+                }
+
+                // vec from edge center to sphere projected to the plane orthogonal to the edge tangent
+                dist.copy(xi);
+                dist.vsub(orthogonal,dist);
+                dist.vsub(edgeCenter,dist);
+                dist.vsub(xj,dist);
+
+                // Distances in tangent direction and distance in the plane orthogonal to it
+                var tdist = Math.abs(orthonorm);
+                var ndist = dist.norm();
+
+                if(tdist < sides[l].norm() && ndist<R){
+                    if(justTest){
+                        return true;
+                    }
+                    found = true;
+                    var res = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                    edgeCenter.vadd(orthogonal,res.rj); // box rj
+                    res.rj.copy(res.rj);
+                    dist.negate(res.ni);
+                    res.ni.normalize();
+
+                    res.ri.copy(res.rj);
+                    res.ri.vadd(xj,res.ri);
+                    res.ri.vsub(xi,res.ri);
+                    res.ri.normalize();
+                    res.ri.mult(R,res.ri);
+
+                    // Make relative to bodies
+                    res.ri.vadd(xi, res.ri);
+                    res.ri.vsub(bi.position, res.ri);
+                    res.rj.vadd(xj, res.rj);
+                    res.rj.vsub(bj.position, res.rj);
+
+                    this.result.push(res);
+                    this.createFrictionEquationsFromContact(res, this.frictionResult);
+                }
+            }
+        }
+    }
+    v3pool.release(edgeTangent,edgeCenter,r,orthogonal,dist);
+};
+
+var convex_to_sphere = new Vec3();
+var sphereConvex_edge = new Vec3();
+var sphereConvex_edgeUnit = new Vec3();
+var sphereConvex_sphereToCorner = new Vec3();
+var sphereConvex_worldCorner = new Vec3();
+var sphereConvex_worldNormal = new Vec3();
+var sphereConvex_worldPoint = new Vec3();
+var sphereConvex_worldSpherePointClosestToPlane = new Vec3();
+var sphereConvex_penetrationVec = new Vec3();
+var sphereConvex_sphereToWorldPoint = new Vec3();
+
+/**
+ * @method sphereConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.sphereConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    var v3pool = this.v3pool;
+    xi.vsub(xj,convex_to_sphere);
+    var normals = sj.faceNormals;
+    var faces = sj.faces;
+    var verts = sj.vertices;
+    var R =     si.radius;
+    var penetrating_sides = [];
+
+    // if(convex_to_sphere.norm2() > si.boundingSphereRadius + sj.boundingSphereRadius){
+    //     return;
+    // }
+
+    // Check corners
+    for(var i=0; i!==verts.length; i++){
+        var v = verts[i];
+
+        // World position of corner
+        var worldCorner = sphereConvex_worldCorner;
+        qj.vmult(v,worldCorner);
+        xj.vadd(worldCorner,worldCorner);
+        var sphere_to_corner = sphereConvex_sphereToCorner;
+        worldCorner.vsub(xi, sphere_to_corner);
+        if(sphere_to_corner.norm2() < R * R){
+            if(justTest){
+                return true;
+            }
+            found = true;
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+            r.ri.copy(sphere_to_corner);
+            r.ri.normalize();
+            r.ni.copy(r.ri);
+            r.ri.mult(R,r.ri);
+            worldCorner.vsub(xj,r.rj);
+
+            // Should be relative to the body.
+            r.ri.vadd(xi, r.ri);
+            r.ri.vsub(bi.position, r.ri);
+
+            // Should be relative to the body.
+            r.rj.vadd(xj, r.rj);
+            r.rj.vsub(bj.position, r.rj);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+            return;
+        }
+    }
+
+    // Check side (plane) intersections
+    var found = false;
+    for(var i=0, nfaces=faces.length; i!==nfaces && found===false; i++){
+        var normal = normals[i];
+        var face = faces[i];
+
+        // Get world-transformed normal of the face
+        var worldNormal = sphereConvex_worldNormal;
+        qj.vmult(normal,worldNormal);
+
+        // Get a world vertex from the face
+        var worldPoint = sphereConvex_worldPoint;
+        qj.vmult(verts[face[0]],worldPoint);
+        worldPoint.vadd(xj,worldPoint);
+
+        // Get a point on the sphere, closest to the face normal
+        var worldSpherePointClosestToPlane = sphereConvex_worldSpherePointClosestToPlane;
+        worldNormal.mult(-R, worldSpherePointClosestToPlane);
+        xi.vadd(worldSpherePointClosestToPlane, worldSpherePointClosestToPlane);
+
+        // Vector from a face point to the closest point on the sphere
+        var penetrationVec = sphereConvex_penetrationVec;
+        worldSpherePointClosestToPlane.vsub(worldPoint,penetrationVec);
+
+        // The penetration. Negative value means overlap.
+        var penetration = penetrationVec.dot(worldNormal);
+
+        var worldPointToSphere = sphereConvex_sphereToWorldPoint;
+        xi.vsub(worldPoint, worldPointToSphere);
+
+        if(penetration < 0 && worldPointToSphere.dot(worldNormal)>0){
+            // Intersects plane. Now check if the sphere is inside the face polygon
+            var faceVerts = []; // Face vertices, in world coords
+            for(var j=0, Nverts=face.length; j!==Nverts; j++){
+                var worldVertex = v3pool.get();
+                qj.vmult(verts[face[j]], worldVertex);
+                xj.vadd(worldVertex,worldVertex);
+                faceVerts.push(worldVertex);
+            }
+
+            if(pointInPolygon(faceVerts,worldNormal,xi)){ // Is the sphere center in the face polygon?
+                if(justTest){
+                    return true;
+                }
+                found = true;
+                var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+                worldNormal.mult(-R, r.ri); // Contact offset, from sphere center to contact
+                worldNormal.negate(r.ni); // Normal pointing out of sphere
+
+                var penetrationVec2 = v3pool.get();
+                worldNormal.mult(-penetration, penetrationVec2);
+                var penetrationSpherePoint = v3pool.get();
+                worldNormal.mult(-R, penetrationSpherePoint);
+
+                //xi.vsub(xj).vadd(penetrationSpherePoint).vadd(penetrationVec2 , r.rj);
+                xi.vsub(xj,r.rj);
+                r.rj.vadd(penetrationSpherePoint,r.rj);
+                r.rj.vadd(penetrationVec2 , r.rj);
+
+                // Should be relative to the body.
+                r.rj.vadd(xj, r.rj);
+                r.rj.vsub(bj.position, r.rj);
+
+                // Should be relative to the body.
+                r.ri.vadd(xi, r.ri);
+                r.ri.vsub(bi.position, r.ri);
+
+                v3pool.release(penetrationVec2);
+                v3pool.release(penetrationSpherePoint);
+
+                this.result.push(r);
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+
+                // Release world vertices
+                for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                    v3pool.release(faceVerts[j]);
+                }
+
+                return; // We only expect *one* face contact
+            } else {
+                // Edge?
+                for(var j=0; j!==face.length; j++){
+
+                    // Get two world transformed vertices
+                    var v1 = v3pool.get();
+                    var v2 = v3pool.get();
+                    qj.vmult(verts[face[(j+1)%face.length]], v1);
+                    qj.vmult(verts[face[(j+2)%face.length]], v2);
+                    xj.vadd(v1, v1);
+                    xj.vadd(v2, v2);
+
+                    // Construct edge vector
+                    var edge = sphereConvex_edge;
+                    v2.vsub(v1,edge);
+
+                    // Construct the same vector, but normalized
+                    var edgeUnit = sphereConvex_edgeUnit;
+                    edge.unit(edgeUnit);
+
+                    // p is xi projected onto the edge
+                    var p = v3pool.get();
+                    var v1_to_xi = v3pool.get();
+                    xi.vsub(v1, v1_to_xi);
+                    var dot = v1_to_xi.dot(edgeUnit);
+                    edgeUnit.mult(dot, p);
+                    p.vadd(v1, p);
+
+                    // Compute a vector from p to the center of the sphere
+                    var xi_to_p = v3pool.get();
+                    p.vsub(xi, xi_to_p);
+
+                    // Collision if the edge-sphere distance is less than the radius
+                    // AND if p is in between v1 and v2
+                    if(dot > 0 && dot*dot<edge.norm2() && xi_to_p.norm2() < R*R){ // Collision if the edge-sphere distance is less than the radius
+                        // Edge contact!
+                        if(justTest){
+                            return true;
+                        }
+                        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                        p.vsub(xj,r.rj);
+
+                        p.vsub(xi,r.ni);
+                        r.ni.normalize();
+
+                        r.ni.mult(R,r.ri);
+
+                        // Should be relative to the body.
+                        r.rj.vadd(xj, r.rj);
+                        r.rj.vsub(bj.position, r.rj);
+
+                        // Should be relative to the body.
+                        r.ri.vadd(xi, r.ri);
+                        r.ri.vsub(bi.position, r.ri);
+
+                        this.result.push(r);
+                        this.createFrictionEquationsFromContact(r, this.frictionResult);
+
+                        // Release world vertices
+                        for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                            v3pool.release(faceVerts[j]);
+                        }
+
+                        v3pool.release(v1);
+                        v3pool.release(v2);
+                        v3pool.release(p);
+                        v3pool.release(xi_to_p);
+                        v3pool.release(v1_to_xi);
+
+                        return;
+                    }
+
+                    v3pool.release(v1);
+                    v3pool.release(v2);
+                    v3pool.release(p);
+                    v3pool.release(xi_to_p);
+                    v3pool.release(v1_to_xi);
+                }
+            }
+
+            // Release world vertices
+            for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                v3pool.release(faceVerts[j]);
+            }
+        }
+    }
+};
+
+var planeBox_normal = new Vec3();
+var plane_to_corner = new Vec3();
+
+/**
+ * @method planeBox
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.BOX] =
+Narrowphase.prototype.planeBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    sj.convexPolyhedronRepresentation.material = sj.material;
+    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;
+    sj.convexPolyhedronRepresentation.id = sj.id;
+    return this.planeConvex(si,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+var planeConvex_v = new Vec3();
+var planeConvex_normal = new Vec3();
+var planeConvex_relpos = new Vec3();
+var planeConvex_projected = new Vec3();
+
+/**
+ * @method planeConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.planeConvex = function(
+    planeShape,
+    convexShape,
+    planePosition,
+    convexPosition,
+    planeQuat,
+    convexQuat,
+    planeBody,
+    convexBody,
+    si,
+    sj,
+    justTest
+){
+    // Simply return the points behind the plane.
+    var worldVertex = planeConvex_v,
+        worldNormal = planeConvex_normal;
+    worldNormal.set(0,0,1);
+    planeQuat.vmult(worldNormal,worldNormal); // Turn normal according to plane orientation
+
+    var numContacts = 0;
+    var relpos = planeConvex_relpos;
+    for(var i = 0; i !== convexShape.vertices.length; i++){
+
+        // Get world convex vertex
+        worldVertex.copy(convexShape.vertices[i]);
+        convexQuat.vmult(worldVertex, worldVertex);
+        convexPosition.vadd(worldVertex, worldVertex);
+        worldVertex.vsub(planePosition, relpos);
+
+        var dot = worldNormal.dot(relpos);
+        if(dot <= 0.0){
+            if(justTest){
+                return true;
+            }
+
+            var r = this.createContactEquation(planeBody, convexBody, planeShape, convexShape, si, sj);
+
+            // Get vertex position projected on plane
+            var projected = planeConvex_projected;
+            worldNormal.mult(worldNormal.dot(relpos),projected);
+            worldVertex.vsub(projected, projected);
+            projected.vsub(planePosition, r.ri); // From plane to vertex projected on plane
+
+            r.ni.copy(worldNormal); // Contact normal is the plane normal out from plane
+
+            // rj is now just the vector from the convex center to the vertex
+            worldVertex.vsub(convexPosition, r.rj);
+
+            // Make it relative to the body
+            r.ri.vadd(planePosition, r.ri);
+            r.ri.vsub(planeBody.position, r.ri);
+            r.rj.vadd(convexPosition, r.rj);
+            r.rj.vsub(convexBody.position, r.rj);
+
+            this.result.push(r);
+            numContacts++;
+            if(!this.enableFrictionReduction){
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+    }
+
+    if(this.enableFrictionReduction && numContacts){
+        this.createFrictionFromAverage(numContacts);
+    }
+};
+
+var convexConvex_sepAxis = new Vec3();
+var convexConvex_q = new Vec3();
+
+/**
+ * @method convexConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.convexConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest,faceListA,faceListB){
+    var sepAxis = convexConvex_sepAxis;
+
+    if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+        return;
+    }
+
+    if(si.findSeparatingAxis(sj,xi,qi,xj,qj,sepAxis,faceListA,faceListB)){
+        var res = [];
+        var q = convexConvex_q;
+        si.clipAgainstHull(xi,qi,sj,xj,qj,sepAxis,-100,100,res);
+        var numContacts = 0;
+        for(var j = 0; j !== res.length; j++){
+            if(justTest){
+                return true;
+            }
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),
+                ri = r.ri,
+                rj = r.rj;
+            sepAxis.negate(r.ni);
+            res[j].normal.negate(q);
+            q.mult(res[j].depth, q);
+            res[j].point.vadd(q, ri);
+            rj.copy(res[j].point);
+
+            // Contact points are in world coordinates. Transform back to relative
+            ri.vsub(xi,ri);
+            rj.vsub(xj,rj);
+
+            // Make relative to bodies
+            ri.vadd(xi, ri);
+            ri.vsub(bi.position, ri);
+            rj.vadd(xj, rj);
+            rj.vsub(bj.position, rj);
+
+            this.result.push(r);
+            numContacts++;
+            if(!this.enableFrictionReduction){
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+        if(this.enableFrictionReduction && numContacts){
+            this.createFrictionFromAverage(numContacts);
+        }
+    }
+};
+
+
+/**
+ * @method convexTrimesh
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+// Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.TRIMESH] =
+// Narrowphase.prototype.convexTrimesh = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,faceListA,faceListB){
+//     var sepAxis = convexConvex_sepAxis;
+
+//     if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+//         return;
+//     }
+
+//     // Construct a temp hull for each triangle
+//     var hullB = new ConvexPolyhedron();
+
+//     hullB.faces = [[0,1,2]];
+//     var va = new Vec3();
+//     var vb = new Vec3();
+//     var vc = new Vec3();
+//     hullB.vertices = [
+//         va,
+//         vb,
+//         vc
+//     ];
+
+//     for (var i = 0; i < sj.indices.length / 3; i++) {
+
+//         var triangleNormal = new Vec3();
+//         sj.getNormal(i, triangleNormal);
+//         hullB.faceNormals = [triangleNormal];
+
+//         sj.getTriangleVertices(i, va, vb, vc);
+
+//         var d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);
+//         if(!d){
+//             triangleNormal.scale(-1, triangleNormal);
+//             d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);
+
+//             if(!d){
+//                 continue;
+//             }
+//         }
+
+//         var res = [];
+//         var q = convexConvex_q;
+//         si.clipAgainstHull(xi,qi,hullB,xj,qj,triangleNormal,-100,100,res);
+//         for(var j = 0; j !== res.length; j++){
+//             var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),
+//                 ri = r.ri,
+//                 rj = r.rj;
+//             r.ni.copy(triangleNormal);
+//             r.ni.negate(r.ni);
+//             res[j].normal.negate(q);
+//             q.mult(res[j].depth, q);
+//             res[j].point.vadd(q, ri);
+//             rj.copy(res[j].point);
+
+//             // Contact points are in world coordinates. Transform back to relative
+//             ri.vsub(xi,ri);
+//             rj.vsub(xj,rj);
+
+//             // Make relative to bodies
+//             ri.vadd(xi, ri);
+//             ri.vsub(bi.position, ri);
+//             rj.vadd(xj, rj);
+//             rj.vsub(bj.position, rj);
+
+//             result.push(r);
+//         }
+//     }
+// };
+
+var particlePlane_normal = new Vec3();
+var particlePlane_relpos = new Vec3();
+var particlePlane_projected = new Vec3();
+
+/**
+ * @method particlePlane
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.PARTICLE] =
+Narrowphase.prototype.planeParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    var normal = particlePlane_normal;
+    normal.set(0,0,1);
+    bj.quaternion.vmult(normal,normal); // Turn normal according to plane orientation
+    var relpos = particlePlane_relpos;
+    xi.vsub(bj.position,relpos);
+    var dot = normal.dot(relpos);
+    if(dot <= 0.0){
+
+        if(justTest){
+            return true;
+        }
+
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        r.ni.copy(normal); // Contact normal is the plane normal
+        r.ni.negate(r.ni);
+        r.ri.set(0,0,0); // Center of particle
+
+        // Get particle position projected on plane
+        var projected = particlePlane_projected;
+        normal.mult(normal.dot(xi),projected);
+        xi.vsub(projected,projected);
+        //projected.vadd(bj.position,projected);
+
+        // rj is now the projected world position minus plane position
+        r.rj.copy(projected);
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+var particleSphere_normal = new Vec3();
+
+/**
+ * @method particleSphere
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.SPHERE] =
+Narrowphase.prototype.sphereParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    // The normal is the unit vector from sphere center to particle center
+    var normal = particleSphere_normal;
+    normal.set(0,0,1);
+    xi.vsub(xj,normal);
+    var lengthSquared = normal.norm2();
+
+    if(lengthSquared <= sj.radius * sj.radius){
+        if(justTest){
+            return true;
+        }
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        normal.normalize();
+        r.rj.copy(normal);
+        r.rj.mult(sj.radius,r.rj);
+        r.ni.copy(normal); // Contact normal
+        r.ni.negate(r.ni);
+        r.ri.set(0,0,0); // Center of particle
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+// WIP
+var cqj = new Quaternion();
+var convexParticle_local = new Vec3();
+var convexParticle_normal = new Vec3();
+var convexParticle_penetratedFaceNormal = new Vec3();
+var convexParticle_vertexToParticle = new Vec3();
+var convexParticle_worldPenetrationVec = new Vec3();
+
+/**
+ * @method convexParticle
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.convexParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    var penetratedFaceIndex = -1;
+    var penetratedFaceNormal = convexParticle_penetratedFaceNormal;
+    var worldPenetrationVec = convexParticle_worldPenetrationVec;
+    var minPenetration = null;
+    var numDetectedFaces = 0;
+
+    // Convert particle position xi to local coords in the convex
+    var local = convexParticle_local;
+    local.copy(xi);
+    local.vsub(xj,local); // Convert position to relative the convex origin
+    qj.conjugate(cqj);
+    cqj.vmult(local,local);
+
+    if(sj.pointIsInside(local)){
+
+        if(sj.worldVerticesNeedsUpdate){
+            sj.computeWorldVertices(xj,qj);
+        }
+        if(sj.worldFaceNormalsNeedsUpdate){
+            sj.computeWorldFaceNormals(qj);
+        }
+
+        // For each world polygon in the polyhedra
+        for(var i=0,nfaces=sj.faces.length; i!==nfaces; i++){
+
+            // Construct world face vertices
+            var verts = [ sj.worldVertices[ sj.faces[i][0] ] ];
+            var normal = sj.worldFaceNormals[i];
+
+            // Check how much the particle penetrates the polygon plane.
+            xi.vsub(verts[0],convexParticle_vertexToParticle);
+            var penetration = -normal.dot(convexParticle_vertexToParticle);
+            if(minPenetration===null || Math.abs(penetration)<Math.abs(minPenetration)){
+
+                if(justTest){
+                    return true;
+                }
+
+                minPenetration = penetration;
+                penetratedFaceIndex = i;
+                penetratedFaceNormal.copy(normal);
+                numDetectedFaces++;
+            }
+        }
+
+        if(penetratedFaceIndex!==-1){
+            // Setup contact
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+            penetratedFaceNormal.mult(minPenetration, worldPenetrationVec);
+
+            // rj is the particle position projected to the face
+            worldPenetrationVec.vadd(xi,worldPenetrationVec);
+            worldPenetrationVec.vsub(xj,worldPenetrationVec);
+            r.rj.copy(worldPenetrationVec);
+            //var projectedToFace = xi.vsub(xj).vadd(worldPenetrationVec);
+            //projectedToFace.copy(r.rj);
+
+            //qj.vmult(r.rj,r.rj);
+            penetratedFaceNormal.negate( r.ni ); // Contact normal
+            r.ri.set(0,0,0); // Center of particle
+
+            var ri = r.ri,
+                rj = r.rj;
+
+            // Make relative to bodies
+            ri.vadd(xi, ri);
+            ri.vsub(bi.position, ri);
+            rj.vadd(xj, rj);
+            rj.vsub(bj.position, rj);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        } else {
+            console.warn("Point found inside convex, but did not find penetrating face!");
+        }
+    }
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.boxHeightfield = function (si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexHeightfield(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+var convexHeightfield_tmp1 = new Vec3();
+var convexHeightfield_tmp2 = new Vec3();
+var convexHeightfield_faceList = [0];
+
+/**
+ * @method convexHeightfield
+ */
+Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.convexHeightfield = function (
+    convexShape,
+    hfShape,
+    convexPos,
+    hfPos,
+    convexQuat,
+    hfQuat,
+    convexBody,
+    hfBody,
+    rsi,
+    rsj,
+    justTest
+){
+    var data = hfShape.data,
+        w = hfShape.elementSize,
+        radius = convexShape.boundingSphereRadius,
+        worldPillarOffset = convexHeightfield_tmp2,
+        faceList = convexHeightfield_faceList;
+
+    // Get sphere position to heightfield local!
+    var localConvexPos = convexHeightfield_tmp1;
+    Transform.pointToLocalFrame(hfPos, hfQuat, convexPos, localConvexPos);
+
+    // Get the index of the data points to test against
+    var iMinX = Math.floor((localConvexPos.x - radius) / w) - 1,
+        iMaxX = Math.ceil((localConvexPos.x + radius) / w) + 1,
+        iMinY = Math.floor((localConvexPos.y - radius) / w) - 1,
+        iMaxY = Math.ceil((localConvexPos.y + radius) / w) + 1;
+
+    // Bail out if we are out of the terrain
+    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMinY > data[0].length){
+        return;
+    }
+
+    // Clamp index to edges
+    if(iMinX < 0){ iMinX = 0; }
+    if(iMaxX < 0){ iMaxX = 0; }
+    if(iMinY < 0){ iMinY = 0; }
+    if(iMaxY < 0){ iMaxY = 0; }
+    if(iMinX >= data.length){ iMinX = data.length - 1; }
+    if(iMaxX >= data.length){ iMaxX = data.length - 1; }
+    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }
+    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }
+
+    var minMax = [];
+    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);
+    var min = minMax[0];
+    var max = minMax[1];
+
+    // Bail out if we're cant touch the bounding height box
+    if(localConvexPos.z - radius > max || localConvexPos.z + radius < min){
+        return;
+    }
+
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            var intersecting = false;
+
+            // Lower triangle
+            hfShape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {
+                intersecting = this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, justTest, faceList, null);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            // Upper triangle
+            hfShape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {
+                intersecting = this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, justTest, faceList, null);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+        }
+    }
+};
+
+var sphereHeightfield_tmp1 = new Vec3();
+var sphereHeightfield_tmp2 = new Vec3();
+
+/**
+ * @method sphereHeightfield
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.sphereHeightfield = function (
+    sphereShape,
+    hfShape,
+    spherePos,
+    hfPos,
+    sphereQuat,
+    hfQuat,
+    sphereBody,
+    hfBody,
+    rsi,
+    rsj,
+    justTest
+){
+    var data = hfShape.data,
+        radius = sphereShape.radius,
+        w = hfShape.elementSize,
+        worldPillarOffset = sphereHeightfield_tmp2;
+
+    // Get sphere position to heightfield local!
+    var localSpherePos = sphereHeightfield_tmp1;
+    Transform.pointToLocalFrame(hfPos, hfQuat, spherePos, localSpherePos);
+
+    // Get the index of the data points to test against
+    var iMinX = Math.floor((localSpherePos.x - radius) / w) - 1,
+        iMaxX = Math.ceil((localSpherePos.x + radius) / w) + 1,
+        iMinY = Math.floor((localSpherePos.y - radius) / w) - 1,
+        iMaxY = Math.ceil((localSpherePos.y + radius) / w) + 1;
+
+    // Bail out if we are out of the terrain
+    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMaxY > data[0].length){
+        return;
+    }
+
+    // Clamp index to edges
+    if(iMinX < 0){ iMinX = 0; }
+    if(iMaxX < 0){ iMaxX = 0; }
+    if(iMinY < 0){ iMinY = 0; }
+    if(iMaxY < 0){ iMaxY = 0; }
+    if(iMinX >= data.length){ iMinX = data.length - 1; }
+    if(iMaxX >= data.length){ iMaxX = data.length - 1; }
+    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }
+    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }
+
+    var minMax = [];
+    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);
+    var min = minMax[0];
+    var max = minMax[1];
+
+    // Bail out if we're cant touch the bounding height box
+    if(localSpherePos.z - radius > max || localSpherePos.z + radius < min){
+        return;
+    }
+
+    var result = this.result;
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            var numContactsBefore = result.length;
+
+            var intersecting = false;
+
+            // Lower triangle
+            hfShape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {
+                intersecting = this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody, sphereShape, hfShape, justTest);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            // Upper triangle
+            hfShape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {
+                intersecting = this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody, sphereShape, hfShape, justTest);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            var numContacts = result.length - numContactsBefore;
+
+            if(numContacts > 2){
+                return;
+            }
+            /*
+            // Skip all but 1
+            for (var k = 0; k < numContacts - 1; k++) {
+                result.pop();
+            }
+            */
+        }
+    }
+};
+
+},{"../collision/AABB":18,"../collision/Ray":25,"../equations/ContactEquation":35,"../equations/FrictionEquation":37,"../math/Quaternion":44,"../math/Transform":45,"../math/Vec3":46,"../objects/Body":47,"../shapes/ConvexPolyhedron":54,"../shapes/Shape":59,"../solver/Solver":63,"../utils/Vec3Pool":70}],72:[function(require,module,exports){
+/* global performance */
+
+module.exports = World;
+
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var GSSolver = require('../solver/GSSolver');
+var ContactEquation = require('../equations/ContactEquation');
+var FrictionEquation = require('../equations/FrictionEquation');
+var Narrowphase = require('./Narrowphase');
+var EventTarget = require('../utils/EventTarget');
+var ArrayCollisionMatrix = require('../collision/ArrayCollisionMatrix');
+var OverlapKeeper = require('../collision/OverlapKeeper');
+var Material = require('../material/Material');
+var ContactMaterial = require('../material/ContactMaterial');
+var Body = require('../objects/Body');
+var TupleDictionary = require('../utils/TupleDictionary');
+var RaycastResult = require('../collision/RaycastResult');
+var AABB = require('../collision/AABB');
+var Ray = require('../collision/Ray');
+var NaiveBroadphase = require('../collision/NaiveBroadphase');
+
+/**
+ * The physics world
+ * @class World
+ * @constructor
+ * @extends EventTarget
+ * @param {object} [options]
+ * @param {Vec3} [options.gravity]
+ * @param {boolean} [options.allowSleep]
+ * @param {Broadphase} [options.broadphase]
+ * @param {Solver} [options.solver]
+ * @param {boolean} [options.quatNormalizeFast]
+ * @param {number} [options.quatNormalizeSkip]
+ */
+function World(options){
+    options = options || {};
+    EventTarget.apply(this);
+
+    /**
+     * Currently / last used timestep. Is set to -1 if not available. This value is updated before each internal step, which means that it is "fresh" inside event callbacks.
+     * @property {Number} dt
+     */
+    this.dt = -1;
+
+    /**
+     * Makes bodies go to sleep when they've been inactive
+     * @property allowSleep
+     * @type {Boolean}
+     * @default false
+     */
+    this.allowSleep = !!options.allowSleep;
+
+    /**
+     * All the current contacts (instances of ContactEquation) in the world.
+     * @property contacts
+     * @type {Array}
+     */
+    this.contacts = [];
+    this.frictionEquations = [];
+
+    /**
+     * How often to normalize quaternions. Set to 0 for every step, 1 for every second etc.. A larger value increases performance. If bodies tend to explode, set to a smaller value (zero to be sure nothing can go wrong).
+     * @property quatNormalizeSkip
+     * @type {Number}
+     * @default 0
+     */
+    this.quatNormalizeSkip = options.quatNormalizeSkip !== undefined ? options.quatNormalizeSkip : 0;
+
+    /**
+     * Set to true to use fast quaternion normalization. It is often enough accurate to use. If bodies tend to explode, set to false.
+     * @property quatNormalizeFast
+     * @type {Boolean}
+     * @see Quaternion.normalizeFast
+     * @see Quaternion.normalize
+     * @default false
+     */
+    this.quatNormalizeFast = options.quatNormalizeFast !== undefined ? options.quatNormalizeFast : false;
+
+    /**
+     * The wall-clock time since simulation start
+     * @property time
+     * @type {Number}
+     */
+    this.time = 0.0;
+
+    /**
+     * Number of timesteps taken since start
+     * @property stepnumber
+     * @type {Number}
+     */
+    this.stepnumber = 0;
+
+    /// Default and last timestep sizes
+    this.default_dt = 1/60;
+
+    this.nextId = 0;
+    /**
+     * @property gravity
+     * @type {Vec3}
+     */
+    this.gravity = new Vec3();
+    if(options.gravity){
+        this.gravity.copy(options.gravity);
+    }
+
+    /**
+     * The broadphase algorithm to use. Default is NaiveBroadphase
+     * @property broadphase
+     * @type {Broadphase}
+     */
+    this.broadphase = options.broadphase !== undefined ? options.broadphase : new NaiveBroadphase();
+
+    /**
+     * @property bodies
+     * @type {Array}
+     */
+    this.bodies = [];
+
+    /**
+     * The solver algorithm to use. Default is GSSolver
+     * @property solver
+     * @type {Solver}
+     */
+    this.solver = options.solver !== undefined ? options.solver : new GSSolver();
+
+    /**
+     * @property constraints
+     * @type {Array}
+     */
+    this.constraints = [];
+
+    /**
+     * @property narrowphase
+     * @type {Narrowphase}
+     */
+    this.narrowphase = new Narrowphase(this);
+
+    /**
+     * @property {ArrayCollisionMatrix} collisionMatrix
+	 * @type {ArrayCollisionMatrix}
+	 */
+	this.collisionMatrix = new ArrayCollisionMatrix();
+
+    /**
+     * CollisionMatrix from the previous step.
+     * @property {ArrayCollisionMatrix} collisionMatrixPrevious
+	 * @type {ArrayCollisionMatrix}
+	 */
+	this.collisionMatrixPrevious = new ArrayCollisionMatrix();
+
+    this.bodyOverlapKeeper = new OverlapKeeper();
+    this.shapeOverlapKeeper = new OverlapKeeper();
+
+    /**
+     * All added materials
+     * @property materials
+     * @type {Array}
+     */
+    this.materials = [];
+
+    /**
+     * @property contactmaterials
+     * @type {Array}
+     */
+    this.contactmaterials = [];
+
+    /**
+     * Used to look up a ContactMaterial given two instances of Material.
+     * @property {TupleDictionary} contactMaterialTable
+     */
+    this.contactMaterialTable = new TupleDictionary();
+
+    this.defaultMaterial = new Material("default");
+
+    /**
+     * This contact material is used if no suitable contactmaterial is found for a contact.
+     * @property defaultContactMaterial
+     * @type {ContactMaterial}
+     */
+    this.defaultContactMaterial = new ContactMaterial(this.defaultMaterial, this.defaultMaterial, { friction: 0.3, restitution: 0.0 });
+
+    /**
+     * @property doProfiling
+     * @type {Boolean}
+     */
+    this.doProfiling = false;
+
+    /**
+     * @property profile
+     * @type {Object}
+     */
+    this.profile = {
+        solve:0,
+        makeContactConstraints:0,
+        broadphase:0,
+        integrate:0,
+        narrowphase:0,
+    };
+
+    /**
+     * Time accumulator for interpolation. See http://gafferongames.com/game-physics/fix-your-timestep/
+     * @property {Number} accumulator
+     */
+    this.accumulator = 0;
+
+    /**
+     * @property subsystems
+     * @type {Array}
+     */
+    this.subsystems = [];
+
+    /**
+     * Dispatched after a body has been added to the world.
+     * @event addBody
+     * @param {Body} body The body that has been added to the world.
+     */
+    this.addBodyEvent = {
+        type:"addBody",
+        body : null
+    };
+
+    /**
+     * Dispatched after a body has been removed from the world.
+     * @event removeBody
+     * @param {Body} body The body that has been removed from the world.
+     */
+    this.removeBodyEvent = {
+        type:"removeBody",
+        body : null
+    };
+
+    this.idToBodyMap = {};
+
+    this.broadphase.setWorld(this);
+}
+World.prototype = new EventTarget();
+
+// Temp stuff
+var tmpAABB1 = new AABB();
+var tmpArray1 = [];
+var tmpRay = new Ray();
+
+/**
+ * Get the contact material between materials m1 and m2
+ * @method getContactMaterial
+ * @param {Material} m1
+ * @param {Material} m2
+ * @return {ContactMaterial} The contact material if it was found.
+ */
+World.prototype.getContactMaterial = function(m1,m2){
+    return this.contactMaterialTable.get(m1.id,m2.id); //this.contactmaterials[this.mats2cmat[i+j*this.materials.length]];
+};
+
+/**
+ * Get number of objects in the world.
+ * @method numObjects
+ * @return {Number}
+ * @deprecated
+ */
+World.prototype.numObjects = function(){
+    return this.bodies.length;
+};
+
+/**
+ * Store old collision state info
+ * @method collisionMatrixTick
+ */
+World.prototype.collisionMatrixTick = function(){
+	var temp = this.collisionMatrixPrevious;
+	this.collisionMatrixPrevious = this.collisionMatrix;
+	this.collisionMatrix = temp;
+	this.collisionMatrix.reset();
+
+    this.bodyOverlapKeeper.tick();
+    this.shapeOverlapKeeper.tick();
+};
+
+/**
+ * Add a rigid body to the simulation.
+ * @method add
+ * @param {Body} body
+ * @todo If the simulation has not yet started, why recrete and copy arrays for each body? Accumulate in dynamic arrays in this case.
+ * @todo Adding an array of bodies should be possible. This would save some loops too
+ * @deprecated Use .addBody instead
+ */
+World.prototype.add = World.prototype.addBody = function(body){
+    if(this.bodies.indexOf(body) !== -1){
+        return;
+    }
+    body.index = this.bodies.length;
+    this.bodies.push(body);
+    body.world = this;
+    body.initPosition.copy(body.position);
+    body.initVelocity.copy(body.velocity);
+    body.timeLastSleepy = this.time;
+    if(body instanceof Body){
+        body.initAngularVelocity.copy(body.angularVelocity);
+        body.initQuaternion.copy(body.quaternion);
+    }
+	this.collisionMatrix.setNumObjects(this.bodies.length);
+    this.addBodyEvent.body = body;
+    this.idToBodyMap[body.id] = body;
+    this.dispatchEvent(this.addBodyEvent);
+};
+
+/**
+ * Add a constraint to the simulation.
+ * @method addConstraint
+ * @param {Constraint} c
+ */
+World.prototype.addConstraint = function(c){
+    this.constraints.push(c);
+};
+
+/**
+ * Removes a constraint
+ * @method removeConstraint
+ * @param {Constraint} c
+ */
+World.prototype.removeConstraint = function(c){
+    var idx = this.constraints.indexOf(c);
+    if(idx!==-1){
+        this.constraints.splice(idx,1);
+    }
+};
+
+/**
+ * Raycast test
+ * @method rayTest
+ * @param {Vec3} from
+ * @param {Vec3} to
+ * @param {RaycastResult} result
+ * @deprecated Use .raycastAll, .raycastClosest or .raycastAny instead.
+ */
+World.prototype.rayTest = function(from, to, result){
+    if(result instanceof RaycastResult){
+        // Do raycastclosest
+        this.raycastClosest(from, to, {
+            skipBackfaces: true
+        }, result);
+    } else {
+        // Do raycastAll
+        this.raycastAll(from, to, {
+            skipBackfaces: true
+        }, result);
+    }
+};
+
+/**
+ * Ray cast against all bodies. The provided callback will be executed for each hit with a RaycastResult as single argument.
+ * @method raycastAll
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {Function} callback
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastAll = function(from, to, options, callback){
+    options.mode = Ray.ALL;
+    options.from = from;
+    options.to = to;
+    options.callback = callback;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Ray cast, and stop at the first result. Note that the order is random - but the method is fast.
+ * @method raycastAny
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {RaycastResult} result
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastAny = function(from, to, options, result){
+    options.mode = Ray.ANY;
+    options.from = from;
+    options.to = to;
+    options.result = result;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Ray cast, and return information of the closest hit.
+ * @method raycastClosest
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {RaycastResult} result
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastClosest = function(from, to, options, result){
+    options.mode = Ray.CLOSEST;
+    options.from = from;
+    options.to = to;
+    options.result = result;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Remove a rigid body from the simulation.
+ * @method remove
+ * @param {Body} body
+ * @deprecated Use .removeBody instead
+ */
+World.prototype.remove = function(body){
+    body.world = null;
+    var n = this.bodies.length - 1,
+        bodies = this.bodies,
+        idx = bodies.indexOf(body);
+    if(idx !== -1){
+        bodies.splice(idx, 1); // Todo: should use a garbage free method
+
+        // Recompute index
+        for(var i=0; i!==bodies.length; i++){
+            bodies[i].index = i;
+        }
+
+        this.collisionMatrix.setNumObjects(n);
+        this.removeBodyEvent.body = body;
+        delete this.idToBodyMap[body.id];
+        this.dispatchEvent(this.removeBodyEvent);
+    }
+};
+
+/**
+ * Remove a rigid body from the simulation.
+ * @method removeBody
+ * @param {Body} body
+ */
+World.prototype.removeBody = World.prototype.remove;
+
+World.prototype.getBodyById = function(id){
+    return this.idToBodyMap[id];
+};
+
+// TODO Make a faster map
+World.prototype.getShapeById = function(id){
+    var bodies = this.bodies;
+    for(var i=0, bl = bodies.length; i<bl; i++){
+        var shapes = bodies[i].shapes;
+        for (var j = 0, sl = shapes.length; j < sl; j++) {
+            var shape = shapes[j];
+            if(shape.id === id){
+                return shape;
+            }
+        }
+    }
+};
+
+/**
+ * Adds a material to the World.
+ * @method addMaterial
+ * @param {Material} m
+ * @todo Necessary?
+ */
+World.prototype.addMaterial = function(m){
+    this.materials.push(m);
+};
+
+/**
+ * Adds a contact material to the World
+ * @method addContactMaterial
+ * @param {ContactMaterial} cmat
+ */
+World.prototype.addContactMaterial = function(cmat) {
+
+    // Add contact material
+    this.contactmaterials.push(cmat);
+
+    // Add current contact material to the material table
+    this.contactMaterialTable.set(cmat.materials[0].id,cmat.materials[1].id,cmat);
+};
+
+// performance.now()
+if(typeof performance === 'undefined'){
+    performance = {};
+}
+if(!performance.now){
+    var nowOffset = Date.now();
+    if (performance.timing && performance.timing.navigationStart){
+        nowOffset = performance.timing.navigationStart;
+    }
+    performance.now = function(){
+        return Date.now() - nowOffset;
+    };
+}
+
+var step_tmp1 = new Vec3();
+
+/**
+ * Step the physics world forward in time.
+ *
+ * There are two modes. The simple mode is fixed timestepping without interpolation. In this case you only use the first argument. The second case uses interpolation. In that you also provide the time since the function was last used, as well as the maximum fixed timesteps to take.
+ *
+ * @method step
+ * @param {Number} dt                       The fixed time step size to use.
+ * @param {Number} [timeSinceLastCalled]    The time elapsed since the function was last called.
+ * @param {Number} [maxSubSteps=10]         Maximum number of fixed steps to take per function call.
+ *
+ * @example
+ *     // fixed timestepping without interpolation
+ *     world.step(1/60);
+ *
+ * @see http://bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World
+ */
+World.prototype.step = function(dt, timeSinceLastCalled, maxSubSteps){
+    maxSubSteps = maxSubSteps || 10;
+    timeSinceLastCalled = timeSinceLastCalled || 0;
+
+    if(timeSinceLastCalled === 0){ // Fixed, simple stepping
+
+        this.internalStep(dt);
+
+        // Increment time
+        this.time += dt;
+
+    } else {
+
+        this.accumulator += timeSinceLastCalled;
+        var substeps = 0;
+        while (this.accumulator >= dt && substeps < maxSubSteps) {
+            // Do fixed steps to catch up
+            this.internalStep(dt);
+            this.accumulator -= dt;
+            substeps++;
+        }
+
+        var t = (this.accumulator % dt) / dt;
+        for(var j=0; j !== this.bodies.length; j++){
+            var b = this.bodies[j];
+            b.previousPosition.lerp(b.position, t, b.interpolatedPosition);
+            b.previousQuaternion.slerp(b.quaternion, t, b.interpolatedQuaternion);
+            b.previousQuaternion.normalize();
+        }
+        this.time += timeSinceLastCalled;
+    }
+};
+
+var
+    /**
+     * Dispatched after the world has stepped forward in time.
+     * @event postStep
+     */
+    World_step_postStepEvent = {type:"postStep"}, // Reusable event objects to save memory
+    /**
+     * Dispatched before the world steps forward in time.
+     * @event preStep
+     */
+    World_step_preStepEvent = {type:"preStep"},
+    World_step_collideEvent = {type:Body.COLLIDE_EVENT_NAME, body:null, contact:null },
+    World_step_oldContacts = [], // Pools for unused objects
+    World_step_frictionEquationPool = [],
+    World_step_p1 = [], // Reusable arrays for collision pairs
+    World_step_p2 = [],
+    World_step_gvec = new Vec3(), // Temporary vectors and quats
+    World_step_vi = new Vec3(),
+    World_step_vj = new Vec3(),
+    World_step_wi = new Vec3(),
+    World_step_wj = new Vec3(),
+    World_step_t1 = new Vec3(),
+    World_step_t2 = new Vec3(),
+    World_step_rixn = new Vec3(),
+    World_step_rjxn = new Vec3(),
+    World_step_step_q = new Quaternion(),
+    World_step_step_w = new Quaternion(),
+    World_step_step_wq = new Quaternion(),
+    invI_tau_dt = new Vec3();
+World.prototype.internalStep = function(dt){
+    this.dt = dt;
+
+    var world = this,
+        that = this,
+        contacts = this.contacts,
+        p1 = World_step_p1,
+        p2 = World_step_p2,
+        N = this.numObjects(),
+        bodies = this.bodies,
+        solver = this.solver,
+        gravity = this.gravity,
+        doProfiling = this.doProfiling,
+        profile = this.profile,
+        DYNAMIC = Body.DYNAMIC,
+        profilingStart,
+        constraints = this.constraints,
+        frictionEquationPool = World_step_frictionEquationPool,
+        gnorm = gravity.norm(),
+        gx = gravity.x,
+        gy = gravity.y,
+        gz = gravity.z,
+        i=0;
+
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+
+    // Add gravity to all objects
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.type === DYNAMIC){ // Only for dynamic bodies
+            var f = bi.force, m = bi.mass;
+            f.x += m*gx;
+            f.y += m*gy;
+            f.z += m*gz;
+        }
+    }
+
+    // Update subsystems
+    for(var i=0, Nsubsystems=this.subsystems.length; i!==Nsubsystems; i++){
+        this.subsystems[i].update();
+    }
+
+    // Collision detection
+    if(doProfiling){ profilingStart = performance.now(); }
+    p1.length = 0; // Clean up pair arrays from last step
+    p2.length = 0;
+    this.broadphase.collisionPairs(this,p1,p2);
+    if(doProfiling){ profile.broadphase = performance.now() - profilingStart; }
+
+    // Remove constrained pairs with collideConnected == false
+    var Nconstraints = constraints.length;
+    for(i=0; i!==Nconstraints; i++){
+        var c = constraints[i];
+        if(!c.collideConnected){
+            for(var j = p1.length-1; j>=0; j-=1){
+                if( (c.bodyA === p1[j] && c.bodyB === p2[j]) ||
+                    (c.bodyB === p1[j] && c.bodyA === p2[j])){
+                    p1.splice(j, 1);
+                    p2.splice(j, 1);
+                }
+            }
+        }
+    }
+
+    this.collisionMatrixTick();
+
+    // Generate contacts
+    if(doProfiling){ profilingStart = performance.now(); }
+    var oldcontacts = World_step_oldContacts;
+    var NoldContacts = contacts.length;
+
+    for(i=0; i!==NoldContacts; i++){
+        oldcontacts.push(contacts[i]);
+    }
+    contacts.length = 0;
+
+    // Transfer FrictionEquation from current list to the pool for reuse
+    var NoldFrictionEquations = this.frictionEquations.length;
+    for(i=0; i!==NoldFrictionEquations; i++){
+        frictionEquationPool.push(this.frictionEquations[i]);
+    }
+    this.frictionEquations.length = 0;
+
+    this.narrowphase.getContacts(
+        p1,
+        p2,
+        this,
+        contacts,
+        oldcontacts, // To be reused
+        this.frictionEquations,
+        frictionEquationPool
+    );
+
+    if(doProfiling){
+        profile.narrowphase = performance.now() - profilingStart;
+    }
+
+    // Loop over all collisions
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+
+    // Add all friction eqs
+    for (var i = 0; i < this.frictionEquations.length; i++) {
+        solver.addEquation(this.frictionEquations[i]);
+    }
+
+    var ncontacts = contacts.length;
+    for(var k=0; k!==ncontacts; k++){
+
+        // Current contact
+        var c = contacts[k];
+
+        // Get current collision indeces
+        var bi = c.bi,
+            bj = c.bj,
+            si = c.si,
+            sj = c.sj;
+
+        // Get collision properties
+        var cm;
+        if(bi.material && bj.material){
+            cm = this.getContactMaterial(bi.material,bj.material) || this.defaultContactMaterial;
+        } else {
+            cm = this.defaultContactMaterial;
+        }
+
+        // c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;
+
+        var mu = cm.friction;
+        // c.restitution = cm.restitution;
+
+        // If friction or restitution were specified in the material, use them
+        if(bi.material && bj.material){
+            if(bi.material.friction >= 0 && bj.material.friction >= 0){
+                mu = bi.material.friction * bj.material.friction;
+            }
+
+            if(bi.material.restitution >= 0 && bj.material.restitution >= 0){
+                c.restitution = bi.material.restitution * bj.material.restitution;
+            }
+        }
+
+		// c.setSpookParams(
+  //           cm.contactEquationStiffness,
+  //           cm.contactEquationRelaxation,
+  //           dt
+  //       );
+
+		solver.addEquation(c);
+
+		// // Add friction constraint equation
+		// if(mu > 0){
+
+		// 	// Create 2 tangent equations
+		// 	var mug = mu * gnorm;
+		// 	var reducedMass = (bi.invMass + bj.invMass);
+		// 	if(reducedMass > 0){
+		// 		reducedMass = 1/reducedMass;
+		// 	}
+		// 	var pool = frictionEquationPool;
+		// 	var c1 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);
+		// 	var c2 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);
+		// 	this.frictionEquations.push(c1, c2);
+
+		// 	c1.bi = c2.bi = bi;
+		// 	c1.bj = c2.bj = bj;
+		// 	c1.minForce = c2.minForce = -mug*reducedMass;
+		// 	c1.maxForce = c2.maxForce = mug*reducedMass;
+
+		// 	// Copy over the relative vectors
+		// 	c1.ri.copy(c.ri);
+		// 	c1.rj.copy(c.rj);
+		// 	c2.ri.copy(c.ri);
+		// 	c2.rj.copy(c.rj);
+
+		// 	// Construct tangents
+		// 	c.ni.tangents(c1.t, c2.t);
+
+  //           // Set spook params
+  //           c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);
+  //           c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);
+
+  //           c1.enabled = c2.enabled = c.enabled;
+
+		// 	// Add equations to solver
+		// 	solver.addEquation(c1);
+		// 	solver.addEquation(c2);
+		// }
+
+        if( bi.allowSleep &&
+            bi.type === Body.DYNAMIC &&
+            bi.sleepState  === Body.SLEEPING &&
+            bj.sleepState  === Body.AWAKE &&
+            bj.type !== Body.STATIC
+        ){
+            var speedSquaredB = bj.velocity.norm2() + bj.angularVelocity.norm2();
+            var speedLimitSquaredB = Math.pow(bj.sleepSpeedLimit,2);
+            if(speedSquaredB >= speedLimitSquaredB*2){
+                bi._wakeUpAfterNarrowphase = true;
+            }
+        }
+
+        if( bj.allowSleep &&
+            bj.type === Body.DYNAMIC &&
+            bj.sleepState  === Body.SLEEPING &&
+            bi.sleepState  === Body.AWAKE &&
+            bi.type !== Body.STATIC
+        ){
+            var speedSquaredA = bi.velocity.norm2() + bi.angularVelocity.norm2();
+            var speedLimitSquaredA = Math.pow(bi.sleepSpeedLimit,2);
+            if(speedSquaredA >= speedLimitSquaredA*2){
+                bj._wakeUpAfterNarrowphase = true;
+            }
+        }
+
+        // Now we know that i and j are in contact. Set collision matrix state
+		this.collisionMatrix.set(bi, bj, true);
+
+        if (!this.collisionMatrixPrevious.get(bi, bj)) {
+            // First contact!
+            // We reuse the collideEvent object, otherwise we will end up creating new objects for each new contact, even if there's no event listener attached.
+            World_step_collideEvent.body = bj;
+            World_step_collideEvent.contact = c;
+            bi.dispatchEvent(World_step_collideEvent);
+
+            World_step_collideEvent.body = bi;
+            bj.dispatchEvent(World_step_collideEvent);
+        }
+
+        this.bodyOverlapKeeper.set(bi.id, bj.id);
+        this.shapeOverlapKeeper.set(si.id, sj.id);
+    }
+
+    this.emitContactEvents();
+
+    if(doProfiling){
+        profile.makeContactConstraints = performance.now() - profilingStart;
+        profilingStart = performance.now();
+    }
+
+    // Wake up bodies
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi._wakeUpAfterNarrowphase){
+            bi.wakeUp();
+            bi._wakeUpAfterNarrowphase = false;
+        }
+    }
+
+    // Add user-added constraints
+    var Nconstraints = constraints.length;
+    for(i=0; i!==Nconstraints; i++){
+        var c = constraints[i];
+        c.update();
+        for(var j=0, Neq=c.equations.length; j!==Neq; j++){
+            var eq = c.equations[j];
+            solver.addEquation(eq);
+        }
+    }
+
+    // Solve the constrained system
+    solver.solve(dt,this);
+
+    if(doProfiling){
+        profile.solve = performance.now() - profilingStart;
+    }
+
+    // Remove all contacts from solver
+    solver.removeAllEquations();
+
+    // Apply damping, see http://code.google.com/p/bullet/issues/detail?id=74 for details
+    var pow = Math.pow;
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.type & DYNAMIC){ // Only for dynamic bodies
+            var ld = pow(1.0 - bi.linearDamping,dt);
+            var v = bi.velocity;
+            v.mult(ld,v);
+            var av = bi.angularVelocity;
+            if(av){
+                var ad = pow(1.0 - bi.angularDamping,dt);
+                av.mult(ad,av);
+            }
+        }
+    }
+
+    this.dispatchEvent(World_step_preStepEvent);
+
+    // Invoke pre-step callbacks
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.preStep){
+            bi.preStep.call(bi);
+        }
+    }
+
+    // Leap frog
+    // vnew = v + h*f/m
+    // xnew = x + h*vnew
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+    var stepnumber = this.stepnumber;
+    var quatNormalize = stepnumber % (this.quatNormalizeSkip + 1) === 0;
+    var quatNormalizeFast = this.quatNormalizeFast;
+
+    for(i=0; i!==N; i++){
+        bodies[i].integrate(dt, quatNormalize, quatNormalizeFast);
+    }
+    this.clearForces();
+
+    this.broadphase.dirty = true;
+
+    if(doProfiling){
+        profile.integrate = performance.now() - profilingStart;
+    }
+
+    // Update world time
+    this.time += dt;
+    this.stepnumber += 1;
+
+    this.dispatchEvent(World_step_postStepEvent);
+
+    // Invoke post-step callbacks
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        var postStep = bi.postStep;
+        if(postStep){
+            postStep.call(bi);
+        }
+    }
+
+    // Sleeping update
+    if(this.allowSleep){
+        for(i=0; i!==N; i++){
+            bodies[i].sleepTick(this.time);
+        }
+    }
+};
+
+World.prototype.emitContactEvents = (function(){
+    var additions = [];
+    var removals = [];
+    var beginContactEvent = {
+        type: 'beginContact',
+        bodyA: null,
+        bodyB: null
+    };
+    var endContactEvent = {
+        type: 'endContact',
+        bodyA: null,
+        bodyB: null
+    };
+    var beginShapeContactEvent = {
+        type: 'beginShapeContact',
+        bodyA: null,
+        bodyB: null,
+        shapeA: null,
+        shapeB: null
+    };
+    var endShapeContactEvent = {
+        type: 'endShapeContact',
+        bodyA: null,
+        bodyB: null,
+        shapeA: null,
+        shapeB: null
+    };
+    return function(){
+        var hasBeginContact = this.hasAnyEventListener('beginContact');
+        var hasEndContact = this.hasAnyEventListener('endContact');
+
+        if(hasBeginContact || hasEndContact){
+            this.bodyOverlapKeeper.getDiff(additions, removals);
+        }
+
+        if(hasBeginContact){
+            for (var i = 0, l = additions.length; i < l; i += 2) {
+                beginContactEvent.bodyA = this.getBodyById(additions[i]);
+                beginContactEvent.bodyB = this.getBodyById(additions[i+1]);
+                this.dispatchEvent(beginContactEvent);
+            }
+            beginContactEvent.bodyA = beginContactEvent.bodyB = null;
+        }
+
+        if(hasEndContact){
+            for (var i = 0, l = removals.length; i < l; i += 2) {
+                endContactEvent.bodyA = this.getBodyById(removals[i]);
+                endContactEvent.bodyB = this.getBodyById(removals[i+1]);
+                this.dispatchEvent(endContactEvent);
+            }
+            endContactEvent.bodyA = endContactEvent.bodyB = null;
+        }
+
+        additions.length = removals.length = 0;
+
+        var hasBeginShapeContact = this.hasAnyEventListener('beginShapeContact');
+        var hasEndShapeContact = this.hasAnyEventListener('endShapeContact');
+
+        if(hasBeginShapeContact || hasEndShapeContact){
+            this.shapeOverlapKeeper.getDiff(additions, removals);
+        }
+
+        if(hasBeginShapeContact){
+            for (var i = 0, l = additions.length; i < l; i += 2) {
+                var shapeA = this.getShapeById(additions[i]);
+                var shapeB = this.getShapeById(additions[i+1]);
+                beginShapeContactEvent.shapeA = shapeA;
+                beginShapeContactEvent.shapeB = shapeB;
+                beginShapeContactEvent.bodyA = shapeA.body;
+                beginShapeContactEvent.bodyB = shapeB.body;
+                this.dispatchEvent(beginShapeContactEvent);
+            }
+            beginShapeContactEvent.bodyA = beginShapeContactEvent.bodyB = beginShapeContactEvent.shapeA = beginShapeContactEvent.shapeB = null;
+        }
+
+        if(hasEndShapeContact){
+            for (var i = 0, l = removals.length; i < l; i += 2) {
+                var shapeA = this.getShapeById(removals[i]);
+                var shapeB = this.getShapeById(removals[i+1]);
+                endShapeContactEvent.shapeA = shapeA;
+                endShapeContactEvent.shapeB = shapeB;
+                endShapeContactEvent.bodyA = shapeA.body;
+                endShapeContactEvent.bodyB = shapeB.body;
+                this.dispatchEvent(endShapeContactEvent);
+            }
+            endShapeContactEvent.bodyA = endShapeContactEvent.bodyB = endShapeContactEvent.shapeA = endShapeContactEvent.shapeB = null;
+        }
+
+    };
+})();
+
+/**
+ * Sets all body forces in the world to zero.
+ * @method clearForces
+ */
+World.prototype.clearForces = function(){
+    var bodies = this.bodies;
+    var N = bodies.length;
+    for(var i=0; i !== N; i++){
+        var b = bodies[i],
+            force = b.force,
+            tau = b.torque;
+
+        b.force.set(0,0,0);
+        b.torque.set(0,0,0);
+    }
+};
+
+},{"../collision/AABB":18,"../collision/ArrayCollisionMatrix":19,"../collision/NaiveBroadphase":22,"../collision/OverlapKeeper":24,"../collision/Ray":25,"../collision/RaycastResult":26,"../equations/ContactEquation":35,"../equations/FrictionEquation":37,"../material/ContactMaterial":40,"../material/Material":41,"../math/Quaternion":44,"../math/Vec3":46,"../objects/Body":47,"../shapes/Shape":59,"../solver/GSSolver":62,"../utils/EventTarget":65,"../utils/TupleDictionary":68,"./Narrowphase":71}],73:[function(require,module,exports){
+var CANNON = require('cannon'),
+    quickhull = require('./lib/THREE.quickhull');
+
+var PI_2 = Math.PI / 2;
+
+var Type = {
+  BOX: 'Box',
+  CYLINDER: 'Cylinder',
+  SPHERE: 'Sphere',
+  HULL: 'ConvexPolyhedron',
+  MESH: 'Trimesh'
+};
+
+/**
+ * Given a THREE.Object3D instance, creates a corresponding CANNON shape.
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+module.exports = CANNON.mesh2shape = function (object, options) {
+  options = options || {};
+
+  var geometry;
+
+  if (options.type === Type.BOX) {
+    return createBoundingBoxShape(object);
+  } else if (options.type === Type.CYLINDER) {
+    return createBoundingCylinderShape(object, options);
+  } else if (options.type === Type.SPHERE) {
+    return createBoundingSphereShape(object, options);
+  } else if (options.type === Type.HULL) {
+    return createConvexPolyhedron(object);
+  } else if (options.type === Type.MESH) {
+    geometry = getGeometry(object);
+    return geometry ? createTrimeshShape(geometry) : null;
+  } else if (options.type) {
+    throw new Error('[CANNON.mesh2shape] Invalid type "%s".', options.type);
+  }
+
+  geometry = getGeometry(object);
+  if (!geometry) return null;
+
+  var type = geometry.metadata
+    ? geometry.metadata.type
+    : geometry.type;
+
+  switch (type) {
+    case 'BoxGeometry':
+    case 'BoxBufferGeometry':
+      return createBoxShape(geometry);
+    case 'CylinderGeometry':
+    case 'CylinderBufferGeometry':
+      return createCylinderShape(geometry);
+    case 'PlaneGeometry':
+    case 'PlaneBufferGeometry':
+      return createPlaneShape(geometry);
+    case 'SphereGeometry':
+    case 'SphereBufferGeometry':
+      return createSphereShape(geometry);
+    case 'TubeGeometry':
+    case 'Geometry':
+    case 'BufferGeometry':
+      return createBoundingBoxShape(object);
+    default:
+      console.warn('Unrecognized geometry: "%s". Using bounding box as shape.', geometry.type);
+      return createBoxShape(geometry);
+  }
+};
+
+CANNON.mesh2shape.Type = Type;
+
+/******************************************************************************
+ * Shape construction
+ */
+
+ /**
+  * @param  {THREE.Geometry} geometry
+  * @return {CANNON.Shape}
+  */
+ function createBoxShape (geometry) {
+   var vertices = getVertices(geometry);
+
+   if (!vertices.length) return null;
+
+   geometry.computeBoundingBox();
+   var box = geometry.boundingBox;
+   return new CANNON.Box(new CANNON.Vec3(
+     (box.max.x - box.min.x) / 2,
+     (box.max.y - box.min.y) / 2,
+     (box.max.z - box.min.z) / 2
+   ));
+ }
+
+/**
+ * Bounding box needs to be computed with the entire mesh, not just geometry.
+ * @param  {THREE.Object3D} mesh
+ * @return {CANNON.Shape}
+ */
+function createBoundingBoxShape (object) {
+  var shape, localPosition, worldPosition,
+      box = new THREE.Box3();
+
+  box.setFromObject(object);
+
+  if (!isFinite(box.min.lengthSq())) return null;
+
+  shape = new CANNON.Box(new CANNON.Vec3(
+    (box.max.x - box.min.x) / 2,
+    (box.max.y - box.min.y) / 2,
+    (box.max.z - box.min.z) / 2
+  ));
+
+  object.updateMatrixWorld();
+  worldPosition = new THREE.Vector3();
+  worldPosition.setFromMatrixPosition(object.matrixWorld);
+  localPosition = box.translate(worldPosition.negate()).getCenter();
+  if (localPosition.lengthSq()) {
+    shape.offset = localPosition;
+  }
+
+  return shape;
+}
+
+/**
+ * Computes 3D convex hull as a CANNON.ConvexPolyhedron.
+ * @param  {THREE.Object3D} mesh
+ * @return {CANNON.Shape}
+ */
+function createConvexPolyhedron (object) {
+  var i, vertices, faces, hull,
+      eps = 1e-4,
+      geometry = getGeometry(object);
+
+  if (!geometry || !geometry.vertices.length) return null;
+
+  // Perturb.
+  for (i = 0; i < geometry.vertices.length; i++) {
+    geometry.vertices[i].x += (Math.random() - 0.5) * eps;
+    geometry.vertices[i].y += (Math.random() - 0.5) * eps;
+    geometry.vertices[i].z += (Math.random() - 0.5) * eps;
+  }
+
+  // Compute the 3D convex hull.
+  hull = quickhull(geometry);
+
+  // Convert from THREE.Vector3 to CANNON.Vec3.
+  vertices = new Array(hull.vertices.length);
+  for (i = 0; i < hull.vertices.length; i++) {
+    vertices[i] = new CANNON.Vec3(hull.vertices[i].x, hull.vertices[i].y, hull.vertices[i].z);
+  }
+
+  // Convert from THREE.Face to Array<number>.
+  faces = new Array(hull.faces.length);
+  for (i = 0; i < hull.faces.length; i++) {
+    faces[i] = [hull.faces[i].a, hull.faces[i].b, hull.faces[i].c];
+  }
+
+  return new CANNON.ConvexPolyhedron(vertices, faces);
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createCylinderShape (geometry) {
+  var shape,
+      params = geometry.metadata
+        ? geometry.metadata.parameters
+        : geometry.parameters;
+  shape = new CANNON.Cylinder(
+    params.radiusTop,
+    params.radiusBottom,
+    params.height,
+    params.radialSegments
+  );
+
+  // Include metadata for serialization.
+  shape._type = CANNON.Shape.types.CYLINDER; // Patch schteppe/cannon.js#329.
+  shape.radiusTop = params.radiusTop;
+  shape.radiusBottom = params.radiusBottom;
+  shape.height = params.height;
+  shape.numSegments = params.radialSegments;
+
+  shape.orientation = new CANNON.Quaternion();
+  shape.orientation.setFromEuler(THREE.Math.degToRad(-90), 0, 0, 'XYZ').normalize();
+  return shape;
+}
+
+/**
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+function createBoundingCylinderShape (object, options) {
+  var shape, height, radius,
+      box = new THREE.Box3(),
+      axes = ['x', 'y', 'z'],
+      majorAxis = options.cylinderAxis || 'y',
+      minorAxes = axes.splice(axes.indexOf(majorAxis), 1) && axes;
+
+  box.setFromObject(object);
+
+  if (!isFinite(box.min.lengthSq())) return null;
+
+  // Compute cylinder dimensions.
+  height = box.max[majorAxis] - box.min[majorAxis];
+  radius = 0.5 * Math.max(
+    box.max[minorAxes[0]] - box.min[minorAxes[0]],
+    box.max[minorAxes[1]] - box.min[minorAxes[1]]
+  );
+
+  // Create shape.
+  shape = new CANNON.Cylinder(radius, radius, height, 12);
+
+  // Include metadata for serialization.
+  shape._type = CANNON.Shape.types.CYLINDER; // Patch schteppe/cannon.js#329.
+  shape.radiusTop = radius;
+  shape.radiusBottom = radius;
+  shape.height = height;
+  shape.numSegments = 12;
+
+  shape.orientation = new CANNON.Quaternion();
+  shape.orientation.setFromEuler(
+    majorAxis === 'y' ? PI_2 : 0,
+    majorAxis === 'z' ? PI_2 : 0,
+    0,
+    'XYZ'
+  ).normalize();
+  return shape;
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createPlaneShape (geometry) {
+  geometry.computeBoundingBox();
+  var box = geometry.boundingBox;
+  return new CANNON.Box(new CANNON.Vec3(
+    (box.max.x - box.min.x) / 2 || 0.1,
+    (box.max.y - box.min.y) / 2 || 0.1,
+    (box.max.z - box.min.z) / 2 || 0.1
+  ));
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createSphereShape (geometry) {
+  var params = geometry.metadata
+    ? geometry.metadata.parameters
+    : geometry.parameters;
+  return new CANNON.Sphere(params.radius);
+}
+
+/**
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+function createBoundingSphereShape (object, options) {
+  if (options.sphereRadius) {
+    return new CANNON.Sphere(options.sphereRadius);
+  }
+  var geometry = getGeometry(object);
+  if (!geometry) return null;
+  geometry.computeBoundingSphere();
+  return new CANNON.Sphere(geometry.boundingSphere.radius);
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createTrimeshShape (geometry) {
+  var indices,
+      vertices = getVertices(geometry);
+
+  if (!vertices.length) return null;
+
+  indices = Object.keys(vertices).map(Number);
+  return new CANNON.Trimesh(vertices, indices);
+}
+
+/******************************************************************************
+ * Utils
+ */
+
+/**
+ * Returns a single geometry for the given object. If the object is compound,
+ * its geometries are automatically merged.
+ * @param {THREE.Object3D} object
+ * @return {THREE.Geometry}
+ */
+function getGeometry (object) {
+  var matrix, mesh,
+      meshes = getMeshes(object),
+      tmp = new THREE.Geometry(),
+      combined = new THREE.Geometry();
+
+  if (meshes.length === 0) return null;
+
+  // Apply scale  – it can't easily be applied to a CANNON.Shape later.
+  if (meshes.length === 1) {
+    var position = new THREE.Vector3(),
+        quaternion = new THREE.Quaternion(),
+        scale = new THREE.Vector3();
+    if (meshes[0].geometry instanceof THREE.BufferGeometry) {
+      if (meshes[0].geometry.attributes.position) {
+        tmp.fromBufferGeometry(meshes[0].geometry);
+      }
+    } else {
+      tmp = meshes[0].geometry.clone();
+    }
+    tmp.metadata = meshes[0].geometry.metadata;
+    meshes[0].updateMatrixWorld();
+    meshes[0].matrixWorld.decompose(position, quaternion, scale);
+    return tmp.scale(scale.x, scale.y, scale.z);
+  }
+
+  // Recursively merge geometry, preserving local transforms.
+  while ((mesh = meshes.pop())) {
+    mesh.updateMatrixWorld();
+    if (mesh.geometry instanceof THREE.BufferGeometry) {
+      tmp.fromBufferGeometry(mesh.geometry);
+      combined.merge(tmp, mesh.matrixWorld);
+    } else {
+      combined.merge(mesh.geometry, mesh.matrixWorld);
+    }
+  }
+
+  matrix = new THREE.Matrix4();
+  matrix.scale(object.scale);
+  combined.applyMatrix(matrix);
+  return combined;
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {Array<number>}
+ */
+function getVertices (geometry) {
+  if (!geometry.attributes) {
+    geometry = new THREE.BufferGeometry().fromGeometry(geometry);
+  }
+  return (geometry.attributes.position || {}).array || [];
+}
+
+/**
+ * Returns a flat array of THREE.Mesh instances from the given object. If
+ * nested transformations are found, they are applied to child meshes
+ * as mesh.userData.matrix, so that each mesh has its position/rotation/scale
+ * independently of all of its parents except the top-level object.
+ * @param  {THREE.Object3D} object
+ * @return {Array<THREE.Mesh>}
+ */
+function getMeshes (object) {
+  var meshes = [];
+  object.traverse(function (o) {
+    if (o.type === 'Mesh') {
+      meshes.push(o);
+    }
+  });
+  return meshes;
+}
+
+},{"./lib/THREE.quickhull":74,"cannon":17}],74:[function(require,module,exports){
+/**
+
+  QuickHull
+  ---------
+
+  The MIT License
+
+  Copyright &copy; 2010-2014 three.js authors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+  THE SOFTWARE.
+
+
+    @author mark lundin / http://mark-lundin.com
+
+    This is a 3D implementation of the Quick Hull algorithm.
+    It is a fast way of computing a convex hull with average complexity
+    of O(n log(n)).
+    It uses depends on three.js and is supposed to create THREE.Geometry.
+
+    It's also very messy
+
+ */
+
+module.exports = (function(){
+
+
+  var faces     = [],
+    faceStack   = [],
+    i, NUM_POINTS, extremes,
+    max     = 0,
+    dcur, current, j, v0, v1, v2, v3,
+    N, D;
+
+  var ab, ac, ax,
+    suba, subb, normal,
+    diff, subaA, subaB, subC;
+
+  function reset(){
+
+    ab    = new THREE.Vector3(),
+    ac    = new THREE.Vector3(),
+    ax    = new THREE.Vector3(),
+    suba  = new THREE.Vector3(),
+    subb  = new THREE.Vector3(),
+    normal  = new THREE.Vector3(),
+    diff  = new THREE.Vector3(),
+    subaA = new THREE.Vector3(),
+    subaB = new THREE.Vector3(),
+    subC  = new THREE.Vector3();
+
+  }
+
+  //temporary vectors
+
+  function process( points ){
+
+    // Iterate through all the faces and remove
+    while( faceStack.length > 0  ){
+      cull( faceStack.shift(), points );
+    }
+  }
+
+
+  var norm = function(){
+
+    var ca = new THREE.Vector3(),
+      ba = new THREE.Vector3(),
+      N = new THREE.Vector3();
+
+    return function( a, b, c ){
+
+      ca.subVectors( c, a );
+      ba.subVectors( b, a );
+
+      N.crossVectors( ca, ba );
+
+      return N.normalize();
+    }
+
+  }();
+
+
+  function getNormal( face, points ){
+
+    if( face.normal !== undefined ) return face.normal;
+
+    var p0 = points[face[0]],
+      p1 = points[face[1]],
+      p2 = points[face[2]];
+
+    ab.subVectors( p1, p0 );
+    ac.subVectors( p2, p0 );
+    normal.crossVectors( ac, ab );
+    normal.normalize();
+
+    return face.normal = normal.clone();
+
+  }
+
+
+  function assignPoints( face, pointset, points ){
+
+    // ASSIGNING POINTS TO FACE
+    var p0 = points[face[0]],
+      dots = [], apex,
+      norm = getNormal( face, points );
+
+
+    // Sory all the points by there distance from the plane
+    pointset.sort( function( aItem, bItem ){
+
+
+      dots[aItem.x/3] = dots[aItem.x/3] !== undefined ? dots[aItem.x/3] : norm.dot( suba.subVectors( aItem, p0 ));
+      dots[bItem.x/3] = dots[bItem.x/3] !== undefined ? dots[bItem.x/3] : norm.dot( subb.subVectors( bItem, p0 ));
+
+      return dots[aItem.x/3] - dots[bItem.x/3] ;
+    });
+
+    //TODO :: Must be a faster way of finding and index in this array
+    var index = pointset.length;
+
+    if( index === 1 ) dots[pointset[0].x/3] = norm.dot( suba.subVectors( pointset[0], p0 ));
+    while( index-- > 0 && dots[pointset[index].x/3] > 0 )
+
+    var point;
+    if( index + 1 < pointset.length && dots[pointset[index+1].x/3] > 0 ){
+
+      face.visiblePoints  = pointset.splice( index + 1 );
+    }
+  }
+
+
+
+
+  function cull( face, points ){
+
+    var i = faces.length,
+      dot, visibleFace, currentFace,
+      visibleFaces = [face];
+
+    var apex = points.indexOf( face.visiblePoints.pop() );
+
+    // Iterate through all other faces...
+    while( i-- > 0 ){
+      currentFace = faces[i];
+      if( currentFace !== face ){
+        // ...and check if they're pointing in the same direction
+        dot = getNormal( currentFace, points ).dot( diff.subVectors( points[apex], points[currentFace[0]] ));
+        if( dot > 0 ){
+          visibleFaces.push( currentFace );
+        }
+      }
+    }
+
+    var index, neighbouringIndex, vertex;
+
+    // Determine Perimeter - Creates a bounded horizon
+
+    // 1. Pick an edge A out of all possible edges
+    // 2. Check if A is shared by any other face. a->b === b->a
+      // 2.1 for each edge in each triangle, isShared = ( f1.a == f2.a && f1.b == f2.b ) || ( f1.a == f2.b && f1.b == f2.a )
+    // 3. If not shared, then add to convex horizon set,
+        //pick an end point (N) of the current edge A and choose a new edge NA connected to A.
+        //Restart from 1.
+    // 4. If A is shared, it is not an horizon edge, therefore flag both faces that share this edge as candidates for culling
+    // 5. If candidate geometry is a degenrate triangle (ie. the tangent space normal cannot be computed) then remove that triangle from all further processing
+
+
+    var j = i = visibleFaces.length;
+    var isDistinct = false,
+      hasOneVisibleFace = i === 1,
+      cull = [],
+      perimeter = [],
+      edgeIndex = 0, compareFace, nextIndex,
+      a, b;
+
+    var allPoints = [];
+    var originFace = [visibleFaces[0][0], visibleFaces[0][1], visibleFaces[0][1], visibleFaces[0][2], visibleFaces[0][2], visibleFaces[0][0]];
+
+
+    if( visibleFaces.length === 1 ){
+      currentFace = visibleFaces[0];
+
+      perimeter = [currentFace[0], currentFace[1], currentFace[1], currentFace[2], currentFace[2], currentFace[0]];
+      // remove visible face from list of faces
+      if( faceStack.indexOf( currentFace ) > -1 ){
+        faceStack.splice( faceStack.indexOf( currentFace ), 1 );
+      }
+
+
+      if( currentFace.visiblePoints ) allPoints = allPoints.concat( currentFace.visiblePoints );
+      faces.splice( faces.indexOf( currentFace ), 1 );
+
+    }else{
+
+      while( i-- > 0  ){  // for each visible face
+
+        currentFace = visibleFaces[i];
+
+        // remove visible face from list of faces
+        if( faceStack.indexOf( currentFace ) > -1 ){
+          faceStack.splice( faceStack.indexOf( currentFace ), 1 );
+        }
+
+        if( currentFace.visiblePoints ) allPoints = allPoints.concat( currentFace.visiblePoints );
+        faces.splice( faces.indexOf( currentFace ), 1 );
+
+
+        var isSharedEdge;
+        cEdgeIndex = 0;
+
+        while( cEdgeIndex < 3 ){ // Iterate through it's edges
+
+          isSharedEdge = false;
+          j = visibleFaces.length;
+          a = currentFace[cEdgeIndex]
+          b = currentFace[(cEdgeIndex+1)%3];
+
+
+          while( j-- > 0 && !isSharedEdge ){ // find another visible faces
+
+            compareFace = visibleFaces[j];
+            edgeIndex = 0;
+
+            // isSharedEdge = compareFace == currentFace;
+            if( compareFace !== currentFace ){
+
+              while( edgeIndex < 3 && !isSharedEdge ){ //Check all it's indices
+
+                nextIndex = ( edgeIndex + 1 );
+                isSharedEdge = ( compareFace[edgeIndex] === a && compareFace[nextIndex%3] === b ) ||
+                         ( compareFace[edgeIndex] === b && compareFace[nextIndex%3] === a );
+
+                edgeIndex++;
+              }
+            }
+          }
+
+          if( !isSharedEdge || hasOneVisibleFace ){
+            perimeter.push( a );
+            perimeter.push( b );
+          }
+
+          cEdgeIndex++;
+        }
+      }
+    }
+
+    // create new face for all pairs around edge
+    i = 0;
+    var l = perimeter.length/2;
+    var f;
+
+    while( i < l ){
+      f = [ perimeter[i*2+1], apex, perimeter[i*2] ];
+      assignPoints( f, allPoints, points );
+      faces.push( f )
+      if( f.visiblePoints !== undefined  )faceStack.push( f );
+      i++;
+    }
+
+  }
+
+  var distSqPointSegment = function(){
+
+    var ab = new THREE.Vector3(),
+      ac = new THREE.Vector3(),
+      bc = new THREE.Vector3();
+
+    return function( a, b, c ){
+
+        ab.subVectors( b, a );
+        ac.subVectors( c, a );
+        bc.subVectors( c, b );
+
+        var e = ac.dot(ab);
+        if (e < 0.0) return ac.dot( ac );
+        var f = ab.dot( ab );
+        if (e >= f) return bc.dot(  bc );
+        return ac.dot( ac ) - e * e / f;
+
+      }
+
+  }();
+
+
+
+
+
+  return function( geometry ){
+
+    reset();
+
+
+    points    = geometry.vertices;
+    faces     = [],
+    faceStack   = [],
+    i       = NUM_POINTS = points.length,
+    extremes  = points.slice( 0, 6 ),
+    max     = 0;
+
+
+
+    /*
+     *  FIND EXTREMETIES
+     */
+    while( i-- > 0 ){
+      if( points[i].x < extremes[0].x ) extremes[0] = points[i];
+      if( points[i].x > extremes[1].x ) extremes[1] = points[i];
+
+      if( points[i].y < extremes[2].y ) extremes[2] = points[i];
+      if( points[i].y < extremes[3].y ) extremes[3] = points[i];
+
+      if( points[i].z < extremes[4].z ) extremes[4] = points[i];
+      if( points[i].z < extremes[5].z ) extremes[5] = points[i];
+    }
+
+
+    /*
+     *  Find the longest line between the extremeties
+     */
+
+    j = i = 6;
+    while( i-- > 0 ){
+      j = i - 1;
+      while( j-- > 0 ){
+          if( max < (dcur = extremes[i].distanceToSquared( extremes[j] )) ){
+        max = dcur;
+        v0 = extremes[ i ];
+        v1 = extremes[ j ];
+
+          }
+        }
+      }
+
+
+      // 3. Find the most distant point to the line segment, this creates a plane
+      i = 6;
+      max = 0;
+    while( i-- > 0 ){
+      dcur = distSqPointSegment( v0, v1, extremes[i]);
+      if( max < dcur ){
+        max = dcur;
+            v2 = extremes[ i ];
+          }
+    }
+
+
+      // 4. Find the most distant point to the plane.
+
+      N = norm(v0, v1, v2);
+      D = N.dot( v0 );
+
+
+      max = 0;
+      i = NUM_POINTS;
+      while( i-- > 0 ){
+        dcur = Math.abs( points[i].dot( N ) - D );
+          if( max < dcur ){
+            max = dcur;
+            v3 = points[i];
+      }
+      }
+
+
+
+      var v0Index = points.indexOf( v0 ),
+      v1Index = points.indexOf( v1 ),
+      v2Index = points.indexOf( v2 ),
+      v3Index = points.indexOf( v3 );
+
+
+    //  We now have a tetrahedron as the base geometry.
+    //  Now we must subdivide the
+
+      var tetrahedron =[
+        [ v2Index, v1Index, v0Index ],
+        [ v1Index, v3Index, v0Index ],
+        [ v2Index, v3Index, v1Index ],
+        [ v0Index, v3Index, v2Index ],
+    ];
+
+
+
+    subaA.subVectors( v1, v0 ).normalize();
+    subaB.subVectors( v2, v0 ).normalize();
+    subC.subVectors ( v3, v0 ).normalize();
+    var sign  = subC.dot( new THREE.Vector3().crossVectors( subaB, subaA ));
+
+
+    // Reverse the winding if negative sign
+    if( sign < 0 ){
+      tetrahedron[0].reverse();
+      tetrahedron[1].reverse();
+      tetrahedron[2].reverse();
+      tetrahedron[3].reverse();
+    }
+
+
+    //One for each face of the pyramid
+    var pointsCloned = points.slice();
+    pointsCloned.splice( pointsCloned.indexOf( v0 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v1 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v2 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v3 ), 1 );
+
+
+    var i = tetrahedron.length;
+    while( i-- > 0 ){
+      assignPoints( tetrahedron[i], pointsCloned, points );
+      if( tetrahedron[i].visiblePoints !== undefined ){
+        faceStack.push( tetrahedron[i] );
+      }
+      faces.push( tetrahedron[i] );
+    }
+
+    process( points );
+
+
+    //  Assign to our geometry object
+
+    var ll = faces.length;
+    while( ll-- > 0 ){
+      geometry.faces[ll] = new THREE.Face3( faces[ll][2], faces[ll][1], faces[ll][0], faces[ll].normal )
+    }
+
+    geometry.normalsNeedUpdate = true;
+
+    return geometry;
+
+  }
+
+}())
+
+},{}],75:[function(require,module,exports){
+var EPS = 0.1;
+
+module.exports = {
+  schema: {
+    enabled: {default: true},
+    mode: {default: 'teleport', oneOf: ['teleport', 'animate']},
+    animateSpeed: {default: 3.0}
+  },
+
+  init: function () {
+    this.active = true;
+    this.checkpoint = null;
+
+    this.offset = new THREE.Vector3();
+    this.position = new THREE.Vector3();
+    this.targetPosition = new THREE.Vector3();
+  },
+
+  play: function () { this.active = true; },
+  pause: function () { this.active = false; },
+
+  setCheckpoint: function (checkpoint) {
+    var el = this.el;
+
+    if (!this.active) return;
+    if (this.checkpoint === checkpoint) return;
+
+    if (this.checkpoint) {
+      el.emit('navigation-end', {checkpoint: checkpoint});
+    }
+
+    this.checkpoint = checkpoint;
+    el.emit('navigation-start', {checkpoint: checkpoint});
+
+    if (this.data.mode === 'teleport') {
+      this.sync();
+      this.el.setAttribute('position', this.targetPosition);
+      this.checkpoint = null;
+      el.emit('navigation-end', {checkpoint: checkpoint});
+    }
+  },
+
+  isVelocityActive: function () {
+    return !!(this.active && this.checkpoint);
+  },
+
+  getVelocity: function () {
+    if (!this.active) return;
+
+    var data = this.data,
+        offset = this.offset,
+        position = this.position,
+        targetPosition = this.targetPosition,
+        checkpoint = this.checkpoint;
+
+    this.sync();
+    if (position.distanceTo(targetPosition) < EPS) {
+      this.checkpoint = null;
+      this.el.emit('navigation-end', {checkpoint: checkpoint});
+      return offset.set(0, 0, 0);
+    }
+    offset.setLength(data.animateSpeed);
+    return offset;
+  },
+
+  sync: function () {
+    var offset = this.offset,
+        position = this.position,
+        targetPosition = this.targetPosition;
+
+    position.copy(this.el.getAttribute('position'));
+    targetPosition.copy(this.checkpoint.object3D.getWorldPosition());
+    targetPosition.add(this.checkpoint.components.checkpoint.getOffset());
+    offset.copy(targetPosition).sub(position);
+  }
+};
+
+},{}],76:[function(require,module,exports){
+/**
+ * Gamepad controls for A-Frame.
+ *
+ * Stripped-down version of: https://github.com/donmccurdy/aframe-gamepad-controls
+ *
+ * For more information about the Gamepad API, see:
+ * https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
+ */
+
+var GamepadButton = require('../../lib/GamepadButton'),
+    GamepadButtonEvent = require('../../lib/GamepadButtonEvent');
+
+var JOYSTICK_EPS = 0.2;
+
+module.exports = {
+
+  /*******************************************************************
+   * Statics
+   */
+
+  GamepadButton: GamepadButton,
+
+  /*******************************************************************
+   * Schema
+   */
+
+  schema: {
+    // Controller 0-3
+    controller:        { default: 0, oneOf: [0, 1, 2, 3] },
+
+    // Enable/disable features
+    enabled:           { default: true },
+
+    // Debugging
+    debug:             { default: false }
+  },
+
+  /*******************************************************************
+   * Core
+   */
+
+  /**
+   * Called once when component is attached. Generally for initial setup.
+   */
+  init: function () {
+    var scene = this.el.sceneEl;
+    this.prevTime = window.performance.now();
+
+    // Button state
+    this.buttons = {};
+
+    scene.addBehavior(this);
+  },
+
+  /**
+   * Called when component is attached and when component data changes.
+   * Generally modifies the entity based on the data.
+   */
+  update: function () { this.tick(); },
+
+  /**
+   * Called on each iteration of main render loop.
+   */
+  tick: function () {
+    this.updateButtonState();
+  },
+
+  /**
+   * Called when a component is removed (e.g., via removeAttribute).
+   * Generally undoes all modifications to the entity.
+   */
+  remove: function () { },
+
+  /*******************************************************************
+   * Universal controls - movement
+   */
+
+  isVelocityActive: function () {
+    if (!this.data.enabled || !this.isConnected()) return false;
+
+    var dpad = this.getDpad(),
+        joystick0 = this.getJoystick(0),
+        inputX = dpad.x || joystick0.x,
+        inputY = dpad.y || joystick0.y;
+
+    return Math.abs(inputX) > JOYSTICK_EPS || Math.abs(inputY) > JOYSTICK_EPS;
+  },
+
+  getVelocityDelta: function () {
+    var dpad = this.getDpad(),
+        joystick0 = this.getJoystick(0),
+        inputX = dpad.x || joystick0.x,
+        inputY = dpad.y || joystick0.y,
+        dVelocity = new THREE.Vector3();
+
+    if (Math.abs(inputX) > JOYSTICK_EPS) {
+      dVelocity.x += inputX;
+    }
+    if (Math.abs(inputY) > JOYSTICK_EPS) {
+      dVelocity.z += inputY;
+    }
+
+    return dVelocity;
+  },
+
+  /*******************************************************************
+   * Universal controls - rotation
+   */
+
+  isRotationActive: function () {
+    if (!this.data.enabled || !this.isConnected()) return false;
+
+    var joystick1 = this.getJoystick(1);
+
+    return Math.abs(joystick1.x) > JOYSTICK_EPS || Math.abs(joystick1.y) > JOYSTICK_EPS;
+  },
+
+  getRotationDelta: function () {
+    var lookVector = this.getJoystick(1);
+    if (Math.abs(lookVector.x) <= JOYSTICK_EPS) lookVector.x = 0;
+    if (Math.abs(lookVector.y) <= JOYSTICK_EPS) lookVector.y = 0;
+    return lookVector;
+  },
+
+  /*******************************************************************
+   * Button events
+   */
+
+  updateButtonState: function () {
+    var gamepad = this.getGamepad();
+    if (this.data.enabled && gamepad) {
+
+      // Fire DOM events for button state changes.
+      for (var i = 0; i < gamepad.buttons.length; i++) {
+        if (gamepad.buttons[i].pressed && !this.buttons[i]) {
+          this.emit(new GamepadButtonEvent('gamepadbuttondown', i, gamepad.buttons[i]));
+        } else if (!gamepad.buttons[i].pressed && this.buttons[i]) {
+          this.emit(new GamepadButtonEvent('gamepadbuttonup', i, gamepad.buttons[i]));
+        }
+        this.buttons[i] = gamepad.buttons[i].pressed;
+      }
+
+    } else if (Object.keys(this.buttons)) {
+      // Reset state if controls are disabled or controller is lost.
+      this.buttons = {};
+    }
+  },
+
+  emit: function (event) {
+    // Emit original event.
+    this.el.emit(event.type, event);
+
+    // Emit convenience event, identifying button index.
+    this.el.emit(
+      event.type + ':' + event.index,
+      new GamepadButtonEvent(event.type, event.index, event)
+    );
+  },
+
+  /*******************************************************************
+   * Gamepad state
+   */
+
+  /**
+   * Returns the Gamepad instance attached to the component. If connected,
+   * a proxy-controls component may provide access to Gamepad input from a
+   * remote device.
+   *
+   * @return {Gamepad}
+   */
+  getGamepad: function () {
+    var localGamepad = navigator.getGamepads
+          && navigator.getGamepads()[this.data.controller],
+        proxyControls = this.el.sceneEl.components['proxy-controls'],
+        proxyGamepad = proxyControls && proxyControls.isConnected()
+          && proxyControls.getGamepad(this.data.controller);
+    return proxyGamepad || localGamepad;
+  },
+
+  /**
+   * Returns the state of the given button.
+   * @param  {number} index The button (0-N) for which to find state.
+   * @return {GamepadButton}
+   */
+  getButton: function (index) {
+    return this.getGamepad().buttons[index];
+  },
+
+  /**
+   * Returns state of the given axis. Axes are labelled 0-N, where 0-1 will
+   * represent X/Y on the first joystick, and 2-3 X/Y on the second.
+   * @param  {number} index The axis (0-N) for which to find state.
+   * @return {number} On the interval [-1,1].
+   */
+  getAxis: function (index) {
+    return this.getGamepad().axes[index];
+  },
+
+  /**
+   * Returns the state of the given joystick (0 or 1) as a THREE.Vector2.
+   * @param  {number} id The joystick (0, 1) for which to find state.
+   * @return {THREE.Vector2}
+   */
+  getJoystick: function (index) {
+    var gamepad = this.getGamepad();
+    switch (index) {
+      case 0: return new THREE.Vector2(gamepad.axes[0], gamepad.axes[1]);
+      case 1: return new THREE.Vector2(gamepad.axes[2], gamepad.axes[3]);
+      default: throw new Error('Unexpected joystick index "%d".', index);
+    }
+  },
+
+  /**
+   * Returns the state of the dpad as a THREE.Vector2.
+   * @return {THREE.Vector2}
+   */
+  getDpad: function () {
+    var gamepad = this.getGamepad();
+    if (!gamepad.buttons[GamepadButton.DPAD_RIGHT]) {
+      return new THREE.Vector2();
+    }
+    return new THREE.Vector2(
+      (gamepad.buttons[GamepadButton.DPAD_RIGHT].pressed ? 1 : 0)
+      + (gamepad.buttons[GamepadButton.DPAD_LEFT].pressed ? -1 : 0),
+      (gamepad.buttons[GamepadButton.DPAD_UP].pressed ? -1 : 0)
+      + (gamepad.buttons[GamepadButton.DPAD_DOWN].pressed ? 1 : 0)
+    );
+  },
+
+  /**
+   * Returns true if the gamepad is currently connected to the system.
+   * @return {boolean}
+   */
+  isConnected: function () {
+    var gamepad = this.getGamepad();
+    return !!(gamepad && gamepad.connected);
+  },
+
+  /**
+   * Returns a string containing some information about the controller. Result
+   * may vary across browsers, for a given controller.
+   * @return {string}
+   */
+  getID: function () {
+    return this.getGamepad().id;
+  }
+};
+
+},{"../../lib/GamepadButton":2,"../../lib/GamepadButtonEvent":3}],77:[function(require,module,exports){
+var radToDeg = THREE.Math.radToDeg,
+    isMobile = AFRAME.utils.device.isMobile();
+
+module.exports = {
+  schema: {
+    enabled: {default: true},
+    standing: {default: true}
+  },
+
+  init: function () {
+    this.isPositionCalibrated = false;
+    this.dolly = new THREE.Object3D();
+    this.hmdEuler = new THREE.Euler();
+    this.previousHMDPosition = new THREE.Vector3();
+    this.deltaHMDPosition = new THREE.Vector3();
+    this.vrControls = new THREE.VRControls(this.dolly);
+    this.rotation = new THREE.Vector3();
+  },
+
+  update: function () {
+    var data = this.data;
+    var vrControls = this.vrControls;
+    vrControls.standing = data.standing;
+    vrControls.update();
+  },
+
+  tick: function () {
+    this.vrControls.update();
+  },
+
+  remove: function () {
+    this.vrControls.dispose();
+  },
+
+  isRotationActive: function () {
+    var hmdEuler = this.hmdEuler;
+    if (!this.data.enabled || !(this.el.sceneEl.is('vr-mode') || isMobile)) {
+      return false;
+    }
+    hmdEuler.setFromQuaternion(this.dolly.quaternion, 'YXZ');
+    return !isNullVector(hmdEuler);
+  },
+
+  getRotation: function () {
+    var hmdEuler = this.hmdEuler;
+    return this.rotation.set(
+      radToDeg(hmdEuler.x),
+      radToDeg(hmdEuler.y),
+      radToDeg(hmdEuler.z)
+    );
+  },
+
+  isVelocityActive: function () {
+    var deltaHMDPosition = this.deltaHMDPosition;
+    var previousHMDPosition = this.previousHMDPosition;
+    var currentHMDPosition = this.calculateHMDPosition();
+    this.isPositionCalibrated = this.isPositionCalibrated || !isNullVector(previousHMDPosition);
+    if (!this.data.enabled || !this.el.sceneEl.is('vr-mode') || isMobile) {
+      return false;
+    }
+    deltaHMDPosition.copy(currentHMDPosition).sub(previousHMDPosition);
+    previousHMDPosition.copy(currentHMDPosition);
+    return this.isPositionCalibrated && !isNullVector(deltaHMDPosition);
+  },
+
+  getPositionDelta: function () {
+    return this.deltaHMDPosition;
+  },
+
+  calculateHMDPosition: function () {
+    var dolly = this.dolly;
+    var position = new THREE.Vector3();
+    dolly.updateMatrix();
+    position.setFromMatrixPosition(dolly.matrix);
+    return position;
+  }
+};
+
+function isNullVector (vector) {
+  return vector.x === 0 && vector.y === 0 && vector.z === 0;
+}
+
+},{}],78:[function(require,module,exports){
+var physics = require('aframe-physics-system');
+
+module.exports = {
+  'checkpoint-controls': require('./checkpoint-controls'),
+  'gamepad-controls':    require('./gamepad-controls'),
+  'hmd-controls':        require('./hmd-controls'),
+  'keyboard-controls':   require('./keyboard-controls'),
+  'mouse-controls':      require('./mouse-controls'),
+  'touch-controls':      require('./touch-controls'),
+  'universal-controls':  require('./universal-controls'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    physics.registerAll();
+    if (!AFRAME.components['checkpoint-controls'])  AFRAME.registerComponent('checkpoint-controls', this['checkpoint-controls']);
+    if (!AFRAME.components['gamepad-controls'])     AFRAME.registerComponent('gamepad-controls',    this['gamepad-controls']);
+    if (!AFRAME.components['hmd-controls'])         AFRAME.registerComponent('hmd-controls',        this['hmd-controls']);
+    if (!AFRAME.components['keyboard-controls'])    AFRAME.registerComponent('keyboard-controls',   this['keyboard-controls']);
+    if (!AFRAME.components['mouse-controls'])       AFRAME.registerComponent('mouse-controls',      this['mouse-controls']);
+    if (!AFRAME.components['touch-controls'])       AFRAME.registerComponent('touch-controls',      this['touch-controls']);
+    if (!AFRAME.components['universal-controls'])   AFRAME.registerComponent('universal-controls',  this['universal-controls']);
+
+    this._registered = true;
+  }
+};
+
+},{"./checkpoint-controls":75,"./gamepad-controls":76,"./hmd-controls":77,"./keyboard-controls":79,"./mouse-controls":80,"./touch-controls":81,"./universal-controls":82,"aframe-physics-system":5}],79:[function(require,module,exports){
+require('../../lib/keyboard.polyfill');
+
+var MAX_DELTA = 0.2,
+    PROXY_FLAG = '__keyboard-controls-proxy';
+
+var KeyboardEvent = window.KeyboardEvent;
+
+/**
+ * Keyboard Controls component.
+ *
+ * Stripped-down version of: https://github.com/donmccurdy/aframe-keyboard-controls
+ *
+ * Bind keyboard events to components, or control your entities with the WASD keys.
+ *
+ * Why use KeyboardEvent.code? "This is set to a string representing the key that was pressed to
+ * generate the KeyboardEvent, without taking the current keyboard layout (e.g., QWERTY vs.
+ * Dvorak), locale (e.g., English vs. French), or any modifier keys into account. This is useful
+ * when you care about which physical key was pressed, rather thanwhich character it corresponds
+ * to. For example, if you’re a writing a game, you might want a certain set of keys to move the
+ * player in different directions, and that mapping should ideally be independent of keyboard
+ * layout. See: https://developers.google.com/web/updates/2016/04/keyboardevent-keys-codes
+ *
+ * @namespace wasd-controls
+ * keys the entity moves and if you release it will stop. Easing simulates friction.
+ * to the entity when pressing the keys.
+ * @param {bool} [enabled=true] - To completely enable or disable the controls
+ */
+module.exports = {
+  schema: {
+    enabled:           { default: true },
+    debug:             { default: false }
+  },
+
+  init: function () {
+    this.dVelocity = new THREE.Vector3();
+    this.localKeys = {};
+    this.listeners = {
+      keydown: this.onKeyDown.bind(this),
+      keyup: this.onKeyUp.bind(this),
+      blur: this.onBlur.bind(this)
+    };
+    this.attachEventListeners();
+  },
+
+  /*******************************************************************
+  * Movement
+  */
+
+  isVelocityActive: function () {
+    return this.data.enabled && !!Object.keys(this.getKeys()).length;
+  },
+
+  getVelocityDelta: function () {
+    var data = this.data,
+        keys = this.getKeys();
+
+    this.dVelocity.set(0, 0, 0);
+    if (data.enabled) {
+      if (keys.KeyW || keys.ArrowUp)    { this.dVelocity.z -= 1; }
+      if (keys.KeyA || keys.ArrowLeft)  { this.dVelocity.x -= 1; }
+      if (keys.KeyS || keys.ArrowDown)  { this.dVelocity.z += 1; }
+      if (keys.KeyD || keys.ArrowRight) { this.dVelocity.x += 1; }
+    }
+
+    return this.dVelocity.clone();
+  },
+
+  /*******************************************************************
+  * Events
+  */
+
+  play: function () {
+    this.attachEventListeners();
+  },
+
+  pause: function () {
+    this.removeEventListeners();
+  },
+
+  remove: function () {
+    this.pause();
+  },
+
+  attachEventListeners: function () {
+    window.addEventListener('keydown', this.listeners.keydown, false);
+    window.addEventListener('keyup', this.listeners.keyup, false);
+    window.addEventListener('blur', this.listeners.blur, false);
+  },
+
+  removeEventListeners: function () {
+    window.removeEventListener('keydown', this.listeners.keydown);
+    window.removeEventListener('keyup', this.listeners.keyup);
+    window.removeEventListener('blur', this.listeners.blur);
+  },
+
+  onKeyDown: function (event) {
+    if (AFRAME.utils.shouldCaptureKeyEvent(event)) {
+      this.localKeys[event.code] = true;
+      this.emit(event);
+    }
+  },
+
+  onKeyUp: function (event) {
+    if (AFRAME.utils.shouldCaptureKeyEvent(event)) {
+      delete this.localKeys[event.code];
+      this.emit(event);
+    }
+  },
+
+  onBlur: function () {
+    for (var code in this.localKeys) {
+      if (this.localKeys.hasOwnProperty(code)) {
+        delete this.localKeys[code];
+      }
+    }
+  },
+
+  emit: function (event) {
+    // TODO - keydown only initially?
+    // TODO - where the f is the spacebar
+
+    // Emit original event.
+    if (PROXY_FLAG in event) {
+      // TODO - Method never triggered.
+      this.el.emit(event.type, event);
+    }
+
+    // Emit convenience event, identifying key.
+    this.el.emit(event.type + ':' + event.code, new KeyboardEvent(event.type, event));
+    if (this.data.debug) console.log(event.type + ':' + event.code);
+  },
+
+  /*******************************************************************
+  * Accessors
+  */
+
+  isPressed: function (code) {
+    return code in this.getKeys();
+  },
+
+  getKeys: function () {
+    if (this.isProxied()) {
+      return this.el.sceneEl.components['proxy-controls'].getKeyboard();
+    }
+    return this.localKeys;
+  },
+
+  isProxied: function () {
+    var proxyControls = this.el.sceneEl.components['proxy-controls'];
+    return proxyControls && proxyControls.isConnected();
+  }
+
+};
+
+},{"../../lib/keyboard.polyfill":4}],80:[function(require,module,exports){
+document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock;
+
+/**
+ * Mouse + Pointerlock controls.
+ *
+ * Based on: https://github.com/aframevr/aframe/pull/1056
+ */
+module.exports = {
+  schema: {
+    enabled: { default: true },
+    pointerlockEnabled: { default: true },
+    sensitivity: { default: 1 / 25 }
+  },
+
+  init: function () {
+    this.mouseDown = false;
+    this.pointerLocked = false;
+    this.lookVector = new THREE.Vector2();
+    this.bindMethods();
+  },
+
+  update: function (previousData) {
+    var data = this.data;
+    if (previousData.pointerlockEnabled && !data.pointerlockEnabled && this.pointerLocked) {
+      document.exitPointerLock();
+    }
+  },
+
+  play: function () {
+    this.addEventListeners();
+  },
+
+  pause: function () {
+    this.removeEventListeners();
+    this.lookVector.set(0, 0);
+  },
+
+  remove: function () {
+    this.pause();
+  },
+
+  bindMethods: function () {
+    this.onMouseDown = this.onMouseDown.bind(this);
+    this.onMouseMove = this.onMouseMove.bind(this);
+    this.onMouseUp = this.onMouseUp.bind(this);
+    this.onMouseUp = this.onMouseUp.bind(this);
+    this.onPointerLockChange = this.onPointerLockChange.bind(this);
+    this.onPointerLockChange = this.onPointerLockChange.bind(this);
+    this.onPointerLockChange = this.onPointerLockChange.bind(this);
+  },
+
+  addEventListeners: function () {
+    var sceneEl = this.el.sceneEl;
+    var canvasEl = sceneEl.canvas;
+    var data = this.data;
+
+    if (!canvasEl) {
+      sceneEl.addEventListener('render-target-loaded', this.addEventListeners.bind(this));
+      return;
+    }
+
+    canvasEl.addEventListener('mousedown', this.onMouseDown, false);
+    canvasEl.addEventListener('mousemove', this.onMouseMove, false);
+    canvasEl.addEventListener('mouseup', this.onMouseUp, false);
+    canvasEl.addEventListener('mouseout', this.onMouseUp, false);
+
+    if (data.pointerlockEnabled) {
+      document.addEventListener('pointerlockchange', this.onPointerLockChange, false);
+      document.addEventListener('mozpointerlockchange', this.onPointerLockChange, false);
+      document.addEventListener('pointerlockerror', this.onPointerLockError, false);
+    }
+  },
+
+  removeEventListeners: function () {
+    var canvasEl = this.el.sceneEl && this.el.sceneEl.canvas;
+    if (canvasEl) {
+      canvasEl.removeEventListener('mousedown', this.onMouseDown, false);
+      canvasEl.removeEventListener('mousemove', this.onMouseMove, false);
+      canvasEl.removeEventListener('mouseup', this.onMouseUp, false);
+      canvasEl.removeEventListener('mouseout', this.onMouseUp, false);
+    }
+    document.removeEventListener('pointerlockchange', this.onPointerLockChange, false);
+    document.removeEventListener('mozpointerlockchange', this.onPointerLockChange, false);
+    document.removeEventListener('pointerlockerror', this.onPointerLockError, false);
+  },
+
+  isRotationActive: function () {
+    return this.data.enabled && (this.mouseDown || this.pointerLocked);
+  },
+
+  /**
+   * Returns the sum of all mouse movement since last call.
+   */
+  getRotationDelta: function () {
+    var dRotation = this.lookVector.clone().multiplyScalar(this.data.sensitivity);
+    this.lookVector.set(0, 0);
+    return dRotation;
+  },
+
+  onMouseMove: function (event) {
+    var previousMouseEvent = this.previousMouseEvent;
+
+    if (!this.data.enabled || !(this.mouseDown || this.pointerLocked)) {
+      return;
+    }
+
+    var movementX = event.movementX || event.mozMovementX || 0;
+    var movementY = event.movementY || event.mozMovementY || 0;
+
+    if (!this.pointerLocked) {
+      movementX = event.screenX - previousMouseEvent.screenX;
+      movementY = event.screenY - previousMouseEvent.screenY;
+    }
+
+    this.lookVector.x += movementX;
+    this.lookVector.y += movementY;
+
+    this.previousMouseEvent = event;
+  },
+
+  onMouseDown: function (event) {
+    var canvasEl = this.el.sceneEl.canvas,
+        isEditing = (AFRAME.INSPECTOR || {}).opened;
+
+    this.mouseDown = true;
+    this.previousMouseEvent = event;
+
+    if (this.data.pointerlockEnabled && !this.pointerLocked && !isEditing) {
+      if (canvasEl.requestPointerLock) {
+        canvasEl.requestPointerLock();
+      } else if (canvasEl.mozRequestPointerLock) {
+        canvasEl.mozRequestPointerLock();
+      }
+    }
+  },
+
+  onMouseUp: function () {
+    this.mouseDown = false;
+  },
+
+  onPointerLockChange: function () {
+    this.pointerLocked = !!(document.pointerLockElement || document.mozPointerLockElement);
+  },
+
+  onPointerLockError: function () {
+    this.pointerLocked = false;
+  }
+};
+
+},{}],81:[function(require,module,exports){
+module.exports = {
+  schema: {
+    enabled: { default: true }
+  },
+
+  init: function () {
+    this.dVelocity = new THREE.Vector3();
+    this.bindMethods();
+  },
+
+  play: function () {
+    this.addEventListeners();
+  },
+
+  pause: function () {
+    this.removeEventListeners();
+    this.dVelocity.set(0, 0, 0);
+  },
+
+  remove: function () {
+    this.pause();
+  },
+
+  addEventListeners: function () {
+    var sceneEl = this.el.sceneEl;
+    var canvasEl = sceneEl.canvas;
+
+    if (!canvasEl) {
+      sceneEl.addEventListener('render-target-loaded', this.addEventListeners.bind(this));
+      return;
+    }
+
+    canvasEl.addEventListener('touchstart', this.onTouchStart);
+    canvasEl.addEventListener('touchend', this.onTouchEnd);
+  },
+
+  removeEventListeners: function () {
+    var canvasEl = this.el.sceneEl && this.el.sceneEl.canvas;
+    if (!canvasEl) { return; }
+
+    canvasEl.removeEventListener('touchstart', this.onTouchStart);
+    canvasEl.removeEventListener('touchend', this.onTouchEnd);
+  },
+
+  isVelocityActive: function () {
+    return this.data.enabled && this.isMoving;
+  },
+
+  getVelocityDelta: function () {
+    this.dVelocity.z = this.isMoving ? -1 : 0;
+    return this.dVelocity.clone();
+  },
+
+  bindMethods: function () {
+    this.onTouchStart = this.onTouchStart.bind(this);
+    this.onTouchEnd = this.onTouchEnd.bind(this);
+  },
+
+  onTouchStart: function (e) {
+    this.isMoving = true;
+    e.preventDefault();
+  },
+
+  onTouchEnd: function (e) {
+    this.isMoving = false;
+    e.preventDefault();
+  }
+};
+
+},{}],82:[function(require,module,exports){
+/**
+ * Universal Controls
+ *
+ * @author Don McCurdy <dm@donmccurdy.com>
+ */
+
+var COMPONENT_SUFFIX = '-controls',
+    MAX_DELTA = 0.2, // ms
+    PI_2 = Math.PI / 2;
+
+module.exports = {
+
+  /*******************************************************************
+   * Schema
+   */
+
+  dependencies: ['velocity', 'rotation'],
+
+  schema: {
+    enabled:              { default: true },
+    movementEnabled:      { default: true },
+    movementControls:     { default: ['gamepad', 'keyboard', 'touch', 'hmd'] },
+    rotationEnabled:      { default: true },
+    rotationControls:     { default: ['hmd', 'gamepad', 'mouse'] },
+    movementSpeed:        { default: 5 }, // m/s
+    movementEasing:       { default: 15 }, // m/s2
+    movementEasingY:      { default: 0  }, // m/s2
+    movementAcceleration: { default: 80 }, // m/s2
+    rotationSensitivity:  { default: 0.05 }, // radians/frame, ish
+    fly:                  { default: false },
+  },
+
+  /*******************************************************************
+   * Lifecycle
+   */
+
+  init: function () {
+    var rotation = this.el.getAttribute('rotation');
+
+    if (this.el.hasAttribute('look-controls') && this.data.rotationEnabled) {
+      console.error('[universal-controls] The `universal-controls` component is a replacement '
+        + 'for `look-controls`, and cannot be used in combination with it.');
+    }
+
+    // Movement
+    this.velocity = new THREE.Vector3();
+
+    // Rotation
+    this.pitch = new THREE.Object3D();
+    this.pitch.rotation.x = THREE.Math.degToRad(rotation.x);
+    this.yaw = new THREE.Object3D();
+    this.yaw.position.y = 10;
+    this.yaw.rotation.y = THREE.Math.degToRad(rotation.y);
+    this.yaw.add(this.pitch);
+    this.heading = new THREE.Euler(0, 0, 0, 'YXZ');
+
+    if (this.el.sceneEl.hasLoaded) {
+      this.injectControls();
+    } else {
+      this.el.sceneEl.addEventListener('loaded', this.injectControls.bind(this));
+    }
+  },
+
+  update: function () {
+    if (this.el.sceneEl.hasLoaded) {
+      this.injectControls();
+    }
+  },
+
+  injectControls: function () {
+    var i, name,
+        data = this.data;
+
+    for (i = 0; i < data.movementControls.length; i++) {
+      name = data.movementControls[i] + COMPONENT_SUFFIX;
+      if (!this.el.components[name]) {
+        this.el.setAttribute(name, '');
+      }
+    }
+
+    for (i = 0; i < data.rotationControls.length; i++) {
+      name = data.rotationControls[i] + COMPONENT_SUFFIX;
+      if (!this.el.components[name]) {
+        this.el.setAttribute(name, '');
+      }
+    }
+  },
+
+  /*******************************************************************
+   * Tick
+   */
+
+  tick: function (t, dt) {
+    if (!dt) { return; }
+
+    // Update rotation.
+    if (this.data.rotationEnabled) this.updateRotation(dt);
+
+    // Update velocity. If FPS is too low, reset.
+    if (this.data.movementEnabled && dt / 1000 > MAX_DELTA) {
+      this.velocity.set(0, 0, 0);
+      this.el.setAttribute('velocity', this.velocity);
+    } else {
+      this.updateVelocity(dt);
+    }
+  },
+
+  /*******************************************************************
+   * Rotation
+   */
+
+  updateRotation: function (dt) {
+    var control, dRotation,
+        data = this.data;
+
+    for (var i = 0, l = data.rotationControls.length; i < l; i++) {
+      control = this.el.components[data.rotationControls[i] + COMPONENT_SUFFIX];
+      if (control && control.isRotationActive()) {
+        if (control.getRotationDelta) {
+          dRotation = control.getRotationDelta(dt);
+          dRotation.multiplyScalar(data.rotationSensitivity);
+          this.yaw.rotation.y -= dRotation.x;
+          this.pitch.rotation.x -= dRotation.y;
+          this.pitch.rotation.x = Math.max(-PI_2, Math.min(PI_2, this.pitch.rotation.x));
+          this.el.setAttribute('rotation', {
+            x: THREE.Math.radToDeg(this.pitch.rotation.x),
+            y: THREE.Math.radToDeg(this.yaw.rotation.y),
+            z: 0
+          });
+        } else if (control.getRotation) {
+          this.el.setAttribute('rotation', control.getRotation());
+        } else {
+          throw new Error('Incompatible rotation controls: %s', data.rotationControls[i]);
+        }
+        break;
+      }
+    }
+  },
+
+  /*******************************************************************
+   * Movement
+   */
+
+  updateVelocity: function (dt) {
+    var control, dVelocity,
+        velocity = this.velocity,
+        data = this.data;
+
+    if (data.movementEnabled) {
+      for (var i = 0, l = data.movementControls.length; i < l; i++) {
+        control = this.el.components[data.movementControls[i] + COMPONENT_SUFFIX];
+        if (control && control.isVelocityActive()) {
+          if (control.getVelocityDelta) {
+            dVelocity = control.getVelocityDelta(dt);
+          } else if (control.getVelocity) {
+            this.el.setAttribute('velocity', control.getVelocity());
+            return;
+          } else if (control.getPositionDelta) {
+            velocity.copy(control.getPositionDelta(dt).multiplyScalar(1000 / dt));
+            this.el.setAttribute('velocity', velocity);
+            return;
+          } else {
+            throw new Error('Incompatible movement controls: ', data.movementControls[i]);
+          }
+          break;
+        }
+      }
+    }
+
+    velocity.copy(this.el.getAttribute('velocity'));
+    velocity.x -= velocity.x * data.movementEasing * dt / 1000;
+    velocity.y -= velocity.y * data.movementEasingY * dt / 1000;
+    velocity.z -= velocity.z * data.movementEasing * dt / 1000;
+
+    if (dVelocity && data.movementEnabled) {
+      // Set acceleration
+      if (dVelocity.length() > 1) {
+        dVelocity.setLength(this.data.movementAcceleration * dt / 1000);
+      } else {
+        dVelocity.multiplyScalar(this.data.movementAcceleration * dt / 1000);
+      }
+
+      // Rotate to heading
+      var rotation = this.el.getAttribute('rotation');
+      if (rotation) {
+        this.heading.set(
+          data.fly ? THREE.Math.degToRad(rotation.x) : 0,
+          THREE.Math.degToRad(rotation.y),
+          0
+        );
+        dVelocity.applyEuler(this.heading);
+      }
+
+      velocity.add(dVelocity);
+
+      // TODO - Several issues here:
+      // (1) Interferes w/ gravity.
+      // (2) Interferes w/ jumping.
+      // (3) Likely to interfere w/ relative position to moving platform.
+      // if (velocity.length() > data.movementSpeed) {
+      //   velocity.setLength(data.movementSpeed);
+      // }
+    }
+
+    this.el.setAttribute('velocity', velocity);
+  }
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.controls.min.js


File diff suppressed because it is too large
+ 5807 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.js


+ 6411 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.loaders.js

@@ -0,0 +1,6411 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+require('./src/loaders').registerAll();
+},{"./src/loaders":9}],2:[function(require,module,exports){
+/**
+ * @author Kyle-Larson https://github.com/Kyle-Larson
+ * @author Takahiro https://github.com/takahirox
+ *
+ * Loader loads FBX file and generates Group representing FBX scene.
+ * Requires FBX file to be >= 7.0 and in ASCII or to be any version in Binary format.
+ *
+ * Supports:
+ *  Mesh Generation (Positional Data)
+ *  Normal Data (Per Vertex Drawing Instance)
+ *  UV Data (Per Vertex Drawing Instance)
+ *  Skinning
+ *  Animation
+ *  - Separated Animations based on stacks.
+ *  - Skeletal & Non-Skeletal Animations
+ *  NURBS (Open, Closed and Periodic forms)
+ *
+ * Needs Support:
+ *  Indexed Buffers
+ *  PreRotation support.
+ */
+
+( function () {
+
+  /**
+   * Generates a loader for loading FBX files from URL and parsing into
+   * a THREE.Group.
+   * @param {THREE.LoadingManager} manager - Loading Manager for loader to use.
+   */
+  module.exports = THREE.FBXLoader = function ( manager ) {
+
+    this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
+
+  };
+
+  Object.assign( THREE.FBXLoader.prototype, {
+
+    /**
+     * Loads an ASCII/Binary FBX file from URL and parses into a THREE.Group.
+     * THREE.Group will have an animations property of AnimationClips
+     * of the different animations exported with the FBX.
+     * @param {string} url - URL of the FBX file.
+     * @param {function(THREE.Group):void} onLoad - Callback for when FBX file is loaded and parsed.
+     * @param {function(ProgressEvent):void} onProgress - Callback fired periodically when file is being retrieved from server.
+     * @param {function(Event):void} onError - Callback fired when error occurs (Currently only with retrieving file, not with parsing errors).
+     */
+    load: function ( url, onLoad, onProgress, onError ) {
+
+      var self = this;
+
+      var resourceDirectory = THREE.Loader.prototype.extractUrlBase( url );
+
+      var loader = new THREE.FileLoader( this.manager );
+      loader.setResponseType( 'arraybuffer' );
+      loader.load( url, function ( buffer ) {
+
+        try {
+
+          var scene = self.parse( buffer, resourceDirectory );
+
+          onLoad( scene );
+
+        } catch ( error ) {
+
+          window.setTimeout( function () {
+
+            if ( onError ) onError( error );
+
+            self.manager.itemError( url );
+
+          }, 0 );
+
+        }
+
+      }, onProgress, onError );
+
+    },
+
+    /**
+     * Parses an ASCII/Binary FBX file and returns a THREE.Group.
+     * THREE.Group will have an animations property of AnimationClips
+     * of the different animations within the FBX file.
+     * @param {ArrayBuffer} FBXBuffer - Contents of FBX file to parse.
+     * @param {string} resourceDirectory - Directory to load external assets (e.g. textures ) from.
+     * @returns {THREE.Group}
+     */
+    parse: function ( FBXBuffer, resourceDirectory ) {
+
+      var FBXTree;
+
+      if ( isFbxFormatBinary( FBXBuffer ) ) {
+
+        FBXTree = new BinaryParser().parse( FBXBuffer );
+
+      } else {
+
+        var FBXText = convertArrayBufferToString( FBXBuffer );
+
+        if ( ! isFbxFormatASCII( FBXText ) ) {
+
+          throw new Error( 'THREE.FBXLoader: Unknown format.' );
+
+        }
+
+        if ( getFbxVersion( FBXText ) < 7000 ) {
+
+          throw new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion( FBXText ) );
+
+        }
+
+        FBXTree = new TextParser().parse( FBXText );
+
+      }
+
+      // console.log( FBXTree );
+
+      var connections = parseConnections( FBXTree );
+      var images = parseImages( FBXTree );
+      var textures = parseTextures( FBXTree, new THREE.TextureLoader( this.manager ).setPath( resourceDirectory ), images, connections );
+      var materials = parseMaterials( FBXTree, textures, connections );
+      var deformers = parseDeformers( FBXTree, connections );
+      var geometryMap = parseGeometries( FBXTree, connections, deformers );
+      var sceneGraph = parseScene( FBXTree, connections, deformers, geometryMap, materials );
+
+      return sceneGraph;
+
+    }
+
+  } );
+
+  /**
+   * Parses map of relationships between objects.
+   * @param {{Connections: { properties: { connections: [number, number, string][]}}}} FBXTree
+   * @returns {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>}
+   */
+  function parseConnections( FBXTree ) {
+
+    /**
+     * @type {Map<number, { parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>}
+     */
+    var connectionMap = new Map();
+
+    if ( 'Connections' in FBXTree ) {
+
+      /**
+       * @type {[number, number, string][]}
+       */
+      var connectionArray = FBXTree.Connections.properties.connections;
+      for ( var connectionArrayIndex = 0, connectionArrayLength = connectionArray.length; connectionArrayIndex < connectionArrayLength; ++ connectionArrayIndex ) {
+
+        var connection = connectionArray[ connectionArrayIndex ];
+
+        if ( ! connectionMap.has( connection[ 0 ] ) ) {
+
+          connectionMap.set( connection[ 0 ], {
+            parents: [],
+            children: []
+          } );
+
+        }
+
+        var parentRelationship = { ID: connection[ 1 ], relationship: connection[ 2 ] };
+        connectionMap.get( connection[ 0 ] ).parents.push( parentRelationship );
+
+        if ( ! connectionMap.has( connection[ 1 ] ) ) {
+
+          connectionMap.set( connection[ 1 ], {
+            parents: [],
+            children: []
+          } );
+
+        }
+
+        var childRelationship = { ID: connection[ 0 ], relationship: connection[ 2 ] };
+        connectionMap.get( connection[ 1 ] ).children.push( childRelationship );
+
+      }
+
+    }
+
+    return connectionMap;
+
+  }
+
+  /**
+   * Parses map of images referenced in FBXTree.
+   * @param {{Objects: {subNodes: {Texture: Object.<string, FBXTextureNode>}}}} FBXTree
+   * @returns {Map<number, string(image blob/data URL)>}
+   */
+  function parseImages( FBXTree ) {
+
+    /**
+     * @type {Map<number, string(image blob/data URL)>}
+     */
+    var imageMap = new Map();
+
+    if ( 'Video' in FBXTree.Objects.subNodes ) {
+
+      var videoNodes = FBXTree.Objects.subNodes.Video;
+
+      for ( var nodeID in videoNodes ) {
+
+        var videoNode = videoNodes[ nodeID ];
+
+        // raw image data is in videoNode.properties.Content
+        if ( 'Content' in videoNode.properties ) {
+
+          var image = parseImage( videoNodes[ nodeID ] );
+          imageMap.set( parseInt( nodeID ), image );
+
+        }
+
+      }
+
+    }
+
+    return imageMap;
+
+  }
+
+  /**
+   * @param {videoNode} videoNode - Node to get texture image information from.
+   * @returns {string} - image blob/data URL
+   */
+  function parseImage( videoNode ) {
+
+    var content = videoNode.properties.Content;
+    var fileName = videoNode.properties.RelativeFilename || videoNode.properties.Filename;
+    var extension = fileName.slice( fileName.lastIndexOf( '.' ) + 1 ).toLowerCase();
+
+    var type;
+
+    switch ( extension ) {
+
+      case 'bmp':
+
+        type = 'image/bmp';
+        break;
+
+      case 'jpg':
+
+        type = 'image/jpeg';
+        break;
+
+      case 'png':
+
+        type = 'image/png';
+        break;
+
+      case 'tif':
+
+        type = 'image/tiff';
+        break;
+
+      default:
+
+        console.warn( 'FBXLoader: No support image type ' + extension );
+        return;
+
+    }
+
+    if ( typeof content === 'string' ) {
+
+      return 'data:' + type + ';base64,' + content;
+
+    } else {
+
+      var array = new Uint8Array( content );
+      return window.URL.createObjectURL( new Blob( [ array ], { type: type } ) );
+
+    }
+
+  }
+
+  /**
+   * Parses map of textures referenced in FBXTree.
+   * @param {{Objects: {subNodes: {Texture: Object.<string, FBXTextureNode>}}}} FBXTree
+   * @param {THREE.TextureLoader} loader
+   * @param {Map<number, string(image blob/data URL)>} imageMap
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @returns {Map<number, THREE.Texture>}
+   */
+  function parseTextures( FBXTree, loader, imageMap, connections ) {
+
+    /**
+     * @type {Map<number, THREE.Texture>}
+     */
+    var textureMap = new Map();
+
+    if ( 'Texture' in FBXTree.Objects.subNodes ) {
+
+      var textureNodes = FBXTree.Objects.subNodes.Texture;
+      for ( var nodeID in textureNodes ) {
+
+        var texture = parseTexture( textureNodes[ nodeID ], loader, imageMap, connections );
+        textureMap.set( parseInt( nodeID ), texture );
+
+      }
+
+    }
+
+    return textureMap;
+
+  }
+
+  /**
+   * @param {textureNode} textureNode - Node to get texture information from.
+   * @param {THREE.TextureLoader} loader
+   * @param {Map<number, string(image blob/data URL)>} imageMap
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @returns {THREE.Texture}
+   */
+  function parseTexture( textureNode, loader, imageMap, connections ) {
+
+    var FBX_ID = textureNode.id;
+
+    var name = textureNode.name;
+
+    var fileName;
+
+    var filePath = textureNode.properties.FileName;
+    var relativeFilePath = textureNode.properties.RelativeFilename;
+
+    var children = connections.get( FBX_ID ).children;
+
+    if ( children !== undefined && children.length > 0 && imageMap.has( children[ 0 ].ID ) ) {
+
+      fileName = imageMap.get( children[ 0 ].ID );
+
+    } else if ( relativeFilePath !== undefined && relativeFilePath[ 0 ] !== '/' &&
+        relativeFilePath.match( /^[a-zA-Z]:/ ) === null ) {
+
+      // use textureNode.properties.RelativeFilename
+      // if it exists and it doesn't seem an absolute path
+
+      fileName = relativeFilePath;
+
+    } else {
+
+      var split = filePath.split( /[\\\/]/ );
+
+      if ( split.length > 0 ) {
+
+        fileName = split[ split.length - 1 ];
+
+      } else {
+
+        fileName = filePath;
+
+      }
+
+    }
+
+    var currentPath = loader.path;
+
+    if ( fileName.indexOf( 'blob:' ) === 0 || fileName.indexOf( 'data:' ) === 0 ) {
+
+      loader.setPath( undefined );
+
+    }
+
+    /**
+     * @type {THREE.Texture}
+     */
+    var texture = loader.load( fileName );
+    texture.name = name;
+    texture.FBX_ID = FBX_ID;
+
+    var wrapModeU = textureNode.properties.WrapModeU;
+    var wrapModeV = textureNode.properties.WrapModeV;
+
+    var valueU = wrapModeU !== undefined ? wrapModeU.value : 0;
+    var valueV = wrapModeV !== undefined ? wrapModeV.value : 0;
+
+    // http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a
+    // 0: repeat(default), 1: clamp
+
+    texture.wrapS = valueU === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
+    texture.wrapT = valueV === 0 ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;
+
+    loader.setPath( currentPath );
+
+    return texture;
+
+  }
+
+  /**
+   * Parses map of Material information.
+   * @param {{Objects: {subNodes: {Material: Object.<number, FBXMaterialNode>}}}} FBXTree
+   * @param {Map<number, THREE.Texture>} textureMap
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @returns {Map<number, THREE.Material>}
+   */
+  function parseMaterials( FBXTree, textureMap, connections ) {
+
+    var materialMap = new Map();
+
+    if ( 'Material' in FBXTree.Objects.subNodes ) {
+
+      var materialNodes = FBXTree.Objects.subNodes.Material;
+      for ( var nodeID in materialNodes ) {
+
+        var material = parseMaterial( materialNodes[ nodeID ], textureMap, connections );
+        if ( material !== null ) materialMap.set( parseInt( nodeID ), material );
+
+      }
+
+    }
+
+    return materialMap;
+
+  }
+
+  /**
+   * Takes information from Material node and returns a generated THREE.Material
+   * @param {FBXMaterialNode} materialNode
+   * @param {Map<number, THREE.Texture>} textureMap
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @returns {THREE.Material}
+   */
+  function parseMaterial( materialNode, textureMap, connections ) {
+
+    var FBX_ID = materialNode.id;
+    var name = materialNode.attrName;
+    var type = materialNode.properties.ShadingModel;
+
+    //Case where FBXs wrap shading model in property object.
+    if ( typeof type === 'object' ) {
+
+      type = type.value;
+
+    }
+
+    // Seems like FBX can include unused materials which don't have any connections.
+    // Ignores them so far.
+    if ( ! connections.has( FBX_ID ) ) return null;
+
+    var children = connections.get( FBX_ID ).children;
+
+    var parameters = parseParameters( materialNode.properties, textureMap, children );
+
+    var material;
+
+    switch ( type.toLowerCase() ) {
+
+      case 'phong':
+        material = new THREE.MeshPhongMaterial();
+        break;
+      case 'lambert':
+        material = new THREE.MeshLambertMaterial();
+        break;
+      default:
+        console.warn( 'THREE.FBXLoader: No implementation given for material type %s in FBXLoader.js. Defaulting to standard material.', type );
+        material = new THREE.MeshStandardMaterial( { color: 0x3300ff } );
+        break;
+
+    }
+
+    material.setValues( parameters );
+    material.name = name;
+
+    return material;
+
+  }
+
+  /**
+   * @typedef {{Diffuse: FBXVector3, Specular: FBXVector3, Shininess: FBXValue, Emissive: FBXVector3, EmissiveFactor: FBXValue, Opacity: FBXValue}} FBXMaterialProperties
+   */
+  /**
+   * @typedef {{color: THREE.Color=, specular: THREE.Color=, shininess: number=, emissive: THREE.Color=, emissiveIntensity: number=, opacity: number=, transparent: boolean=, map: THREE.Texture=}} THREEMaterialParameterPack
+   */
+  /**
+   * @param {FBXMaterialProperties} properties
+   * @param {Map<number, THREE.Texture>} textureMap
+   * @param {{ID: number, relationship: string}[]} childrenRelationships
+   * @returns {THREEMaterialParameterPack}
+   */
+  function parseParameters( properties, textureMap, childrenRelationships ) {
+
+    var parameters = {};
+
+    if ( properties.Diffuse ) {
+
+      parameters.color = parseColor( properties.Diffuse );
+
+    }
+    if ( properties.Specular ) {
+
+      parameters.specular = parseColor( properties.Specular );
+
+    }
+    if ( properties.Shininess ) {
+
+      parameters.shininess = properties.Shininess.value;
+
+    }
+    if ( properties.Emissive ) {
+
+      parameters.emissive = parseColor( properties.Emissive );
+
+    }
+    if ( properties.EmissiveFactor ) {
+
+      parameters.emissiveIntensity = properties.EmissiveFactor.value;
+
+    }
+    if ( properties.Opacity ) {
+
+      parameters.opacity = properties.Opacity.value;
+
+    }
+    if ( parameters.opacity < 1.0 ) {
+
+      parameters.transparent = true;
+
+    }
+
+    for ( var childrenRelationshipsIndex = 0, childrenRelationshipsLength = childrenRelationships.length; childrenRelationshipsIndex < childrenRelationshipsLength; ++ childrenRelationshipsIndex ) {
+
+      var relationship = childrenRelationships[ childrenRelationshipsIndex ];
+
+      var type = relationship.relationship;
+
+      switch ( type ) {
+
+        case 'DiffuseColor':
+        case ' "DiffuseColor':
+          parameters.map = textureMap.get( relationship.ID );
+          break;
+
+        case 'Bump':
+        case ' "Bump':
+          parameters.bumpMap = textureMap.get( relationship.ID );
+          break;
+
+        case 'NormalMap':
+        case ' "NormalMap':
+          parameters.normalMap = textureMap.get( relationship.ID );
+          break;
+
+        case 'AmbientColor':
+        case 'EmissiveColor':
+        case ' "AmbientColor':
+        case ' "EmissiveColor':
+        default:
+          console.warn( 'THREE.FBXLoader: Unknown texture application of type %s, skipping texture.', type );
+          break;
+
+      }
+
+    }
+
+    return parameters;
+
+  }
+
+  /**
+   * Generates map of Skeleton-like objects for use later when generating and binding skeletons.
+   * @param {{Objects: {subNodes: {Deformer: Object.<number, FBXSubDeformerNode>}}}} FBXTree
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @returns {Map<number, {map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[], skeleton: THREE.Skeleton|null}>}
+   */
+  function parseDeformers( FBXTree, connections ) {
+
+    var deformers = {};
+
+    if ( 'Deformer' in FBXTree.Objects.subNodes ) {
+
+      var DeformerNodes = FBXTree.Objects.subNodes.Deformer;
+
+      for ( var nodeID in DeformerNodes ) {
+
+        var deformerNode = DeformerNodes[ nodeID ];
+
+        if ( deformerNode.attrType === 'Skin' ) {
+
+          var conns = connections.get( parseInt( nodeID ) );
+          var skeleton = parseSkeleton( conns, DeformerNodes );
+          skeleton.FBX_ID = parseInt( nodeID );
+
+          deformers[ nodeID ] = skeleton;
+
+        }
+
+      }
+
+    }
+
+    return deformers;
+
+  }
+
+  /**
+   * Generates a "Skeleton Representation" of FBX nodes based on an FBX Skin Deformer's connections and an object containing SubDeformer nodes.
+   * @param {{parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}} connections
+   * @param {Object.<number, FBXSubDeformerNode>} DeformerNodes
+   * @returns {{map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[], skeleton: THREE.Skeleton|null}}
+   */
+  function parseSkeleton( connections, DeformerNodes ) {
+
+    var subDeformers = {};
+    var children = connections.children;
+
+    for ( var i = 0, l = children.length; i < l; ++ i ) {
+
+      var child = children[ i ];
+
+      var subDeformerNode = DeformerNodes[ child.ID ];
+
+      var subDeformer = {
+        FBX_ID: child.ID,
+        index: i,
+        indices: [],
+        weights: [],
+        transform: parseMatrixArray( subDeformerNode.subNodes.Transform.properties.a ),
+        transformLink: parseMatrixArray( subDeformerNode.subNodes.TransformLink.properties.a ),
+        linkMode: subDeformerNode.properties.Mode
+      };
+
+      if ( 'Indexes' in subDeformerNode.subNodes ) {
+
+        subDeformer.indices = parseIntArray( subDeformerNode.subNodes.Indexes.properties.a );
+        subDeformer.weights = parseFloatArray( subDeformerNode.subNodes.Weights.properties.a );
+
+      }
+
+      subDeformers[ child.ID ] = subDeformer;
+
+    }
+
+    return {
+      map: subDeformers,
+      bones: []
+    };
+
+  }
+
+  /**
+   * Generates Buffer geometries from geometry information in FBXTree, and generates map of THREE.BufferGeometries
+   * @param {{Objects: {subNodes: {Geometry: Object.<number, FBXGeometryNode}}}} FBXTree
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @param {Map<number, {map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[], skeleton: THREE.Skeleton|null}>} deformers
+   * @returns {Map<number, THREE.BufferGeometry>}
+   */
+  function parseGeometries( FBXTree, connections, deformers ) {
+
+    var geometryMap = new Map();
+
+    if ( 'Geometry' in FBXTree.Objects.subNodes ) {
+
+      var geometryNodes = FBXTree.Objects.subNodes.Geometry;
+
+      for ( var nodeID in geometryNodes ) {
+
+        var relationships = connections.get( parseInt( nodeID ) );
+        var geo = parseGeometry( geometryNodes[ nodeID ], relationships, deformers );
+        geometryMap.set( parseInt( nodeID ), geo );
+
+      }
+
+    }
+
+    return geometryMap;
+
+  }
+
+  /**
+   * Generates BufferGeometry from FBXGeometryNode.
+   * @param {FBXGeometryNode} geometryNode
+   * @param {{parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}} relationships
+   * @param {Map<number, {map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[]}>} deformers
+   * @returns {THREE.BufferGeometry}
+   */
+  function parseGeometry( geometryNode, relationships, deformers ) {
+
+    switch ( geometryNode.attrType ) {
+
+      case 'Mesh':
+        return parseMeshGeometry( geometryNode, relationships, deformers );
+        break;
+
+      case 'NurbsCurve':
+        return parseNurbsGeometry( geometryNode );
+        break;
+
+    }
+
+  }
+
+  /**
+   * Specialty function for parsing Mesh based Geometry Nodes.
+   * @param {FBXGeometryNode} geometryNode
+   * @param {{parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}} relationships - Object representing relationships between specific geometry node and other nodes.
+   * @param {Map<number, {map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[]}>} deformers - Map object of deformers and subDeformers by ID.
+   * @returns {THREE.BufferGeometry}
+   */
+  function parseMeshGeometry( geometryNode, relationships, deformers ) {
+
+    for ( var i = 0; i < relationships.children.length; ++ i ) {
+
+      var deformer = deformers[ relationships.children[ i ].ID ];
+      if ( deformer !== undefined ) break;
+
+    }
+
+    return genGeometry( geometryNode, deformer );
+
+  }
+
+  /**
+   * @param {{map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[]}} deformer - Skeleton representation for geometry instance.
+   * @returns {THREE.BufferGeometry}
+   */
+  function genGeometry( geometryNode, deformer ) {
+
+    var geometry = new Geometry();
+
+    var subNodes = geometryNode.subNodes;
+
+    // First, each index is going to be its own vertex.
+
+    var vertexBuffer = parseFloatArray( subNodes.Vertices.properties.a );
+    var indexBuffer = parseIntArray( subNodes.PolygonVertexIndex.properties.a );
+
+    if ( subNodes.LayerElementNormal ) {
+
+      var normalInfo = getNormals( subNodes.LayerElementNormal[ 0 ] );
+
+    }
+
+    if ( subNodes.LayerElementUV ) {
+
+      var uvInfo = getUVs( subNodes.LayerElementUV[ 0 ] );
+
+    }
+
+    if ( subNodes.LayerElementColor ) {
+
+      var colorInfo = getColors( subNodes.LayerElementColor[ 0 ] );
+
+    }
+
+    if ( subNodes.LayerElementMaterial ) {
+
+      var materialInfo = getMaterials( subNodes.LayerElementMaterial[ 0 ] );
+
+    }
+
+    var weightTable = {};
+
+    if ( deformer ) {
+
+      var subDeformers = deformer.map;
+
+      for ( var key in subDeformers ) {
+
+        var subDeformer = subDeformers[ key ];
+        var indices = subDeformer.indices;
+
+        for ( var j = 0; j < indices.length; j ++ ) {
+
+          var index = indices[ j ];
+          var weight = subDeformer.weights[ j ];
+
+          if ( weightTable[ index ] === undefined ) weightTable[ index ] = [];
+
+          weightTable[ index ].push( {
+            id: subDeformer.index,
+            weight: weight
+          } );
+
+        }
+
+      }
+
+    }
+
+    var faceVertexBuffer = [];
+    var polygonIndex = 0;
+    var displayedWeightsWarning = false;
+
+    for ( var polygonVertexIndex = 0; polygonVertexIndex < indexBuffer.length; polygonVertexIndex ++ ) {
+
+      var vertexIndex = indexBuffer[ polygonVertexIndex ];
+
+      var endOfFace = false;
+
+      if ( vertexIndex < 0 ) {
+
+        vertexIndex = vertexIndex ^ - 1;
+        indexBuffer[ polygonVertexIndex ] = vertexIndex;
+        endOfFace = true;
+
+      }
+
+      var vertex = new Vertex();
+      var weightIndices = [];
+      var weights = [];
+
+      vertex.position.fromArray( vertexBuffer, vertexIndex * 3 );
+
+      if ( deformer ) {
+
+        if ( weightTable[ vertexIndex ] !== undefined ) {
+
+          var array = weightTable[ vertexIndex ];
+
+          for ( var j = 0, jl = array.length; j < jl; j ++ ) {
+
+            weights.push( array[ j ].weight );
+            weightIndices.push( array[ j ].id );
+
+          }
+
+        }
+
+        if ( weights.length > 4 ) {
+
+          if ( ! displayedWeightsWarning ) {
+
+            console.warn( 'THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.' );
+            displayedWeightsWarning = true;
+
+          }
+
+          var WIndex = [ 0, 0, 0, 0 ];
+          var Weight = [ 0, 0, 0, 0 ];
+
+          weights.forEach( function ( weight, weightIndex ) {
+
+            var currentWeight = weight;
+            var currentIndex = weightIndices[ weightIndex ];
+
+            Weight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {
+
+              if ( currentWeight > comparedWeight ) {
+
+                comparedWeightArray[ comparedWeightIndex ] = currentWeight;
+                currentWeight = comparedWeight;
+
+                var tmp = WIndex[ comparedWeightIndex ];
+                WIndex[ comparedWeightIndex ] = currentIndex;
+                currentIndex = tmp;
+
+              }
+
+            } );
+
+          } );
+
+          weightIndices = WIndex;
+          weights = Weight;
+
+        }
+
+        for ( var i = weights.length; i < 4; ++ i ) {
+
+          weights[ i ] = 0;
+          weightIndices[ i ] = 0;
+
+        }
+
+        vertex.skinWeights.fromArray( weights );
+        vertex.skinIndices.fromArray( weightIndices );
+
+      }
+
+      if ( normalInfo ) {
+
+        vertex.normal.fromArray( getData( polygonVertexIndex, polygonIndex, vertexIndex, normalInfo ) );
+
+      }
+
+      if ( uvInfo ) {
+
+        vertex.uv.fromArray( getData( polygonVertexIndex, polygonIndex, vertexIndex, uvInfo ) );
+
+      }
+
+      if ( colorInfo ) {
+
+        vertex.color.fromArray( getData( polygonVertexIndex, polygonIndex, vertexIndex, colorInfo ) );
+
+      }
+
+      faceVertexBuffer.push( vertex );
+
+      if ( endOfFace ) {
+
+        var face = new Face();
+        face.genTrianglesFromVertices( faceVertexBuffer );
+
+        if ( materialInfo !== undefined ) {
+
+          var materials = getData( polygonVertexIndex, polygonIndex, vertexIndex, materialInfo );
+          face.materialIndex = materials[ 0 ];
+
+        } else {
+
+          // Seems like some models don't have materialInfo(subNodes.LayerElementMaterial).
+          // Set 0 in such a case.
+          face.materialIndex = 0;
+
+        }
+
+        geometry.faces.push( face );
+        faceVertexBuffer = [];
+        polygonIndex ++;
+
+        endOfFace = false;
+
+      }
+
+    }
+
+    /**
+     * @type {{vertexBuffer: number[], normalBuffer: number[], uvBuffer: number[], skinIndexBuffer: number[], skinWeightBuffer: number[], materialIndexBuffer: number[]}}
+     */
+    var bufferInfo = geometry.flattenToBuffers();
+
+    var geo = new THREE.BufferGeometry();
+    geo.name = geometryNode.name;
+    geo.addAttribute( 'position', new THREE.Float32BufferAttribute( bufferInfo.vertexBuffer, 3 ) );
+
+    if ( bufferInfo.normalBuffer.length > 0 ) {
+
+      geo.addAttribute( 'normal', new THREE.Float32BufferAttribute( bufferInfo.normalBuffer, 3 ) );
+
+    }
+    if ( bufferInfo.uvBuffer.length > 0 ) {
+
+      geo.addAttribute( 'uv', new THREE.Float32BufferAttribute( bufferInfo.uvBuffer, 2 ) );
+
+    }
+    if ( subNodes.LayerElementColor ) {
+
+      geo.addAttribute( 'color', new THREE.Float32BufferAttribute( bufferInfo.colorBuffer, 3 ) );
+
+    }
+
+    if ( deformer ) {
+
+      geo.addAttribute( 'skinIndex', new THREE.Float32BufferAttribute( bufferInfo.skinIndexBuffer, 4 ) );
+
+      geo.addAttribute( 'skinWeight', new THREE.Float32BufferAttribute( bufferInfo.skinWeightBuffer, 4 ) );
+
+      geo.FBX_Deformer = deformer;
+
+    }
+
+    // Convert the material indices of each vertex into rendering groups on the geometry.
+
+    var materialIndexBuffer = bufferInfo.materialIndexBuffer;
+    var prevMaterialIndex = materialIndexBuffer[ 0 ];
+    var startIndex = 0;
+
+    for ( var i = 0; i < materialIndexBuffer.length; ++ i ) {
+
+      if ( materialIndexBuffer[ i ] !== prevMaterialIndex ) {
+
+        geo.addGroup( startIndex, i - startIndex, prevMaterialIndex );
+
+        prevMaterialIndex = materialIndexBuffer[ i ];
+        startIndex = i;
+
+      }
+
+    }
+
+    return geo;
+
+  }
+
+  /**
+   * Parses normal information for geometry.
+   * @param {FBXGeometryNode} geometryNode
+   * @returns {{dataSize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}}
+   */
+  function getNormals( NormalNode ) {
+
+    var mappingType = NormalNode.properties.MappingInformationType;
+    var referenceType = NormalNode.properties.ReferenceInformationType;
+    var buffer = parseFloatArray( NormalNode.subNodes.Normals.properties.a );
+    var indexBuffer = [];
+    if ( referenceType === 'IndexToDirect' ) {
+
+      if ( 'NormalIndex' in NormalNode.subNodes ) {
+
+        indexBuffer = parseIntArray( NormalNode.subNodes.NormalIndex.properties.a );
+
+      } else if ( 'NormalsIndex' in NormalNode.subNodes ) {
+
+        indexBuffer = parseIntArray( NormalNode.subNodes.NormalsIndex.properties.a );
+
+      }
+
+    }
+
+    return {
+      dataSize: 3,
+      buffer: buffer,
+      indices: indexBuffer,
+      mappingType: mappingType,
+      referenceType: referenceType
+    };
+
+  }
+
+  /**
+   * Parses UV information for geometry.
+   * @param {FBXGeometryNode} geometryNode
+   * @returns {{dataSize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}}
+   */
+  function getUVs( UVNode ) {
+
+    var mappingType = UVNode.properties.MappingInformationType;
+    var referenceType = UVNode.properties.ReferenceInformationType;
+    var buffer = parseFloatArray( UVNode.subNodes.UV.properties.a );
+    var indexBuffer = [];
+    if ( referenceType === 'IndexToDirect' ) {
+
+      indexBuffer = parseIntArray( UVNode.subNodes.UVIndex.properties.a );
+
+    }
+
+    return {
+      dataSize: 2,
+      buffer: buffer,
+      indices: indexBuffer,
+      mappingType: mappingType,
+      referenceType: referenceType
+    };
+
+  }
+
+  /**
+   * Parses Vertex Color information for geometry.
+   * @param {FBXGeometryNode} geometryNode
+   * @returns {{dataSize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}}
+   */
+  function getColors( ColorNode ) {
+
+    var mappingType = ColorNode.properties.MappingInformationType;
+    var referenceType = ColorNode.properties.ReferenceInformationType;
+    var buffer = parseFloatArray( ColorNode.subNodes.Colors.properties.a );
+    var indexBuffer = [];
+    if ( referenceType === 'IndexToDirect' ) {
+
+      indexBuffer = parseFloatArray( ColorNode.subNodes.ColorIndex.properties.a );
+
+    }
+
+    return {
+      dataSize: 4,
+      buffer: buffer,
+      indices: indexBuffer,
+      mappingType: mappingType,
+      referenceType: referenceType
+    };
+
+  }
+
+  /**
+   * Parses material application information for geometry.
+   * @param {FBXGeometryNode}
+   * @returns {{dataSize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}}
+   */
+  function getMaterials( MaterialNode ) {
+
+    var mappingType = MaterialNode.properties.MappingInformationType;
+    var referenceType = MaterialNode.properties.ReferenceInformationType;
+
+    if ( mappingType === 'NoMappingInformation' ) {
+
+      return {
+        dataSize: 1,
+        buffer: [ 0 ],
+        indices: [ 0 ],
+        mappingType: 'AllSame',
+        referenceType: referenceType
+      };
+
+    }
+
+    var materialIndexBuffer = parseIntArray( MaterialNode.subNodes.Materials.properties.a );
+
+    // Since materials are stored as indices, there's a bit of a mismatch between FBX and what
+    // we expect.  So we create an intermediate buffer that points to the index in the buffer,
+    // for conforming with the other functions we've written for other data.
+    var materialIndices = [];
+
+    for ( var materialIndexBufferIndex = 0, materialIndexBufferLength = materialIndexBuffer.length; materialIndexBufferIndex < materialIndexBufferLength; ++ materialIndexBufferIndex ) {
+
+      materialIndices.push( materialIndexBufferIndex );
+
+    }
+
+    return {
+      dataSize: 1,
+      buffer: materialIndexBuffer,
+      indices: materialIndices,
+      mappingType: mappingType,
+      referenceType: referenceType
+    };
+
+  }
+
+  /**
+   * Function uses the infoObject and given indices to return value array of object.
+   * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+   * @param {number} polygonIndex - Index of polygon in geometry.
+   * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+   * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+   * @returns {number[]}
+   */
+
+  var dataArray = [];
+
+  var GetData = {
+
+    ByPolygonVertex: {
+
+      /**
+       * Function uses the infoObject and given indices to return value array of object.
+       * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+       * @param {number} polygonIndex - Index of polygon in geometry.
+       * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+       * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+       * @returns {number[]}
+       */
+      Direct: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var from = ( polygonVertexIndex * infoObject.dataSize );
+        var to = ( polygonVertexIndex * infoObject.dataSize ) + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      },
+
+      /**
+       * Function uses the infoObject and given indices to return value array of object.
+       * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+       * @param {number} polygonIndex - Index of polygon in geometry.
+       * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+       * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+       * @returns {number[]}
+       */
+      IndexToDirect: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var index = infoObject.indices[ polygonVertexIndex ];
+        var from = ( index * infoObject.dataSize );
+        var to = ( index * infoObject.dataSize ) + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      }
+
+    },
+
+    ByPolygon: {
+
+      /**
+       * Function uses the infoObject and given indices to return value array of object.
+       * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+       * @param {number} polygonIndex - Index of polygon in geometry.
+       * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+       * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+       * @returns {number[]}
+       */
+      Direct: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var from = polygonIndex * infoObject.dataSize;
+        var to = polygonIndex * infoObject.dataSize + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      },
+
+      /**
+       * Function uses the infoObject and given indices to return value array of object.
+       * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+       * @param {number} polygonIndex - Index of polygon in geometry.
+       * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+       * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+       * @returns {number[]}
+       */
+      IndexToDirect: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var index = infoObject.indices[ polygonIndex ];
+        var from = index * infoObject.dataSize;
+        var to = index * infoObject.dataSize + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      }
+
+    },
+
+    ByVertice: {
+
+      Direct: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var from = ( vertexIndex * infoObject.dataSize );
+        var to = ( vertexIndex * infoObject.dataSize ) + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      }
+
+    },
+
+    AllSame: {
+
+      /**
+       * Function uses the infoObject and given indices to return value array of object.
+       * @param {number} polygonVertexIndex - Index of vertex in draw order (which index of the index buffer refers to this vertex).
+       * @param {number} polygonIndex - Index of polygon in geometry.
+       * @param {number} vertexIndex - Index of vertex inside vertex buffer (used because some data refers to old index buffer that we don't use anymore).
+       * @param {{datasize: number, buffer: number[], indices: number[], mappingType: string, referenceType: string}} infoObject - Object containing data and how to access data.
+       * @returns {number[]}
+       */
+      IndexToDirect: function ( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+        var from = infoObject.indices[ 0 ] * infoObject.dataSize;
+        var to = infoObject.indices[ 0 ] * infoObject.dataSize + infoObject.dataSize;
+
+        // return infoObject.buffer.slice( from, to );
+        return slice( dataArray, infoObject.buffer, from, to );
+
+      }
+
+    }
+
+  };
+
+  function getData( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {
+
+    return GetData[ infoObject.mappingType ][ infoObject.referenceType ]( polygonVertexIndex, polygonIndex, vertexIndex, infoObject );
+
+  }
+
+  /**
+   * Specialty function for parsing NurbsCurve based Geometry Nodes.
+   * @param {FBXGeometryNode} geometryNode
+   * @param {{parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}} relationships
+   * @returns {THREE.BufferGeometry}
+   */
+  function parseNurbsGeometry( geometryNode ) {
+
+    if ( THREE.NURBSCurve === undefined ) {
+
+      console.error( 'THREE.FBXLoader: The loader relies on THREE.NURBSCurve for any nurbs present in the model. Nurbs will show up as empty geometry.' );
+      return new THREE.BufferGeometry();
+
+    }
+
+    var order = parseInt( geometryNode.properties.Order );
+
+    if ( isNaN( order ) ) {
+
+      console.error( 'THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geometryNode.properties.Order, geometryNode.id );
+      return new THREE.BufferGeometry();
+
+    }
+
+    var degree = order - 1;
+
+    var knots = parseFloatArray( geometryNode.subNodes.KnotVector.properties.a );
+    var controlPoints = [];
+    var pointsValues = parseFloatArray( geometryNode.subNodes.Points.properties.a );
+
+    for ( var i = 0, l = pointsValues.length; i < l; i += 4 ) {
+
+      controlPoints.push( new THREE.Vector4().fromArray( pointsValues, i ) );
+
+    }
+
+    var startKnot, endKnot;
+
+    if ( geometryNode.properties.Form === 'Closed' ) {
+
+      controlPoints.push( controlPoints[ 0 ] );
+
+    } else if ( geometryNode.properties.Form === 'Periodic' ) {
+
+      startKnot = degree;
+      endKnot = knots.length - 1 - startKnot;
+
+      for ( var i = 0; i < degree; ++ i ) {
+
+        controlPoints.push( controlPoints[ i ] );
+
+      }
+
+    }
+
+    var curve = new THREE.NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );
+    var vertices = curve.getPoints( controlPoints.length * 7 );
+
+    var positions = new Float32Array( vertices.length * 3 );
+
+    for ( var i = 0, l = vertices.length; i < l; ++ i ) {
+
+      vertices[ i ].toArray( positions, i * 3 );
+
+    }
+
+    var geometry = new THREE.BufferGeometry();
+    geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
+
+    return geometry;
+
+  }
+
+  /**
+   * Finally generates Scene graph and Scene graph Objects.
+   * @param {{Objects: {subNodes: {Model: Object.<number, FBXModelNode>}}}} FBXTree
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @param {Map<number, {map: Map<number, {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}>, array: {FBX_ID: number, indices: number[], weights: number[], transform: number[], transformLink: number[], linkMode: string}[], skeleton: THREE.Skeleton|null}>} deformers
+   * @param {Map<number, THREE.BufferGeometry>} geometryMap
+   * @param {Map<number, THREE.Material>} materialMap
+   * @returns {THREE.Group}
+   */
+  function parseScene( FBXTree, connections, deformers, geometryMap, materialMap ) {
+
+    var sceneGraph = new THREE.Group();
+
+    var ModelNode = FBXTree.Objects.subNodes.Model;
+
+    /**
+     * @type {Array.<THREE.Object3D>}
+     */
+    var modelArray = [];
+
+    /**
+     * @type {Map.<number, THREE.Object3D>}
+     */
+    var modelMap = new Map();
+
+    for ( var nodeID in ModelNode ) {
+
+      var id = parseInt( nodeID );
+      var node = ModelNode[ nodeID ];
+      var conns = connections.get( id );
+      var model = null;
+
+      for ( var i = 0; i < conns.parents.length; ++ i ) {
+
+        for ( var FBX_ID in deformers ) {
+
+          var deformer = deformers[ FBX_ID ];
+          var subDeformers = deformer.map;
+          var subDeformer = subDeformers[ conns.parents[ i ].ID ];
+
+          if ( subDeformer ) {
+
+            var model2 = model;
+            model = new THREE.Bone();
+            deformer.bones[ subDeformer.index ] = model;
+
+            // seems like we need this not to make non-connected bone, maybe?
+            // TODO: confirm
+            if ( model2 !== null ) model.add( model2 );
+
+          }
+
+        }
+
+      }
+
+      if ( ! model ) {
+
+        switch ( node.attrType ) {
+
+          case 'Mesh':
+            /**
+             * @type {?THREE.BufferGeometry}
+             */
+            var geometry = null;
+
+            /**
+             * @type {THREE.MultiMaterial|THREE.Material}
+             */
+            var material = null;
+
+            /**
+             * @type {Array.<THREE.Material>}
+             */
+            var materials = [];
+
+            for ( var childrenIndex = 0, childrenLength = conns.children.length; childrenIndex < childrenLength; ++ childrenIndex ) {
+
+              var child = conns.children[ childrenIndex ];
+
+              if ( geometryMap.has( child.ID ) ) {
+
+                geometry = geometryMap.get( child.ID );
+
+              }
+
+              if ( materialMap.has( child.ID ) ) {
+
+                materials.push( materialMap.get( child.ID ) );
+
+              }
+
+            }
+            if ( materials.length > 1 ) {
+
+              material = materials;
+
+            } else if ( materials.length > 0 ) {
+
+              material = materials[ 0 ];
+
+            } else {
+
+              material = new THREE.MeshStandardMaterial( { color: 0x3300ff } );
+              materials.push( material );
+
+            }
+            if ( 'color' in geometry.attributes ) {
+
+              for ( var materialIndex = 0, numMaterials = materials.length; materialIndex < numMaterials; ++materialIndex ) {
+
+                materials[ materialIndex ].vertexColors = THREE.VertexColors;
+
+              }
+
+            }
+            if ( geometry.FBX_Deformer ) {
+
+              for ( var materialsIndex = 0, materialsLength = materials.length; materialsIndex < materialsLength; ++ materialsIndex ) {
+
+                materials[ materialsIndex ].skinning = true;
+
+              }
+              model = new THREE.SkinnedMesh( geometry, material );
+
+            } else {
+
+              model = new THREE.Mesh( geometry, material );
+
+            }
+            break;
+
+          case 'NurbsCurve':
+            var geometry = null;
+
+            for ( var childrenIndex = 0, childrenLength = conns.children.length; childrenIndex < childrenLength; ++ childrenIndex ) {
+
+              var child = conns.children[ childrenIndex ];
+
+              if ( geometryMap.has( child.ID ) ) {
+
+                geometry = geometryMap.get( child.ID );
+
+              }
+
+            }
+
+            // FBX does not list materials for Nurbs lines, so we'll just put our own in here.
+            material = new THREE.LineBasicMaterial( { color: 0x3300ff, linewidth: 5 } );
+            model = new THREE.Line( geometry, material );
+            break;
+
+          default:
+            model = new THREE.Object3D();
+            break;
+
+        }
+
+      }
+
+      model.name = node.attrName.replace( /:/, '' ).replace( /_/, '' ).replace( /-/, '' );
+      model.FBX_ID = id;
+
+      modelArray.push( model );
+      modelMap.set( id, model );
+
+    }
+
+    for ( var modelArrayIndex = 0, modelArrayLength = modelArray.length; modelArrayIndex < modelArrayLength; ++ modelArrayIndex ) {
+
+      var model = modelArray[ modelArrayIndex ];
+
+      var node = ModelNode[ model.FBX_ID ];
+
+      if ( 'Lcl_Translation' in node.properties ) {
+
+        model.position.fromArray( parseFloatArray( node.properties.Lcl_Translation.value ) );
+
+      }
+
+      if ( 'Lcl_Rotation' in node.properties ) {
+
+        var rotation = parseFloatArray( node.properties.Lcl_Rotation.value ).map( degreeToRadian );
+        rotation.push( 'ZYX' );
+        model.rotation.fromArray( rotation );
+
+      }
+
+      if ( 'Lcl_Scaling' in node.properties ) {
+
+        model.scale.fromArray( parseFloatArray( node.properties.Lcl_Scaling.value ) );
+
+      }
+
+      if ( 'PreRotation' in node.properties ) {
+
+        var preRotations = new THREE.Euler().setFromVector3( parseVector3( node.properties.PreRotation ).multiplyScalar( DEG2RAD ), 'ZYX' );
+        preRotations = new THREE.Quaternion().setFromEuler( preRotations );
+        var currentRotation = new THREE.Quaternion().setFromEuler( model.rotation );
+        preRotations.multiply( currentRotation );
+        model.rotation.setFromQuaternion( preRotations, 'ZYX' );
+
+      }
+
+      var conns = connections.get( model.FBX_ID );
+      for ( var parentIndex = 0; parentIndex < conns.parents.length; parentIndex ++ ) {
+
+        var pIndex = findIndex( modelArray, function ( mod ) {
+
+          return mod.FBX_ID === conns.parents[ parentIndex ].ID;
+
+        } );
+        if ( pIndex > - 1 ) {
+
+          modelArray[ pIndex ].add( model );
+          break;
+
+        }
+
+      }
+      if ( model.parent === null ) {
+
+        sceneGraph.add( model );
+
+      }
+
+    }
+
+
+    // Now with the bones created, we can update the skeletons and bind them to the skinned meshes.
+    sceneGraph.updateMatrixWorld( true );
+
+    // Put skeleton into bind pose.
+    var BindPoseNode = FBXTree.Objects.subNodes.Pose;
+    for ( var nodeID in BindPoseNode ) {
+
+      if ( BindPoseNode[ nodeID ].attrType === 'BindPose' ) {
+
+        BindPoseNode = BindPoseNode[ nodeID ];
+        break;
+
+      }
+
+    }
+    if ( BindPoseNode ) {
+
+      var PoseNode = BindPoseNode.subNodes.PoseNode;
+      var worldMatrices = new Map();
+
+      for ( var PoseNodeIndex = 0, PoseNodeLength = PoseNode.length; PoseNodeIndex < PoseNodeLength; ++ PoseNodeIndex ) {
+
+        var node = PoseNode[ PoseNodeIndex ];
+
+        var rawMatWrd = parseMatrixArray( node.subNodes.Matrix.properties.a );
+
+        worldMatrices.set( parseInt( node.id ), rawMatWrd );
+
+      }
+
+    }
+
+    for ( var FBX_ID in deformers ) {
+
+      var deformer = deformers[ FBX_ID ];
+      var subDeformers = deformer.map;
+
+      for ( var key in subDeformers ) {
+
+        var subDeformer = subDeformers[ key ];
+        var subDeformerIndex = subDeformer.index;
+
+        /**
+         * @type {THREE.Bone}
+         */
+        var bone = deformer.bones[ subDeformerIndex ];
+        if ( ! worldMatrices.has( bone.FBX_ID ) ) {
+
+          break;
+
+        }
+        var mat = worldMatrices.get( bone.FBX_ID );
+        bone.matrixWorld.copy( mat );
+
+      }
+
+      // Now that skeleton is in bind pose, bind to model.
+      deformer.skeleton = new THREE.Skeleton( deformer.bones );
+
+      var conns = connections.get( deformer.FBX_ID );
+      var parents = conns.parents;
+
+      for ( var parentsIndex = 0, parentsLength = parents.length; parentsIndex < parentsLength; ++ parentsIndex ) {
+
+        var parent = parents[ parentsIndex ];
+
+        if ( geometryMap.has( parent.ID ) ) {
+
+          var geoID = parent.ID;
+          var geoConns = connections.get( geoID );
+
+          for ( var i = 0; i < geoConns.parents.length; ++ i ) {
+
+            if ( modelMap.has( geoConns.parents[ i ].ID ) ) {
+
+              var model = modelMap.get( geoConns.parents[ i ].ID );
+              //ASSERT model typeof SkinnedMesh
+              model.bind( deformer.skeleton, model.matrixWorld );
+              break;
+
+            }
+
+          }
+
+        }
+
+      }
+
+    }
+
+    //Skeleton is now bound, return objects to starting
+    //world positions.
+    sceneGraph.updateMatrixWorld( true );
+
+    // Silly hack with the animation parsing.  We're gonna pretend the scene graph has a skeleton
+    // to attach animations to, since FBXs treat animations as animations for the entire scene,
+    // not just for individual objects.
+    sceneGraph.skeleton = {
+      bones: modelArray
+    };
+
+    var animations = parseAnimations( FBXTree, connections, sceneGraph );
+
+    addAnimations( sceneGraph, animations );
+
+    return sceneGraph;
+
+  }
+
+  /**
+   * Parses animation information from FBXTree and generates an AnimationInfoObject.
+   * @param {{Objects: {subNodes: {AnimationCurveNode: any, AnimationCurve: any, AnimationLayer: any, AnimationStack: any}}}} FBXTree
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   */
+  function parseAnimations( FBXTree, connections, sceneGraph ) {
+
+    var rawNodes = FBXTree.Objects.subNodes.AnimationCurveNode;
+    var rawCurves = FBXTree.Objects.subNodes.AnimationCurve;
+    var rawLayers = FBXTree.Objects.subNodes.AnimationLayer;
+    var rawStacks = FBXTree.Objects.subNodes.AnimationStack;
+
+    /**
+     * @type {{
+         curves: Map<number, {
+         T: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        },
+         R: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        },
+         S: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        }
+       }>,
+       layers: Map<number, {
+        T: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        },
+        R: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        },
+        S: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        }
+        }[]>,
+       stacks: Map<number, {
+         name: string,
+         layers: {
+          T: {
+            id: number;
+            attr: string;
+            internalID: number;
+            attrX: boolean;
+            attrY: boolean;
+            attrZ: boolean;
+            containerBoneID: number;
+            containerID: number;
+            curves: {
+              x: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              y: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              z: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+            };
+          };
+          R: {
+            id: number;
+            attr: string;
+            internalID: number;
+            attrX: boolean;
+            attrY: boolean;
+            attrZ: boolean;
+            containerBoneID: number;
+            containerID: number;
+            curves: {
+              x: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              y: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              z: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+            };
+          };
+          S: {
+            id: number;
+            attr: string;
+            internalID: number;
+            attrX: boolean;
+            attrY: boolean;
+            attrZ: boolean;
+            containerBoneID: number;
+            containerID: number;
+            curves: {
+              x: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              y: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+              z: {
+                version: any;
+                id: number;
+                internalID: number;
+                times: number[];
+                values: number[];
+                attrFlag: number[];
+                attrData: number[];
+              };
+            };
+          };
+        }[][],
+       length: number,
+       frames: number }>,
+       length: number,
+       fps: number,
+       frames: number
+     }}
+     */
+    var returnObject = {
+      curves: new Map(),
+      layers: {},
+      stacks: {},
+      length: 0,
+      fps: 30,
+      frames: 0
+    };
+
+    /**
+     * @type {Array.<{
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+      }>}
+     */
+    var animationCurveNodes = [];
+    for ( var nodeID in rawNodes ) {
+
+      if ( nodeID.match( /\d+/ ) ) {
+
+        var animationNode = parseAnimationNode( FBXTree, rawNodes[ nodeID ], connections, sceneGraph );
+        animationCurveNodes.push( animationNode );
+
+      }
+
+    }
+
+    /**
+     * @type {Map.<number, {
+        id: number,
+        attr: string,
+        internalID: number,
+        attrX: boolean,
+        attrY: boolean,
+        attrZ: boolean,
+        containerBoneID: number,
+        containerID: number,
+        curves: {
+          x: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+          },
+          y: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+          },
+          z: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+          }
+        }
+      }>}
+     */
+    var tmpMap = new Map();
+    for ( var animationCurveNodeIndex = 0; animationCurveNodeIndex < animationCurveNodes.length; ++ animationCurveNodeIndex ) {
+
+      if ( animationCurveNodes[ animationCurveNodeIndex ] === null ) {
+
+        continue;
+
+      }
+      tmpMap.set( animationCurveNodes[ animationCurveNodeIndex ].id, animationCurveNodes[ animationCurveNodeIndex ] );
+
+    }
+
+
+    /**
+     * @type {{
+        version: any,
+        id: number,
+        internalID: number,
+        times: number[],
+        values: number[],
+        attrFlag: number[],
+        attrData: number[],
+      }[]}
+     */
+    var animationCurves = [];
+    for ( nodeID in rawCurves ) {
+
+      if ( nodeID.match( /\d+/ ) ) {
+
+        var animationCurve = parseAnimationCurve( rawCurves[ nodeID ] );
+
+        // seems like this check would be necessary?
+        if ( ! connections.has( animationCurve.id ) ) continue;
+
+        animationCurves.push( animationCurve );
+
+        var firstParentConn = connections.get( animationCurve.id ).parents[ 0 ];
+        var firstParentID = firstParentConn.ID;
+        var firstParentRelationship = firstParentConn.relationship;
+        var axis = '';
+
+        if ( firstParentRelationship.match( /X/ ) ) {
+
+          axis = 'x';
+
+        } else if ( firstParentRelationship.match( /Y/ ) ) {
+
+          axis = 'y';
+
+        } else if ( firstParentRelationship.match( /Z/ ) ) {
+
+          axis = 'z';
+
+        } else {
+
+          continue;
+
+        }
+
+        tmpMap.get( firstParentID ).curves[ axis ] = animationCurve;
+
+      }
+
+    }
+
+    tmpMap.forEach( function ( curveNode ) {
+
+      var id = curveNode.containerBoneID;
+      if ( ! returnObject.curves.has( id ) ) {
+
+        returnObject.curves.set( id, { T: null, R: null, S: null } );
+
+      }
+      returnObject.curves.get( id )[ curveNode.attr ] = curveNode;
+      if ( curveNode.attr === 'R' ) {
+
+        var curves = curveNode.curves;
+
+        // Seems like some FBX files have AnimationCurveNode
+        // which doesn't have any connected AnimationCurve.
+        // Setting animation parameter for them here.
+
+        if ( curves.x === null ) {
+
+          curves.x = {
+            version: null,
+            times: [ 0.0 ],
+            values: [ 0.0 ]
+          };
+
+        }
+
+        if ( curves.y === null ) {
+
+          curves.y = {
+            version: null,
+            times: [ 0.0 ],
+            values: [ 0.0 ]
+          };
+
+        }
+
+        if ( curves.z === null ) {
+
+          curves.z = {
+            version: null,
+            times: [ 0.0 ],
+            values: [ 0.0 ]
+          };
+
+        }
+
+        curves.x.values = curves.x.values.map( degreeToRadian );
+        curves.y.values = curves.y.values.map( degreeToRadian );
+        curves.z.values = curves.z.values.map( degreeToRadian );
+
+        if ( curveNode.preRotations !== null ) {
+
+          var preRotations = new THREE.Euler().setFromVector3( curveNode.preRotations, 'ZYX' );
+          preRotations = new THREE.Quaternion().setFromEuler( preRotations );
+          var frameRotation = new THREE.Euler();
+          var frameRotationQuaternion = new THREE.Quaternion();
+          for ( var frame = 0; frame < curves.x.times.length; ++ frame ) {
+
+            frameRotation.set( curves.x.values[ frame ], curves.y.values[ frame ], curves.z.values[ frame ], 'ZYX' );
+            frameRotationQuaternion.setFromEuler( frameRotation ).premultiply( preRotations );
+            frameRotation.setFromQuaternion( frameRotationQuaternion, 'ZYX' );
+            curves.x.values[ frame ] = frameRotation.x;
+            curves.y.values[ frame ] = frameRotation.y;
+            curves.z.values[ frame ] = frameRotation.z;
+
+          }
+
+        }
+
+      }
+
+    } );
+
+    for ( var nodeID in rawLayers ) {
+
+      /**
+       * @type {{
+        T: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        },
+        R: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        },
+        S: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          },
+        }
+        }[]}
+       */
+      var layer = [];
+      var children = connections.get( parseInt( nodeID ) ).children;
+
+      for ( var childIndex = 0; childIndex < children.length; childIndex ++ ) {
+
+        // Skip lockInfluenceWeights
+        if ( tmpMap.has( children[ childIndex ].ID ) ) {
+
+          var curveNode = tmpMap.get( children[ childIndex ].ID );
+          var boneID = curveNode.containerBoneID;
+          if ( layer[ boneID ] === undefined ) {
+
+            layer[ boneID ] = {
+              T: null,
+              R: null,
+              S: null
+            };
+
+          }
+
+          layer[ boneID ][ curveNode.attr ] = curveNode;
+
+        }
+
+      }
+
+      returnObject.layers[ nodeID ] = layer;
+
+    }
+
+    for ( var nodeID in rawStacks ) {
+
+      var layers = [];
+      var children = connections.get( parseInt( nodeID ) ).children;
+      var timestamps = { max: 0, min: Number.MAX_VALUE };
+
+      for ( var childIndex = 0; childIndex < children.length; ++ childIndex ) {
+
+        var currentLayer = returnObject.layers[ children[ childIndex ].ID ];
+
+        if ( currentLayer !== undefined ) {
+
+          layers.push( currentLayer );
+
+          for ( var currentLayerIndex = 0, currentLayerLength = currentLayer.length; currentLayerIndex < currentLayerLength; ++ currentLayerIndex ) {
+
+            var layer = currentLayer[ currentLayerIndex ];
+
+            if ( layer ) {
+
+              getCurveNodeMaxMinTimeStamps( layer, timestamps );
+
+            }
+
+          }
+
+        }
+
+      }
+
+      // Do we have an animation clip with actual length?
+      if ( timestamps.max > timestamps.min ) {
+
+        returnObject.stacks[ nodeID ] = {
+          name: rawStacks[ nodeID ].attrName,
+          layers: layers,
+          length: timestamps.max - timestamps.min,
+          frames: ( timestamps.max - timestamps.min ) * 30
+        };
+
+      }
+
+    }
+
+    return returnObject;
+
+  }
+
+  /**
+   * @param {Object} FBXTree
+   * @param {{id: number, attrName: string, properties: Object<string, any>}} animationCurveNode
+   * @param {Map<number, {parents: {ID: number, relationship: string}[], children: {ID: number, relationship: string}[]}>} connections
+   * @param {{skeleton: {bones: {FBX_ID: number}[]}}} sceneGraph
+   */
+  function parseAnimationNode( FBXTree, animationCurveNode, connections, sceneGraph ) {
+
+    var rawModels = FBXTree.Objects.subNodes.Model;
+
+    var returnObject = {
+      /**
+       * @type {number}
+       */
+      id: animationCurveNode.id,
+
+      /**
+       * @type {string}
+       */
+      attr: animationCurveNode.attrName,
+
+      /**
+       * @type {number}
+       */
+      internalID: animationCurveNode.id,
+
+      /**
+       * @type {boolean}
+       */
+      attrX: false,
+
+      /**
+       * @type {boolean}
+       */
+      attrY: false,
+
+      /**
+       * @type {boolean}
+       */
+      attrZ: false,
+
+      /**
+       * @type {number}
+       */
+      containerBoneID: - 1,
+
+      /**
+       * @type {number}
+       */
+      containerID: - 1,
+
+      curves: {
+        x: null,
+        y: null,
+        z: null
+      },
+
+      /**
+       * @type {number[]}
+       */
+      preRotations: null
+    };
+
+    if ( returnObject.attr.match( /S|R|T/ ) ) {
+
+      for ( var attributeKey in animationCurveNode.properties ) {
+
+        if ( attributeKey.match( /X/ ) ) {
+
+          returnObject.attrX = true;
+
+        }
+        if ( attributeKey.match( /Y/ ) ) {
+
+          returnObject.attrY = true;
+
+        }
+        if ( attributeKey.match( /Z/ ) ) {
+
+          returnObject.attrZ = true;
+
+        }
+
+      }
+
+    } else {
+
+      return null;
+
+    }
+
+    var conns = connections.get( returnObject.id );
+    var containerIndices = conns.parents;
+
+    for ( var containerIndicesIndex = containerIndices.length - 1; containerIndicesIndex >= 0; -- containerIndicesIndex ) {
+
+      var boneID = findIndex( sceneGraph.skeleton.bones, function ( bone ) {
+
+        return bone.FBX_ID === containerIndices[ containerIndicesIndex ].ID;
+
+      } );
+      if ( boneID > - 1 ) {
+
+        returnObject.containerBoneID = boneID;
+        returnObject.containerID = containerIndices[ containerIndicesIndex ].ID;
+        var model = rawModels[ returnObject.containerID.toString() ];
+        if ( 'PreRotation' in model.properties ) {
+
+          returnObject.preRotations = parseVector3( model.properties.PreRotation ).multiplyScalar( Math.PI / 180 );
+
+        }
+        break;
+
+      }
+
+    }
+
+    return returnObject;
+
+  }
+
+  /**
+   * @param {{id: number, subNodes: {KeyTime: {properties: {a: string}}, KeyValueFloat: {properties: {a: string}}, KeyAttrFlags: {properties: {a: string}}, KeyAttrDataFloat: {properties: {a: string}}}}} animationCurve
+   */
+  function parseAnimationCurve( animationCurve ) {
+
+    return {
+      version: null,
+      id: animationCurve.id,
+      internalID: animationCurve.id,
+      times: parseFloatArray( animationCurve.subNodes.KeyTime.properties.a ).map( convertFBXTimeToSeconds ),
+      values: parseFloatArray( animationCurve.subNodes.KeyValueFloat.properties.a ),
+
+      attrFlag: parseIntArray( animationCurve.subNodes.KeyAttrFlags.properties.a ),
+      attrData: parseFloatArray( animationCurve.subNodes.KeyAttrDataFloat.properties.a )
+    };
+
+  }
+
+  /**
+   * Sets the maxTimeStamp and minTimeStamp variables if it has timeStamps that are either larger or smaller
+   * than the max or min respectively.
+   * @param {{
+        T: {
+            id: number,
+            attr: string,
+            internalID: number,
+            attrX: boolean,
+            attrY: boolean,
+            attrZ: boolean,
+            containerBoneID: number,
+            containerID: number,
+            curves: {
+                x: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                y: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                z: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+            },
+        },
+        R: {
+            id: number,
+            attr: string,
+            internalID: number,
+            attrX: boolean,
+            attrY: boolean,
+            attrZ: boolean,
+            containerBoneID: number,
+            containerID: number,
+            curves: {
+                x: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                y: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                z: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+            },
+        },
+        S: {
+            id: number,
+            attr: string,
+            internalID: number,
+            attrX: boolean,
+            attrY: boolean,
+            attrZ: boolean,
+            containerBoneID: number,
+            containerID: number,
+            curves: {
+                x: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                y: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+                z: {
+                    version: any,
+                    id: number,
+                    internalID: number,
+                    times: number[],
+                    values: number[],
+                    attrFlag: number[],
+                    attrData: number[],
+                },
+            },
+        },
+    }} layer
+   */
+  function getCurveNodeMaxMinTimeStamps( layer, timestamps ) {
+
+    if ( layer.R ) {
+
+      getCurveMaxMinTimeStamp( layer.R.curves, timestamps );
+
+    }
+    if ( layer.S ) {
+
+      getCurveMaxMinTimeStamp( layer.S.curves, timestamps );
+
+    }
+    if ( layer.T ) {
+
+      getCurveMaxMinTimeStamp( layer.T.curves, timestamps );
+
+    }
+
+  }
+
+  /**
+   * Sets the maxTimeStamp and minTimeStamp if one of the curve's time stamps
+   * exceeds the maximum or minimum.
+   * @param {{
+        x: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+        },
+        y: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+        },
+        z: {
+            version: any,
+            id: number,
+            internalID: number,
+            times: number[],
+            values: number[],
+            attrFlag: number[],
+            attrData: number[],
+        }
+    }} curve
+   */
+  function getCurveMaxMinTimeStamp( curve, timestamps ) {
+
+    if ( curve.x ) {
+
+      getCurveAxisMaxMinTimeStamps( curve.x, timestamps );
+
+    }
+    if ( curve.y ) {
+
+      getCurveAxisMaxMinTimeStamps( curve.y, timestamps );
+
+    }
+    if ( curve.z ) {
+
+      getCurveAxisMaxMinTimeStamps( curve.z, timestamps );
+
+    }
+
+  }
+
+  /**
+   * Sets the maxTimeStamp and minTimeStamp if one of its timestamps exceeds the maximum or minimum.
+   * @param {{times: number[]}} axis
+   */
+  function getCurveAxisMaxMinTimeStamps( axis, timestamps ) {
+
+    timestamps.max = axis.times[ axis.times.length - 1 ] > timestamps.max ? axis.times[ axis.times.length - 1 ] : timestamps.max;
+    timestamps.min = axis.times[ 0 ] < timestamps.min ? axis.times[ 0 ] : timestamps.min;
+
+  }
+
+  /**
+   * @param {{
+    curves: Map<number, {
+      T: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+      R: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+      S: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+    }>;
+    layers: Map<number, {
+      T: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+      R: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+      S: {
+        id: number;
+        attr: string;
+        internalID: number;
+        attrX: boolean;
+        attrY: boolean;
+        attrZ: boolean;
+        containerBoneID: number;
+        containerID: number;
+        curves: {
+          x: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          y: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+          z: {
+            version: any;
+            id: number;
+            internalID: number;
+            times: number[];
+            values: number[];
+            attrFlag: number[];
+            attrData: number[];
+          };
+        };
+      };
+    }[]>;
+    stacks: Map<number, {
+      name: string;
+      layers: {
+        T: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        };
+        R: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        };
+        S: {
+          id: number;
+          attr: string;
+          internalID: number;
+          attrX: boolean;
+          attrY: boolean;
+          attrZ: boolean;
+          containerBoneID: number;
+          containerID: number;
+          curves: {
+            x: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            y: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+            z: {
+              version: any;
+              id: number;
+              internalID: number;
+              times: number[];
+              values: number[];
+              attrFlag: number[];
+              attrData: number[];
+            };
+          };
+        };
+      }[][];
+      length: number;
+      frames: number;
+    }>;
+    length: number;
+    fps: number;
+    frames: number;
+  }} animations,
+   * @param {{skeleton: { bones: THREE.Bone[]}}} group
+   */
+  function addAnimations( group, animations ) {
+
+    if ( group.animations === undefined ) {
+
+      group.animations = [];
+
+    }
+
+    var stacks = animations.stacks;
+
+    for ( var key in stacks ) {
+
+      var stack = stacks[ key ];
+
+      /**
+       * @type {{
+       * name: string,
+       * fps: number,
+       * length: number,
+       * hierarchy: Array.<{
+       *  parent: number,
+       *  name: string,
+       *  keys: Array.<{
+       *    time: number,
+       *    pos: Array.<number>,
+       *    rot: Array.<number>,
+       *    scl: Array.<number>
+       *  }>
+       * }>
+       * }}
+       */
+      var animationData = {
+        name: stack.name,
+        fps: 30,
+        length: stack.length,
+        hierarchy: []
+      };
+
+      var bones = group.skeleton.bones;
+
+      for ( var bonesIndex = 0, bonesLength = bones.length; bonesIndex < bonesLength; ++ bonesIndex ) {
+
+        var bone = bones[ bonesIndex ];
+
+        var name = bone.name.replace( /.*:/, '' );
+        var parentIndex = findIndex( bones, function ( parentBone ) {
+
+          return bone.parent === parentBone;
+
+        } );
+        animationData.hierarchy.push( { parent: parentIndex, name: name, keys: [] } );
+
+      }
+
+      for ( var frame = 0; frame <= stack.frames; frame ++ ) {
+
+        for ( var bonesIndex = 0, bonesLength = bones.length; bonesIndex < bonesLength; ++ bonesIndex ) {
+
+          var bone = bones[ bonesIndex ];
+          var boneIndex = bonesIndex;
+
+          var animationNode = stack.layers[ 0 ][ boneIndex ];
+
+          for ( var hierarchyIndex = 0, hierarchyLength = animationData.hierarchy.length; hierarchyIndex < hierarchyLength; ++ hierarchyIndex ) {
+
+            var node = animationData.hierarchy[ hierarchyIndex ];
+
+            if ( node.name === bone.name ) {
+
+              node.keys.push( generateKey( animations, animationNode, bone, frame ) );
+
+            }
+
+          }
+
+        }
+
+      }
+
+      group.animations.push( THREE.AnimationClip.parseAnimation( animationData, bones ) );
+
+    }
+
+  }
+
+  var euler = new THREE.Euler();
+  var quaternion = new THREE.Quaternion();
+
+  /**
+   * @param {THREE.Bone} bone
+   */
+  function generateKey( animations, animationNode, bone, frame ) {
+
+    var key = {
+      time: frame / animations.fps,
+      pos: bone.position.toArray(),
+      rot: bone.quaternion.toArray(),
+      scl: bone.scale.toArray()
+    };
+
+    if ( animationNode === undefined ) return key;
+
+    try {
+
+      if ( hasCurve( animationNode, 'T' ) && hasKeyOnFrame( animationNode.T, frame ) ) {
+
+        key.pos = [ animationNode.T.curves.x.values[ frame ], animationNode.T.curves.y.values[ frame ], animationNode.T.curves.z.values[ frame ] ];
+
+      }
+
+      if ( hasCurve( animationNode, 'R' ) && hasKeyOnFrame( animationNode.R, frame ) ) {
+
+        var rotationX = animationNode.R.curves.x.values[ frame ];
+        var rotationY = animationNode.R.curves.y.values[ frame ];
+        var rotationZ = animationNode.R.curves.z.values[ frame ];
+
+        quaternion.setFromEuler( euler.set( rotationX, rotationY, rotationZ, 'ZYX' ) );
+        key.rot = quaternion.toArray();
+
+      }
+
+      if ( hasCurve( animationNode, 'S' ) && hasKeyOnFrame( animationNode.S, frame ) ) {
+
+        key.scl = [ animationNode.S.curves.x.values[ frame ], animationNode.S.curves.y.values[ frame ], animationNode.S.curves.z.values[ frame ] ];
+
+      }
+
+    } catch ( error ) {
+
+      // Curve is not fully plotted.
+      console.log( 'THREE.FBXLoader: ', bone );
+      console.log( 'THREE.FBXLoader: ', error );
+
+    }
+
+    return key;
+
+  }
+
+  var AXES = [ 'x', 'y', 'z' ];
+
+  function hasCurve( animationNode, attribute ) {
+
+    if ( animationNode === undefined ) {
+
+      return false;
+
+    }
+
+    var attributeNode = animationNode[ attribute ];
+
+    if ( ! attributeNode ) {
+
+      return false;
+
+    }
+
+    return AXES.every( function ( key ) {
+
+      return attributeNode.curves[ key ] !== null;
+
+    } );
+
+  }
+
+  function hasKeyOnFrame( attributeNode, frame ) {
+
+    return AXES.every( function ( key ) {
+
+      return isKeyExistOnFrame( attributeNode.curves[ key ], frame );
+
+    } );
+
+  }
+
+  function isKeyExistOnFrame( curve, frame ) {
+
+    return curve.values[ frame ] !== undefined;
+
+  }
+
+  /**
+   * An instance of a Vertex with data for drawing vertices to the screen.
+   * @constructor
+   */
+  function Vertex() {
+
+    /**
+     * Position of the vertex.
+     * @type {THREE.Vector3}
+     */
+    this.position = new THREE.Vector3();
+
+    /**
+     * Normal of the vertex
+     * @type {THREE.Vector3}
+     */
+    this.normal = new THREE.Vector3();
+
+    /**
+     * UV coordinates of the vertex.
+     * @type {THREE.Vector2}
+     */
+    this.uv = new THREE.Vector2();
+
+    /**
+     * Color of the vertex
+     * @type {THREE.Vector3}
+     */
+    this.color = new THREE.Vector3();
+
+    /**
+     * Indices of the bones vertex is influenced by.
+     * @type {THREE.Vector4}
+     */
+    this.skinIndices = new THREE.Vector4( 0, 0, 0, 0 );
+
+    /**
+     * Weights that each bone influences the vertex.
+     * @type {THREE.Vector4}
+     */
+    this.skinWeights = new THREE.Vector4( 0, 0, 0, 0 );
+
+  }
+
+  Object.assign( Vertex.prototype, {
+
+    copy: function ( target ) {
+
+      var returnVar = target || new Vertex();
+
+      returnVar.position.copy( this.position );
+      returnVar.normal.copy( this.normal );
+      returnVar.uv.copy( this.uv );
+      returnVar.skinIndices.copy( this.skinIndices );
+      returnVar.skinWeights.copy( this.skinWeights );
+
+      return returnVar;
+
+    },
+
+    flattenToBuffers: function ( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer ) {
+
+      this.position.toArray( vertexBuffer, vertexBuffer.length );
+      this.normal.toArray( normalBuffer, normalBuffer.length );
+      this.uv.toArray( uvBuffer, uvBuffer.length );
+      this.color.toArray( colorBuffer, colorBuffer.length );
+      this.skinIndices.toArray( skinIndexBuffer, skinIndexBuffer.length );
+      this.skinWeights.toArray( skinWeightBuffer, skinWeightBuffer.length );
+
+    }
+
+  } );
+
+  /**
+   * @constructor
+   */
+  function Triangle() {
+
+    /**
+     * @type {{position: THREE.Vector3, normal: THREE.Vector3, uv: THREE.Vector2, skinIndices: THREE.Vector4, skinWeights: THREE.Vector4}[]}
+     */
+    this.vertices = [];
+
+  }
+
+  Object.assign( Triangle.prototype, {
+
+    copy: function ( target ) {
+
+      var returnVar = target || new Triangle();
+
+      for ( var i = 0; i < this.vertices.length; ++ i ) {
+
+         this.vertices[ i ].copy( returnVar.vertices[ i ] );
+
+      }
+
+      return returnVar;
+
+    },
+
+    flattenToBuffers: function ( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer ) {
+
+      var vertices = this.vertices;
+
+      for ( var i = 0, l = vertices.length; i < l; ++ i ) {
+
+        vertices[ i ].flattenToBuffers( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer );
+
+      }
+
+    }
+
+  } );
+
+  /**
+   * @constructor
+   */
+  function Face() {
+
+    /**
+     * @type {{vertices: {position: THREE.Vector3, normal: THREE.Vector3, uv: THREE.Vector2, skinIndices: THREE.Vector4, skinWeights: THREE.Vector4}[]}[]}
+     */
+    this.triangles = [];
+    this.materialIndex = 0;
+
+  }
+
+  Object.assign( Face.prototype, {
+
+    copy: function ( target ) {
+
+      var returnVar = target || new Face();
+
+      for ( var i = 0; i < this.triangles.length; ++ i ) {
+
+        this.triangles[ i ].copy( returnVar.triangles[ i ] );
+
+      }
+
+      returnVar.materialIndex = this.materialIndex;
+
+      return returnVar;
+
+    },
+
+    genTrianglesFromVertices: function ( vertexArray ) {
+
+      for ( var i = 2; i < vertexArray.length; ++ i ) {
+
+        var triangle = new Triangle();
+        triangle.vertices[ 0 ] = vertexArray[ 0 ];
+        triangle.vertices[ 1 ] = vertexArray[ i - 1 ];
+        triangle.vertices[ 2 ] = vertexArray[ i ];
+        this.triangles.push( triangle );
+
+      }
+
+    },
+
+    flattenToBuffers: function ( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer, materialIndexBuffer ) {
+
+      var triangles = this.triangles;
+      var materialIndex = this.materialIndex;
+
+      for ( var i = 0, l = triangles.length; i < l; ++ i ) {
+
+        triangles[ i ].flattenToBuffers( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer );
+        append( materialIndexBuffer, [ materialIndex, materialIndex, materialIndex ] );
+
+      }
+
+    }
+
+  } );
+
+  /**
+   * @constructor
+   */
+  function Geometry() {
+
+    /**
+     * @type {{triangles: {vertices: {position: THREE.Vector3, normal: THREE.Vector3, uv: THREE.Vector2, skinIndices: THREE.Vector4, skinWeights: THREE.Vector4}[]}[], materialIndex: number}[]}
+     */
+    this.faces = [];
+
+    /**
+     * @type {{}|THREE.Skeleton}
+     */
+    this.skeleton = null;
+
+  }
+
+  Object.assign( Geometry.prototype, {
+
+    /**
+     * @returns {{vertexBuffer: number[], normalBuffer: number[], uvBuffer: number[], skinIndexBuffer: number[], skinWeightBuffer: number[], materialIndexBuffer: number[]}}
+     */
+    flattenToBuffers: function () {
+
+      var vertexBuffer = [];
+      var normalBuffer = [];
+      var uvBuffer = [];
+      var colorBuffer = [];
+      var skinIndexBuffer = [];
+      var skinWeightBuffer = [];
+
+      var materialIndexBuffer = [];
+
+      var faces = this.faces;
+
+      for ( var i = 0, l = faces.length; i < l; ++ i ) {
+
+        faces[ i ].flattenToBuffers( vertexBuffer, normalBuffer, uvBuffer, colorBuffer, skinIndexBuffer, skinWeightBuffer, materialIndexBuffer );
+
+      }
+
+      return {
+        vertexBuffer: vertexBuffer,
+        normalBuffer: normalBuffer,
+        uvBuffer: uvBuffer,
+        colorBuffer: colorBuffer,
+        skinIndexBuffer: skinIndexBuffer,
+        skinWeightBuffer: skinWeightBuffer,
+        materialIndexBuffer: materialIndexBuffer
+      };
+
+    }
+
+  } );
+
+  function TextParser() {}
+
+  Object.assign( TextParser.prototype, {
+
+    getPrevNode: function () {
+
+      return this.nodeStack[ this.currentIndent - 2 ];
+
+    },
+
+    getCurrentNode: function () {
+
+      return this.nodeStack[ this.currentIndent - 1 ];
+
+    },
+
+    getCurrentProp: function () {
+
+      return this.currentProp;
+
+    },
+
+    pushStack: function ( node ) {
+
+      this.nodeStack.push( node );
+      this.currentIndent += 1;
+
+    },
+
+    popStack: function () {
+
+      this.nodeStack.pop();
+      this.currentIndent -= 1;
+
+    },
+
+    setCurrentProp: function ( val, name ) {
+
+      this.currentProp = val;
+      this.currentPropName = name;
+
+    },
+
+    // ----------parse ---------------------------------------------------
+    parse: function ( text ) {
+
+      this.currentIndent = 0;
+      this.allNodes = new FBXTree();
+      this.nodeStack = [];
+      this.currentProp = [];
+      this.currentPropName = '';
+
+      var split = text.split( '\n' );
+
+      for ( var lineNum = 0, lineLength = split.length; lineNum < lineLength; lineNum ++ ) {
+
+        var l = split[ lineNum ];
+
+        // skip comment line
+        if ( l.match( /^[\s\t]*;/ ) ) {
+
+          continue;
+
+        }
+
+        // skip empty line
+        if ( l.match( /^[\s\t]*$/ ) ) {
+
+          continue;
+
+        }
+
+        // beginning of node
+        var beginningOfNodeExp = new RegExp( '^\\t{' + this.currentIndent + '}(\\w+):(.*){', '' );
+        var match = l.match( beginningOfNodeExp );
+
+        if ( match ) {
+
+          var nodeName = match[ 1 ].trim().replace( /^"/, '' ).replace( /"$/, '' );
+          var nodeAttrs = match[ 2 ].split( ',' );
+
+          for ( var i = 0, l = nodeAttrs.length; i < l; i ++ ) {
+            nodeAttrs[ i ] = nodeAttrs[ i ].trim().replace( /^"/, '' ).replace( /"$/, '' );
+          }
+
+          this.parseNodeBegin( l, nodeName, nodeAttrs || null );
+          continue;
+
+        }
+
+        // node's property
+        var propExp = new RegExp( '^\\t{' + ( this.currentIndent ) + '}(\\w+):[\\s\\t\\r\\n](.*)' );
+        var match = l.match( propExp );
+
+        if ( match ) {
+
+          var propName = match[ 1 ].replace( /^"/, '' ).replace( /"$/, '' ).trim();
+          var propValue = match[ 2 ].replace( /^"/, '' ).replace( /"$/, '' ).trim();
+
+          // for special case: base64 image data follows "Content: ," line
+          //  Content: ,
+          //   "iVB..."
+          if ( propName === 'Content' && propValue === ',' ) {
+
+            propValue = split[ ++ lineNum ].replace( /"/g, '' ).trim();
+
+          }
+
+          this.parseNodeProperty( l, propName, propValue );
+          continue;
+
+        }
+
+        // end of node
+        var endOfNodeExp = new RegExp( '^\\t{' + ( this.currentIndent - 1 ) + '}}' );
+
+        if ( l.match( endOfNodeExp ) ) {
+
+          this.nodeEnd();
+          continue;
+
+        }
+
+        // for special case,
+        //
+        //    Vertices: *8670 {
+        //      a: 0.0356229953467846,13.9599733352661,-0.399196773.....(snip)
+        // -0.0612030513584614,13.960485458374,-0.409748703241348,-0.10.....
+        // 0.12490539252758,13.7450733184814,-0.454119384288788,0.09272.....
+        // 0.0836158767342567,13.5432004928589,-0.435397416353226,0.028.....
+        //
+        // these case the lines must contiue with previous line
+        if ( l.match( /^[^\s\t}]/ ) ) {
+
+          this.parseNodePropertyContinued( l );
+
+        }
+
+      }
+
+      return this.allNodes;
+
+    },
+
+    parseNodeBegin: function ( line, nodeName, nodeAttrs ) {
+
+      // var nodeName = match[1];
+      var node = { 'name': nodeName, properties: {}, 'subNodes': {} };
+      var attrs = this.parseNodeAttr( nodeAttrs );
+      var currentNode = this.getCurrentNode();
+
+      // a top node
+      if ( this.currentIndent === 0 ) {
+
+        this.allNodes.add( nodeName, node );
+
+      } else {
+
+        // a subnode
+
+        // already exists subnode, then append it
+        if ( nodeName in currentNode.subNodes ) {
+
+          var tmp = currentNode.subNodes[ nodeName ];
+
+          // console.log( "duped entry found\nkey: " + nodeName + "\nvalue: " + propValue );
+          if ( this.isFlattenNode( currentNode.subNodes[ nodeName ] ) ) {
+
+
+            if ( attrs.id === '' ) {
+
+              currentNode.subNodes[ nodeName ] = [];
+              currentNode.subNodes[ nodeName ].push( tmp );
+
+            } else {
+
+              currentNode.subNodes[ nodeName ] = {};
+              currentNode.subNodes[ nodeName ][ tmp.id ] = tmp;
+
+            }
+
+          }
+
+          if ( attrs.id === '' ) {
+
+            currentNode.subNodes[ nodeName ].push( node );
+
+          } else {
+
+            currentNode.subNodes[ nodeName ][ attrs.id ] = node;
+
+          }
+
+        } else if ( typeof attrs.id === 'number' || attrs.id.match( /^\d+$/ ) ) {
+
+          currentNode.subNodes[ nodeName ] = {};
+          currentNode.subNodes[ nodeName ][ attrs.id ] = node;
+
+        } else {
+
+          currentNode.subNodes[ nodeName ] = node;
+
+        }
+
+      }
+
+      // for this     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
+      // NodeAttribute: 1001463072, "NodeAttribute::", "LimbNode" {
+      if ( nodeAttrs ) {
+
+        node.id = attrs.id;
+        node.attrName = attrs.name;
+        node.attrType = attrs.type;
+
+      }
+
+      this.pushStack( node );
+
+    },
+
+    parseNodeAttr: function ( attrs ) {
+
+      var id = attrs[ 0 ];
+
+      if ( attrs[ 0 ] !== '' ) {
+
+        id = parseInt( attrs[ 0 ] );
+
+        if ( isNaN( id ) ) {
+
+          // PolygonVertexIndex: *16380 {
+          id = attrs[ 0 ];
+
+        }
+
+      }
+
+      var name = '', type = '';
+
+      if ( attrs.length > 1 ) {
+
+        name = attrs[ 1 ].replace( /^(\w+)::/, '' );
+        type = attrs[ 2 ];
+
+      }
+
+      return { id: id, name: name, type: type };
+
+    },
+
+    parseNodeProperty: function ( line, propName, propValue ) {
+
+      var currentNode = this.getCurrentNode();
+      var parentName = currentNode.name;
+
+      // special case parent node's is like "Properties70"
+      // these children nodes must treat with careful
+      if ( parentName !== undefined ) {
+
+        var propMatch = parentName.match( /Properties(\d)+/ );
+        if ( propMatch ) {
+
+          this.parseNodeSpecialProperty( line, propName, propValue );
+          return;
+
+        }
+
+      }
+
+      // special case Connections
+      if ( propName === 'C' ) {
+
+        var connProps = propValue.split( ',' ).slice( 1 );
+        var from = parseInt( connProps[ 0 ] );
+        var to = parseInt( connProps[ 1 ] );
+
+        var rest = propValue.split( ',' ).slice( 3 );
+
+        propName = 'connections';
+        propValue = [ from, to ];
+        append( propValue, rest );
+
+        if ( currentNode.properties[ propName ] === undefined ) {
+
+          currentNode.properties[ propName ] = [];
+
+        }
+
+      }
+
+      // special case Connections
+      if ( propName === 'Node' ) {
+
+        var id = parseInt( propValue );
+        currentNode.properties.id = id;
+        currentNode.id = id;
+
+      }
+
+      // already exists in properties, then append this
+      if ( propName in currentNode.properties ) {
+
+        // console.log( "duped entry found\nkey: " + propName + "\nvalue: " + propValue );
+        if ( Array.isArray( currentNode.properties[ propName ] ) ) {
+
+          currentNode.properties[ propName ].push( propValue );
+
+        } else {
+
+          currentNode.properties[ propName ] += propValue;
+
+        }
+
+      } else {
+
+        // console.log( propName + ":  " + propValue );
+        if ( Array.isArray( currentNode.properties[ propName ] ) ) {
+
+          currentNode.properties[ propName ].push( propValue );
+
+        } else {
+
+          currentNode.properties[ propName ] = propValue;
+
+        }
+
+      }
+
+      this.setCurrentProp( currentNode.properties, propName );
+
+    },
+
+    // TODO:
+    parseNodePropertyContinued: function ( line ) {
+
+      this.currentProp[ this.currentPropName ] += line;
+
+    },
+
+    parseNodeSpecialProperty: function ( line, propName, propValue ) {
+
+      // split this
+      // P: "Lcl Scaling", "Lcl Scaling", "", "A",1,1,1
+      // into array like below
+      // ["Lcl Scaling", "Lcl Scaling", "", "A", "1,1,1" ]
+      var props = propValue.split( '",' );
+
+      for ( var i = 0, l = props.length; i < l; i ++ ) {
+        props[ i ] = props[ i ].trim().replace( /^\"/, '' ).replace( /\s/, '_' );
+      }
+
+      var innerPropName = props[ 0 ];
+      var innerPropType1 = props[ 1 ];
+      var innerPropType2 = props[ 2 ];
+      var innerPropFlag = props[ 3 ];
+      var innerPropValue = props[ 4 ];
+
+      /*
+      if ( innerPropValue === undefined ) {
+        innerPropValue = props[3];
+      }
+      */
+
+      // cast value in its type
+      switch ( innerPropType1 ) {
+
+        case 'int':
+          innerPropValue = parseInt( innerPropValue );
+          break;
+
+        case 'double':
+          innerPropValue = parseFloat( innerPropValue );
+          break;
+
+        case 'ColorRGB':
+        case 'Vector3D':
+          innerPropValue = parseFloatArray( innerPropValue );
+          break;
+
+      }
+
+      // CAUTION: these props must append to parent's parent
+      this.getPrevNode().properties[ innerPropName ] = {
+
+        'type': innerPropType1,
+        'type2': innerPropType2,
+        'flag': innerPropFlag,
+        'value': innerPropValue
+
+      };
+
+      this.setCurrentProp( this.getPrevNode().properties, innerPropName );
+
+    },
+
+    nodeEnd: function () {
+
+      this.popStack();
+
+    },
+
+    /* ---------------------------------------------------------------- */
+    /*    util                            */
+    isFlattenNode: function ( node ) {
+
+      return ( 'subNodes' in node && 'properties' in node ) ? true : false;
+
+    }
+
+  } );
+
+  // Binary format specification:
+  //   https://code.blender.org/2013/08/fbx-binary-file-format-specification/
+  //   https://wiki.rogiken.org/specifications/file-format/fbx/ (more detail but Japanese)
+  function BinaryParser() {}
+
+  Object.assign( BinaryParser.prototype, {
+
+    /**
+     * Parses binary data and builds FBXTree as much compatible as possible with the one built by TextParser.
+     * @param {ArrayBuffer} buffer
+     * @returns {THREE.FBXTree}
+     */
+    parse: function ( buffer ) {
+
+      var reader = new BinaryReader( buffer );
+      reader.skip( 23 ); // skip magic 23 bytes
+
+      var version = reader.getUint32();
+
+      console.log( 'THREE.FBXLoader: FBX binary version: ' + version );
+
+      var allNodes = new FBXTree();
+
+      while ( ! this.endOfContent( reader ) ) {
+
+        var node = this.parseNode( reader, version );
+        if ( node !== null ) allNodes.add( node.name, node );
+
+      }
+
+      return allNodes;
+
+    },
+
+    /**
+     * Checks if reader has reached the end of content.
+     * @param {BinaryReader} reader
+     * @returns {boolean}
+     */
+    endOfContent: function( reader ) {
+
+      // footer size: 160bytes + 16-byte alignment padding
+      // - 16bytes: magic
+      // - padding til 16-byte alignment (at least 1byte?)
+      //   (seems like some exporters embed fixed 15 or 16bytes?)
+      // - 4bytes: magic
+      // - 4bytes: version
+      // - 120bytes: zero
+      // - 16bytes: magic
+      if ( reader.size() % 16 === 0 ) {
+
+        return ( ( reader.getOffset() + 160 + 16 ) & ~0xf ) >= reader.size();
+
+      } else {
+
+        return reader.getOffset() + 160 + 16 >= reader.size();
+
+      }
+
+    },
+
+    /**
+     * Parses Node as much compatible as possible with the one parsed by TextParser
+     * TODO: could be optimized more?
+     * @param {BinaryReader} reader
+     * @param {number} version
+     * @returns {Object} - Returns an Object as node, or null if NULL-record.
+     */
+    parseNode: function ( reader, version ) {
+
+      // The first three data sizes depends on version.
+      var endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
+      var numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
+      var propertyListLen = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();
+      var nameLen = reader.getUint8();
+      var name = reader.getString( nameLen );
+
+      // Regards this node as NULL-record if endOffset is zero
+      if ( endOffset === 0 ) return null;
+
+      var propertyList = [];
+
+      for ( var i = 0; i < numProperties; i ++ ) {
+
+        propertyList.push( this.parseProperty( reader ) );
+
+      }
+
+      // Regards the first three elements in propertyList as id, attrName, and attrType
+      var id = propertyList.length > 0 ? propertyList[ 0 ] : '';
+      var attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';
+      var attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';
+
+      var subNodes = {};
+      var properties = {};
+
+      var isSingleProperty = false;
+
+      // if this node represents just a single property
+      // like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}
+      if ( numProperties === 1 && reader.getOffset() === endOffset ) {
+
+        isSingleProperty = true;
+
+      }
+
+      while ( endOffset > reader.getOffset() ) {
+
+        var node = this.parseNode( reader, version );
+
+        if ( node === null ) continue;
+
+        // special case: child node is single property
+        if ( node.singleProperty === true ) {
+
+          var value = node.propertyList[ 0 ];
+
+          if ( Array.isArray( value ) ) {
+
+            // node represents
+            //  Vertices: *3 {
+            //    a: 0.01, 0.02, 0.03
+            //  }
+            // of text format here.
+
+            node.properties[ node.name ] = node.propertyList[ 0 ];
+            subNodes[ node.name ] = node;
+
+            // Later phase expects single property array is in node.properties.a as String.
+            // TODO: optimize
+            node.properties.a = value.toString();
+
+          } else {
+
+            // node represents
+            //  Version: 100
+            // of text format here.
+
+            properties[ node.name ] = value;
+
+          }
+
+          continue;
+
+        }
+
+        // special case: connections
+        if ( name === 'Connections' && node.name === 'C' ) {
+
+          var array = [];
+
+          // node.propertyList would be like
+          // ["OO", 111264976, 144038752, "d|x"] (?, from, to, additional values)
+          for ( var i = 1, il = node.propertyList.length; i < il; i ++ ) {
+
+            array[ i - 1 ] = node.propertyList[ i ];
+
+          }
+
+          if ( properties.connections === undefined ) {
+
+            properties.connections = [];
+
+          }
+
+          properties.connections.push( array );
+
+          continue;
+
+        }
+
+        // special case: child node is Properties\d+
+        if ( node.name.match( /^Properties\d+$/ ) ) {
+
+          // move child node's properties to this node.
+
+          var keys = Object.keys( node.properties );
+
+          for ( var i = 0, il = keys.length; i < il; i ++ ) {
+
+            var key = keys[ i ];
+            properties[ key ] = node.properties[ key ];
+
+          }
+
+          continue;
+
+        }
+
+        // special case: properties
+        if ( name.match( /^Properties\d+$/ ) && node.name === 'P' ) {
+
+          var innerPropName = node.propertyList[ 0 ];
+          var innerPropType1 = node.propertyList[ 1 ];
+          var innerPropType2 = node.propertyList[ 2 ];
+          var innerPropFlag = node.propertyList[ 3 ];
+          var innerPropValue;
+
+          if ( innerPropName.indexOf( 'Lcl ' ) === 0 ) innerPropName = innerPropName.replace( 'Lcl ', 'Lcl_' );
+          if ( innerPropType1.indexOf( 'Lcl ' ) === 0 ) innerPropType1 = innerPropType1.replace( 'Lcl ', 'Lcl_' );
+
+          if ( innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' ||
+             innerPropType1 === 'Vector3D' || innerPropType1.indexOf( 'Lcl_' ) === 0 ) {
+
+            innerPropValue = [
+              node.propertyList[ 4 ],
+              node.propertyList[ 5 ],
+              node.propertyList[ 6 ]
+            ];
+
+          } else {
+
+            innerPropValue = node.propertyList[ 4 ];
+
+          }
+
+          if ( innerPropType1.indexOf( 'Lcl_' ) === 0 ) {
+
+            innerPropValue = innerPropValue.toString();
+
+          }
+
+          // this will be copied to parent. see above.
+          properties[ innerPropName ] = {
+
+            'type': innerPropType1,
+            'type2': innerPropType2,
+            'flag': innerPropFlag,
+            'value': innerPropValue
+
+          };
+
+          continue;
+
+        }
+
+        // standard case
+        // follows TextParser's manner.
+        if ( subNodes[ node.name ] === undefined ) {
+
+          if ( typeof node.id === 'number' ) {
+
+            subNodes[ node.name ] = {};
+            subNodes[ node.name ][ node.id ] = node;
+
+          } else {
+
+            subNodes[ node.name ] = node;
+
+          }
+
+        } else {
+
+          if ( node.id === '' ) {
+
+            if ( ! Array.isArray( subNodes[ node.name ] ) ) {
+
+              subNodes[ node.name ] = [ subNodes[ node.name ] ];
+
+            }
+
+            subNodes[ node.name ].push( node );
+
+          } else {
+
+            if ( subNodes[ node.name ][ node.id ] === undefined ) {
+
+              subNodes[ node.name ][ node.id ] = node;
+
+            } else {
+
+              // conflict id. irregular?
+
+              if ( ! Array.isArray( subNodes[ node.name ][ node.id ] ) ) {
+
+                subNodes[ node.name ][ node.id ] = [ subNodes[ node.name ][ node.id ] ];
+
+              }
+
+              subNodes[ node.name ][ node.id ].push( node );
+
+            }
+
+          }
+
+        }
+
+      }
+
+      return {
+
+        singleProperty: isSingleProperty,
+        id: id,
+        attrName: attrName,
+        attrType: attrType,
+        name: name,
+        properties: properties,
+        propertyList: propertyList, // raw property list, would be used by parent
+        subNodes: subNodes
+
+      };
+
+    },
+
+    parseProperty: function ( reader ) {
+
+      var type = reader.getChar();
+
+      switch ( type ) {
+
+        case 'F':
+          return reader.getFloat32();
+
+        case 'D':
+          return reader.getFloat64();
+
+        case 'L':
+          return reader.getInt64();
+
+        case 'I':
+          return reader.getInt32();
+
+        case 'Y':
+          return reader.getInt16();
+
+        case 'C':
+          return reader.getBoolean();
+
+        case 'f':
+        case 'd':
+        case 'l':
+        case 'i':
+        case 'b':
+
+          var arrayLength = reader.getUint32();
+          var encoding = reader.getUint32(); // 0: non-compressed, 1: compressed
+          var compressedLength = reader.getUint32();
+
+          if ( encoding === 0 ) {
+
+            switch ( type ) {
+
+              case 'f':
+                return reader.getFloat32Array( arrayLength );
+
+              case 'd':
+                return reader.getFloat64Array( arrayLength );
+
+              case 'l':
+                return reader.getInt64Array( arrayLength );
+
+              case 'i':
+                return reader.getInt32Array( arrayLength );
+
+              case 'b':
+                return reader.getBooleanArray( arrayLength );
+
+            }
+
+          }
+
+          if ( window.Zlib === undefined ) {
+
+            throw new Error( 'THREE.FBXLoader: External library Inflate.min.js required, obtain or import from https://github.com/imaya/zlib.js' );
+
+          }
+
+          var inflate = new Zlib.Inflate( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );
+          var reader2 = new BinaryReader( inflate.decompress().buffer );
+
+          switch ( type ) {
+
+            case 'f':
+              return reader2.getFloat32Array( arrayLength );
+
+            case 'd':
+              return reader2.getFloat64Array( arrayLength );
+
+            case 'l':
+              return reader2.getInt64Array( arrayLength );
+
+            case 'i':
+              return reader2.getInt32Array( arrayLength );
+
+            case 'b':
+              return reader2.getBooleanArray( arrayLength );
+
+          }
+
+        case 'S':
+          var length = reader.getUint32();
+          return reader.getString( length );
+
+        case 'R':
+          var length = reader.getUint32();
+          return reader.getArrayBuffer( length );
+
+        default:
+          throw new Error( 'THREE.FBXLoader: Unknown property type ' + type );
+
+      }
+
+    }
+
+  } );
+
+
+  function BinaryReader( buffer, littleEndian ) {
+
+    this.dv = new DataView( buffer );
+    this.offset = 0;
+    this.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;
+
+  }
+
+  Object.assign( BinaryReader.prototype, {
+
+    getOffset: function () {
+
+      return this.offset;
+
+    },
+
+    size: function () {
+
+      return this.dv.buffer.byteLength;
+
+    },
+
+    skip: function ( length ) {
+
+      this.offset += length;
+
+    },
+
+    // seems like true/false representation depends on exporter.
+    //   true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)
+    // then sees LSB.
+    getBoolean: function () {
+
+      return ( this.getUint8() & 1 ) === 1;
+
+    },
+
+    getBooleanArray: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getBoolean() );
+
+      }
+
+      return a;
+
+    },
+
+    getInt8: function () {
+
+      var value = this.dv.getInt8( this.offset );
+      this.offset += 1;
+      return value;
+
+    },
+
+    getInt8Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getInt8() );
+
+      }
+
+      return a;
+
+    },
+
+    getUint8: function () {
+
+      var value = this.dv.getUint8( this.offset );
+      this.offset += 1;
+      return value;
+
+    },
+
+    getUint8Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getUint8() );
+
+      }
+
+      return a;
+
+    },
+
+    getInt16: function () {
+
+      var value = this.dv.getInt16( this.offset, this.littleEndian );
+      this.offset += 2;
+      return value;
+
+    },
+
+    getInt16Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getInt16() );
+
+      }
+
+      return a;
+
+    },
+
+    getUint16: function () {
+
+      var value = this.dv.getUint16( this.offset, this.littleEndian );
+      this.offset += 2;
+      return value;
+
+    },
+
+    getUint16Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getUint16() );
+
+      }
+
+      return a;
+
+    },
+
+    getInt32: function () {
+
+      var value = this.dv.getInt32( this.offset, this.littleEndian );
+      this.offset += 4;
+      return value;
+
+    },
+
+    getInt32Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getInt32() );
+
+      }
+
+      return a;
+
+    },
+
+    getUint32: function () {
+
+      var value = this.dv.getUint32( this.offset, this.littleEndian );
+      this.offset += 4;
+      return value;
+
+    },
+
+    getUint32Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getUint32() );
+
+      }
+
+      return a;
+
+    },
+
+    // JavaScript doesn't support 64-bit integer so attempting to calculate by ourselves.
+    // 1 << 32 will return 1 so using multiply operation instead here.
+    // There'd be a possibility that this method returns wrong value if the value
+    // is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.
+    // TODO: safely handle 64-bit integer
+    getInt64: function () {
+
+      var low, high;
+
+      if ( this.littleEndian ) {
+
+        low = this.getUint32();
+        high = this.getUint32();
+
+      } else {
+
+        high = this.getUint32();
+        low = this.getUint32();
+
+      }
+
+      // calculate negative value
+      if ( high & 0x80000000 ) {
+
+        high = ~high & 0xFFFFFFFF;
+        low = ~low & 0xFFFFFFFF;
+
+        if ( low === 0xFFFFFFFF ) high = ( high + 1 ) & 0xFFFFFFFF;
+
+        low = ( low + 1 ) & 0xFFFFFFFF;
+
+        return - ( high * 0x100000000 + low );
+
+      }
+
+      return high * 0x100000000 + low;
+
+    },
+
+    getInt64Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getInt64() );
+
+      }
+
+      return a;
+
+    },
+
+    // Note: see getInt64() comment
+    getUint64: function () {
+
+      var low, high;
+
+      if ( this.littleEndian ) {
+
+        low = this.getUint32();
+        high = this.getUint32();
+
+      } else {
+
+        high = this.getUint32();
+        low = this.getUint32();
+
+      }
+
+      return high * 0x100000000 + low;
+
+    },
+
+    getUint64Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getUint64() );
+
+      }
+
+      return a;
+
+    },
+
+    getFloat32: function () {
+
+      var value = this.dv.getFloat32( this.offset, this.littleEndian );
+      this.offset += 4;
+      return value;
+
+    },
+
+    getFloat32Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getFloat32() );
+
+      }
+
+      return a;
+
+    },
+
+    getFloat64: function () {
+
+      var value = this.dv.getFloat64( this.offset, this.littleEndian );
+      this.offset += 8;
+      return value;
+
+    },
+
+    getFloat64Array: function ( size ) {
+
+      var a = [];
+
+      for ( var i = 0; i < size; i ++ ) {
+
+        a.push( this.getFloat64() );
+
+      }
+
+      return a;
+
+    },
+
+    getArrayBuffer: function ( size ) {
+
+      var value = this.dv.buffer.slice( this.offset, this.offset + size );
+      this.offset += size;
+      return value;
+
+    },
+
+    getChar: function () {
+
+      return String.fromCharCode( this.getUint8() );
+
+    },
+
+    getString: function ( size ) {
+
+      var s = '';
+
+      while ( size > 0 ) {
+
+        var value = this.getUint8();
+        size--;
+
+        if ( value === 0 ) break;
+
+        s += String.fromCharCode( value );
+
+      }
+
+      this.skip( size );
+
+      return s;
+
+    }
+
+  } );
+
+
+  function FBXTree() {}
+
+  Object.assign( FBXTree.prototype, {
+
+    add: function ( key, val ) {
+
+      this[ key ] = val;
+
+    },
+
+    searchConnectionParent: function ( id ) {
+
+      if ( this.__cache_search_connection_parent === undefined ) {
+
+        this.__cache_search_connection_parent = [];
+
+      }
+
+      if ( this.__cache_search_connection_parent[ id ] !== undefined ) {
+
+        return this.__cache_search_connection_parent[ id ];
+
+      } else {
+
+        this.__cache_search_connection_parent[ id ] = [];
+
+      }
+
+      var conns = this.Connections.properties.connections;
+
+      var results = [];
+      for ( var i = 0; i < conns.length; ++ i ) {
+
+        if ( conns[ i ][ 0 ] == id ) {
+
+          // 0 means scene root
+          var res = conns[ i ][ 1 ] === 0 ? - 1 : conns[ i ][ 1 ];
+          results.push( res );
+
+        }
+
+      }
+
+      if ( results.length > 0 ) {
+
+        append( this.__cache_search_connection_parent[ id ], results );
+        return results;
+
+      } else {
+
+        this.__cache_search_connection_parent[ id ] = [ - 1 ];
+        return [ - 1 ];
+
+      }
+
+    },
+
+    searchConnectionChildren: function ( id ) {
+
+      if ( this.__cache_search_connection_children === undefined ) {
+
+        this.__cache_search_connection_children = [];
+
+      }
+
+      if ( this.__cache_search_connection_children[ id ] !== undefined ) {
+
+        return this.__cache_search_connection_children[ id ];
+
+      } else {
+
+        this.__cache_search_connection_children[ id ] = [];
+
+      }
+
+      var conns = this.Connections.properties.connections;
+
+      var res = [];
+      for ( var i = 0; i < conns.length; ++ i ) {
+
+        if ( conns[ i ][ 1 ] == id ) {
+
+          // 0 means scene root
+          res.push( conns[ i ][ 0 ] === 0 ? - 1 : conns[ i ][ 0 ] );
+          // there may more than one kid, then search to the end
+
+        }
+
+      }
+
+      if ( res.length > 0 ) {
+
+        append( this.__cache_search_connection_children[ id ], res );
+        return res;
+
+      } else {
+
+        this.__cache_search_connection_children[ id ] = [ ];
+        return [ ];
+
+      }
+
+    },
+
+    searchConnectionType: function ( id, to ) {
+
+      var key = id + ',' + to; // TODO: to hash
+      if ( this.__cache_search_connection_type === undefined ) {
+
+        this.__cache_search_connection_type = {};
+
+      }
+
+      if ( this.__cache_search_connection_type[ key ] !== undefined ) {
+
+        return this.__cache_search_connection_type[ key ];
+
+      } else {
+
+        this.__cache_search_connection_type[ key ] = '';
+
+      }
+
+      var conns = this.Connections.properties.connections;
+
+      for ( var i = 0; i < conns.length; ++ i ) {
+
+        if ( conns[ i ][ 0 ] == id && conns[ i ][ 1 ] == to ) {
+
+          // 0 means scene root
+          this.__cache_search_connection_type[ key ] = conns[ i ][ 2 ];
+          return conns[ i ][ 2 ];
+
+        }
+
+      }
+
+      this.__cache_search_connection_type[ id ] = null;
+      return null;
+
+    }
+
+  } );
+
+
+  /**
+   * @param {ArrayBuffer} buffer
+   * @returns {boolean}
+   */
+  function isFbxFormatBinary( buffer ) {
+
+    var CORRECT = 'Kaydara FBX Binary  \0';
+
+    return buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString( buffer, 0, CORRECT.length );
+
+  }
+
+  /**
+   * @returns {boolean}
+   */
+  function isFbxFormatASCII( text ) {
+
+    var CORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\', 'F', 'B', 'X', '\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\', '\\' ];
+
+    var cursor = 0;
+
+    function read( offset ) {
+
+      var result = text[ offset - 1 ];
+      text = text.slice( cursor + offset );
+      cursor ++;
+      return result;
+
+    }
+
+    for ( var i = 0; i < CORRECT.length; ++ i ) {
+
+      var num = read( 1 );
+      if ( num === CORRECT[ i ] ) {
+
+        return false;
+
+      }
+
+    }
+
+    return true;
+
+  }
+
+  /**
+   * @returns {number}
+   */
+  function getFbxVersion( text ) {
+
+    var versionRegExp = /FBXVersion: (\d+)/;
+    var match = text.match( versionRegExp );
+    if ( match ) {
+
+      var version = parseInt( match[ 1 ] );
+      return version;
+
+    }
+    throw new Error( 'THREE.FBXLoader: Cannot find the version number for the file given.' );
+
+  }
+
+  /**
+   * Converts FBX ticks into real time seconds.
+   * @param {number} time - FBX tick timestamp to convert.
+   * @returns {number} - FBX tick in real world time.
+   */
+  function convertFBXTimeToSeconds( time ) {
+
+    // Constant is FBX ticks per second.
+    return time / 46186158000;
+
+  }
+
+  /**
+   * Parses comma separated list of float numbers and returns them in an array.
+   * @example
+   * // Returns [ 5.6, 9.4, 2.5, 1.4 ]
+   * parseFloatArray( "5.6,9.4,2.5,1.4" )
+   * @returns {number[]}
+   */
+  function parseFloatArray( string ) {
+
+    var array = string.split( ',' );
+
+    for ( var i = 0, l = array.length; i < l; i ++ ) {
+
+      array[ i ] = parseFloat( array[ i ] );
+
+    }
+
+    return array;
+
+  }
+
+  /**
+   * Parses comma separated list of int numbers and returns them in an array.
+   * @example
+   * // Returns [ 5, 8, 2, 3 ]
+   * parseFloatArray( "5,8,2,3" )
+   * @returns {number[]}
+   */
+  function parseIntArray( string ) {
+
+    var array = string.split( ',' );
+
+    for ( var i = 0, l = array.length; i < l; i ++ ) {
+
+      array[ i ] = parseInt( array[ i ] );
+
+    }
+
+    return array;
+
+  }
+
+  /**
+   * Parses Vector3 property from FBXTree.  Property is given as .value.x, .value.y, etc.
+   * @param {FBXVector3} property - Property to parse as Vector3.
+   * @returns {THREE.Vector3}
+   */
+  function parseVector3( property ) {
+
+    return new THREE.Vector3().fromArray( property.value );
+
+  }
+
+  /**
+   * Parses Color property from FBXTree.  Property is given as .value.x, .value.y, etc.
+   * @param {FBXVector3} property - Property to parse as Color.
+   * @returns {THREE.Color}
+   */
+  function parseColor( property ) {
+
+    return new THREE.Color().fromArray( property.value );
+
+  }
+
+  function parseMatrixArray( floatString ) {
+
+    return new THREE.Matrix4().fromArray( parseFloatArray( floatString ) );
+
+  }
+
+  /**
+   * Converts ArrayBuffer to String.
+   * @param {ArrayBuffer} buffer
+   * @param {number} from
+   * @param {number} to
+   * @returns {String}
+   */
+  function convertArrayBufferToString( buffer, from, to ) {
+
+    if ( from === undefined ) from = 0;
+    if ( to === undefined ) to = buffer.byteLength;
+
+    var array = new Uint8Array( buffer, from, to );
+
+    if ( window.TextDecoder !== undefined ) {
+
+      return new TextDecoder().decode( array );
+
+    }
+
+    var s = '';
+
+    for ( var i = 0, il = array.length; i < il; i ++ ) {
+
+      s += String.fromCharCode( array[ i ] );
+
+    }
+
+    return s;
+
+  }
+
+  /**
+   * Converts number from degrees into radians.
+   * @param {number} value
+   * @returns {number}
+   */
+  function degreeToRadian( value ) {
+
+    return value * DEG2RAD;
+
+  }
+
+  var DEG2RAD = Math.PI / 180;
+
+  //
+
+  function findIndex( array, func ) {
+
+    for ( var i = 0, l = array.length; i < l; i ++ ) {
+
+      if ( func( array[ i ] ) ) return i;
+
+    }
+
+    return -1;
+
+  }
+
+  function append( a, b ) {
+
+    for ( var i = 0, j = a.length, l = b.length; i < l; i ++, j ++ ) {
+
+      a[ j ] = b[ i ];
+
+    }
+
+  }
+
+  function slice( a, b, from, to ) {
+
+    for ( var i = from, j = 0; i < to; i ++, j ++ ) {
+
+      a[ j ] = b[ i ];
+
+    }
+
+    return a;
+
+  }
+
+} )();
+
+},{}],3:[function(require,module,exports){
+/**
+ * @author Wei Meng / http://about.me/menway
+ *
+ * Description: A THREE loader for PLY ASCII files (known as the Polygon File Format or the Stanford Triangle Format).
+ *
+ *
+ * Limitations: ASCII decoding assumes file is UTF-8.
+ *
+ * Usage:
+ *  var loader = new THREE.PLYLoader();
+ *  loader.load('./models/ply/ascii/dolphins.ply', function (geometry) {
+ *
+ *    scene.add( new THREE.Mesh( geometry ) );
+ *
+ *  } );
+ *
+ * If the PLY file uses non standard property names, they can be mapped while
+ * loading. For example, the following maps the properties
+ * “diffuse_(red|green|blue)” in the file to standard color names.
+ *
+ * loader.setPropertyNameMapping( {
+ *  diffuse_red: 'red',
+ *  diffuse_green: 'green',
+ *  diffuse_blue: 'blue'
+ * } );
+ *
+ */
+
+module.exports = THREE.PLYLoader = function ( manager ) {
+
+  this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
+
+  this.propertyNameMapping = {};
+
+};
+
+THREE.PLYLoader.prototype = {
+
+  constructor: THREE.PLYLoader,
+
+  load: function ( url, onLoad, onProgress, onError ) {
+
+    var scope = this;
+
+    var loader = new THREE.XHRLoader( this.manager );
+    loader.setResponseType( 'arraybuffer' );
+    loader.load( url, function ( text ) {
+
+      onLoad( scope.parse( text ) );
+
+    }, onProgress, onError );
+
+  },
+
+  setPropertyNameMapping: function ( mapping ) {
+
+    this.propertyNameMapping = mapping;
+
+  },
+
+  bin2str: function ( buf ) {
+
+    var array_buffer = new Uint8Array( buf );
+    var str = '';
+    for ( var i = 0; i < buf.byteLength; i ++ ) {
+
+      str += String.fromCharCode( array_buffer[ i ] ); // implicitly assumes little-endian
+
+    }
+
+    return str;
+
+  },
+
+  isASCII: function( data ) {
+
+    var header = this.parseHeader( this.bin2str( data ) );
+
+    return header.format === "ascii";
+
+  },
+
+  parse: function ( data ) {
+
+    if ( data instanceof ArrayBuffer ) {
+
+      return this.isASCII( data )
+        ? this.parseASCII( this.bin2str( data ) )
+        : this.parseBinary( data );
+
+    } else {
+
+      return this.parseASCII( data );
+
+    }
+
+  },
+
+  parseHeader: function ( data ) {
+
+    var patternHeader = /ply([\s\S]*)end_header\s/;
+    var headerText = "";
+    var headerLength = 0;
+    var result = patternHeader.exec( data );
+    if ( result !== null ) {
+
+      headerText = result [ 1 ];
+      headerLength = result[ 0 ].length;
+
+    }
+
+    var header = {
+      comments: [],
+      elements: [],
+      headerLength: headerLength
+    };
+
+    var lines = headerText.split( '\n' );
+    var currentElement = undefined;
+    var lineType, lineValues;
+
+    function make_ply_element_property( propertValues, propertyNameMapping ) {
+
+      var property = {
+        type: propertValues[ 0 ]
+      };
+
+      if ( property.type === 'list' ) {
+
+        property.name = propertValues[ 3 ];
+        property.countType = propertValues[ 1 ];
+        property.itemType = propertValues[ 2 ];
+
+      } else {
+
+        property.name = propertValues[ 1 ];
+
+      }
+
+      if ( property.name in propertyNameMapping ) {
+
+        property.name = propertyNameMapping[ property.name ];
+
+      }
+
+      return property;
+
+    }
+
+    for ( var i = 0; i < lines.length; i ++ ) {
+
+      var line = lines[ i ];
+      line = line.trim();
+      if ( line === "" ) {
+
+        continue;
+
+      }
+      lineValues = line.split( /\s+/ );
+      lineType = lineValues.shift();
+      line = lineValues.join( " " );
+
+      switch ( lineType ) {
+
+      case "format":
+
+        header.format = lineValues[ 0 ];
+        header.version = lineValues[ 1 ];
+
+        break;
+
+      case "comment":
+
+        header.comments.push( line );
+
+        break;
+
+      case "element":
+
+        if ( ! ( currentElement === undefined ) ) {
+
+          header.elements.push( currentElement );
+
+        }
+
+        currentElement = Object();
+        currentElement.name = lineValues[ 0 ];
+        currentElement.count = parseInt( lineValues[ 1 ] );
+        currentElement.properties = [];
+
+        break;
+
+      case "property":
+
+        currentElement.properties.push( make_ply_element_property( lineValues, this.propertyNameMapping ) );
+
+        break;
+
+
+      default:
+
+        console.log( "unhandled", lineType, lineValues );
+
+      }
+
+    }
+
+    if ( ! ( currentElement === undefined ) ) {
+
+      header.elements.push( currentElement );
+
+    }
+
+    return header;
+
+  },
+
+  parseASCIINumber: function ( n, type ) {
+
+    switch ( type ) {
+
+    case 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':
+    case 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':
+
+      return parseInt( n );
+
+    case 'float': case 'double': case 'float32': case 'float64':
+
+      return parseFloat( n );
+
+    }
+
+  },
+
+  parseASCIIElement: function ( properties, line ) {
+
+    var values = line.split( /\s+/ );
+
+    var element = Object();
+
+    for ( var i = 0; i < properties.length; i ++ ) {
+
+      if ( properties[ i ].type === "list" ) {
+
+        var list = [];
+        var n = this.parseASCIINumber( values.shift(), properties[ i ].countType );
+
+        for ( var j = 0; j < n; j ++ ) {
+
+          list.push( this.parseASCIINumber( values.shift(), properties[ i ].itemType ) );
+
+        }
+
+        element[ properties[ i ].name ] = list;
+
+      } else {
+
+        element[ properties[ i ].name ] = this.parseASCIINumber( values.shift(), properties[ i ].type );
+
+      }
+
+    }
+
+    return element;
+
+  },
+
+  parseASCII: function ( data ) {
+
+    // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
+
+    var geometry = new THREE.Geometry();
+
+    var result;
+
+    var header = this.parseHeader( data );
+
+    var patternBody = /end_header\s([\s\S]*)$/;
+    var body = "";
+    if ( ( result = patternBody.exec( data ) ) !== null ) {
+
+      body = result [ 1 ];
+
+    }
+
+    var lines = body.split( '\n' );
+    var currentElement = 0;
+    var currentElementCount = 0;
+    geometry.useColor = false;
+
+    for ( var i = 0; i < lines.length; i ++ ) {
+
+      var line = lines[ i ];
+      line = line.trim();
+      if ( line === "" ) {
+
+        continue;
+
+      }
+
+      if ( currentElementCount >= header.elements[ currentElement ].count ) {
+
+        currentElement ++;
+        currentElementCount = 0;
+
+      }
+
+      var element = this.parseASCIIElement( header.elements[ currentElement ].properties, line );
+
+      this.handleElement( geometry, header.elements[ currentElement ].name, element );
+
+      currentElementCount ++;
+
+    }
+
+    return this.postProcess( geometry );
+
+  },
+
+  postProcess: function ( geometry ) {
+
+    if ( geometry.useColor ) {
+
+      for ( var i = 0; i < geometry.faces.length; i ++ ) {
+
+        geometry.faces[ i ].vertexColors = [
+          geometry.colors[ geometry.faces[ i ].a ],
+          geometry.colors[ geometry.faces[ i ].b ],
+          geometry.colors[ geometry.faces[ i ].c ]
+        ];
+
+      }
+
+      geometry.elementsNeedUpdate = true;
+
+    }
+
+    geometry.computeBoundingSphere();
+
+    return geometry;
+
+  },
+
+  handleElement: function ( geometry, elementName, element ) {
+
+    if ( elementName === "vertex" ) {
+
+      geometry.vertices.push(
+        new THREE.Vector3( element.x, element.y, element.z )
+      );
+
+      if ( 'red' in element && 'green' in element && 'blue' in element ) {
+
+        geometry.useColor = true;
+
+        var color = new THREE.Color();
+        color.setRGB( element.red / 255.0, element.green / 255.0, element.blue / 255.0 );
+        geometry.colors.push( color );
+
+      }
+
+    } else if ( elementName === "face" ) {
+
+      // BEGIN: Edits by donmccurdy.
+      var vertex_indices = element.vertex_indices || element.vertex_index;
+      // END: Edits by donmccurdy.
+
+      if ( vertex_indices.length === 3 ) {
+
+        geometry.faces.push(
+          new THREE.Face3( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] )
+        );
+
+      } else if ( vertex_indices.length === 4 ) {
+
+        geometry.faces.push(
+          new THREE.Face3( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] ),
+          new THREE.Face3( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] )
+        );
+
+      }
+
+    }
+
+  },
+
+  binaryRead: function ( dataview, at, type, little_endian ) {
+
+    switch ( type ) {
+
+      // corespondences for non-specific length types here match rply:
+    case 'int8':    case 'char':   return [ dataview.getInt8( at ), 1 ];
+
+    case 'uint8':   case 'uchar':  return [ dataview.getUint8( at ), 1 ];
+
+    case 'int16':   case 'short':  return [ dataview.getInt16( at, little_endian ), 2 ];
+
+    case 'uint16':  case 'ushort': return [ dataview.getUint16( at, little_endian ), 2 ];
+
+    case 'int32':   case 'int':    return [ dataview.getInt32( at, little_endian ), 4 ];
+
+    case 'uint32':  case 'uint':   return [ dataview.getUint32( at, little_endian ), 4 ];
+
+    case 'float32': case 'float':  return [ dataview.getFloat32( at, little_endian ), 4 ];
+
+    case 'float64': case 'double': return [ dataview.getFloat64( at, little_endian ), 8 ];
+
+    }
+
+  },
+
+  binaryReadElement: function ( dataview, at, properties, little_endian ) {
+
+    var element = Object();
+    var result, read = 0;
+
+    for ( var i = 0; i < properties.length; i ++ ) {
+
+      if ( properties[ i ].type === "list" ) {
+
+        var list = [];
+
+        result = this.binaryRead( dataview, at + read, properties[ i ].countType, little_endian );
+        var n = result[ 0 ];
+        read += result[ 1 ];
+
+        for ( var j = 0; j < n; j ++ ) {
+
+          result = this.binaryRead( dataview, at + read, properties[ i ].itemType, little_endian );
+          list.push( result[ 0 ] );
+          read += result[ 1 ];
+
+        }
+
+        element[ properties[ i ].name ] = list;
+
+      } else {
+
+        result = this.binaryRead( dataview, at + read, properties[ i ].type, little_endian );
+        element[ properties[ i ].name ] = result[ 0 ];
+        read += result[ 1 ];
+
+      }
+
+    }
+
+    return [ element, read ];
+
+  },
+
+  parseBinary: function ( data ) {
+
+    var geometry = new THREE.Geometry();
+
+    var header = this.parseHeader( this.bin2str( data ) );
+    var little_endian = ( header.format === "binary_little_endian" );
+    var body = new DataView( data, header.headerLength );
+    var result, loc = 0;
+
+    for ( var currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {
+
+      for ( var currentElementCount = 0; currentElementCount < header.elements[ currentElement ].count; currentElementCount ++ ) {
+
+        result = this.binaryReadElement( body, loc, header.elements[ currentElement ].properties, little_endian );
+        loc += result[ 1 ];
+        var element = result[ 0 ];
+
+        this.handleElement( geometry, header.elements[ currentElement ].name, element );
+
+      }
+
+    }
+
+    return this.postProcess( geometry );
+
+  }
+
+};
+
+},{}],4:[function(require,module,exports){
+/**
+ * Source: https://github.com/Adobe-Marketing-Cloud/fetch-script
+ */
+
+function getScriptId() {
+  return 'script_' + Date.now() + '_' + Math.ceil(Math.random() * 100000);
+}
+
+function createScript(url, id) {
+  var script = document.createElement('script');
+  script.type = 'text/javascript';
+  script.async = true;
+  script.id = id;
+  script.src = url;
+
+  return script;
+}
+
+function removeScript(id) {
+  const script = document.getElementById(id);
+  const parent = script.parentNode;
+
+  try {
+    parent && parent.removeChild(script);
+  } catch (e) {
+    // ignore
+  }
+}
+
+function appendScript(script) {
+  const firstScript = document.getElementsByTagName('script')[0];
+  firstScript.parentNode.insertBefore(script, firstScript);
+}
+
+function fetchScriptInternal(url, options, Promise) {
+  return new Promise(function(resolve, reject) {
+    const timeout = options.timeout || 5000;
+    const scriptId = getScriptId();
+    const script = createScript(url, scriptId);
+
+    const timeoutId = setTimeout(function() {
+      reject(new Error('Script request to ' + url + ' timed out'));
+
+      removeScript(scriptId);
+    }, timeout);
+
+    const disableTimeout = function(timeoutId) { clearTimeout(timeoutId); };
+
+    script.addEventListener('load', function(e) {
+      resolve({ok: true});
+
+      disableTimeout(timeoutId);
+      removeScript(scriptId);
+    });
+
+    script.addEventListener('error', function(e) {
+      reject(new Error('Script request to ' + url + ' failed ' + e));
+
+      disableTimeout(timeoutId);
+      removeScript(scriptId);
+    });
+
+    appendScript(script);
+  });
+}
+
+function fetchScript(settings) {
+  settings = settings || {};
+  return function (url, options) {
+    options = options || {};
+    return fetchScriptInternal(url, options, settings.Promise || Promise);
+  };
+}
+
+module.exports = fetchScript;
+
+},{}],5:[function(require,module,exports){
+var LoopMode = {
+  once: THREE.LoopOnce,
+  repeat: THREE.LoopRepeat,
+  pingpong: THREE.LoopPingPong
+};
+
+/**
+ * animation-mixer
+ *
+ * Player for animation clips. Intended to be compatible with any model format that supports
+ * skeletal or morph animations through THREE.AnimationMixer.
+ * See: https://threejs.org/docs/?q=animation#Reference/Animation/AnimationMixer
+ */
+module.exports = {
+  schema: {
+    clip:  {default: '*'},
+    duration: {default: 0},
+    crossFadeDuration: {default: 0},
+    loop: {default: 'repeat', oneOf: Object.keys(LoopMode)},
+    repetitions: {default: Infinity, min: 0}
+  },
+
+  init: function () {
+    /** @type {THREE.Mesh} */
+    this.model = null;
+    /** @type {THREE.AnimationMixer} */
+    this.mixer = null;
+    /** @type {Array<THREE.AnimationAction>} */
+    this.activeActions = [];
+
+    var model = this.el.getObject3D('mesh');
+
+    if (model) {
+      this.load(model);
+    } else {
+      this.el.addEventListener('model-loaded', function(e) {
+        this.load(e.detail.model);
+      }.bind(this));
+    }
+  },
+
+  load: function (model) {
+    var el = this.el;
+    this.model = model;
+    this.mixer = new THREE.AnimationMixer(model);
+    this.mixer.addEventListener('loop', function (e) {
+      el.emit('animation-loop', {action: e.action, loopDelta: e.loopDelta});
+    }.bind(this));
+    this.mixer.addEventListener('finished', function (e) {
+      el.emit('animation-finished', {action: e.action, direction: e.direction});
+    }.bind(this));
+    if (this.data.clip) this.update({});
+  },
+
+  remove: function () {
+    if (this.mixer) this.mixer.stopAllAction();
+  },
+
+  update: function (previousData) {
+    if (!previousData) return;
+
+    this.stopAction();
+
+    if (this.data.clip) {
+      this.playAction();
+    }
+  },
+
+  stopAction: function () {
+    var data = this.data;
+    for (var i = 0; i < this.activeActions.length; i++) {
+      data.crossFadeDuration
+        ? this.activeActions[i].fadeOut(data.crossFadeDuration)
+        : this.activeActions[i].stop();
+    }
+    this.activeActions.length = 0;
+  },
+
+  playAction: function () {
+    if (!this.mixer) return;
+
+    var model = this.model,
+        data = this.data,
+        clips = model.animations || (model.geometry || {}).animations || [];
+
+    if (!clips.length) return;
+
+    var re = wildcardToRegExp(data.clip);
+
+    for (var clip, i = 0; (clip = clips[i]); i++) {
+      if (clip.name.match(re)) {
+        var action = this.mixer.clipAction(clip, model);
+        action.enabled = true;
+        if (data.duration) action.setDuration(data.duration);
+        action
+          .setLoop(LoopMode[data.loop], data.repetitions)
+          .fadeIn(data.crossFadeDuration)
+          .play();
+        this.activeActions.push(action);
+      }
+    }
+  },
+
+  tick: function (t, dt) {
+    if (this.mixer && !isNaN(dt)) this.mixer.update(dt / 1000);
+  }
+};
+
+/**
+ * Creates a RegExp from the given string, converting asterisks to .* expressions,
+ * and escaping all other characters.
+ */
+function wildcardToRegExp (s) {
+  return new RegExp('^' + s.split(/\*+/).map(regExpEscape).join('.*') + '$');
+}
+
+/**
+ * RegExp-escapes all characters in the given string.
+ */
+function regExpEscape (s) {
+  return s.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
+}
+
+},{}],6:[function(require,module,exports){
+THREE.FBXLoader = require('../../lib/FBXLoader');
+
+/**
+ * fbx-model
+ *
+ * Loader for FBX format. Supports ASCII, but *not* binary, models.
+ */
+module.exports = {
+  schema: {
+    src:         { type: 'asset' },
+    crossorigin: { default: '' }
+  },
+
+  init: function () {
+    this.model = null;
+  },
+
+  update: function () {
+    var loader,
+        data = this.data;
+    if (!data.src) return;
+
+    this.remove();
+    loader = new THREE.FBXLoader();
+    if (data.crossorigin) loader.setCrossOrigin(data.crossorigin);
+    loader.load(data.src, this.load.bind(this));
+  },
+
+  load: function (model) {
+    this.model = model;
+    this.el.setObject3D('mesh', model);
+    this.el.emit('model-loaded', {format: 'fbx', model: model});
+  },
+
+  remove: function () {
+    if (this.model) this.el.removeObject3D('mesh');
+  }
+};
+
+},{"../../lib/FBXLoader":2}],7:[function(require,module,exports){
+var fetchScript = require('../../lib/fetch-script')();
+
+var LOADER_SRC = 'https://rawgit.com/mrdoob/three.js/r86/examples/js/loaders/GLTFLoader.js';
+
+/**
+ * Legacy loader for glTF 1.0 models.
+ * Asynchronously loads THREE.GLTFLoader from rawgit.
+ */
+module.exports.Component = {
+  schema: {type: 'model'},
+
+  init: function () {
+    this.model = null;
+    this.loader = null;
+    this.loaderPromise = loadLoader().then(function () {
+      this.loader = new THREE.GLTFLoader();
+      this.loader.setCrossOrigin('Anonymous');
+    }.bind(this));
+  },
+
+  update: function () {
+    var self = this;
+    var el = this.el;
+    var src = this.data;
+
+    if (!src) { return; }
+
+    this.remove();
+
+    this.loaderPromise.then(function () {
+      this.loader.load(src, function gltfLoaded (gltfModel) {
+        self.model = gltfModel.scene;
+        self.model.animations = gltfModel.animations;
+        self.system.registerModel(self.model);
+        el.setObject3D('mesh', self.model);
+        el.emit('model-loaded', {format: 'gltf', model: self.model});
+      });
+    }.bind(this));
+  },
+
+  remove: function () {
+    if (!this.model) { return; }
+    this.el.removeObject3D('mesh');
+    this.system.unregisterModel(this.model);
+  }
+};
+
+/**
+ * glTF model system.
+ */
+module.exports.System = {
+  init: function () {
+    this.models = [];
+  },
+
+  /**
+   * Updates shaders for all glTF models in the system.
+   */
+  tick: function () {
+    var sceneEl = this.sceneEl;
+    if (sceneEl.hasLoaded && this.models.length) {
+      THREE.GLTFLoader.Shaders.update(sceneEl.object3D, sceneEl.camera);
+    }
+  },
+
+  /**
+   * Registers a glTF asset.
+   * @param {object} gltf Asset containing a scene and (optional) animations and cameras.
+   */
+  registerModel: function (gltf) {
+    this.models.push(gltf);
+  },
+
+  /**
+   * Unregisters a glTF asset.
+   * @param  {object} gltf Asset containing a scene and (optional) animations and cameras.
+   */
+  unregisterModel: function (gltf) {
+    var models = this.models;
+    var index = models.indexOf(gltf);
+    if (index >= 0) {
+      models.splice(index, 1);
+    }
+  }
+};
+
+var loadLoader = (function () {
+  var promise;
+  return function () {
+    promise = promise || fetchScript(LOADER_SRC);
+    return promise;
+  };
+}());
+
+},{"../../lib/fetch-script":4}],8:[function(require,module,exports){
+var fetchScript = require('../../lib/fetch-script')();
+
+var LOADER_SRC = 'https://rawgit.com/mrdoob/three.js/r87/examples/js/loaders/GLTFLoader.js';
+// Monkeypatch while waiting for three.js r86.
+if (THREE.PropertyBinding.sanitizeNodeName === undefined) {
+
+  THREE.PropertyBinding.sanitizeNodeName = function (s) {
+    return s.replace( /\s/g, '_' ).replace( /[^\w-]/g, '' );
+  };
+
+}
+
+/**
+ * Upcoming loader for glTF 2.0 models.
+ * Asynchronously loads THREE.GLTF2Loader from rawgit.
+ */
+module.exports = {
+  schema: {type: 'model'},
+
+  init: function () {
+    this.model = null;
+    this.loader = null;
+    this.loaderPromise = loadLoader().then(function () {
+      this.loader = new THREE.GLTFLoader();
+      this.loader.setCrossOrigin('Anonymous');
+    }.bind(this));
+  },
+
+  update: function () {
+    var self = this;
+    var el = this.el;
+    var src = this.data;
+
+    if (!src) { return; }
+
+    this.remove();
+
+    this.loaderPromise.then(function () {
+      this.loader.load(src, function gltfLoaded (gltfModel) {
+        self.model = gltfModel.scene;
+        self.model.animations = gltfModel.animations;
+        el.setObject3D('mesh', self.model);
+        el.emit('model-loaded', {format: 'gltf', model: self.model});
+      });
+    }.bind(this));
+  },
+
+  remove: function () {
+    if (!this.model) { return; }
+    this.el.removeObject3D('mesh');
+  }
+};
+
+var loadLoader = (function () {
+  var promise;
+  return function () {
+    promise = promise || fetchScript(LOADER_SRC);
+    return promise;
+  };
+}());
+
+},{"../../lib/fetch-script":4}],9:[function(require,module,exports){
+module.exports = {
+  'animation-mixer': require('./animation-mixer'),
+  'fbx-model': require('./fbx-model'),
+  'gltf-model-next': require('./gltf-model-next'),
+  'gltf-model-legacy': require('./gltf-model-legacy'),
+  'json-model': require('./json-model'),
+  'object-model': require('./object-model'),
+  'ply-model': require('./ply-model'),
+  'three-model': require('./three-model'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    // THREE.AnimationMixer
+    if (!AFRAME.components['animation-mixer']) {
+      AFRAME.registerComponent('animation-mixer', this['animation-mixer']);
+    }
+
+    // THREE.PlyLoader
+    if (!AFRAME.systems['ply-model']) {
+      AFRAME.registerSystem('ply-model', this['ply-model'].System);
+    }
+    if (!AFRAME.components['ply-model']) {
+      AFRAME.registerComponent('ply-model', this['ply-model'].Component);
+    }
+
+    // THREE.FBXLoader
+    if (!AFRAME.components['fbx-model']) {
+      AFRAME.registerComponent('fbx-model', this['fbx-model']);
+    }
+
+    // THREE.GLTF2Loader
+    if (!AFRAME.components['gltf-model-next']) {
+      AFRAME.registerComponent('gltf-model-next', this['gltf-model-next']);
+    }
+
+    // THREE.GLTFLoader
+    if (!AFRAME.components['gltf-model-legacy']) {
+      AFRAME.registerComponent('gltf-model-legacy', this['gltf-model-legacy'].Component);
+      AFRAME.registerSystem('gltf-model-legacy', this['gltf-model-legacy'].System);
+    }
+
+    // THREE.JsonLoader
+    if (!AFRAME.components['json-model']) {
+      AFRAME.registerComponent('json-model', this['json-model']);
+    }
+
+    // THREE.ObjectLoader
+    if (!AFRAME.components['object-model']) {
+      AFRAME.registerComponent('object-model', this['object-model']);
+    }
+
+    // (deprecated) THREE.JsonLoader and THREE.ObjectLoader
+    if (!AFRAME.components['three-model']) {
+      AFRAME.registerComponent('three-model', this['three-model']);
+    }
+
+    this._registered = true;
+  }
+};
+
+},{"./animation-mixer":5,"./fbx-model":6,"./gltf-model-legacy":7,"./gltf-model-next":8,"./json-model":10,"./object-model":11,"./ply-model":12,"./three-model":13}],10:[function(require,module,exports){
+/**
+ * json-model
+ *
+ * Loader for THREE.js JSON format. Somewhat confusingly, there are two different THREE.js formats,
+ * both having the .json extension. This loader supports only THREE.JsonLoader, which typically
+ * includes only a single mesh.
+ *
+ * Check the console for errors, if in doubt. You may need to use `object-model` or
+ * `blend-character-model` for some .js and .json files.
+ *
+ * See: https://clara.io/learn/user-guide/data_exchange/threejs_export
+ */
+module.exports = {
+  schema: {
+    src:         { type: 'asset' },
+    crossorigin: { default: '' }
+  },
+
+  init: function () {
+    this.model = null;
+  },
+
+  update: function () {
+    var loader,
+        data = this.data;
+    if (!data.src) return;
+
+    this.remove();
+    loader = new THREE.JSONLoader();
+    if (data.crossorigin) loader.crossOrigin = data.crossorigin;
+    loader.load(data.src, function (geometry, materials) {
+
+      // Attempt to automatically detect common material options.
+      materials.forEach(function (mat) {
+        mat.vertexColors = (geometry.faces[0] || {}).color ? THREE.FaceColors : THREE.NoColors;
+        mat.skinning = !!(geometry.bones || []).length;
+        mat.morphTargets = !!(geometry.morphTargets || []).length;
+        mat.morphNormals = !!(geometry.morphNormals || []).length;
+      });
+
+      var model = (geometry.bones || []).length
+        ? new THREE.SkinnedMesh(geometry, new THREE.MultiMaterial(materials))
+        : new THREE.Mesh(geometry, new THREE.MultiMaterial(materials));
+
+      this.load(model);
+    }.bind(this));
+  },
+
+  load: function (model) {
+    this.model = model;
+    this.el.setObject3D('mesh', model);
+    this.el.emit('model-loaded', {format: 'json', model: model});
+  },
+
+  remove: function () {
+    if (this.model) this.el.removeObject3D('mesh');
+  }
+};
+
+},{}],11:[function(require,module,exports){
+/**
+ * object-model
+ *
+ * Loader for THREE.js JSON format. Somewhat confusingly, there are two different THREE.js formats,
+ * both having the .json extension. This loader supports only THREE.ObjectLoader, which typically
+ * includes multiple meshes or an entire scene.
+ *
+ * Check the console for errors, if in doubt. You may need to use `json-model` or
+ * `blend-character-model` for some .js and .json files.
+ *
+ * See: https://clara.io/learn/user-guide/data_exchange/threejs_export
+ */
+module.exports = {
+  schema: {
+    src:         { type: 'asset' },
+    crossorigin: { default: '' }
+  },
+
+  init: function () {
+    this.model = null;
+  },
+
+  update: function () {
+    var loader,
+        data = this.data;
+    if (!data.src) return;
+
+    this.remove();
+    loader = new THREE.ObjectLoader();
+    if (data.crossorigin) loader.setCrossOrigin(data.crossorigin);
+    loader.load(data.src, function(object) {
+
+      // Enable skinning, if applicable.
+      object.traverse(function(o) {
+        if (o instanceof THREE.SkinnedMesh && o.material) {
+          o.material.skinning = !!((o.geometry && o.geometry.bones) || []).length;
+        }
+      });
+
+      this.load(object);
+    }.bind(this));
+  },
+
+  load: function (model) {
+    this.model = model;
+    this.el.setObject3D('mesh', model);
+    this.el.emit('model-loaded', {format: 'json', model: model});
+  },
+
+  remove: function () {
+    if (this.model) this.el.removeObject3D('mesh');
+  }
+};
+
+},{}],12:[function(require,module,exports){
+/**
+ * ply-model
+ *
+ * Wraps THREE.PLYLoader.
+ */
+THREE.PLYLoader = require('../../lib/PLYLoader');
+
+/**
+ * Loads, caches, resolves geometries.
+ *
+ * @member cache - Promises that resolve geometries keyed by `src`.
+ */
+module.exports.System = {
+  init: function () {
+    this.cache = {};
+  },
+
+  /**
+   * @returns {Promise}
+   */
+  getOrLoadGeometry: function (src, skipCache) {
+    var cache = this.cache;
+    var cacheItem = cache[src];
+
+    if (!skipCache && cacheItem) {
+      return cacheItem;
+    }
+
+    cache[src] = new Promise(function (resolve) {
+      var loader = new THREE.PLYLoader();
+      loader.load(src, function (geometry) {
+        resolve(geometry);
+      });
+    });
+    return cache[src];
+  },
+};
+
+module.exports.Component = {
+  schema: {
+    skipCache: {type: 'boolean', default: false},
+    src: {type: 'asset'}
+  },
+
+  init: function () {
+    this.model = null;
+  },
+
+  update: function () {
+    var data = this.data;
+    var el = this.el;
+    var loader;
+
+    if (!data.src) {
+      console.warn('[%s] `src` property is required.', this.name);
+      return;
+    }
+
+    // Get geometry from system, create and set mesh.
+    this.system.getOrLoadGeometry(data.src, data.skipCache).then(function (geometry) {
+      var model = createModel(geometry);
+      el.setObject3D('mesh', model);
+      el.emit('model-loaded', {format: 'ply', model: model});
+    });
+  },
+
+  remove: function () {
+    if (this.model) { this.el.removeObject3D('mesh'); }
+  }
+};
+
+function createModel (geometry) {
+  return new THREE.Mesh(geometry, new THREE.MeshPhongMaterial({
+    color: 0xFFFFFF,
+    shading: THREE.FlatShading,
+    vertexColors: THREE.VertexColors,
+    shininess: 0
+  }));
+}
+
+},{"../../lib/PLYLoader":3}],13:[function(require,module,exports){
+var DEFAULT_ANIMATION = '__auto__';
+
+/**
+ * three-model
+ *
+ * Loader for THREE.js JSON format. Somewhat confusingly, there are two
+ * different THREE.js formats, both having the .json extension. This loader
+ * supports both, but requires you to specify the mode as "object" or "json".
+ *
+ * Typically, you will use "json" for a single mesh, and "object" for a scene
+ * or multiple meshes. Check the console for errors, if in doubt.
+ *
+ * See: https://clara.io/learn/user-guide/data_exchange/threejs_export
+ */
+module.exports = {
+  deprecated: true,
+
+  schema: {
+    src:               { type: 'asset' },
+    loader:            { default: 'object', oneOf: ['object', 'json'] },
+    enableAnimation:   { default: true },
+    animation:         { default: DEFAULT_ANIMATION },
+    animationDuration: { default: 0 },
+    crossorigin:       { default: '' }
+  },
+
+  init: function () {
+    this.model = null;
+    this.mixer = null;
+    console.warn('[three-model] Component is deprecated. Use json-model or object-model instead.');
+  },
+
+  update: function (previousData) {
+    previousData = previousData || {};
+
+    var loader,
+        data = this.data;
+
+    if (!data.src) {
+      this.remove();
+      return;
+    }
+
+    // First load.
+    if (!Object.keys(previousData).length) {
+      this.remove();
+      if (data.loader === 'object') {
+        loader = new THREE.ObjectLoader();
+        if (data.crossorigin) loader.setCrossOrigin(data.crossorigin);
+        loader.load(data.src, function(loaded) {
+          loaded.traverse( function(object) {
+            if (object instanceof THREE.SkinnedMesh)
+              loaded = object;
+          });
+          if(loaded.material)
+            loaded.material.skinning = !!((loaded.geometry && loaded.geometry.bones) || []).length;
+          this.load(loaded);
+        }.bind(this));
+      } else if (data.loader === 'json') {
+        loader = new THREE.JSONLoader();
+        if (data.crossorigin) loader.crossOrigin = data.crossorigin;
+        loader.load(data.src, function (geometry, materials) {
+
+          // Attempt to automatically detect common material options.
+          materials.forEach(function (mat) {
+            mat.vertexColors = (geometry.faces[0] || {}).color ? THREE.FaceColors : THREE.NoColors;
+            mat.skinning = !!(geometry.bones || []).length;
+            mat.morphTargets = !!(geometry.morphTargets || []).length;
+            mat.morphNormals = !!(geometry.morphNormals || []).length;
+          });
+
+          var mesh = (geometry.bones || []).length
+            ? new THREE.SkinnedMesh(geometry, new THREE.MultiMaterial(materials))
+            : new THREE.Mesh(geometry, new THREE.MultiMaterial(materials));
+
+          this.load(mesh);
+        }.bind(this));
+      } else {
+        throw new Error('[three-model] Invalid mode "%s".', data.mode);
+      }
+      return;
+    }
+
+    var activeAction = this.model && this.model.activeAction;
+
+    if (data.animation !== previousData.animation) {
+      if (activeAction) activeAction.stop();
+      this.playAnimation();
+      return;
+    }
+
+    if (activeAction && data.enableAnimation !== activeAction.isRunning()) {
+      data.enableAnimation ? this.playAnimation() : activeAction.stop();
+    }
+
+    if (activeAction && data.animationDuration) {
+        activeAction.setDuration(data.animationDuration);
+    }
+  },
+
+  load: function (model) {
+    this.model = model;
+    this.mixer = new THREE.AnimationMixer(this.model);
+    this.el.setObject3D('mesh', model);
+    this.el.emit('model-loaded', {format: 'three', model: model});
+
+    if (this.data.enableAnimation) this.playAnimation();
+  },
+
+  playAnimation: function () {
+    var clip,
+        data = this.data,
+        animations = this.model.animations || this.model.geometry.animations || [];
+
+    if (!data.enableAnimation || !data.animation || !animations.length) {
+      return;
+    }
+
+    clip = data.animation === DEFAULT_ANIMATION
+      ? animations[0]
+      : THREE.AnimationClip.findByName(animations, data.animation);
+
+    if (!clip) {
+      console.error('[three-model] Animation "%s" not found.', data.animation);
+      return;
+    }
+
+    this.model.activeAction = this.mixer.clipAction(clip, this.model);
+    if (data.animationDuration) {
+      this.model.activeAction.setDuration(data.animationDuration);
+    }
+    this.model.activeAction.play();
+  },
+
+  remove: function () {
+    if (this.mixer) this.mixer.stopAllAction();
+    if (this.model) this.el.removeObject3D('mesh');
+  },
+
+  tick: function (t, dt) {
+    if (this.mixer && !isNaN(dt)) {
+      this.mixer.update(dt / 1000);
+    }
+  }
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.loaders.min.js


File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.min.js


+ 16845 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.misc.js

@@ -0,0 +1,16845 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+require('./src/misc').registerAll();
+},{"./src/misc":75}],2:[function(require,module,exports){
+var CANNON = require('cannon'),
+    math = require('./src/components/math');
+
+module.exports = {
+  'dynamic-body':   require('./src/components/body/dynamic-body'),
+  'static-body':    require('./src/components/body/static-body'),
+  'constraint':     require('./src/components/constraint'),
+  'system':         require('./src/system/physics'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    math.registerAll();
+    if (!AFRAME.systems.physics)            AFRAME.registerSystem('physics',         this.system);
+    if (!AFRAME.components['dynamic-body']) AFRAME.registerComponent('dynamic-body', this['dynamic-body']);
+    if (!AFRAME.components['static-body'])  AFRAME.registerComponent('static-body',  this['static-body']);
+    if (!AFRAME.components['constraint'])   AFRAME.registerComponent('constraint',   this['constraint']);
+
+    this._registered = true;
+  }
+};
+
+// Export CANNON.js.
+window.CANNON = window.CANNON || CANNON;
+
+},{"./src/components/body/dynamic-body":5,"./src/components/body/static-body":6,"./src/components/constraint":7,"./src/components/math":8,"./src/system/physics":12,"cannon":14}],3:[function(require,module,exports){
+/**
+ * CANNON.shape2mesh
+ *
+ * Source: http://schteppe.github.io/cannon.js/build/cannon.demo.js
+ * Author: @schteppe
+ */
+var CANNON = require('cannon');
+
+CANNON.shape2mesh = function(body){
+    var obj = new THREE.Object3D();
+
+    for (var l = 0; l < body.shapes.length; l++) {
+        var shape = body.shapes[l];
+
+        var mesh;
+
+        switch(shape.type){
+
+        case CANNON.Shape.types.SPHERE:
+            var sphere_geometry = new THREE.SphereGeometry( shape.radius, 8, 8);
+            mesh = new THREE.Mesh( sphere_geometry, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.PARTICLE:
+            mesh = new THREE.Mesh( this.particleGeo, this.particleMaterial );
+            var s = this.settings;
+            mesh.scale.set(s.particleSize,s.particleSize,s.particleSize);
+            break;
+
+        case CANNON.Shape.types.PLANE:
+            var geometry = new THREE.PlaneGeometry(10, 10, 4, 4);
+            mesh = new THREE.Object3D();
+            var submesh = new THREE.Object3D();
+            var ground = new THREE.Mesh( geometry, this.currentMaterial );
+            ground.scale.set(100, 100, 100);
+            submesh.add(ground);
+
+            ground.castShadow = true;
+            ground.receiveShadow = true;
+
+            mesh.add(submesh);
+            break;
+
+        case CANNON.Shape.types.BOX:
+            var box_geometry = new THREE.BoxGeometry(  shape.halfExtents.x*2,
+                                                        shape.halfExtents.y*2,
+                                                        shape.halfExtents.z*2 );
+            mesh = new THREE.Mesh( box_geometry, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.CONVEXPOLYHEDRON:
+            var geo = new THREE.Geometry();
+
+            // Add vertices
+            for (var i = 0; i < shape.vertices.length; i++) {
+                var v = shape.vertices[i];
+                geo.vertices.push(new THREE.Vector3(v.x, v.y, v.z));
+            }
+
+            for(var i=0; i < shape.faces.length; i++){
+                var face = shape.faces[i];
+
+                // add triangles
+                var a = face[0];
+                for (var j = 1; j < face.length - 1; j++) {
+                    var b = face[j];
+                    var c = face[j + 1];
+                    geo.faces.push(new THREE.Face3(a, b, c));
+                }
+            }
+            geo.computeBoundingSphere();
+            geo.computeFaceNormals();
+            mesh = new THREE.Mesh( geo, this.currentMaterial );
+            break;
+
+        case CANNON.Shape.types.HEIGHTFIELD:
+            var geometry = new THREE.Geometry();
+
+            var v0 = new CANNON.Vec3();
+            var v1 = new CANNON.Vec3();
+            var v2 = new CANNON.Vec3();
+            for (var xi = 0; xi < shape.data.length - 1; xi++) {
+                for (var yi = 0; yi < shape.data[xi].length - 1; yi++) {
+                    for (var k = 0; k < 2; k++) {
+                        shape.getConvexTrianglePillar(xi, yi, k===0);
+                        v0.copy(shape.pillarConvex.vertices[0]);
+                        v1.copy(shape.pillarConvex.vertices[1]);
+                        v2.copy(shape.pillarConvex.vertices[2]);
+                        v0.vadd(shape.pillarOffset, v0);
+                        v1.vadd(shape.pillarOffset, v1);
+                        v2.vadd(shape.pillarOffset, v2);
+                        geometry.vertices.push(
+                            new THREE.Vector3(v0.x, v0.y, v0.z),
+                            new THREE.Vector3(v1.x, v1.y, v1.z),
+                            new THREE.Vector3(v2.x, v2.y, v2.z)
+                        );
+                        var i = geometry.vertices.length - 3;
+                        geometry.faces.push(new THREE.Face3(i, i+1, i+2));
+                    }
+                }
+            }
+            geometry.computeBoundingSphere();
+            geometry.computeFaceNormals();
+            mesh = new THREE.Mesh(geometry, this.currentMaterial);
+            break;
+
+        case CANNON.Shape.types.TRIMESH:
+            var geometry = new THREE.Geometry();
+
+            var v0 = new CANNON.Vec3();
+            var v1 = new CANNON.Vec3();
+            var v2 = new CANNON.Vec3();
+            for (var i = 0; i < shape.indices.length / 3; i++) {
+                shape.getTriangleVertices(i, v0, v1, v2);
+                geometry.vertices.push(
+                    new THREE.Vector3(v0.x, v0.y, v0.z),
+                    new THREE.Vector3(v1.x, v1.y, v1.z),
+                    new THREE.Vector3(v2.x, v2.y, v2.z)
+                );
+                var j = geometry.vertices.length - 3;
+                geometry.faces.push(new THREE.Face3(j, j+1, j+2));
+            }
+            geometry.computeBoundingSphere();
+            geometry.computeFaceNormals();
+            mesh = new THREE.Mesh(geometry, this.currentMaterial);
+            break;
+
+        default:
+            throw "Visual type not recognized: "+shape.type;
+        }
+
+        mesh.receiveShadow = true;
+        mesh.castShadow = true;
+        if(mesh.children){
+            for(var i=0; i<mesh.children.length; i++){
+                mesh.children[i].castShadow = true;
+                mesh.children[i].receiveShadow = true;
+                if(mesh.children[i]){
+                    for(var j=0; j<mesh.children[i].length; j++){
+                        mesh.children[i].children[j].castShadow = true;
+                        mesh.children[i].children[j].receiveShadow = true;
+                    }
+                }
+            }
+        }
+
+        var o = body.shapeOffsets[l];
+        var q = body.shapeOrientations[l];
+        mesh.position.set(o.x, o.y, o.z);
+        mesh.quaternion.set(q.x, q.y, q.z, q.w);
+
+        obj.add(mesh);
+    }
+
+    return obj;
+};
+
+module.exports = CANNON.shape2mesh;
+
+},{"cannon":14}],4:[function(require,module,exports){
+var CANNON = require('cannon'),
+    mesh2shape = require('three-to-cannon');
+
+require('../../../lib/CANNON-shape2mesh');
+
+module.exports = {
+  schema: {
+    shape: {default: 'auto', oneOf: ['auto', 'box', 'cylinder', 'sphere', 'hull', 'none']},
+    cylinderAxis: {default: 'y', oneOf: ['x', 'y', 'z']},
+    sphereRadius: {default: NaN}
+  },
+
+  /**
+   * Initializes a body component, assigning it to the physics system and binding listeners for
+   * parsing the elements geometry.
+   */
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+
+    if (this.el.sceneEl.hasLoaded) {
+      this.initBody();
+    } else {
+      this.el.sceneEl.addEventListener('loaded', this.initBody.bind(this));
+    }
+  },
+
+  /**
+   * Parses an element's geometry and component metadata to create a CANNON.Body instance for the
+   * component.
+   */
+  initBody: function () {
+    var shape,
+        el = this.el,
+        data = this.data,
+        pos = el.getAttribute('position');
+
+    this.body = new CANNON.Body({
+      mass: data.mass || 0,
+      material: this.system.material,
+      position: new CANNON.Vec3(pos.x, pos.y, pos.z),
+      linearDamping: data.linearDamping,
+      angularDamping: data.angularDamping
+    });
+
+    // Matrix World must be updated at root level, if scale is to be applied – updateMatrixWorld()
+    // only checks an object's parent, not the rest of the ancestors. Hence, a wrapping entity with
+    // scale="0.5 0.5 0.5" will be ignored.
+    // Reference: https://github.com/mrdoob/three.js/blob/master/src/core/Object3D.js#L511-L541
+    // Potential fix: https://github.com/mrdoob/three.js/pull/7019
+    this.el.object3D.updateMatrixWorld(true);
+
+    if(data.shape !== 'none') {
+      var options = data.shape === 'auto' ? undefined : AFRAME.utils.extend({}, this.data, {
+        type: mesh2shape.Type[data.shape.toUpperCase()]
+      });
+
+      shape = mesh2shape(this.el.object3D, options);
+
+      if (!shape) {
+        this.el.addEventListener('model-loaded', this.initBody.bind(this));
+        return;
+      }
+
+      this.body.addShape(shape, shape.offset, shape.orientation);
+
+      // Show wireframe
+      if (this.system.debug) {
+        this.createWireframe(this.body, shape);
+      }
+    }
+
+    // Apply rotation
+    var rot = el.getAttribute('rotation');
+    this.body.quaternion.setFromEuler(
+      THREE.Math.degToRad(rot.x),
+      THREE.Math.degToRad(rot.y),
+      THREE.Math.degToRad(rot.z),
+      'XYZ'
+    ).normalize();
+
+    this.el.body = this.body;
+    this.body.el = this.el;
+    this.isLoaded = true;
+
+    // If component wasn't initialized when play() was called, finish up.
+    if (this.isPlaying) {
+      this._play();
+    }
+
+    this.el.emit('body-loaded', {body: this.el.body});
+  },
+
+  /**
+   * Registers the component with the physics system, if ready.
+   */
+  play: function () {
+    if (this.isLoaded) this._play();
+  },
+
+  /**
+   * Internal helper to register component with physics system.
+   */
+  _play: function () {
+    this.system.addBehavior(this, this.system.Phase.SIMULATE);
+    this.system.addBody(this.body);
+    if (this.wireframe) this.el.sceneEl.object3D.add(this.wireframe);
+
+    this.syncToPhysics();
+  },
+
+  /**
+   * Unregisters the component with the physics system.
+   */
+  pause: function () {
+    if (!this.isLoaded) return;
+
+    this.system.removeBehavior(this, this.system.Phase.SIMULATE);
+    this.system.removeBody(this.body);
+    if (this.wireframe) this.el.sceneEl.object3D.remove(this.wireframe);
+  },
+
+  /**
+   * Removes the component and all physics and scene side effects.
+   */
+  remove: function () {
+    this.pause();
+    delete this.body.el;
+    delete this.body;
+    delete this.el.body;
+    delete this.wireframe;
+  },
+
+  /**
+   * Creates a wireframe for the body, for debugging.
+   * TODO(donmccurdy) – Refactor this into a standalone utility or component.
+   * @param  {CANNON.Body} body
+   * @param  {CANNON.Shape} shape
+   */
+  createWireframe: function (body, shape) {
+    var offset = shape.offset,
+        orientation = shape.orientation,
+        mesh = CANNON.shape2mesh(body).children[0];
+
+    this.wireframe = new THREE.LineSegments(
+      new THREE.EdgesGeometry(mesh.geometry),
+      new THREE.LineBasicMaterial({color: 0xff0000})
+    );
+
+    if (offset) {
+      this.wireframe.offset = offset.clone();
+    }
+
+    if (orientation) {
+      orientation.inverse(orientation);
+      this.wireframe.orientation = new THREE.Quaternion(
+        orientation.x,
+        orientation.y,
+        orientation.z,
+        orientation.w
+      );
+    }
+
+    this.syncWireframe();
+  },
+
+  /**
+   * Updates the debugging wireframe's position and rotation.
+   */
+  syncWireframe: function () {
+    var offset,
+        wireframe = this.wireframe;
+
+    if (!this.wireframe) return;
+
+    // Apply rotation. If the shape required custom orientation, also apply
+    // that on the wireframe.
+    wireframe.quaternion.copy(this.body.quaternion);
+    if (wireframe.orientation) {
+      wireframe.quaternion.multiply(wireframe.orientation);
+    }
+
+    // Apply position. If the shape required custom offset, also apply that on
+    // the wireframe.
+    wireframe.position.copy(this.body.position);
+    if (wireframe.offset) {
+      offset = wireframe.offset.clone().applyQuaternion(wireframe.quaternion);
+      wireframe.position.add(offset);
+    }
+
+    wireframe.updateMatrix();
+  },
+
+  /**
+   * Updates the CANNON.Body instance's position, velocity, and rotation, based on the scene.
+   */
+  syncToPhysics: (function () {
+    var q =  new THREE.Quaternion(),
+        v = new THREE.Vector3();
+    return function () {
+      var el = this.el,
+          parentEl = el.parentEl,
+          body = this.body;
+
+      if (!body) return;
+
+      if (el.components.velocity) body.velocity.copy(el.getAttribute('velocity'));
+
+      if (parentEl.isScene) {
+        body.quaternion.copy(el.object3D.quaternion);
+        body.position.copy(el.object3D.position);
+      } else {
+        el.object3D.getWorldQuaternion(q);
+        body.quaternion.copy(q);
+        el.object3D.getWorldPosition(v);
+        body.position.copy(v);
+      }
+
+      if (this.wireframe) this.syncWireframe();
+    };
+  }()),
+
+  /**
+   * Updates the scene object's position and rotation, based on the physics simulation.
+   */
+  syncFromPhysics: (function () {
+    var v = new THREE.Vector3(),
+        q1 = new THREE.Quaternion(),
+        q2 = new THREE.Quaternion();
+    return function () {
+      var el = this.el,
+          parentEl = el.parentEl,
+          body = this.body;
+
+      if (!body) return;
+
+      if (parentEl.isScene) {
+        el.setAttribute('quaternion', body.quaternion);
+        el.setAttribute('position', body.position);
+      } else {
+        // TODO - Nested rotation doesn't seem to be working as expected.
+        q1.copy(body.quaternion);
+        parentEl.object3D.getWorldQuaternion(q2);
+        q1.multiply(q2.inverse());
+        el.setAttribute('quaternion', {x: q1.x, y: q1.y, z: q1.z, w: q1.w});
+
+        v.copy(body.position);
+        parentEl.object3D.worldToLocal(v);
+        el.setAttribute('position', {x: v.x, y: v.y, z: v.z});
+      }
+
+      if (this.wireframe) this.syncWireframe();
+    };
+  }())
+};
+
+},{"../../../lib/CANNON-shape2mesh":3,"cannon":14,"three-to-cannon":70}],5:[function(require,module,exports){
+var Body = require('./body');
+
+/**
+ * Dynamic body.
+ *
+ * Moves according to physics simulation, and may collide with other objects.
+ */
+module.exports = AFRAME.utils.extend({}, Body, {
+  dependencies: ['quaternion', 'velocity'],
+
+  schema: AFRAME.utils.extend({}, Body.schema, {
+    mass:           { default: 5 },
+    linearDamping:  { default: 0.01 },
+    angularDamping: { default: 0.01 }
+  }),
+
+  step: function () {
+    this.syncFromPhysics();
+  }
+});
+
+},{"./body":4}],6:[function(require,module,exports){
+var Body = require('./body');
+
+/**
+ * Static body.
+ *
+ * Solid body with a fixed position. Unaffected by gravity and collisions, but
+ * other objects may collide with it.
+ */
+module.exports = AFRAME.utils.extend({}, Body, {
+  step: function () {
+    this.syncToPhysics();
+  }
+});
+
+},{"./body":4}],7:[function(require,module,exports){
+var CANNON = require('cannon');
+
+module.exports = {
+  dependencies: ['dynamic-body'],
+
+  multiple: true,
+
+  schema: {
+    // Type of constraint.
+    type: {default: 'lock', oneOf: ['coneTwist', 'distance', 'hinge', 'lock', 'pointToPoint']},
+
+    // Target (other) body for the constraint.
+    target: {type: 'selector'},
+
+    // Maximum force that should be applied to constraint the bodies.
+    maxForce: {default: 1e6, min: 0},
+
+    // If true, bodies can collide when they are connected.
+    collideConnected: {default: true},
+
+    // Wake up bodies when connected.
+    wakeUpBodies: {default: true},
+
+    // The distance to be kept between the bodies. If 0, will be set to current distance.
+    distance: {default: 0, min: 0},
+
+    // Offset of the hinge or point-to-point constraint, defined locally in the body.
+    pivot: {type: 'vec3'},
+    targetPivot: {type: 'vec3'},
+
+    // An axis that each body can rotate around, defined locally to that body.
+    axis: {type: 'vec3', default: { x: 0, y: 0, z: 1 }},
+    targetAxis: {type: 'vec3', default: { x: 0, y: 0, z: 1}}
+  },
+
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+    this.constraint = /* {CANNON.Constraint} */ null;
+  },
+
+  remove: function () {
+    if (!this.constraint) return;
+
+    this.system.world.removeConstraint(this.constraint);
+    this.constraint = null;
+  },
+
+  update: function () {
+    var el = this.el,
+        data = this.data;
+
+    this.remove();
+
+    if (!el.body || !data.target.body) {
+      (el.body ? data.target : el).addEventListener('body-loaded', this.update.bind(this, {}));
+      return;
+    }
+
+    this.constraint = this.createConstraint();
+    this.system.world.addConstraint(this.constraint);
+  },
+
+  /**
+   * Creates a new constraint, given current component data. The CANNON.js constructors are a bit
+   * different for each constraint type.
+   * @return {CANNON.Constraint}
+   */
+  createConstraint: function () {
+    var data = this.data,
+        pivot = new CANNON.Vec3(data.pivot.x, data.pivot.y, data.pivot.z),
+        targetPivot = new CANNON.Vec3(data.targetPivot.x, data.targetPivot.y, data.targetPivot.z),
+        axis = new CANNON.Vec3(data.axis.x, data.axis.y, data.axis.z),
+        targetAxis= new CANNON.Vec3(data.targetAxis.x, data.targetAxis.y, data.targetAxis.z);
+
+    var constraint;
+
+    switch (data.type) {
+      case 'lock':
+        constraint = new CANNON.LockConstraint(
+          this.el.body,
+          data.target.body,
+          {maxForce: data.maxForce}
+        );
+        break;
+
+      case 'distance':
+        constraint = new CANNON.DistanceConstraint(
+          this.el.body,
+          data.target.body,
+          data.distance,
+          data.maxForce
+        );
+        break;
+
+      case 'hinge':
+        constraint = new CANNON.HingeConstraint(
+          this.el.body,
+          data.target.body, {
+            pivotA: pivot,
+            pivotB: targetPivot,
+            axisA: axis,
+            axisB: targetAxis,
+            maxForce: data.maxForce
+          });
+        break;
+
+      case 'coneTwist':
+        constraint = new CANNON.ConeTwistConstraint(
+          this.el.body,
+          data.target.body, {
+            pivotA: pivot,
+            pivotB: targetPivot,
+            axisA: axis,
+            axisB: targetAxis,
+            maxForce: data.maxForce
+          });
+        break;
+
+      case 'pointToPoint':
+        constraint = new CANNON.PointToPointConstraint(
+          this.el.body,
+          pivot,
+          data.target.body,
+          targetPivot,
+          data.maxForce);
+        break;
+
+      default:
+        throw new Error('[constraint] Unexpected type: ' + data.type);
+    }
+
+    constraint.collideConnected = data.collideConnected;
+    return constraint;
+  }
+};
+
+},{"cannon":14}],8:[function(require,module,exports){
+module.exports = {
+  'velocity':   require('./velocity'),
+  'quaternion': require('./quaternion'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    if (!AFRAME.components['velocity'])    AFRAME.registerComponent('velocity',   this.velocity);
+    if (!AFRAME.components['quaternion'])  AFRAME.registerComponent('quaternion', this.quaternion);
+
+    this._registered = true;
+  }
+};
+
+},{"./quaternion":9,"./velocity":10}],9:[function(require,module,exports){
+/**
+ * Quaternion.
+ *
+ * Represents orientation of object in three dimensions. Similar to `rotation`
+ * component, but avoids problems of gimbal lock.
+ *
+ * See: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation
+ */
+module.exports = {
+  schema: {type: 'vec4'},
+
+  play: function () {
+    var el = this.el,
+        q = el.object3D.quaternion;
+    if (el.hasAttribute('rotation')) {
+      el.components.rotation.update();
+      el.setAttribute('quaternion', {x: q.x, y: q.y, z: q.z, w: q.w});
+      el.removeAttribute('rotation');
+      this.update();
+    }
+  },
+
+  update: function () {
+    var data = this.data;
+    this.el.object3D.quaternion.set(data.x, data.y, data.z, data.w);
+  }
+};
+
+},{}],10:[function(require,module,exports){
+/**
+ * Velocity, in m/s.
+ */
+module.exports = {
+  schema: {type: 'vec3'},
+
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+
+    if (this.system) {
+      this.system.addBehavior(this, this.system.Phase.RENDER);
+    }
+  },
+
+  remove: function () {
+    if (this.system) {
+      this.system.removeBehavior(this, this.system.Phase.RENDER);
+    }
+  },
+
+  tick: function (t, dt) {
+    if (!dt) return;
+    if (this.system) return;
+    this.step(t, dt);
+  },
+
+  step: function (t, dt) {
+    if (!dt) return;
+
+    var physics = this.el.sceneEl.systems.physics || {data: {maxInterval: 1 / 60}},
+
+        // TODO - There's definitely a bug with getComputedAttribute and el.data.
+        velocity = this.el.getAttribute('velocity') || {x: 0, y: 0, z: 0},
+        position = this.el.getAttribute('position') || {x: 0, y: 0, z: 0};
+
+    dt = Math.min(dt, physics.data.maxInterval * 1000);
+
+    this.el.setAttribute('position', {
+      x: position.x + velocity.x * dt / 1000,
+      y: position.y + velocity.y * dt / 1000,
+      z: position.z + velocity.z * dt / 1000
+    });
+  }
+};
+
+},{}],11:[function(require,module,exports){
+module.exports = {
+  GRAVITY: -9.8,
+  MAX_INTERVAL: 4 / 60,
+  ITERATIONS: 10,
+  CONTACT_MATERIAL: {
+    friction:     0.01,
+    restitution:  0.3,
+    contactEquationStiffness: 1e8,
+    contactEquationRelaxation: 3,
+    frictionEquationStiffness: 1e8,
+    frictionEquationRegularization: 3
+  }
+};
+
+},{}],12:[function(require,module,exports){
+var CANNON = require('cannon'),
+    CONSTANTS = require('../constants'),
+    C_GRAV = CONSTANTS.GRAVITY,
+    C_MAT = CONSTANTS.CONTACT_MATERIAL;
+
+/**
+ * Physics system.
+ */
+module.exports = {
+  schema: {
+    gravity:                        { default: C_GRAV },
+    iterations:                     { default: CONSTANTS.ITERATIONS },
+    friction:                       { default: C_MAT.friction },
+    restitution:                    { default: C_MAT.restitution },
+    contactEquationStiffness:       { default: C_MAT.contactEquationStiffness },
+    contactEquationRelaxation:      { default: C_MAT.contactEquationRelaxation },
+    frictionEquationStiffness:      { default: C_MAT.frictionEquationStiffness },
+    frictionEquationRegularization: { default: C_MAT.frictionEquationRegularization },
+
+    // Never step more than four frames at once. Effectively pauses the scene
+    // when out of focus, and prevents weird "jumps" when focus returns.
+    maxInterval:                    { default: 4 / 60 },
+
+    // If true, show wireframes around physics bodies.
+    debug:                          { default: false },
+  },
+
+  /**
+   * Update phases, used to separate physics simulation from updates to A-Frame scene.
+   * @enum {string}
+   */
+  Phase: {
+    SIMULATE: 'sim',
+    RENDER:   'render'
+  },
+
+  /**
+   * Initializes the physics system.
+   */
+  init: function () {
+    var data = this.data;
+
+    // If true, show wireframes around physics bodies.
+    this.debug = data.debug;
+
+    this.children = {};
+    this.children[this.Phase.SIMULATE] = [];
+    this.children[this.Phase.RENDER] = [];
+
+    this.listeners = {};
+
+    this.world = new CANNON.World();
+    this.world.quatNormalizeSkip = 0;
+    this.world.quatNormalizeFast = false;
+    // this.world.solver.setSpookParams(300,10);
+    this.world.solver.iterations = data.iterations;
+    this.world.gravity.set(0, data.gravity, 0);
+    this.world.broadphase = new CANNON.NaiveBroadphase();
+
+    this.material = new CANNON.Material({name: 'defaultMaterial'});
+    this.contactMaterial = new CANNON.ContactMaterial(this.material, this.material, {
+        friction: data.friction,
+        restitution: data.restitution,
+        contactEquationStiffness: data.contactEquationStiffness,
+        contactEquationRelaxation: data.contactEquationRelaxation,
+        frictionEquationStiffness: data.frictionEquationStiffness,
+        frictionEquationRegularization: data.frictionEquationRegularization
+    });
+    this.world.addContactMaterial(this.contactMaterial);
+  },
+
+  /**
+   * Updates the physics world on each tick of the A-Frame scene. It would be
+   * entirely possible to separate the two – updating physics more or less
+   * frequently than the scene – if greater precision or performance were
+   * necessary.
+   * @param  {number} t
+   * @param  {number} dt
+   */
+  tick: function (t, dt) {
+    if (!dt) return;
+
+    this.world.step(Math.min(dt / 1000, this.data.maxInterval));
+
+    var i;
+    for (i = 0; i < this.children[this.Phase.SIMULATE].length; i++) {
+      this.children[this.Phase.SIMULATE][i].step(t, dt);
+    }
+
+    for (i = 0; i < this.children[this.Phase.RENDER].length; i++) {
+      this.children[this.Phase.RENDER][i].step(t, dt);
+    }
+  },
+
+  /**
+   * Adds a body to the scene, and binds collision events to the element.
+   * @param {CANNON.Body} body
+   */
+  addBody: function (body) {
+    this.listeners[body.id] = function (e) { body.el.emit('collide', e); };
+    body.addEventListener('collide', this.listeners[body.id]);
+    this.world.addBody(body);
+  },
+
+  /**
+   * Removes a body, and its listeners, from the scene.
+   * @param {CANNON.Body} body
+   */
+  removeBody: function (body) {
+    body.removeEventListener('collide', this.listeners[body.id]);
+    delete this.listeners[body.id];
+    this.world.removeBody(body);
+  },
+
+  /**
+   * Adds a component instance to the system, to be invoked on each tick during
+   * the given phase.
+   * @param {Component} component
+   * @param {string} phase
+   */
+  addBehavior: function (component, phase) {
+    this.children[phase].push(component);
+  },
+
+  /**
+   * Removes a component instance from the system.
+   * @param {Component} component
+   * @param {string} phase
+   */
+  removeBehavior: function (component, phase) {
+    this.children[phase].splice(this.children[phase].indexOf(component), 1);
+  },
+
+  /**
+   * Sets an option on the physics system, affecting future simulation steps.
+   * @param {string} opt
+   * @param {mixed} value
+   */
+  update: function (previousData) {
+    var data = this.data;
+
+    if (data.debug !== previousData.debug) {
+      console.warn('[physics] `debug` cannot be changed dynamically.');
+    }
+
+    if (data.maxInterval !== previousData.maxInterval); // noop;
+
+    if (data.gravity !== previousData.gravity) this.world.gravity.set(0, data.gravity, 0);
+
+    this.contactMaterial.friction = data.friction;
+    this.contactMaterial.restitution = data.restitution;
+    this.contactMaterial.contactEquationStiffness = data.contactEquationStiffness;
+    this.contactMaterial.contactEquationRelaxation = data.contactEquationRelaxation;
+    this.contactMaterial.frictionEquationStiffness = data.frictionEquationStiffness;
+    this.contactMaterial.frictionEquationRegularization = data.frictionEquationRegularization;
+  }
+};
+
+},{"../constants":11,"cannon":14}],13:[function(require,module,exports){
+module.exports={
+  "_from": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+  "_id": "cannon@0.6.2",
+  "_inBundle": false,
+  "_integrity": "sha1-kuhwtr7Hd8jqU3mcndOx2tmf0RU=",
+  "_location": "/cannon",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "git",
+    "raw": "cannon@github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "name": "cannon",
+    "escapedName": "cannon",
+    "rawSpec": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "saveSpec": "github:donmccurdy/cannon.js#v0.6.2-dev1",
+    "fetchSpec": null,
+    "gitCommittish": "v0.6.2-dev1"
+  },
+  "_requiredBy": [
+    "/aframe-physics-system"
+  ],
+  "_resolved": "github:donmccurdy/cannon.js#022e8ba53fa83abf0ad8a0e4fd08623123838a17",
+  "_spec": "cannon@github:donmccurdy/cannon.js#v0.6.2-dev1",
+  "_where": "/Users/donmccurdy/Documents/Projects/aframe-extras/node_modules/aframe-physics-system",
+  "author": {
+    "name": "Stefan Hedman",
+    "email": "schteppe@gmail.com",
+    "url": "http://steffe.se"
+  },
+  "bugs": {
+    "url": "https://github.com/schteppe/cannon.js/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {},
+  "deprecated": false,
+  "description": "A lightweight 3D physics engine written in JavaScript.",
+  "devDependencies": {
+    "browserify": "*",
+    "grunt": "~0.4.0",
+    "grunt-browserify": "^2.1.4",
+    "grunt-contrib-concat": "~0.1.3",
+    "grunt-contrib-jshint": "~0.1.1",
+    "grunt-contrib-nodeunit": "^0.4.1",
+    "grunt-contrib-uglify": "^0.5.1",
+    "grunt-contrib-yuidoc": "^0.5.2",
+    "jshint": "latest",
+    "nodeunit": "^0.9.0",
+    "uglify-js": "latest"
+  },
+  "engines": {
+    "node": "*"
+  },
+  "homepage": "https://github.com/schteppe/cannon.js",
+  "keywords": [
+    "cannon.js",
+    "cannon",
+    "physics",
+    "engine",
+    "3d"
+  ],
+  "licenses": [
+    {
+      "type": "MIT"
+    }
+  ],
+  "main": "./src/Cannon.js",
+  "name": "cannon",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/schteppe/cannon.js.git"
+  },
+  "version": "0.6.2"
+}
+
+},{}],14:[function(require,module,exports){
+// Export classes
+module.exports = {
+    version :                       require('../package.json').version,
+
+    AABB :                          require('./collision/AABB'),
+    ArrayCollisionMatrix :          require('./collision/ArrayCollisionMatrix'),
+    Body :                          require('./objects/Body'),
+    Box :                           require('./shapes/Box'),
+    Broadphase :                    require('./collision/Broadphase'),
+    Constraint :                    require('./constraints/Constraint'),
+    ContactEquation :               require('./equations/ContactEquation'),
+    Narrowphase :                   require('./world/Narrowphase'),
+    ConeTwistConstraint :           require('./constraints/ConeTwistConstraint'),
+    ContactMaterial :               require('./material/ContactMaterial'),
+    ConvexPolyhedron :              require('./shapes/ConvexPolyhedron'),
+    Cylinder :                      require('./shapes/Cylinder'),
+    DistanceConstraint :            require('./constraints/DistanceConstraint'),
+    Equation :                      require('./equations/Equation'),
+    EventTarget :                   require('./utils/EventTarget'),
+    FrictionEquation :              require('./equations/FrictionEquation'),
+    GSSolver :                      require('./solver/GSSolver'),
+    GridBroadphase :                require('./collision/GridBroadphase'),
+    Heightfield :                   require('./shapes/Heightfield'),
+    HingeConstraint :               require('./constraints/HingeConstraint'),
+    LockConstraint :                require('./constraints/LockConstraint'),
+    Mat3 :                          require('./math/Mat3'),
+    Material :                      require('./material/Material'),
+    NaiveBroadphase :               require('./collision/NaiveBroadphase'),
+    ObjectCollisionMatrix :         require('./collision/ObjectCollisionMatrix'),
+    Pool :                          require('./utils/Pool'),
+    Particle :                      require('./shapes/Particle'),
+    Plane :                         require('./shapes/Plane'),
+    PointToPointConstraint :        require('./constraints/PointToPointConstraint'),
+    Quaternion :                    require('./math/Quaternion'),
+    Ray :                           require('./collision/Ray'),
+    RaycastVehicle :                require('./objects/RaycastVehicle'),
+    RaycastResult :                 require('./collision/RaycastResult'),
+    RigidVehicle :                  require('./objects/RigidVehicle'),
+    RotationalEquation :            require('./equations/RotationalEquation'),
+    RotationalMotorEquation :       require('./equations/RotationalMotorEquation'),
+    SAPBroadphase :                 require('./collision/SAPBroadphase'),
+    SPHSystem :                     require('./objects/SPHSystem'),
+    Shape :                         require('./shapes/Shape'),
+    Solver :                        require('./solver/Solver'),
+    Sphere :                        require('./shapes/Sphere'),
+    SplitSolver :                   require('./solver/SplitSolver'),
+    Spring :                        require('./objects/Spring'),
+    Transform :                     require('./math/Transform'),
+    Trimesh :                       require('./shapes/Trimesh'),
+    Vec3 :                          require('./math/Vec3'),
+    Vec3Pool :                      require('./utils/Vec3Pool'),
+    World :                         require('./world/World'),
+};
+
+},{"../package.json":13,"./collision/AABB":15,"./collision/ArrayCollisionMatrix":16,"./collision/Broadphase":17,"./collision/GridBroadphase":18,"./collision/NaiveBroadphase":19,"./collision/ObjectCollisionMatrix":20,"./collision/Ray":22,"./collision/RaycastResult":23,"./collision/SAPBroadphase":24,"./constraints/ConeTwistConstraint":25,"./constraints/Constraint":26,"./constraints/DistanceConstraint":27,"./constraints/HingeConstraint":28,"./constraints/LockConstraint":29,"./constraints/PointToPointConstraint":30,"./equations/ContactEquation":32,"./equations/Equation":33,"./equations/FrictionEquation":34,"./equations/RotationalEquation":35,"./equations/RotationalMotorEquation":36,"./material/ContactMaterial":37,"./material/Material":38,"./math/Mat3":40,"./math/Quaternion":41,"./math/Transform":42,"./math/Vec3":43,"./objects/Body":44,"./objects/RaycastVehicle":45,"./objects/RigidVehicle":46,"./objects/SPHSystem":47,"./objects/Spring":48,"./shapes/Box":50,"./shapes/ConvexPolyhedron":51,"./shapes/Cylinder":52,"./shapes/Heightfield":53,"./shapes/Particle":54,"./shapes/Plane":55,"./shapes/Shape":56,"./shapes/Sphere":57,"./shapes/Trimesh":58,"./solver/GSSolver":59,"./solver/Solver":60,"./solver/SplitSolver":61,"./utils/EventTarget":62,"./utils/Pool":64,"./utils/Vec3Pool":67,"./world/Narrowphase":68,"./world/World":69}],15:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+var Utils = require('../utils/Utils');
+
+module.exports = AABB;
+
+/**
+ * Axis aligned bounding box class.
+ * @class AABB
+ * @constructor
+ * @param {Object} [options]
+ * @param {Vec3}   [options.upperBound]
+ * @param {Vec3}   [options.lowerBound]
+ */
+function AABB(options){
+    options = options || {};
+
+    /**
+     * The lower bound of the bounding box.
+     * @property lowerBound
+     * @type {Vec3}
+     */
+    this.lowerBound = new Vec3();
+    if(options.lowerBound){
+        this.lowerBound.copy(options.lowerBound);
+    }
+
+    /**
+     * The upper bound of the bounding box.
+     * @property upperBound
+     * @type {Vec3}
+     */
+    this.upperBound = new Vec3();
+    if(options.upperBound){
+        this.upperBound.copy(options.upperBound);
+    }
+}
+
+var tmp = new Vec3();
+
+/**
+ * Set the AABB bounds from a set of points.
+ * @method setFromPoints
+ * @param {Array} points An array of Vec3's.
+ * @param {Vec3} position
+ * @param {Quaternion} quaternion
+ * @param {number} skinSize
+ * @return {AABB} The self object
+ */
+AABB.prototype.setFromPoints = function(points, position, quaternion, skinSize){
+    var l = this.lowerBound,
+        u = this.upperBound,
+        q = quaternion;
+
+    // Set to the first point
+    l.copy(points[0]);
+    if(q){
+        q.vmult(l, l);
+    }
+    u.copy(l);
+
+    for(var i = 1; i<points.length; i++){
+        var p = points[i];
+
+        if(q){
+            q.vmult(p, tmp);
+            p = tmp;
+        }
+
+        if(p.x > u.x){ u.x = p.x; }
+        if(p.x < l.x){ l.x = p.x; }
+        if(p.y > u.y){ u.y = p.y; }
+        if(p.y < l.y){ l.y = p.y; }
+        if(p.z > u.z){ u.z = p.z; }
+        if(p.z < l.z){ l.z = p.z; }
+    }
+
+    // Add offset
+    if (position) {
+        position.vadd(l, l);
+        position.vadd(u, u);
+    }
+
+    if(skinSize){
+        l.x -= skinSize;
+        l.y -= skinSize;
+        l.z -= skinSize;
+        u.x += skinSize;
+        u.y += skinSize;
+        u.z += skinSize;
+    }
+
+    return this;
+};
+
+/**
+ * Copy bounds from an AABB to this AABB
+ * @method copy
+ * @param  {AABB} aabb Source to copy from
+ * @return {AABB} The this object, for chainability
+ */
+AABB.prototype.copy = function(aabb){
+    this.lowerBound.copy(aabb.lowerBound);
+    this.upperBound.copy(aabb.upperBound);
+    return this;
+};
+
+/**
+ * Clone an AABB
+ * @method clone
+ */
+AABB.prototype.clone = function(){
+    return new AABB().copy(this);
+};
+
+/**
+ * Extend this AABB so that it covers the given AABB too.
+ * @method extend
+ * @param  {AABB} aabb
+ */
+AABB.prototype.extend = function(aabb){
+    this.lowerBound.x = Math.min(this.lowerBound.x, aabb.lowerBound.x);
+    this.upperBound.x = Math.max(this.upperBound.x, aabb.upperBound.x);
+    this.lowerBound.y = Math.min(this.lowerBound.y, aabb.lowerBound.y);
+    this.upperBound.y = Math.max(this.upperBound.y, aabb.upperBound.y);
+    this.lowerBound.z = Math.min(this.lowerBound.z, aabb.lowerBound.z);
+    this.upperBound.z = Math.max(this.upperBound.z, aabb.upperBound.z);
+};
+
+/**
+ * Returns true if the given AABB overlaps this AABB.
+ * @method overlaps
+ * @param  {AABB} aabb
+ * @return {Boolean}
+ */
+AABB.prototype.overlaps = function(aabb){
+    var l1 = this.lowerBound,
+        u1 = this.upperBound,
+        l2 = aabb.lowerBound,
+        u2 = aabb.upperBound;
+
+    //      l2        u2
+    //      |---------|
+    // |--------|
+    // l1       u1
+
+    var overlapsX = ((l2.x <= u1.x && u1.x <= u2.x) || (l1.x <= u2.x && u2.x <= u1.x));
+    var overlapsY = ((l2.y <= u1.y && u1.y <= u2.y) || (l1.y <= u2.y && u2.y <= u1.y));
+    var overlapsZ = ((l2.z <= u1.z && u1.z <= u2.z) || (l1.z <= u2.z && u2.z <= u1.z));
+
+    return overlapsX && overlapsY && overlapsZ;
+};
+
+// Mostly for debugging
+AABB.prototype.volume = function(){
+    var l = this.lowerBound,
+        u = this.upperBound;
+    return (u.x - l.x) * (u.y - l.y) * (u.z - l.z);
+};
+
+
+/**
+ * Returns true if the given AABB is fully contained in this AABB.
+ * @method contains
+ * @param {AABB} aabb
+ * @return {Boolean}
+ */
+AABB.prototype.contains = function(aabb){
+    var l1 = this.lowerBound,
+        u1 = this.upperBound,
+        l2 = aabb.lowerBound,
+        u2 = aabb.upperBound;
+
+    //      l2        u2
+    //      |---------|
+    // |---------------|
+    // l1              u1
+
+    return (
+        (l1.x <= l2.x && u1.x >= u2.x) &&
+        (l1.y <= l2.y && u1.y >= u2.y) &&
+        (l1.z <= l2.z && u1.z >= u2.z)
+    );
+};
+
+/**
+ * @method getCorners
+ * @param {Vec3} a
+ * @param {Vec3} b
+ * @param {Vec3} c
+ * @param {Vec3} d
+ * @param {Vec3} e
+ * @param {Vec3} f
+ * @param {Vec3} g
+ * @param {Vec3} h
+ */
+AABB.prototype.getCorners = function(a, b, c, d, e, f, g, h){
+    var l = this.lowerBound,
+        u = this.upperBound;
+
+    a.copy(l);
+    b.set( u.x, l.y, l.z );
+    c.set( u.x, u.y, l.z );
+    d.set( l.x, u.y, u.z );
+    e.set( u.x, l.y, l.z );
+    f.set( l.x, u.y, l.z );
+    g.set( l.x, l.y, u.z );
+    h.copy(u);
+};
+
+var transformIntoFrame_corners = [
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3()
+];
+
+/**
+ * Get the representation of an AABB in another frame.
+ * @method toLocalFrame
+ * @param  {Transform} frame
+ * @param  {AABB} target
+ * @return {AABB} The "target" AABB object.
+ */
+AABB.prototype.toLocalFrame = function(frame, target){
+
+    var corners = transformIntoFrame_corners;
+    var a = corners[0];
+    var b = corners[1];
+    var c = corners[2];
+    var d = corners[3];
+    var e = corners[4];
+    var f = corners[5];
+    var g = corners[6];
+    var h = corners[7];
+
+    // Get corners in current frame
+    this.getCorners(a, b, c, d, e, f, g, h);
+
+    // Transform them to new local frame
+    for(var i=0; i !== 8; i++){
+        var corner = corners[i];
+        frame.pointToLocal(corner, corner);
+    }
+
+    return target.setFromPoints(corners);
+};
+
+/**
+ * Get the representation of an AABB in the global frame.
+ * @method toWorldFrame
+ * @param  {Transform} frame
+ * @param  {AABB} target
+ * @return {AABB} The "target" AABB object.
+ */
+AABB.prototype.toWorldFrame = function(frame, target){
+
+    var corners = transformIntoFrame_corners;
+    var a = corners[0];
+    var b = corners[1];
+    var c = corners[2];
+    var d = corners[3];
+    var e = corners[4];
+    var f = corners[5];
+    var g = corners[6];
+    var h = corners[7];
+
+    // Get corners in current frame
+    this.getCorners(a, b, c, d, e, f, g, h);
+
+    // Transform them to new local frame
+    for(var i=0; i !== 8; i++){
+        var corner = corners[i];
+        frame.pointToWorld(corner, corner);
+    }
+
+    return target.setFromPoints(corners);
+};
+
+/**
+ * Check if the AABB is hit by a ray.
+ * @param  {Ray} ray
+ * @return {number}
+ */
+AABB.prototype.overlapsRay = function(ray){
+    var t = 0;
+
+    // ray.direction is unit direction vector of ray
+    var dirFracX = 1 / ray._direction.x;
+    var dirFracY = 1 / ray._direction.y;
+    var dirFracZ = 1 / ray._direction.z;
+
+    // this.lowerBound is the corner of AABB with minimal coordinates - left bottom, rt is maximal corner
+    var t1 = (this.lowerBound.x - ray.from.x) * dirFracX;
+    var t2 = (this.upperBound.x - ray.from.x) * dirFracX;
+    var t3 = (this.lowerBound.y - ray.from.y) * dirFracY;
+    var t4 = (this.upperBound.y - ray.from.y) * dirFracY;
+    var t5 = (this.lowerBound.z - ray.from.z) * dirFracZ;
+    var t6 = (this.upperBound.z - ray.from.z) * dirFracZ;
+
+    // var tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)));
+    // var tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)));
+    var tmin = Math.max(Math.max(Math.min(t1, t2), Math.min(t3, t4)), Math.min(t5, t6));
+    var tmax = Math.min(Math.min(Math.max(t1, t2), Math.max(t3, t4)), Math.max(t5, t6));
+
+    // if tmax < 0, ray (line) is intersecting AABB, but whole AABB is behing us
+    if (tmax < 0){
+        //t = tmax;
+        return false;
+    }
+
+    // if tmin > tmax, ray doesn't intersect AABB
+    if (tmin > tmax){
+        //t = tmax;
+        return false;
+    }
+
+    return true;
+};
+},{"../math/Vec3":43,"../utils/Utils":66}],16:[function(require,module,exports){
+module.exports = ArrayCollisionMatrix;
+
+/**
+ * Collision "matrix". It's actually a triangular-shaped array of whether two bodies are touching this step, for reference next step
+ * @class ArrayCollisionMatrix
+ * @constructor
+ */
+function ArrayCollisionMatrix() {
+
+    /**
+     * The matrix storage
+     * @property matrix
+     * @type {Array}
+     */
+    this.matrix = [];
+}
+
+/**
+ * Get an element
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+ArrayCollisionMatrix.prototype.get = function(i, j) {
+    i = i.index;
+    j = j.index;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return this.matrix[(i*(i + 1)>>1) + j-1];
+};
+
+/**
+ * Set an element
+ * @method set
+ * @param {Number} i
+ * @param {Number} j
+ * @param {Number} value
+ */
+ArrayCollisionMatrix.prototype.set = function(i, j, value) {
+    i = i.index;
+    j = j.index;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    this.matrix[(i*(i + 1)>>1) + j-1] = value ? 1 : 0;
+};
+
+/**
+ * Sets all elements to zero
+ * @method reset
+ */
+ArrayCollisionMatrix.prototype.reset = function() {
+    for (var i=0, l=this.matrix.length; i!==l; i++) {
+        this.matrix[i]=0;
+    }
+};
+
+/**
+ * Sets the max number of objects
+ * @method setNumObjects
+ * @param {Number} n
+ */
+ArrayCollisionMatrix.prototype.setNumObjects = function(n) {
+    this.matrix.length = n*(n-1)>>1;
+};
+
+},{}],17:[function(require,module,exports){
+var Body = require('../objects/Body');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Shape = require('../shapes/Shape');
+var Plane = require('../shapes/Plane');
+
+module.exports = Broadphase;
+
+/**
+ * Base class for broadphase implementations
+ * @class Broadphase
+ * @constructor
+ * @author schteppe
+ */
+function Broadphase(){
+    /**
+    * The world to search for collisions in.
+    * @property world
+    * @type {World}
+    */
+    this.world = null;
+
+    /**
+     * If set to true, the broadphase uses bounding boxes for intersection test, else it uses bounding spheres.
+     * @property useBoundingBoxes
+     * @type {Boolean}
+     */
+    this.useBoundingBoxes = false;
+
+    /**
+     * Set to true if the objects in the world moved.
+     * @property {Boolean} dirty
+     */
+    this.dirty = true;
+}
+
+/**
+ * Get the collision pairs from the world
+ * @method collisionPairs
+ * @param {World} world The world to search in
+ * @param {Array} p1 Empty array to be filled with body objects
+ * @param {Array} p2 Empty array to be filled with body objects
+ */
+Broadphase.prototype.collisionPairs = function(world,p1,p2){
+    throw new Error("collisionPairs not implemented for this BroadPhase class!");
+};
+
+/**
+ * Check if a body pair needs to be intersection tested at all.
+ * @method needBroadphaseCollision
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @return {bool}
+ */
+Broadphase.prototype.needBroadphaseCollision = function(bodyA,bodyB){
+
+    // Check collision filter masks
+    if( (bodyA.collisionFilterGroup & bodyB.collisionFilterMask)===0 || (bodyB.collisionFilterGroup & bodyA.collisionFilterMask)===0){
+        return false;
+    }
+
+    // Check types
+    if(((bodyA.type & Body.STATIC)!==0 || bodyA.sleepState === Body.SLEEPING) &&
+       ((bodyB.type & Body.STATIC)!==0 || bodyB.sleepState === Body.SLEEPING)) {
+        // Both bodies are static or sleeping. Skip.
+        return false;
+    }
+
+    return true;
+};
+
+/**
+ * Check if the bounding volumes of two bodies intersect.
+ * @method intersectionTest
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {array} pairs1
+ * @param {array} pairs2
+  */
+Broadphase.prototype.intersectionTest = function(bodyA, bodyB, pairs1, pairs2){
+    if(this.useBoundingBoxes){
+        this.doBoundingBoxBroadphase(bodyA,bodyB,pairs1,pairs2);
+    } else {
+        this.doBoundingSphereBroadphase(bodyA,bodyB,pairs1,pairs2);
+    }
+};
+
+/**
+ * Check if the bounding spheres of two bodies are intersecting.
+ * @method doBoundingSphereBroadphase
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Array} pairs1 bodyA is appended to this array if intersection
+ * @param {Array} pairs2 bodyB is appended to this array if intersection
+ */
+var Broadphase_collisionPairs_r = new Vec3(), // Temp objects
+    Broadphase_collisionPairs_normal =  new Vec3(),
+    Broadphase_collisionPairs_quat =  new Quaternion(),
+    Broadphase_collisionPairs_relpos  =  new Vec3();
+Broadphase.prototype.doBoundingSphereBroadphase = function(bodyA,bodyB,pairs1,pairs2){
+    var r = Broadphase_collisionPairs_r;
+    bodyB.position.vsub(bodyA.position,r);
+    var boundingRadiusSum2 = Math.pow(bodyA.boundingRadius + bodyB.boundingRadius, 2);
+    var norm2 = r.norm2();
+    if(norm2 < boundingRadiusSum2){
+        pairs1.push(bodyA);
+        pairs2.push(bodyB);
+    }
+};
+
+/**
+ * Check if the bounding boxes of two bodies are intersecting.
+ * @method doBoundingBoxBroadphase
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+Broadphase.prototype.doBoundingBoxBroadphase = function(bodyA,bodyB,pairs1,pairs2){
+    if(bodyA.aabbNeedsUpdate){
+        bodyA.computeAABB();
+    }
+    if(bodyB.aabbNeedsUpdate){
+        bodyB.computeAABB();
+    }
+
+    // Check AABB / AABB
+    if(bodyA.aabb.overlaps(bodyB.aabb)){
+        pairs1.push(bodyA);
+        pairs2.push(bodyB);
+    }
+};
+
+/**
+ * Removes duplicate pairs from the pair arrays.
+ * @method makePairsUnique
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+var Broadphase_makePairsUnique_temp = { keys:[] },
+    Broadphase_makePairsUnique_p1 = [],
+    Broadphase_makePairsUnique_p2 = [];
+Broadphase.prototype.makePairsUnique = function(pairs1,pairs2){
+    var t = Broadphase_makePairsUnique_temp,
+        p1 = Broadphase_makePairsUnique_p1,
+        p2 = Broadphase_makePairsUnique_p2,
+        N = pairs1.length;
+
+    for(var i=0; i!==N; i++){
+        p1[i] = pairs1[i];
+        p2[i] = pairs2[i];
+    }
+
+    pairs1.length = 0;
+    pairs2.length = 0;
+
+    for(var i=0; i!==N; i++){
+        var id1 = p1[i].id,
+            id2 = p2[i].id;
+        var key = id1 < id2 ? id1+","+id2 :  id2+","+id1;
+        t[key] = i;
+        t.keys.push(key);
+    }
+
+    for(var i=0; i!==t.keys.length; i++){
+        var key = t.keys.pop(),
+            pairIndex = t[key];
+        pairs1.push(p1[pairIndex]);
+        pairs2.push(p2[pairIndex]);
+        delete t[key];
+    }
+};
+
+/**
+ * To be implemented by subcasses
+ * @method setWorld
+ * @param {World} world
+ */
+Broadphase.prototype.setWorld = function(world){
+};
+
+/**
+ * Check if the bounding spheres of two bodies overlap.
+ * @method boundingSphereCheck
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @return {boolean}
+ */
+var bsc_dist = new Vec3();
+Broadphase.boundingSphereCheck = function(bodyA,bodyB){
+    var dist = bsc_dist;
+    bodyA.position.vsub(bodyB.position,dist);
+    return Math.pow(bodyA.shape.boundingSphereRadius + bodyB.shape.boundingSphereRadius,2) > dist.norm2();
+};
+
+/**
+ * Returns all the bodies within the AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param  {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+Broadphase.prototype.aabbQuery = function(world, aabb, result){
+    console.warn('.aabbQuery is not implemented in this Broadphase subclass.');
+    return [];
+};
+},{"../math/Quaternion":41,"../math/Vec3":43,"../objects/Body":44,"../shapes/Plane":55,"../shapes/Shape":56}],18:[function(require,module,exports){
+module.exports = GridBroadphase;
+
+var Broadphase = require('./Broadphase');
+var Vec3 = require('../math/Vec3');
+var Shape = require('../shapes/Shape');
+
+/**
+ * Axis aligned uniform grid broadphase.
+ * @class GridBroadphase
+ * @constructor
+ * @extends Broadphase
+ * @todo Needs support for more than just planes and spheres.
+ * @param {Vec3} aabbMin
+ * @param {Vec3} aabbMax
+ * @param {Number} nx Number of boxes along x
+ * @param {Number} ny Number of boxes along y
+ * @param {Number} nz Number of boxes along z
+ */
+function GridBroadphase(aabbMin,aabbMax,nx,ny,nz){
+    Broadphase.apply(this);
+    this.nx = nx || 10;
+    this.ny = ny || 10;
+    this.nz = nz || 10;
+    this.aabbMin = aabbMin || new Vec3(100,100,100);
+    this.aabbMax = aabbMax || new Vec3(-100,-100,-100);
+	var nbins = this.nx * this.ny * this.nz;
+	if (nbins <= 0) {
+		throw "GridBroadphase: Each dimension's n must be >0";
+	}
+    this.bins = [];
+	this.binLengths = []; //Rather than continually resizing arrays (thrashing the memory), just record length and allow them to grow
+	this.bins.length = nbins;
+	this.binLengths.length = nbins;
+	for (var i=0;i<nbins;i++) {
+		this.bins[i]=[];
+		this.binLengths[i]=0;
+	}
+}
+GridBroadphase.prototype = new Broadphase();
+GridBroadphase.prototype.constructor = GridBroadphase;
+
+/**
+ * Get all the collision pairs in the physics world
+ * @method collisionPairs
+ * @param {World} world
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+var GridBroadphase_collisionPairs_d = new Vec3();
+var GridBroadphase_collisionPairs_binPos = new Vec3();
+GridBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){
+    var N = world.numObjects(),
+        bodies = world.bodies;
+
+    var max = this.aabbMax,
+        min = this.aabbMin,
+        nx = this.nx,
+        ny = this.ny,
+        nz = this.nz;
+
+	var xstep = ny*nz;
+	var ystep = nz;
+	var zstep = 1;
+
+    var xmax = max.x,
+        ymax = max.y,
+        zmax = max.z,
+        xmin = min.x,
+        ymin = min.y,
+        zmin = min.z;
+
+    var xmult = nx / (xmax-xmin),
+        ymult = ny / (ymax-ymin),
+        zmult = nz / (zmax-zmin);
+
+    var binsizeX = (xmax - xmin) / nx,
+        binsizeY = (ymax - ymin) / ny,
+        binsizeZ = (zmax - zmin) / nz;
+
+	var binRadius = Math.sqrt(binsizeX*binsizeX + binsizeY*binsizeY + binsizeZ*binsizeZ) * 0.5;
+
+    var types = Shape.types;
+    var SPHERE =            types.SPHERE,
+        PLANE =             types.PLANE,
+        BOX =               types.BOX,
+        COMPOUND =          types.COMPOUND,
+        CONVEXPOLYHEDRON =  types.CONVEXPOLYHEDRON;
+
+    var bins=this.bins,
+		binLengths=this.binLengths,
+        Nbins=this.bins.length;
+
+    // Reset bins
+    for(var i=0; i!==Nbins; i++){
+        binLengths[i] = 0;
+    }
+
+    var ceil = Math.ceil;
+	var min = Math.min;
+	var max = Math.max;
+
+	function addBoxToBins(x0,y0,z0,x1,y1,z1,bi) {
+		var xoff0 = ((x0 - xmin) * xmult)|0,
+			yoff0 = ((y0 - ymin) * ymult)|0,
+			zoff0 = ((z0 - zmin) * zmult)|0,
+			xoff1 = ceil((x1 - xmin) * xmult),
+			yoff1 = ceil((y1 - ymin) * ymult),
+			zoff1 = ceil((z1 - zmin) * zmult);
+
+		if (xoff0 < 0) { xoff0 = 0; } else if (xoff0 >= nx) { xoff0 = nx - 1; }
+		if (yoff0 < 0) { yoff0 = 0; } else if (yoff0 >= ny) { yoff0 = ny - 1; }
+		if (zoff0 < 0) { zoff0 = 0; } else if (zoff0 >= nz) { zoff0 = nz - 1; }
+		if (xoff1 < 0) { xoff1 = 0; } else if (xoff1 >= nx) { xoff1 = nx - 1; }
+		if (yoff1 < 0) { yoff1 = 0; } else if (yoff1 >= ny) { yoff1 = ny - 1; }
+		if (zoff1 < 0) { zoff1 = 0; } else if (zoff1 >= nz) { zoff1 = nz - 1; }
+
+		xoff0 *= xstep;
+		yoff0 *= ystep;
+		zoff0 *= zstep;
+		xoff1 *= xstep;
+		yoff1 *= ystep;
+		zoff1 *= zstep;
+
+		for (var xoff = xoff0; xoff <= xoff1; xoff += xstep) {
+			for (var yoff = yoff0; yoff <= yoff1; yoff += ystep) {
+				for (var zoff = zoff0; zoff <= zoff1; zoff += zstep) {
+					var idx = xoff+yoff+zoff;
+					bins[idx][binLengths[idx]++] = bi;
+				}
+			}
+		}
+	}
+
+    // Put all bodies into the bins
+    for(var i=0; i!==N; i++){
+        var bi = bodies[i];
+        var si = bi.shape;
+
+        switch(si.type){
+        case SPHERE:
+            // Put in bin
+            // check if overlap with other bins
+            var x = bi.position.x,
+                y = bi.position.y,
+                z = bi.position.z;
+            var r = si.radius;
+
+			addBoxToBins(x-r, y-r, z-r, x+r, y+r, z+r, bi);
+            break;
+
+        case PLANE:
+            if(si.worldNormalNeedsUpdate){
+                si.computeWorldNormal(bi.quaternion);
+            }
+            var planeNormal = si.worldNormal;
+
+			//Relative position from origin of plane object to the first bin
+			//Incremented as we iterate through the bins
+			var xreset = xmin + binsizeX*0.5 - bi.position.x,
+				yreset = ymin + binsizeY*0.5 - bi.position.y,
+				zreset = zmin + binsizeZ*0.5 - bi.position.z;
+
+            var d = GridBroadphase_collisionPairs_d;
+			d.set(xreset, yreset, zreset);
+
+			for (var xi = 0, xoff = 0; xi !== nx; xi++, xoff += xstep, d.y = yreset, d.x += binsizeX) {
+				for (var yi = 0, yoff = 0; yi !== ny; yi++, yoff += ystep, d.z = zreset, d.y += binsizeY) {
+					for (var zi = 0, zoff = 0; zi !== nz; zi++, zoff += zstep, d.z += binsizeZ) {
+						if (d.dot(planeNormal) < binRadius) {
+							var idx = xoff + yoff + zoff;
+							bins[idx][binLengths[idx]++] = bi;
+						}
+					}
+				}
+			}
+            break;
+
+        default:
+			if (bi.aabbNeedsUpdate) {
+				bi.computeAABB();
+			}
+
+			addBoxToBins(
+				bi.aabb.lowerBound.x,
+				bi.aabb.lowerBound.y,
+				bi.aabb.lowerBound.z,
+				bi.aabb.upperBound.x,
+				bi.aabb.upperBound.y,
+				bi.aabb.upperBound.z,
+				bi);
+            break;
+        }
+    }
+
+    // Check each bin
+    for(var i=0; i!==Nbins; i++){
+		var binLength = binLengths[i];
+		//Skip bins with no potential collisions
+		if (binLength > 1) {
+			var bin = bins[i];
+
+			// Do N^2 broadphase inside
+			for(var xi=0; xi!==binLength; xi++){
+				var bi = bin[xi];
+				for(var yi=0; yi!==xi; yi++){
+					var bj = bin[yi];
+					if(this.needBroadphaseCollision(bi,bj)){
+						this.intersectionTest(bi,bj,pairs1,pairs2);
+					}
+				}
+			}
+		}
+    }
+
+//	for (var zi = 0, zoff=0; zi < nz; zi++, zoff+= zstep) {
+//		console.log("layer "+zi);
+//		for (var yi = 0, yoff=0; yi < ny; yi++, yoff += ystep) {
+//			var row = '';
+//			for (var xi = 0, xoff=0; xi < nx; xi++, xoff += xstep) {
+//				var idx = xoff + yoff + zoff;
+//				row += ' ' + binLengths[idx];
+//			}
+//			console.log(row);
+//		}
+//	}
+
+    this.makePairsUnique(pairs1,pairs2);
+};
+
+},{"../math/Vec3":43,"../shapes/Shape":56,"./Broadphase":17}],19:[function(require,module,exports){
+module.exports = NaiveBroadphase;
+
+var Broadphase = require('./Broadphase');
+var AABB = require('./AABB');
+
+/**
+ * Naive broadphase implementation, used in lack of better ones.
+ * @class NaiveBroadphase
+ * @constructor
+ * @description The naive broadphase looks at all possible pairs without restriction, therefore it has complexity N^2 (which is bad)
+ * @extends Broadphase
+ */
+function NaiveBroadphase(){
+    Broadphase.apply(this);
+}
+NaiveBroadphase.prototype = new Broadphase();
+NaiveBroadphase.prototype.constructor = NaiveBroadphase;
+
+/**
+ * Get all the collision pairs in the physics world
+ * @method collisionPairs
+ * @param {World} world
+ * @param {Array} pairs1
+ * @param {Array} pairs2
+ */
+NaiveBroadphase.prototype.collisionPairs = function(world,pairs1,pairs2){
+    var bodies = world.bodies,
+        n = bodies.length,
+        i,j,bi,bj;
+
+    // Naive N^2 ftw!
+    for(i=0; i!==n; i++){
+        for(j=0; j!==i; j++){
+
+            bi = bodies[i];
+            bj = bodies[j];
+
+            if(!this.needBroadphaseCollision(bi,bj)){
+                continue;
+            }
+
+            this.intersectionTest(bi,bj,pairs1,pairs2);
+        }
+    }
+};
+
+var tmpAABB = new AABB();
+
+/**
+ * Returns all the bodies within an AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+NaiveBroadphase.prototype.aabbQuery = function(world, aabb, result){
+    result = result || [];
+
+    for(var i = 0; i < world.bodies.length; i++){
+        var b = world.bodies[i];
+
+        if(b.aabbNeedsUpdate){
+            b.computeAABB();
+        }
+
+        // Ugly hack until Body gets aabb
+        if(b.aabb.overlaps(aabb)){
+            result.push(b);
+        }
+    }
+
+    return result;
+};
+},{"./AABB":15,"./Broadphase":17}],20:[function(require,module,exports){
+module.exports = ObjectCollisionMatrix;
+
+/**
+ * Records what objects are colliding with each other
+ * @class ObjectCollisionMatrix
+ * @constructor
+ */
+function ObjectCollisionMatrix() {
+
+    /**
+     * The matrix storage
+     * @property matrix
+     * @type {Object}
+     */
+	this.matrix = {};
+}
+
+/**
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+ObjectCollisionMatrix.prototype.get = function(i, j) {
+	i = i.id;
+	j = j.id;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+	return i+'-'+j in this.matrix;
+};
+
+/**
+ * @method set
+ * @param  {Number} i
+ * @param  {Number} j
+ * @param {Number} value
+ */
+ObjectCollisionMatrix.prototype.set = function(i, j, value) {
+	i = i.id;
+	j = j.id;
+    if (j > i) {
+        var temp = j;
+        j = i;
+        i = temp;
+	}
+	if (value) {
+		this.matrix[i+'-'+j] = true;
+	}
+	else {
+		delete this.matrix[i+'-'+j];
+	}
+};
+
+/**
+ * Empty the matrix
+ * @method reset
+ */
+ObjectCollisionMatrix.prototype.reset = function() {
+	this.matrix = {};
+};
+
+/**
+ * Set max number of objects
+ * @method setNumObjects
+ * @param {Number} n
+ */
+ObjectCollisionMatrix.prototype.setNumObjects = function(n) {
+};
+
+},{}],21:[function(require,module,exports){
+module.exports = OverlapKeeper;
+
+/**
+ * @class OverlapKeeper
+ * @constructor
+ */
+function OverlapKeeper() {
+    this.current = [];
+    this.previous = [];
+}
+
+OverlapKeeper.prototype.getKey = function(i, j) {
+    if (j < i) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return (i << 16) | j;
+};
+
+
+/**
+ * @method set
+ * @param {Number} i
+ * @param {Number} j
+ */
+OverlapKeeper.prototype.set = function(i, j) {
+    // Insertion sort. This way the diff will have linear complexity.
+    var key = this.getKey(i, j);
+    var current = this.current;
+    var index = 0;
+    while(key > current[index]){
+        index++;
+    }
+    if(key === current[index]){
+        return; // Pair was already added
+    }
+    for(var j=current.length-1; j>=index; j--){
+        current[j + 1] = current[j];
+    }
+    current[index] = key;
+};
+
+/**
+ * @method tick
+ */
+OverlapKeeper.prototype.tick = function() {
+    var tmp = this.current;
+    this.current = this.previous;
+    this.previous = tmp;
+    this.current.length = 0;
+};
+
+function unpackAndPush(array, key){
+    array.push((key & 0xFFFF0000) >> 16, key & 0x0000FFFF);
+}
+
+/**
+ * @method getDiff
+ * @param  {array} additions
+ * @param  {array} removals
+ */
+OverlapKeeper.prototype.getDiff = function(additions, removals) {
+    var a = this.current;
+    var b = this.previous;
+    var al = a.length;
+    var bl = b.length;
+
+    var j=0;
+    for (var i = 0; i < al; i++) {
+        var found = false;
+        var keyA = a[i];
+        while(keyA > b[j]){
+            j++;
+        }
+        found = keyA === b[j];
+
+        if(!found){
+            unpackAndPush(additions, keyA);
+        }
+    }
+    j = 0;
+    for (var i = 0; i < bl; i++) {
+        var found = false;
+        var keyB = b[i];
+        while(keyB > a[j]){
+            j++;
+        }
+        found = a[j] === keyB;
+
+        if(!found){
+            unpackAndPush(removals, keyB);
+        }
+    }
+};
+},{}],22:[function(require,module,exports){
+module.exports = Ray;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+var ConvexPolyhedron = require('../shapes/ConvexPolyhedron');
+var Box = require('../shapes/Box');
+var RaycastResult = require('../collision/RaycastResult');
+var Shape = require('../shapes/Shape');
+var AABB = require('../collision/AABB');
+
+/**
+ * A line in 3D space that intersects bodies and return points.
+ * @class Ray
+ * @constructor
+ * @param {Vec3} from
+ * @param {Vec3} to
+ */
+function Ray(from, to){
+    /**
+     * @property {Vec3} from
+     */
+    this.from = from ? from.clone() : new Vec3();
+
+    /**
+     * @property {Vec3} to
+     */
+    this.to = to ? to.clone() : new Vec3();
+
+    /**
+     * @private
+     * @property {Vec3} _direction
+     */
+    this._direction = new Vec3();
+
+    /**
+     * The precision of the ray. Used when checking parallelity etc.
+     * @property {Number} precision
+     */
+    this.precision = 0.0001;
+
+    /**
+     * Set to true if you want the Ray to take .collisionResponse flags into account on bodies and shapes.
+     * @property {Boolean} checkCollisionResponse
+     */
+    this.checkCollisionResponse = true;
+
+    /**
+     * If set to true, the ray skips any hits with normal.dot(rayDirection) < 0.
+     * @property {Boolean} skipBackfaces
+     */
+    this.skipBackfaces = false;
+
+    /**
+     * @property {number} collisionFilterMask
+     * @default -1
+     */
+    this.collisionFilterMask = -1;
+
+    /**
+     * @property {number} collisionFilterGroup
+     * @default -1
+     */
+    this.collisionFilterGroup = -1;
+
+    /**
+     * The intersection mode. Should be Ray.ANY, Ray.ALL or Ray.CLOSEST.
+     * @property {number} mode
+     */
+    this.mode = Ray.ANY;
+
+    /**
+     * Current result object.
+     * @property {RaycastResult} result
+     */
+    this.result = new RaycastResult();
+
+    /**
+     * Will be set to true during intersectWorld() if the ray hit anything.
+     * @property {Boolean} hasHit
+     */
+    this.hasHit = false;
+
+    /**
+     * Current, user-provided result callback. Will be used if mode is Ray.ALL.
+     * @property {Function} callback
+     */
+    this.callback = function(result){};
+}
+Ray.prototype.constructor = Ray;
+
+Ray.CLOSEST = 1;
+Ray.ANY = 2;
+Ray.ALL = 4;
+
+var tmpAABB = new AABB();
+var tmpArray = [];
+
+/**
+ * Do itersection against all bodies in the given World.
+ * @method intersectWorld
+ * @param  {World} world
+ * @param  {object} options
+ * @return {Boolean} True if the ray hit anything, otherwise false.
+ */
+Ray.prototype.intersectWorld = function (world, options) {
+    this.mode = options.mode || Ray.ANY;
+    this.result = options.result || new RaycastResult();
+    this.skipBackfaces = !!options.skipBackfaces;
+    this.collisionFilterMask = typeof(options.collisionFilterMask) !== 'undefined' ? options.collisionFilterMask : -1;
+    this.collisionFilterGroup = typeof(options.collisionFilterGroup) !== 'undefined' ? options.collisionFilterGroup : -1;
+    if(options.from){
+        this.from.copy(options.from);
+    }
+    if(options.to){
+        this.to.copy(options.to);
+    }
+    this.callback = options.callback || function(){};
+    this.hasHit = false;
+
+    this.result.reset();
+    this._updateDirection();
+
+    this.getAABB(tmpAABB);
+    tmpArray.length = 0;
+    world.broadphase.aabbQuery(world, tmpAABB, tmpArray);
+    this.intersectBodies(tmpArray);
+
+    return this.hasHit;
+};
+
+var v1 = new Vec3(),
+    v2 = new Vec3();
+
+/*
+ * As per "Barycentric Technique" as named here http://www.blackpawn.com/texts/pointinpoly/default.html But without the division
+ */
+Ray.pointInTriangle = pointInTriangle;
+function pointInTriangle(p, a, b, c) {
+    c.vsub(a,v0);
+    b.vsub(a,v1);
+    p.vsub(a,v2);
+
+    var dot00 = v0.dot( v0 );
+    var dot01 = v0.dot( v1 );
+    var dot02 = v0.dot( v2 );
+    var dot11 = v1.dot( v1 );
+    var dot12 = v1.dot( v2 );
+
+    var u,v;
+
+    return  ( (u = dot11 * dot02 - dot01 * dot12) >= 0 ) &&
+            ( (v = dot00 * dot12 - dot01 * dot02) >= 0 ) &&
+            ( u + v < ( dot00 * dot11 - dot01 * dot01 ) );
+}
+
+/**
+ * Shoot a ray at a body, get back information about the hit.
+ * @method intersectBody
+ * @private
+ * @param {Body} body
+ * @param {RaycastResult} [result] Deprecated - set the result property of the Ray instead.
+ */
+var intersectBody_xi = new Vec3();
+var intersectBody_qi = new Quaternion();
+Ray.prototype.intersectBody = function (body, result) {
+    if(result){
+        this.result = result;
+        this._updateDirection();
+    }
+    var checkCollisionResponse = this.checkCollisionResponse;
+
+    if(checkCollisionResponse && !body.collisionResponse){
+        return;
+    }
+
+    if((this.collisionFilterGroup & body.collisionFilterMask)===0 || (body.collisionFilterGroup & this.collisionFilterMask)===0){
+        return;
+    }
+
+    var xi = intersectBody_xi;
+    var qi = intersectBody_qi;
+
+    for (var i = 0, N = body.shapes.length; i < N; i++) {
+        var shape = body.shapes[i];
+
+        if(checkCollisionResponse && !shape.collisionResponse){
+            continue; // Skip
+        }
+
+        body.quaternion.mult(body.shapeOrientations[i], qi);
+        body.quaternion.vmult(body.shapeOffsets[i], xi);
+        xi.vadd(body.position, xi);
+
+        this.intersectShape(
+            shape,
+            qi,
+            xi,
+            body
+        );
+
+        if(this.result._shouldStop){
+            break;
+        }
+    }
+};
+
+/**
+ * @method intersectBodies
+ * @param {Array} bodies An array of Body objects.
+ * @param {RaycastResult} [result] Deprecated
+ */
+Ray.prototype.intersectBodies = function (bodies, result) {
+    if(result){
+        this.result = result;
+        this._updateDirection();
+    }
+
+    for ( var i = 0, l = bodies.length; !this.result._shouldStop && i < l; i ++ ) {
+        this.intersectBody(bodies[i]);
+    }
+};
+
+/**
+ * Updates the _direction vector.
+ * @private
+ * @method _updateDirection
+ */
+Ray.prototype._updateDirection = function(){
+    this.to.vsub(this.from, this._direction);
+    this._direction.normalize();
+};
+
+/**
+ * @method intersectShape
+ * @private
+ * @param {Shape} shape
+ * @param {Quaternion} quat
+ * @param {Vec3} position
+ * @param {Body} body
+ */
+Ray.prototype.intersectShape = function(shape, quat, position, body){
+    var from = this.from;
+
+
+    // Checking boundingSphere
+    var distance = distanceFromIntersection(from, this._direction, position);
+    if ( distance > shape.boundingSphereRadius ) {
+        return;
+    }
+
+    var intersectMethod = this[shape.type];
+    if(intersectMethod){
+        intersectMethod.call(this, shape, quat, position, body, shape);
+    }
+};
+
+var vector = new Vec3();
+var normal = new Vec3();
+var intersectPoint = new Vec3();
+
+var a = new Vec3();
+var b = new Vec3();
+var c = new Vec3();
+var d = new Vec3();
+
+var tmpRaycastResult = new RaycastResult();
+
+/**
+ * @method intersectBox
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectBox = function(shape, quat, position, body, reportedShape){
+    return this.intersectConvex(shape.convexPolyhedronRepresentation, quat, position, body, reportedShape);
+};
+Ray.prototype[Shape.types.BOX] = Ray.prototype.intersectBox;
+
+/**
+ * @method intersectPlane
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectPlane = function(shape, quat, position, body, reportedShape){
+    var from = this.from;
+    var to = this.to;
+    var direction = this._direction;
+
+    // Get plane normal
+    var worldNormal = new Vec3(0, 0, 1);
+    quat.vmult(worldNormal, worldNormal);
+
+    var len = new Vec3();
+    from.vsub(position, len);
+    var planeToFrom = len.dot(worldNormal);
+    to.vsub(position, len);
+    var planeToTo = len.dot(worldNormal);
+
+    if(planeToFrom * planeToTo > 0){
+        // "from" and "to" are on the same side of the plane... bail out
+        return;
+    }
+
+    if(from.distanceTo(to) < planeToFrom){
+        return;
+    }
+
+    var n_dot_dir = worldNormal.dot(direction);
+
+    if (Math.abs(n_dot_dir) < this.precision) {
+        // No intersection
+        return;
+    }
+
+    var planePointToFrom = new Vec3();
+    var dir_scaled_with_t = new Vec3();
+    var hitPointWorld = new Vec3();
+
+    from.vsub(position, planePointToFrom);
+    var t = -worldNormal.dot(planePointToFrom) / n_dot_dir;
+    direction.scale(t, dir_scaled_with_t);
+    from.vadd(dir_scaled_with_t, hitPointWorld);
+
+    this.reportIntersection(worldNormal, hitPointWorld, reportedShape, body, -1);
+};
+Ray.prototype[Shape.types.PLANE] = Ray.prototype.intersectPlane;
+
+/**
+ * Get the world AABB of the ray.
+ * @method getAABB
+ * @param  {AABB} aabb
+ */
+Ray.prototype.getAABB = function(result){
+    var to = this.to;
+    var from = this.from;
+    result.lowerBound.x = Math.min(to.x, from.x);
+    result.lowerBound.y = Math.min(to.y, from.y);
+    result.lowerBound.z = Math.min(to.z, from.z);
+    result.upperBound.x = Math.max(to.x, from.x);
+    result.upperBound.y = Math.max(to.y, from.y);
+    result.upperBound.z = Math.max(to.z, from.z);
+};
+
+var intersectConvexOptions = {
+    faceList: [0]
+};
+var worldPillarOffset = new Vec3();
+var intersectHeightfield_localRay = new Ray();
+var intersectHeightfield_index = [];
+var intersectHeightfield_minMax = [];
+
+/**
+ * @method intersectHeightfield
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectHeightfield = function(shape, quat, position, body, reportedShape){
+    var data = shape.data,
+        w = shape.elementSize;
+
+    // Convert the ray to local heightfield coordinates
+    var localRay = intersectHeightfield_localRay; //new Ray(this.from, this.to);
+    localRay.from.copy(this.from);
+    localRay.to.copy(this.to);
+    Transform.pointToLocalFrame(position, quat, localRay.from, localRay.from);
+    Transform.pointToLocalFrame(position, quat, localRay.to, localRay.to);
+    localRay._updateDirection();
+
+    // Get the index of the data points to test against
+    var index = intersectHeightfield_index;
+    var iMinX, iMinY, iMaxX, iMaxY;
+
+    // Set to max
+    iMinX = iMinY = 0;
+    iMaxX = iMaxY = shape.data.length - 1;
+
+    var aabb = new AABB();
+    localRay.getAABB(aabb);
+
+    shape.getIndexOfPosition(aabb.lowerBound.x, aabb.lowerBound.y, index, true);
+    iMinX = Math.max(iMinX, index[0]);
+    iMinY = Math.max(iMinY, index[1]);
+    shape.getIndexOfPosition(aabb.upperBound.x, aabb.upperBound.y, index, true);
+    iMaxX = Math.min(iMaxX, index[0] + 1);
+    iMaxY = Math.min(iMaxY, index[1] + 1);
+
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            if(this.result._shouldStop){
+                return;
+            }
+
+            shape.getAabbAtIndex(i, j, aabb);
+            if(!aabb.overlapsRay(localRay)){
+                continue;
+            }
+
+            // Lower triangle
+            shape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);
+            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, reportedShape, intersectConvexOptions);
+
+            if(this.result._shouldStop){
+                return;
+            }
+
+            // Upper triangle
+            shape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(position, quat, shape.pillarOffset, worldPillarOffset);
+            this.intersectConvex(shape.pillarConvex, quat, worldPillarOffset, body, reportedShape, intersectConvexOptions);
+        }
+    }
+};
+Ray.prototype[Shape.types.HEIGHTFIELD] = Ray.prototype.intersectHeightfield;
+
+var Ray_intersectSphere_intersectionPoint = new Vec3();
+var Ray_intersectSphere_normal = new Vec3();
+
+/**
+ * @method intersectSphere
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ */
+Ray.prototype.intersectSphere = function(shape, quat, position, body, reportedShape){
+    var from = this.from,
+        to = this.to,
+        r = shape.radius;
+
+    var a = Math.pow(to.x - from.x, 2) + Math.pow(to.y - from.y, 2) + Math.pow(to.z - from.z, 2);
+    var b = 2 * ((to.x - from.x) * (from.x - position.x) + (to.y - from.y) * (from.y - position.y) + (to.z - from.z) * (from.z - position.z));
+    var c = Math.pow(from.x - position.x, 2) + Math.pow(from.y - position.y, 2) + Math.pow(from.z - position.z, 2) - Math.pow(r, 2);
+
+    var delta = Math.pow(b, 2) - 4 * a * c;
+
+    var intersectionPoint = Ray_intersectSphere_intersectionPoint;
+    var normal = Ray_intersectSphere_normal;
+
+    if(delta < 0){
+        // No intersection
+        return;
+
+    } else if(delta === 0){
+        // single intersection point
+        from.lerp(to, delta, intersectionPoint);
+
+        intersectionPoint.vsub(position, normal);
+        normal.normalize();
+
+        this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+
+    } else {
+        var d1 = (- b - Math.sqrt(delta)) / (2 * a);
+        var d2 = (- b + Math.sqrt(delta)) / (2 * a);
+
+        if(d1 >= 0 && d1 <= 1){
+            from.lerp(to, d1, intersectionPoint);
+            intersectionPoint.vsub(position, normal);
+            normal.normalize();
+            this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+        }
+
+        if(this.result._shouldStop){
+            return;
+        }
+
+        if(d2 >= 0 && d2 <= 1){
+            from.lerp(to, d2, intersectionPoint);
+            intersectionPoint.vsub(position, normal);
+            normal.normalize();
+            this.reportIntersection(normal, intersectionPoint, reportedShape, body, -1);
+        }
+    }
+};
+Ray.prototype[Shape.types.SPHERE] = Ray.prototype.intersectSphere;
+
+
+var intersectConvex_normal = new Vec3();
+var intersectConvex_minDistNormal = new Vec3();
+var intersectConvex_minDistIntersect = new Vec3();
+var intersectConvex_vector = new Vec3();
+
+/**
+ * @method intersectConvex
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ * @param {object} [options]
+ * @param {array} [options.faceList]
+ */
+Ray.prototype.intersectConvex = function intersectConvex(
+    shape,
+    quat,
+    position,
+    body,
+    reportedShape,
+    options
+){
+    var minDistNormal = intersectConvex_minDistNormal;
+    var normal = intersectConvex_normal;
+    var vector = intersectConvex_vector;
+    var minDistIntersect = intersectConvex_minDistIntersect;
+    var faceList = (options && options.faceList) || null;
+
+    // Checking faces
+    var faces = shape.faces,
+        vertices = shape.vertices,
+        normals = shape.faceNormals;
+    var direction = this._direction;
+
+    var from = this.from;
+    var to = this.to;
+    var fromToDistance = from.distanceTo(to);
+
+    var minDist = -1;
+    var Nfaces = faceList ? faceList.length : faces.length;
+    var result = this.result;
+
+    for (var j = 0; !result._shouldStop && j < Nfaces; j++) {
+        var fi = faceList ? faceList[j] : j;
+
+        var face = faces[fi];
+        var faceNormal = normals[fi];
+        var q = quat;
+        var x = position;
+
+        // determine if ray intersects the plane of the face
+        // note: this works regardless of the direction of the face normal
+
+        // Get plane point in world coordinates...
+        vector.copy(vertices[face[0]]);
+        q.vmult(vector,vector);
+        vector.vadd(x,vector);
+
+        // ...but make it relative to the ray from. We'll fix this later.
+        vector.vsub(from,vector);
+
+        // Get plane normal
+        q.vmult(faceNormal,normal);
+
+        // If this dot product is negative, we have something interesting
+        var dot = direction.dot(normal);
+
+        // Bail out if ray and plane are parallel
+        if ( Math.abs( dot ) < this.precision ){
+            continue;
+        }
+
+        // calc distance to plane
+        var scalar = normal.dot(vector) / dot;
+
+        // if negative distance, then plane is behind ray
+        if (scalar < 0){
+            continue;
+        }
+
+        // if (dot < 0) {
+
+        // Intersection point is from + direction * scalar
+        direction.mult(scalar,intersectPoint);
+        intersectPoint.vadd(from,intersectPoint);
+
+        // a is the point we compare points b and c with.
+        a.copy(vertices[face[0]]);
+        q.vmult(a,a);
+        x.vadd(a,a);
+
+        for(var i = 1; !result._shouldStop && i < face.length - 1; i++){
+            // Transform 3 vertices to world coords
+            b.copy(vertices[face[i]]);
+            c.copy(vertices[face[i+1]]);
+            q.vmult(b,b);
+            q.vmult(c,c);
+            x.vadd(b,b);
+            x.vadd(c,c);
+
+            var distance = intersectPoint.distanceTo(from);
+
+            if(!(pointInTriangle(intersectPoint, a, b, c) || pointInTriangle(intersectPoint, b, a, c)) || distance > fromToDistance){
+                continue;
+            }
+
+            this.reportIntersection(normal, intersectPoint, reportedShape, body, fi);
+        }
+        // }
+    }
+};
+Ray.prototype[Shape.types.CONVEXPOLYHEDRON] = Ray.prototype.intersectConvex;
+
+var intersectTrimesh_normal = new Vec3();
+var intersectTrimesh_localDirection = new Vec3();
+var intersectTrimesh_localFrom = new Vec3();
+var intersectTrimesh_localTo = new Vec3();
+var intersectTrimesh_worldNormal = new Vec3();
+var intersectTrimesh_worldIntersectPoint = new Vec3();
+var intersectTrimesh_localAABB = new AABB();
+var intersectTrimesh_triangles = [];
+var intersectTrimesh_treeTransform = new Transform();
+
+/**
+ * @method intersectTrimesh
+ * @private
+ * @param  {Shape} shape
+ * @param  {Quaternion} quat
+ * @param  {Vec3} position
+ * @param  {Body} body
+ * @param {object} [options]
+ * @todo Optimize by transforming the world to local space first.
+ * @todo Use Octree lookup
+ */
+Ray.prototype.intersectTrimesh = function intersectTrimesh(
+    mesh,
+    quat,
+    position,
+    body,
+    reportedShape,
+    options
+){
+    var normal = intersectTrimesh_normal;
+    var triangles = intersectTrimesh_triangles;
+    var treeTransform = intersectTrimesh_treeTransform;
+    var minDistNormal = intersectConvex_minDistNormal;
+    var vector = intersectConvex_vector;
+    var minDistIntersect = intersectConvex_minDistIntersect;
+    var localAABB = intersectTrimesh_localAABB;
+    var localDirection = intersectTrimesh_localDirection;
+    var localFrom = intersectTrimesh_localFrom;
+    var localTo = intersectTrimesh_localTo;
+    var worldIntersectPoint = intersectTrimesh_worldIntersectPoint;
+    var worldNormal = intersectTrimesh_worldNormal;
+    var faceList = (options && options.faceList) || null;
+
+    // Checking faces
+    var indices = mesh.indices,
+        vertices = mesh.vertices,
+        normals = mesh.faceNormals;
+
+    var from = this.from;
+    var to = this.to;
+    var direction = this._direction;
+
+    var minDist = -1;
+    treeTransform.position.copy(position);
+    treeTransform.quaternion.copy(quat);
+
+    // Transform ray to local space!
+    Transform.vectorToLocalFrame(position, quat, direction, localDirection);
+    Transform.pointToLocalFrame(position, quat, from, localFrom);
+    Transform.pointToLocalFrame(position, quat, to, localTo);
+
+    localTo.x *= mesh.scale.x;
+    localTo.y *= mesh.scale.y;
+    localTo.z *= mesh.scale.z;
+    localFrom.x *= mesh.scale.x;
+    localFrom.y *= mesh.scale.y;
+    localFrom.z *= mesh.scale.z;
+
+    localTo.vsub(localFrom, localDirection);
+    localDirection.normalize();
+
+    var fromToDistanceSquared = localFrom.distanceSquared(localTo);
+
+    mesh.tree.rayQuery(this, treeTransform, triangles);
+
+    for (var i = 0, N = triangles.length; !this.result._shouldStop && i !== N; i++) {
+        var trianglesIndex = triangles[i];
+
+        mesh.getNormal(trianglesIndex, normal);
+
+        // determine if ray intersects the plane of the face
+        // note: this works regardless of the direction of the face normal
+
+        // Get plane point in world coordinates...
+        mesh.getVertex(indices[trianglesIndex * 3], a);
+
+        // ...but make it relative to the ray from. We'll fix this later.
+        a.vsub(localFrom,vector);
+
+        // If this dot product is negative, we have something interesting
+        var dot = localDirection.dot(normal);
+
+        // Bail out if ray and plane are parallel
+        // if (Math.abs( dot ) < this.precision){
+        //     continue;
+        // }
+
+        // calc distance to plane
+        var scalar = normal.dot(vector) / dot;
+
+        // if negative distance, then plane is behind ray
+        if (scalar < 0){
+            continue;
+        }
+
+        // Intersection point is from + direction * scalar
+        localDirection.scale(scalar,intersectPoint);
+        intersectPoint.vadd(localFrom,intersectPoint);
+
+        // Get triangle vertices
+        mesh.getVertex(indices[trianglesIndex * 3 + 1], b);
+        mesh.getVertex(indices[trianglesIndex * 3 + 2], c);
+
+        var squaredDistance = intersectPoint.distanceSquared(localFrom);
+
+        if(!(pointInTriangle(intersectPoint, b, a, c) || pointInTriangle(intersectPoint, a, b, c)) || squaredDistance > fromToDistanceSquared){
+            continue;
+        }
+
+        // transform intersectpoint and normal to world
+        Transform.vectorToWorldFrame(quat, normal, worldNormal);
+        Transform.pointToWorldFrame(position, quat, intersectPoint, worldIntersectPoint);
+        this.reportIntersection(worldNormal, worldIntersectPoint, reportedShape, body, trianglesIndex);
+    }
+    triangles.length = 0;
+};
+Ray.prototype[Shape.types.TRIMESH] = Ray.prototype.intersectTrimesh;
+
+
+/**
+ * @method reportIntersection
+ * @private
+ * @param  {Vec3} normal
+ * @param  {Vec3} hitPointWorld
+ * @param  {Shape} shape
+ * @param  {Body} body
+ * @return {boolean} True if the intersections should continue
+ */
+Ray.prototype.reportIntersection = function(normal, hitPointWorld, shape, body, hitFaceIndex){
+    var from = this.from;
+    var to = this.to;
+    var distance = from.distanceTo(hitPointWorld);
+    var result = this.result;
+
+    // Skip back faces?
+    if(this.skipBackfaces && normal.dot(this._direction) > 0){
+        return;
+    }
+
+    result.hitFaceIndex = typeof(hitFaceIndex) !== 'undefined' ? hitFaceIndex : -1;
+
+    switch(this.mode){
+    case Ray.ALL:
+        this.hasHit = true;
+        result.set(
+            from,
+            to,
+            normal,
+            hitPointWorld,
+            shape,
+            body,
+            distance
+        );
+        result.hasHit = true;
+        this.callback(result);
+        break;
+
+    case Ray.CLOSEST:
+
+        // Store if closer than current closest
+        if(distance < result.distance || !result.hasHit){
+            this.hasHit = true;
+            result.hasHit = true;
+            result.set(
+                from,
+                to,
+                normal,
+                hitPointWorld,
+                shape,
+                body,
+                distance
+            );
+        }
+        break;
+
+    case Ray.ANY:
+
+        // Report and stop.
+        this.hasHit = true;
+        result.hasHit = true;
+        result.set(
+            from,
+            to,
+            normal,
+            hitPointWorld,
+            shape,
+            body,
+            distance
+        );
+        result._shouldStop = true;
+        break;
+    }
+};
+
+var v0 = new Vec3(),
+    intersect = new Vec3();
+function distanceFromIntersection(from, direction, position) {
+
+    // v0 is vector from from to position
+    position.vsub(from,v0);
+    var dot = v0.dot(direction);
+
+    // intersect = direction*dot + from
+    direction.mult(dot,intersect);
+    intersect.vadd(from,intersect);
+
+    var distance = position.distanceTo(intersect);
+
+    return distance;
+}
+
+
+},{"../collision/AABB":15,"../collision/RaycastResult":23,"../math/Quaternion":41,"../math/Transform":42,"../math/Vec3":43,"../shapes/Box":50,"../shapes/ConvexPolyhedron":51,"../shapes/Shape":56}],23:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+
+module.exports = RaycastResult;
+
+/**
+ * Storage for Ray casting data.
+ * @class RaycastResult
+ * @constructor
+ */
+function RaycastResult(){
+
+	/**
+	 * @property {Vec3} rayFromWorld
+	 */
+	this.rayFromWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} rayToWorld
+	 */
+	this.rayToWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} hitNormalWorld
+	 */
+	this.hitNormalWorld = new Vec3();
+
+	/**
+	 * @property {Vec3} hitPointWorld
+	 */
+	this.hitPointWorld = new Vec3();
+
+	/**
+	 * @property {boolean} hasHit
+	 */
+	this.hasHit = false;
+
+	/**
+	 * The hit shape, or null.
+	 * @property {Shape} shape
+	 */
+	this.shape = null;
+
+	/**
+	 * The hit body, or null.
+	 * @property {Body} body
+	 */
+	this.body = null;
+
+	/**
+	 * The index of the hit triangle, if the hit shape was a trimesh.
+	 * @property {number} hitFaceIndex
+	 * @default -1
+	 */
+	this.hitFaceIndex = -1;
+
+	/**
+	 * Distance to the hit. Will be set to -1 if there was no hit.
+	 * @property {number} distance
+	 * @default -1
+	 */
+	this.distance = -1;
+
+	/**
+	 * If the ray should stop traversing the bodies.
+	 * @private
+	 * @property {Boolean} _shouldStop
+	 * @default false
+	 */
+	this._shouldStop = false;
+}
+
+/**
+ * Reset all result data.
+ * @method reset
+ */
+RaycastResult.prototype.reset = function () {
+	this.rayFromWorld.setZero();
+	this.rayToWorld.setZero();
+	this.hitNormalWorld.setZero();
+	this.hitPointWorld.setZero();
+	this.hasHit = false;
+	this.shape = null;
+	this.body = null;
+	this.hitFaceIndex = -1;
+	this.distance = -1;
+	this._shouldStop = false;
+};
+
+/**
+ * @method abort
+ */
+RaycastResult.prototype.abort = function(){
+	this._shouldStop = true;
+};
+
+/**
+ * @method set
+ * @param {Vec3} rayFromWorld
+ * @param {Vec3} rayToWorld
+ * @param {Vec3} hitNormalWorld
+ * @param {Vec3} hitPointWorld
+ * @param {Shape} shape
+ * @param {Body} body
+ * @param {number} distance
+ */
+RaycastResult.prototype.set = function(
+	rayFromWorld,
+	rayToWorld,
+	hitNormalWorld,
+	hitPointWorld,
+	shape,
+	body,
+	distance
+){
+	this.rayFromWorld.copy(rayFromWorld);
+	this.rayToWorld.copy(rayToWorld);
+	this.hitNormalWorld.copy(hitNormalWorld);
+	this.hitPointWorld.copy(hitPointWorld);
+	this.shape = shape;
+	this.body = body;
+	this.distance = distance;
+};
+},{"../math/Vec3":43}],24:[function(require,module,exports){
+var Shape = require('../shapes/Shape');
+var Broadphase = require('../collision/Broadphase');
+
+module.exports = SAPBroadphase;
+
+/**
+ * Sweep and prune broadphase along one axis.
+ *
+ * @class SAPBroadphase
+ * @constructor
+ * @param {World} [world]
+ * @extends Broadphase
+ */
+function SAPBroadphase(world){
+    Broadphase.apply(this);
+
+    /**
+     * List of bodies currently in the broadphase.
+     * @property axisList
+     * @type {Array}
+     */
+    this.axisList = [];
+
+    /**
+     * The world to search in.
+     * @property world
+     * @type {World}
+     */
+    this.world = null;
+
+    /**
+     * Axis to sort the bodies along. Set to 0 for x axis, and 1 for y axis. For best performance, choose an axis that the bodies are spread out more on.
+     * @property axisIndex
+     * @type {Number}
+     */
+    this.axisIndex = 0;
+
+    var axisList = this.axisList;
+
+    this._addBodyHandler = function(e){
+        axisList.push(e.body);
+    };
+
+    this._removeBodyHandler = function(e){
+        var idx = axisList.indexOf(e.body);
+        if(idx !== -1){
+            axisList.splice(idx,1);
+        }
+    };
+
+    if(world){
+        this.setWorld(world);
+    }
+}
+SAPBroadphase.prototype = new Broadphase();
+
+/**
+ * Change the world
+ * @method setWorld
+ * @param  {World} world
+ */
+SAPBroadphase.prototype.setWorld = function(world){
+    // Clear the old axis array
+    this.axisList.length = 0;
+
+    // Add all bodies from the new world
+    for(var i=0; i<world.bodies.length; i++){
+        this.axisList.push(world.bodies[i]);
+    }
+
+    // Remove old handlers, if any
+    world.removeEventListener("addBody", this._addBodyHandler);
+    world.removeEventListener("removeBody", this._removeBodyHandler);
+
+    // Add handlers to update the list of bodies.
+    world.addEventListener("addBody", this._addBodyHandler);
+    world.addEventListener("removeBody", this._removeBodyHandler);
+
+    this.world = world;
+    this.dirty = true;
+};
+
+/**
+ * @static
+ * @method insertionSortX
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortX = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.x <= v.aabb.lowerBound.x){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * @static
+ * @method insertionSortY
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortY = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.y <= v.aabb.lowerBound.y){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * @static
+ * @method insertionSortZ
+ * @param  {Array} a
+ * @return {Array}
+ */
+SAPBroadphase.insertionSortZ = function(a) {
+    for(var i=1,l=a.length;i<l;i++) {
+        var v = a[i];
+        for(var j=i - 1;j>=0;j--) {
+            if(a[j].aabb.lowerBound.z <= v.aabb.lowerBound.z){
+                break;
+            }
+            a[j+1] = a[j];
+        }
+        a[j+1] = v;
+    }
+    return a;
+};
+
+/**
+ * Collect all collision pairs
+ * @method collisionPairs
+ * @param  {World} world
+ * @param  {Array} p1
+ * @param  {Array} p2
+ */
+SAPBroadphase.prototype.collisionPairs = function(world,p1,p2){
+    var bodies = this.axisList,
+        N = bodies.length,
+        axisIndex = this.axisIndex,
+        i, j;
+
+    if(this.dirty){
+        this.sortList();
+        this.dirty = false;
+    }
+
+    // Look through the list
+    for(i=0; i !== N; i++){
+        var bi = bodies[i];
+
+        for(j=i+1; j < N; j++){
+            var bj = bodies[j];
+
+            if(!this.needBroadphaseCollision(bi,bj)){
+                continue;
+            }
+
+            if(!SAPBroadphase.checkBounds(bi,bj,axisIndex)){
+                break;
+            }
+
+            this.intersectionTest(bi,bj,p1,p2);
+        }
+    }
+};
+
+SAPBroadphase.prototype.sortList = function(){
+    var axisList = this.axisList;
+    var axisIndex = this.axisIndex;
+    var N = axisList.length;
+
+    // Update AABBs
+    for(var i = 0; i!==N; i++){
+        var bi = axisList[i];
+        if(bi.aabbNeedsUpdate){
+            bi.computeAABB();
+        }
+    }
+
+    // Sort the list
+    if(axisIndex === 0){
+        SAPBroadphase.insertionSortX(axisList);
+    } else if(axisIndex === 1){
+        SAPBroadphase.insertionSortY(axisList);
+    } else if(axisIndex === 2){
+        SAPBroadphase.insertionSortZ(axisList);
+    }
+};
+
+/**
+ * Check if the bounds of two bodies overlap, along the given SAP axis.
+ * @static
+ * @method checkBounds
+ * @param  {Body} bi
+ * @param  {Body} bj
+ * @param  {Number} axisIndex
+ * @return {Boolean}
+ */
+SAPBroadphase.checkBounds = function(bi, bj, axisIndex){
+    var biPos;
+    var bjPos;
+
+    if(axisIndex === 0){
+        biPos = bi.position.x;
+        bjPos = bj.position.x;
+    } else if(axisIndex === 1){
+        biPos = bi.position.y;
+        bjPos = bj.position.y;
+    } else if(axisIndex === 2){
+        biPos = bi.position.z;
+        bjPos = bj.position.z;
+    }
+
+    var ri = bi.boundingRadius,
+        rj = bj.boundingRadius,
+        boundA1 = biPos - ri,
+        boundA2 = biPos + ri,
+        boundB1 = bjPos - rj,
+        boundB2 = bjPos + rj;
+
+    return boundB1 < boundA2;
+};
+
+/**
+ * Computes the variance of the body positions and estimates the best
+ * axis to use. Will automatically set property .axisIndex.
+ * @method autoDetectAxis
+ */
+SAPBroadphase.prototype.autoDetectAxis = function(){
+    var sumX=0,
+        sumX2=0,
+        sumY=0,
+        sumY2=0,
+        sumZ=0,
+        sumZ2=0,
+        bodies = this.axisList,
+        N = bodies.length,
+        invN=1/N;
+
+    for(var i=0; i!==N; i++){
+        var b = bodies[i];
+
+        var centerX = b.position.x;
+        sumX += centerX;
+        sumX2 += centerX*centerX;
+
+        var centerY = b.position.y;
+        sumY += centerY;
+        sumY2 += centerY*centerY;
+
+        var centerZ = b.position.z;
+        sumZ += centerZ;
+        sumZ2 += centerZ*centerZ;
+    }
+
+    var varianceX = sumX2 - sumX*sumX*invN,
+        varianceY = sumY2 - sumY*sumY*invN,
+        varianceZ = sumZ2 - sumZ*sumZ*invN;
+
+    if(varianceX > varianceY){
+        if(varianceX > varianceZ){
+            this.axisIndex = 0;
+        } else{
+            this.axisIndex = 2;
+        }
+    } else if(varianceY > varianceZ){
+        this.axisIndex = 1;
+    } else{
+        this.axisIndex = 2;
+    }
+};
+
+/**
+ * Returns all the bodies within an AABB.
+ * @method aabbQuery
+ * @param  {World} world
+ * @param  {AABB} aabb
+ * @param {array} result An array to store resulting bodies in.
+ * @return {array}
+ */
+SAPBroadphase.prototype.aabbQuery = function(world, aabb, result){
+    result = result || [];
+
+    if(this.dirty){
+        this.sortList();
+        this.dirty = false;
+    }
+
+    var axisIndex = this.axisIndex, axis = 'x';
+    if(axisIndex === 1){ axis = 'y'; }
+    if(axisIndex === 2){ axis = 'z'; }
+
+    var axisList = this.axisList;
+    var lower = aabb.lowerBound[axis];
+    var upper = aabb.upperBound[axis];
+    for(var i = 0; i < axisList.length; i++){
+        var b = axisList[i];
+
+        if(b.aabbNeedsUpdate){
+            b.computeAABB();
+        }
+
+        if(b.aabb.overlaps(aabb)){
+            result.push(b);
+        }
+    }
+
+    return result;
+};
+},{"../collision/Broadphase":17,"../shapes/Shape":56}],25:[function(require,module,exports){
+module.exports = ConeTwistConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var ConeEquation = require('../equations/ConeEquation');
+var RotationalEquation = require('../equations/RotationalEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * @class ConeTwistConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Vec3} [options.pivotA]
+ * @param {Vec3} [options.pivotB]
+ * @param {Vec3} [options.axisA]
+ * @param {Vec3} [options.axisB]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function ConeTwistConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    // Set pivot point in between
+    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();
+    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3();
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3();
+
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    this.collideConnected = !!options.collideConnected;
+
+    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;
+
+    /**
+     * @property {ConeEquation} coneEquation
+     */
+    var c = this.coneEquation = new ConeEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} twistEquation
+     */
+    var t = this.twistEquation = new RotationalEquation(bodyA,bodyB,options);
+    this.twistAngle = typeof(options.twistAngle) !== 'undefined' ? options.twistAngle : 0;
+
+    // Make the cone equation push the bodies toward the cone axis, not outward
+    c.maxForce = 0;
+    c.minForce = -maxForce;
+
+    // Make the twist equation add torque toward the initial position
+    t.maxForce = 0;
+    t.minForce = -maxForce;
+
+    this.equations.push(c, t);
+}
+ConeTwistConstraint.prototype = new PointToPointConstraint();
+ConeTwistConstraint.constructor = ConeTwistConstraint;
+
+var ConeTwistConstraint_update_tmpVec1 = new Vec3();
+var ConeTwistConstraint_update_tmpVec2 = new Vec3();
+
+ConeTwistConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        cone = this.coneEquation,
+        twist = this.twistEquation;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // Update the axes to the cone constraint
+    bodyA.vectorToWorldFrame(this.axisA, cone.axisA);
+    bodyB.vectorToWorldFrame(this.axisB, cone.axisB);
+
+    // Update the world axes in the twist constraint
+    this.axisA.tangents(twist.axisA, twist.axisA);
+    bodyA.vectorToWorldFrame(twist.axisA, twist.axisA);
+
+    this.axisB.tangents(twist.axisB, twist.axisB);
+    bodyB.vectorToWorldFrame(twist.axisB, twist.axisB);
+
+    cone.angle = this.angle;
+    twist.maxAngle = this.twistAngle;
+};
+
+
+},{"../equations/ConeEquation":31,"../equations/ContactEquation":32,"../equations/RotationalEquation":35,"../math/Vec3":43,"./Constraint":26,"./PointToPointConstraint":30}],26:[function(require,module,exports){
+module.exports = Constraint;
+
+var Utils = require('../utils/Utils');
+
+/**
+ * Constraint base class
+ * @class Constraint
+ * @author schteppe
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {boolean} [options.collideConnected=true]
+ * @param {boolean} [options.wakeUpBodies=true]
+ */
+function Constraint(bodyA, bodyB, options){
+    options = Utils.defaults(options,{
+        collideConnected : true,
+        wakeUpBodies : true,
+    });
+
+    /**
+     * Equations to be solved in this constraint
+     * @property equations
+     * @type {Array}
+     */
+    this.equations = [];
+
+    /**
+     * @property {Body} bodyA
+     */
+    this.bodyA = bodyA;
+
+    /**
+     * @property {Body} bodyB
+     */
+    this.bodyB = bodyB;
+
+    /**
+     * @property {Number} id
+     */
+    this.id = Constraint.idCounter++;
+
+    /**
+     * Set to true if you want the bodies to collide when they are connected.
+     * @property collideConnected
+     * @type {boolean}
+     */
+    this.collideConnected = options.collideConnected;
+
+    if(options.wakeUpBodies){
+        if(bodyA){
+            bodyA.wakeUp();
+        }
+        if(bodyB){
+            bodyB.wakeUp();
+        }
+    }
+}
+
+/**
+ * Update all the equations with data.
+ * @method update
+ */
+Constraint.prototype.update = function(){
+    throw new Error("method update() not implmemented in this Constraint subclass!");
+};
+
+/**
+ * Enables all equations in the constraint.
+ * @method enable
+ */
+Constraint.prototype.enable = function(){
+    var eqs = this.equations;
+    for(var i=0; i<eqs.length; i++){
+        eqs[i].enabled = true;
+    }
+};
+
+/**
+ * Disables all equations in the constraint.
+ * @method disable
+ */
+Constraint.prototype.disable = function(){
+    var eqs = this.equations;
+    for(var i=0; i<eqs.length; i++){
+        eqs[i].enabled = false;
+    }
+};
+
+Constraint.idCounter = 0;
+
+},{"../utils/Utils":66}],27:[function(require,module,exports){
+module.exports = DistanceConstraint;
+
+var Constraint = require('./Constraint');
+var ContactEquation = require('../equations/ContactEquation');
+
+/**
+ * Constrains two bodies to be at a constant distance from each others center of mass.
+ * @class DistanceConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} [distance] The distance to keep. If undefined, it will be set to the current distance between bodyA and bodyB
+ * @param {Number} [maxForce=1e6]
+ * @extends Constraint
+ */
+function DistanceConstraint(bodyA,bodyB,distance,maxForce){
+    Constraint.call(this,bodyA,bodyB);
+
+    if(typeof(distance)==="undefined") {
+        distance = bodyA.position.distanceTo(bodyB.position);
+    }
+
+    if(typeof(maxForce)==="undefined") {
+        maxForce = 1e6;
+    }
+
+    /**
+     * @property {number} distance
+     */
+    this.distance = distance;
+
+    /**
+     * @property {ContactEquation} distanceEquation
+     */
+    var eq = this.distanceEquation = new ContactEquation(bodyA, bodyB);
+    this.equations.push(eq);
+
+    // Make it bidirectional
+    eq.minForce = -maxForce;
+    eq.maxForce =  maxForce;
+}
+DistanceConstraint.prototype = new Constraint();
+
+DistanceConstraint.prototype.update = function(){
+    var bodyA = this.bodyA;
+    var bodyB = this.bodyB;
+    var eq = this.distanceEquation;
+    var halfDist = this.distance * 0.5;
+    var normal = eq.ni;
+
+    bodyB.position.vsub(bodyA.position, normal);
+    normal.normalize();
+    normal.mult(halfDist, eq.ri);
+    normal.mult(-halfDist, eq.rj);
+};
+},{"../equations/ContactEquation":32,"./Constraint":26}],28:[function(require,module,exports){
+module.exports = HingeConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var RotationalEquation = require('../equations/RotationalEquation');
+var RotationalMotorEquation = require('../equations/RotationalMotorEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Hinge constraint. Think of it as a door hinge. It tries to keep the door in the correct place and with the correct orientation.
+ * @class HingeConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Vec3} [options.pivotA] A point defined locally in bodyA. This defines the offset of axisA.
+ * @param {Vec3} [options.axisA] An axis that bodyA can rotate around, defined locally in bodyA.
+ * @param {Vec3} [options.pivotB]
+ * @param {Vec3} [options.axisB]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function HingeConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+    var pivotA = options.pivotA ? options.pivotA.clone() : new Vec3();
+    var pivotB = options.pivotB ? options.pivotB.clone() : new Vec3();
+
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    /**
+     * Rotation axis, defined locally in bodyA.
+     * @property {Vec3} axisA
+     */
+    var axisA = this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1,0,0);
+    axisA.normalize();
+
+    /**
+     * Rotation axis, defined locally in bodyB.
+     * @property {Vec3} axisB
+     */
+    var axisB = this.axisB = options.axisB ? options.axisB.clone() : new Vec3(1,0,0);
+    axisB.normalize();
+
+    /**
+     * @property {RotationalEquation} rotationalEquation1
+     */
+    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation2
+     */
+    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalMotorEquation} motorEquation
+     */
+    var motor = this.motorEquation = new RotationalMotorEquation(bodyA,bodyB,maxForce);
+    motor.enabled = false; // Not enabled by default
+
+    // Equations to be fed to the solver
+    this.equations.push(
+        r1, // rotational1
+        r2, // rotational2
+        motor
+    );
+}
+HingeConstraint.prototype = new PointToPointConstraint();
+HingeConstraint.constructor = HingeConstraint;
+
+/**
+ * @method enableMotor
+ */
+HingeConstraint.prototype.enableMotor = function(){
+    this.motorEquation.enabled = true;
+};
+
+/**
+ * @method disableMotor
+ */
+HingeConstraint.prototype.disableMotor = function(){
+    this.motorEquation.enabled = false;
+};
+
+/**
+ * @method setMotorSpeed
+ * @param {number} speed
+ */
+HingeConstraint.prototype.setMotorSpeed = function(speed){
+    this.motorEquation.targetVelocity = speed;
+};
+
+/**
+ * @method setMotorMaxForce
+ * @param {number} maxForce
+ */
+HingeConstraint.prototype.setMotorMaxForce = function(maxForce){
+    this.motorEquation.maxForce = maxForce;
+    this.motorEquation.minForce = -maxForce;
+};
+
+var HingeConstraint_update_tmpVec1 = new Vec3();
+var HingeConstraint_update_tmpVec2 = new Vec3();
+
+HingeConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        motor = this.motorEquation,
+        r1 = this.rotationalEquation1,
+        r2 = this.rotationalEquation2,
+        worldAxisA = HingeConstraint_update_tmpVec1,
+        worldAxisB = HingeConstraint_update_tmpVec2;
+
+    var axisA = this.axisA;
+    var axisB = this.axisB;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // Get world axes
+    bodyA.quaternion.vmult(axisA, worldAxisA);
+    bodyB.quaternion.vmult(axisB, worldAxisB);
+
+    worldAxisA.tangents(r1.axisA, r2.axisA);
+    r1.axisB.copy(worldAxisB);
+    r2.axisB.copy(worldAxisB);
+
+    if(this.motorEquation.enabled){
+        bodyA.quaternion.vmult(this.axisA, motor.axisA);
+        bodyB.quaternion.vmult(this.axisB, motor.axisB);
+    }
+};
+
+
+},{"../equations/ContactEquation":32,"../equations/RotationalEquation":35,"../equations/RotationalMotorEquation":36,"../math/Vec3":43,"./Constraint":26,"./PointToPointConstraint":30}],29:[function(require,module,exports){
+module.exports = LockConstraint;
+
+var Constraint = require('./Constraint');
+var PointToPointConstraint = require('./PointToPointConstraint');
+var RotationalEquation = require('../equations/RotationalEquation');
+var RotationalMotorEquation = require('../equations/RotationalMotorEquation');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Lock constraint. Will remove all degrees of freedom between the bodies.
+ * @class LockConstraint
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {object} [options]
+ * @param {Number} [options.maxForce=1e6]
+ * @extends PointToPointConstraint
+ */
+function LockConstraint(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    // Set pivot point in between
+    var pivotA = new Vec3();
+    var pivotB = new Vec3();
+    var halfWay = new Vec3();
+    bodyA.position.vadd(bodyB.position, halfWay);
+    halfWay.scale(0.5, halfWay);
+    bodyB.pointToLocalFrame(halfWay, pivotB);
+    bodyA.pointToLocalFrame(halfWay, pivotA);
+
+    // The point-to-point constraint will keep a point shared between the bodies
+    PointToPointConstraint.call(this, bodyA, pivotA, bodyB, pivotB, maxForce);
+
+    // Store initial rotation of the bodies as unit vectors in the local body spaces
+    this.xA = bodyA.vectorToLocalFrame(Vec3.UNIT_X);
+    this.xB = bodyB.vectorToLocalFrame(Vec3.UNIT_X);
+    this.yA = bodyA.vectorToLocalFrame(Vec3.UNIT_Y);
+    this.yB = bodyB.vectorToLocalFrame(Vec3.UNIT_Y);
+    this.zA = bodyA.vectorToLocalFrame(Vec3.UNIT_Z);
+    this.zB = bodyB.vectorToLocalFrame(Vec3.UNIT_Z);
+
+    // ...and the following rotational equations will keep all rotational DOF's in place
+
+    /**
+     * @property {RotationalEquation} rotationalEquation1
+     */
+    var r1 = this.rotationalEquation1 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation2
+     */
+    var r2 = this.rotationalEquation2 = new RotationalEquation(bodyA,bodyB,options);
+
+    /**
+     * @property {RotationalEquation} rotationalEquation3
+     */
+    var r3 = this.rotationalEquation3 = new RotationalEquation(bodyA,bodyB,options);
+
+    this.equations.push(r1, r2, r3);
+}
+LockConstraint.prototype = new PointToPointConstraint();
+LockConstraint.constructor = LockConstraint;
+
+var LockConstraint_update_tmpVec1 = new Vec3();
+var LockConstraint_update_tmpVec2 = new Vec3();
+
+LockConstraint.prototype.update = function(){
+    var bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        motor = this.motorEquation,
+        r1 = this.rotationalEquation1,
+        r2 = this.rotationalEquation2,
+        r3 = this.rotationalEquation3,
+        worldAxisA = LockConstraint_update_tmpVec1,
+        worldAxisB = LockConstraint_update_tmpVec2;
+
+    PointToPointConstraint.prototype.update.call(this);
+
+    // These vector pairs must be orthogonal
+    bodyA.vectorToWorldFrame(this.xA, r1.axisA);
+    bodyB.vectorToWorldFrame(this.yB, r1.axisB);
+
+    bodyA.vectorToWorldFrame(this.yA, r2.axisA);
+    bodyB.vectorToWorldFrame(this.zB, r2.axisB);
+
+    bodyA.vectorToWorldFrame(this.zA, r3.axisA);
+    bodyB.vectorToWorldFrame(this.xB, r3.axisB);
+};
+
+
+},{"../equations/ContactEquation":32,"../equations/RotationalEquation":35,"../equations/RotationalMotorEquation":36,"../math/Vec3":43,"./Constraint":26,"./PointToPointConstraint":30}],30:[function(require,module,exports){
+module.exports = PointToPointConstraint;
+
+var Constraint = require('./Constraint');
+var ContactEquation = require('../equations/ContactEquation');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Connects two bodies at given offset points.
+ * @class PointToPointConstraint
+ * @extends Constraint
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Vec3} pivotA The point relative to the center of mass of bodyA which bodyA is constrained to.
+ * @param {Body} bodyB Body that will be constrained in a similar way to the same point as bodyA. We will therefore get a link between bodyA and bodyB. If not specified, bodyA will be constrained to a static point.
+ * @param {Vec3} pivotB See pivotA.
+ * @param {Number} maxForce The maximum force that should be applied to constrain the bodies.
+ *
+ * @example
+ *     var bodyA = new Body({ mass: 1 });
+ *     var bodyB = new Body({ mass: 1 });
+ *     bodyA.position.set(-1, 0, 0);
+ *     bodyB.position.set(1, 0, 0);
+ *     bodyA.addShape(shapeA);
+ *     bodyB.addShape(shapeB);
+ *     world.addBody(bodyA);
+ *     world.addBody(bodyB);
+ *     var localPivotA = new Vec3(1, 0, 0);
+ *     var localPivotB = new Vec3(-1, 0, 0);
+ *     var constraint = new PointToPointConstraint(bodyA, localPivotA, bodyB, localPivotB);
+ *     world.addConstraint(constraint);
+ */
+function PointToPointConstraint(bodyA,pivotA,bodyB,pivotB,maxForce){
+    Constraint.call(this,bodyA,bodyB);
+
+    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;
+
+    /**
+     * Pivot, defined locally in bodyA.
+     * @property {Vec3} pivotA
+     */
+    this.pivotA = pivotA ? pivotA.clone() : new Vec3();
+
+    /**
+     * Pivot, defined locally in bodyB.
+     * @property {Vec3} pivotB
+     */
+    this.pivotB = pivotB ? pivotB.clone() : new Vec3();
+
+    /**
+     * @property {ContactEquation} equationX
+     */
+    var x = this.equationX = new ContactEquation(bodyA,bodyB);
+
+    /**
+     * @property {ContactEquation} equationY
+     */
+    var y = this.equationY = new ContactEquation(bodyA,bodyB);
+
+    /**
+     * @property {ContactEquation} equationZ
+     */
+    var z = this.equationZ = new ContactEquation(bodyA,bodyB);
+
+    // Equations to be fed to the solver
+    this.equations.push(x, y, z);
+
+    // Make the equations bidirectional
+    x.minForce = y.minForce = z.minForce = -maxForce;
+    x.maxForce = y.maxForce = z.maxForce =  maxForce;
+
+    x.ni.set(1, 0, 0);
+    y.ni.set(0, 1, 0);
+    z.ni.set(0, 0, 1);
+}
+PointToPointConstraint.prototype = new Constraint();
+
+PointToPointConstraint.prototype.update = function(){
+    var bodyA = this.bodyA;
+    var bodyB = this.bodyB;
+    var x = this.equationX;
+    var y = this.equationY;
+    var z = this.equationZ;
+
+    // Rotate the pivots to world space
+    bodyA.quaternion.vmult(this.pivotA,x.ri);
+    bodyB.quaternion.vmult(this.pivotB,x.rj);
+
+    y.ri.copy(x.ri);
+    y.rj.copy(x.rj);
+    z.ri.copy(x.ri);
+    z.rj.copy(x.rj);
+};
+},{"../equations/ContactEquation":32,"../math/Vec3":43,"./Constraint":26}],31:[function(require,module,exports){
+module.exports = ConeEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Cone equation. Works to keep the given body world vectors aligned, or tilted within a given angle from each other.
+ * @class ConeEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Vec3} [options.axisA] Local axis in A
+ * @param {Vec3} [options.axisB] Local axis in B
+ * @param {Vec3} [options.angle] The "cone angle" to keep
+ * @param {number} [options.maxForce=1e6]
+ * @extends Equation
+ */
+function ConeEquation(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);
+
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);
+
+    /**
+     * The cone angle to keep
+     * @property {number} angle
+     */
+    this.angle = typeof(options.angle) !== 'undefined' ? options.angle : 0;
+}
+
+ConeEquation.prototype = new Equation();
+ConeEquation.prototype.constructor = ConeEquation;
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+
+ConeEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+
+        ni = this.axisA,
+        nj = this.axisB,
+
+        nixnj = tmpVec1,
+        njxni = tmpVec2,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // Caluclate cross products
+    ni.cross(nj, nixnj);
+    nj.cross(ni, njxni);
+
+    // The angle between two vector is:
+    // cos(theta) = a * b / (length(a) * length(b) = { len(a) = len(b) = 1 } = a * b
+
+    // g = a * b
+    // gdot = (b x a) * wi + (a x b) * wj
+    // G = [0 bxa 0 axb]
+    // W = [vi wi vj wj]
+    GA.rotational.copy(njxni);
+    GB.rotational.copy(nixnj);
+
+    var g = Math.cos(this.angle) - ni.dot(nj),
+        GW = this.computeGW(),
+        GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h * GiMf;
+
+    return B;
+};
+
+
+},{"../math/Mat3":40,"../math/Vec3":43,"./Equation":33}],32:[function(require,module,exports){
+module.exports = ContactEquation;
+
+var Equation = require('./Equation');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+
+/**
+ * Contact/non-penetration constraint equation
+ * @class ContactEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @extends Equation
+ */
+function ContactEquation(bodyA, bodyB, maxForce){
+    maxForce = typeof(maxForce) !== 'undefined' ? maxForce : 1e6;
+    Equation.call(this, bodyA, bodyB, 0, maxForce);
+
+    /**
+     * @property restitution
+     * @type {Number}
+     */
+    this.restitution = 0.0; // "bounciness": u1 = -e*u0
+
+    /**
+     * World-oriented vector that goes from the center of bi to the contact point.
+     * @property {Vec3} ri
+     */
+    this.ri = new Vec3();
+
+    /**
+     * World-oriented vector that starts in body j position and goes to the contact point.
+     * @property {Vec3} rj
+     */
+    this.rj = new Vec3();
+
+    /**
+     * Contact normal, pointing out of body i.
+     * @property {Vec3} ni
+     */
+    this.ni = new Vec3();
+}
+
+ContactEquation.prototype = new Equation();
+ContactEquation.prototype.constructor = ContactEquation;
+
+var ContactEquation_computeB_temp1 = new Vec3(); // Temp vectors
+var ContactEquation_computeB_temp2 = new Vec3();
+var ContactEquation_computeB_temp3 = new Vec3();
+ContactEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+        ri = this.ri,
+        rj = this.rj,
+        rixn = ContactEquation_computeB_temp1,
+        rjxn = ContactEquation_computeB_temp2,
+
+        vi = bi.velocity,
+        wi = bi.angularVelocity,
+        fi = bi.force,
+        taui = bi.torque,
+
+        vj = bj.velocity,
+        wj = bj.angularVelocity,
+        fj = bj.force,
+        tauj = bj.torque,
+
+        penetrationVec = ContactEquation_computeB_temp3,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+
+        n = this.ni;
+
+    // Caluclate cross products
+    ri.cross(n,rixn);
+    rj.cross(n,rjxn);
+
+    // g = xj+rj -(xi+ri)
+    // G = [ -ni  -rixn  ni  rjxn ]
+    n.negate(GA.spatial);
+    rixn.negate(GA.rotational);
+    GB.spatial.copy(n);
+    GB.rotational.copy(rjxn);
+
+    // Calculate the penetration vector
+    penetrationVec.copy(bj.position);
+    penetrationVec.vadd(rj,penetrationVec);
+    penetrationVec.vsub(bi.position,penetrationVec);
+    penetrationVec.vsub(ri,penetrationVec);
+
+    var g = n.dot(penetrationVec);
+
+    // Compute iteration
+    var ePlusOne = this.restitution + 1;
+    var GW = ePlusOne * vj.dot(n) - ePlusOne * vi.dot(n) + wj.dot(rjxn) - wi.dot(rixn);
+    var GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h*GiMf;
+
+    return B;
+};
+
+var ContactEquation_getImpactVelocityAlongNormal_vi = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_vj = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_xi = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_xj = new Vec3();
+var ContactEquation_getImpactVelocityAlongNormal_relVel = new Vec3();
+
+/**
+ * Get the current relative velocity in the contact point.
+ * @method getImpactVelocityAlongNormal
+ * @return {number}
+ */
+ContactEquation.prototype.getImpactVelocityAlongNormal = function(){
+    var vi = ContactEquation_getImpactVelocityAlongNormal_vi;
+    var vj = ContactEquation_getImpactVelocityAlongNormal_vj;
+    var xi = ContactEquation_getImpactVelocityAlongNormal_xi;
+    var xj = ContactEquation_getImpactVelocityAlongNormal_xj;
+    var relVel = ContactEquation_getImpactVelocityAlongNormal_relVel;
+
+    this.bi.position.vadd(this.ri, xi);
+    this.bj.position.vadd(this.rj, xj);
+
+    this.bi.getVelocityAtWorldPoint(xi, vi);
+    this.bj.getVelocityAtWorldPoint(xj, vj);
+
+    vi.vsub(vj, relVel);
+
+    return this.ni.dot(relVel);
+};
+
+
+},{"../math/Mat3":40,"../math/Vec3":43,"./Equation":33}],33:[function(require,module,exports){
+module.exports = Equation;
+
+var JacobianElement = require('../math/JacobianElement'),
+    Vec3 = require('../math/Vec3');
+
+/**
+ * Equation base class
+ * @class Equation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bi
+ * @param {Body} bj
+ * @param {Number} minForce Minimum (read: negative max) force to be applied by the constraint.
+ * @param {Number} maxForce Maximum (read: positive max) force to be applied by the constraint.
+ */
+function Equation(bi,bj,minForce,maxForce){
+    this.id = Equation.id++;
+
+    /**
+     * @property {number} minForce
+     */
+    this.minForce = typeof(minForce)==="undefined" ? -1e6 : minForce;
+
+    /**
+     * @property {number} maxForce
+     */
+    this.maxForce = typeof(maxForce)==="undefined" ? 1e6 : maxForce;
+
+    /**
+     * @property bi
+     * @type {Body}
+     */
+    this.bi = bi;
+
+    /**
+     * @property bj
+     * @type {Body}
+     */
+    this.bj = bj;
+
+    /**
+     * SPOOK parameter
+     * @property {number} a
+     */
+    this.a = 0.0;
+
+    /**
+     * SPOOK parameter
+     * @property {number} b
+     */
+    this.b = 0.0;
+
+    /**
+     * SPOOK parameter
+     * @property {number} eps
+     */
+    this.eps = 0.0;
+
+    /**
+     * @property {JacobianElement} jacobianElementA
+     */
+    this.jacobianElementA = new JacobianElement();
+
+    /**
+     * @property {JacobianElement} jacobianElementB
+     */
+    this.jacobianElementB = new JacobianElement();
+
+    /**
+     * @property {boolean} enabled
+     * @default true
+     */
+    this.enabled = true;
+
+    /**
+     * A number, proportional to the force added to the bodies.
+     * @property {number} multiplier
+     * @readonly
+     */
+    this.multiplier = 0;
+
+    // Set typical spook params
+    this.setSpookParams(1e7,4,1/60);
+}
+Equation.prototype.constructor = Equation;
+
+Equation.id = 0;
+
+/**
+ * Recalculates a,b,eps.
+ * @method setSpookParams
+ */
+Equation.prototype.setSpookParams = function(stiffness,relaxation,timeStep){
+    var d = relaxation,
+        k = stiffness,
+        h = timeStep;
+    this.a = 4.0 / (h * (1 + 4 * d));
+    this.b = (4.0 * d) / (1 + 4 * d);
+    this.eps = 4.0 / (h * h * k * (1 + 4 * d));
+};
+
+/**
+ * Computes the RHS of the SPOOK equation
+ * @method computeB
+ * @return {Number}
+ */
+Equation.prototype.computeB = function(a,b,h){
+    var GW = this.computeGW(),
+        Gq = this.computeGq(),
+        GiMf = this.computeGiMf();
+    return - Gq * a - GW * b - GiMf*h;
+};
+
+/**
+ * Computes G*q, where q are the generalized body coordinates
+ * @method computeGq
+ * @return {Number}
+ */
+Equation.prototype.computeGq = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        xi = bi.position,
+        xj = bj.position;
+    return GA.spatial.dot(xi) + GB.spatial.dot(xj);
+};
+
+var zero = new Vec3();
+
+/**
+ * Computes G*W, where W are the body velocities
+ * @method computeGW
+ * @return {Number}
+ */
+Equation.prototype.computeGW = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        vi = bi.velocity,
+        vj = bj.velocity,
+        wi = bi.angularVelocity,
+        wj = bj.angularVelocity;
+    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);
+};
+
+
+/**
+ * Computes G*Wlambda, where W are the body velocities
+ * @method computeGWlambda
+ * @return {Number}
+ */
+Equation.prototype.computeGWlambda = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        vi = bi.vlambda,
+        vj = bj.vlambda,
+        wi = bi.wlambda,
+        wj = bj.wlambda;
+    return GA.multiplyVectors(vi,wi) + GB.multiplyVectors(vj,wj);
+};
+
+/**
+ * Computes G*inv(M)*f, where M is the mass matrix with diagonal blocks for each body, and f are the forces on the bodies.
+ * @method computeGiMf
+ * @return {Number}
+ */
+var iMfi = new Vec3(),
+    iMfj = new Vec3(),
+    invIi_vmult_taui = new Vec3(),
+    invIj_vmult_tauj = new Vec3();
+Equation.prototype.computeGiMf = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        fi = bi.force,
+        ti = bi.torque,
+        fj = bj.force,
+        tj = bj.torque,
+        invMassi = bi.invMassSolve,
+        invMassj = bj.invMassSolve;
+
+    fi.scale(invMassi,iMfi);
+    fj.scale(invMassj,iMfj);
+
+    bi.invInertiaWorldSolve.vmult(ti,invIi_vmult_taui);
+    bj.invInertiaWorldSolve.vmult(tj,invIj_vmult_tauj);
+
+    return GA.multiplyVectors(iMfi,invIi_vmult_taui) + GB.multiplyVectors(iMfj,invIj_vmult_tauj);
+};
+
+/**
+ * Computes G*inv(M)*G'
+ * @method computeGiMGt
+ * @return {Number}
+ */
+var tmp = new Vec3();
+Equation.prototype.computeGiMGt = function(){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        invMassi = bi.invMassSolve,
+        invMassj = bj.invMassSolve,
+        invIi = bi.invInertiaWorldSolve,
+        invIj = bj.invInertiaWorldSolve,
+        result = invMassi + invMassj;
+
+    invIi.vmult(GA.rotational,tmp);
+    result += tmp.dot(GA.rotational);
+
+    invIj.vmult(GB.rotational,tmp);
+    result += tmp.dot(GB.rotational);
+
+    return  result;
+};
+
+var addToWlambda_temp = new Vec3(),
+    addToWlambda_Gi = new Vec3(),
+    addToWlambda_Gj = new Vec3(),
+    addToWlambda_ri = new Vec3(),
+    addToWlambda_rj = new Vec3(),
+    addToWlambda_Mdiag = new Vec3();
+
+/**
+ * Add constraint velocity to the bodies.
+ * @method addToWlambda
+ * @param {Number} deltalambda
+ */
+Equation.prototype.addToWlambda = function(deltalambda){
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB,
+        bi = this.bi,
+        bj = this.bj,
+        temp = addToWlambda_temp;
+
+    // Add to linear velocity
+    // v_lambda += inv(M) * delta_lamba * G
+    bi.vlambda.addScaledVector(bi.invMassSolve * deltalambda, GA.spatial, bi.vlambda);
+    bj.vlambda.addScaledVector(bj.invMassSolve * deltalambda, GB.spatial, bj.vlambda);
+
+    // Add to angular velocity
+    bi.invInertiaWorldSolve.vmult(GA.rotational,temp);
+    bi.wlambda.addScaledVector(deltalambda, temp, bi.wlambda);
+
+    bj.invInertiaWorldSolve.vmult(GB.rotational,temp);
+    bj.wlambda.addScaledVector(deltalambda, temp, bj.wlambda);
+};
+
+/**
+ * Compute the denominator part of the SPOOK equation: C = G*inv(M)*G' + eps
+ * @method computeInvC
+ * @param  {Number} eps
+ * @return {Number}
+ */
+Equation.prototype.computeC = function(){
+    return this.computeGiMGt() + this.eps;
+};
+
+},{"../math/JacobianElement":39,"../math/Vec3":43}],34:[function(require,module,exports){
+module.exports = FrictionEquation;
+
+var Equation = require('./Equation');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+
+/**
+ * Constrains the slipping in a contact along a tangent
+ * @class FrictionEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} slipForce should be +-F_friction = +-mu * F_normal = +-mu * m * g
+ * @extends Equation
+ */
+function FrictionEquation(bodyA, bodyB, slipForce){
+    Equation.call(this,bodyA, bodyB, -slipForce, slipForce);
+    this.ri = new Vec3();
+    this.rj = new Vec3();
+    this.t = new Vec3(); // tangent
+}
+
+FrictionEquation.prototype = new Equation();
+FrictionEquation.prototype.constructor = FrictionEquation;
+
+var FrictionEquation_computeB_temp1 = new Vec3();
+var FrictionEquation_computeB_temp2 = new Vec3();
+FrictionEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+        ri = this.ri,
+        rj = this.rj,
+        rixt = FrictionEquation_computeB_temp1,
+        rjxt = FrictionEquation_computeB_temp2,
+        t = this.t;
+
+    // Caluclate cross products
+    ri.cross(t,rixt);
+    rj.cross(t,rjxt);
+
+    // G = [-t -rixt t rjxt]
+    // And remember, this is a pure velocity constraint, g is always zero!
+    var GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+    t.negate(GA.spatial);
+    rixt.negate(GA.rotational);
+    GB.spatial.copy(t);
+    GB.rotational.copy(rjxt);
+
+    var GW = this.computeGW();
+    var GiMf = this.computeGiMf();
+
+    var B = - GW * b - h * GiMf;
+
+    return B;
+};
+
+},{"../math/Mat3":40,"../math/Vec3":43,"./Equation":33}],35:[function(require,module,exports){
+module.exports = RotationalEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Rotational constraint. Works to keep the local vectors orthogonal to each other in world space.
+ * @class RotationalEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Vec3} [options.axisA]
+ * @param {Vec3} [options.axisB]
+ * @param {number} [options.maxForce]
+ * @extends Equation
+ */
+function RotationalEquation(bodyA, bodyB, options){
+    options = options || {};
+    var maxForce = typeof(options.maxForce) !== 'undefined' ? options.maxForce : 1e6;
+
+    Equation.call(this,bodyA,bodyB,-maxForce, maxForce);
+
+    this.axisA = options.axisA ? options.axisA.clone() : new Vec3(1, 0, 0);
+    this.axisB = options.axisB ? options.axisB.clone() : new Vec3(0, 1, 0);
+
+    this.maxAngle = Math.PI / 2;
+}
+
+RotationalEquation.prototype = new Equation();
+RotationalEquation.prototype.constructor = RotationalEquation;
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+
+RotationalEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+
+        ni = this.axisA,
+        nj = this.axisB,
+
+        nixnj = tmpVec1,
+        njxni = tmpVec2,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // Caluclate cross products
+    ni.cross(nj, nixnj);
+    nj.cross(ni, njxni);
+
+    // g = ni * nj
+    // gdot = (nj x ni) * wi + (ni x nj) * wj
+    // G = [0 njxni 0 nixnj]
+    // W = [vi wi vj wj]
+    GA.rotational.copy(njxni);
+    GB.rotational.copy(nixnj);
+
+    var g = Math.cos(this.maxAngle) - ni.dot(nj),
+        GW = this.computeGW(),
+        GiMf = this.computeGiMf();
+
+    var B = - g * a - GW * b - h * GiMf;
+
+    return B;
+};
+
+
+},{"../math/Mat3":40,"../math/Vec3":43,"./Equation":33}],36:[function(require,module,exports){
+module.exports = RotationalMotorEquation;
+
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Equation = require('./Equation');
+
+/**
+ * Rotational motor constraint. Tries to keep the relative angular velocity of the bodies to a given value.
+ * @class RotationalMotorEquation
+ * @constructor
+ * @author schteppe
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Number} maxForce
+ * @extends Equation
+ */
+function RotationalMotorEquation(bodyA, bodyB, maxForce){
+    maxForce = typeof(maxForce)!=='undefined' ? maxForce : 1e6;
+    Equation.call(this,bodyA,bodyB,-maxForce,maxForce);
+
+    /**
+     * World oriented rotational axis
+     * @property {Vec3} axisA
+     */
+    this.axisA = new Vec3();
+
+    /**
+     * World oriented rotational axis
+     * @property {Vec3} axisB
+     */
+    this.axisB = new Vec3(); // World oriented rotational axis
+
+    /**
+     * Motor velocity
+     * @property {Number} targetVelocity
+     */
+    this.targetVelocity = 0;
+}
+
+RotationalMotorEquation.prototype = new Equation();
+RotationalMotorEquation.prototype.constructor = RotationalMotorEquation;
+
+RotationalMotorEquation.prototype.computeB = function(h){
+    var a = this.a,
+        b = this.b,
+        bi = this.bi,
+        bj = this.bj,
+
+        axisA = this.axisA,
+        axisB = this.axisB,
+
+        GA = this.jacobianElementA,
+        GB = this.jacobianElementB;
+
+    // g = 0
+    // gdot = axisA * wi - axisB * wj
+    // gdot = G * W = G * [vi wi vj wj]
+    // =>
+    // G = [0 axisA 0 -axisB]
+
+    GA.rotational.copy(axisA);
+    axisB.negate(GB.rotational);
+
+    var GW = this.computeGW() - this.targetVelocity,
+        GiMf = this.computeGiMf();
+
+    var B = - GW * b - h * GiMf;
+
+    return B;
+};
+
+},{"../math/Mat3":40,"../math/Vec3":43,"./Equation":33}],37:[function(require,module,exports){
+var Utils = require('../utils/Utils');
+
+module.exports = ContactMaterial;
+
+/**
+ * Defines what happens when two materials meet.
+ * @class ContactMaterial
+ * @constructor
+ * @param {Material} m1
+ * @param {Material} m2
+ * @param {object} [options]
+ * @param {Number} [options.friction=0.3]
+ * @param {Number} [options.restitution=0.3]
+ * @param {number} [options.contactEquationStiffness=1e7]
+ * @param {number} [options.contactEquationRelaxation=3]
+ * @param {number} [options.frictionEquationStiffness=1e7]
+ * @param {Number} [options.frictionEquationRelaxation=3]
+ */
+function ContactMaterial(m1, m2, options){
+    options = Utils.defaults(options, {
+        friction: 0.3,
+        restitution: 0.3,
+        contactEquationStiffness: 1e7,
+        contactEquationRelaxation: 3,
+        frictionEquationStiffness: 1e7,
+        frictionEquationRelaxation: 3
+    });
+
+    /**
+     * Identifier of this material
+     * @property {Number} id
+     */
+    this.id = ContactMaterial.idCounter++;
+
+    /**
+     * Participating materials
+     * @property {Array} materials
+     * @todo  Should be .materialA and .materialB instead
+     */
+    this.materials = [m1, m2];
+
+    /**
+     * Friction coefficient
+     * @property {Number} friction
+     */
+    this.friction = options.friction;
+
+    /**
+     * Restitution coefficient
+     * @property {Number} restitution
+     */
+    this.restitution = options.restitution;
+
+    /**
+     * Stiffness of the produced contact equations
+     * @property {Number} contactEquationStiffness
+     */
+    this.contactEquationStiffness = options.contactEquationStiffness;
+
+    /**
+     * Relaxation time of the produced contact equations
+     * @property {Number} contactEquationRelaxation
+     */
+    this.contactEquationRelaxation = options.contactEquationRelaxation;
+
+    /**
+     * Stiffness of the produced friction equations
+     * @property {Number} frictionEquationStiffness
+     */
+    this.frictionEquationStiffness = options.frictionEquationStiffness;
+
+    /**
+     * Relaxation time of the produced friction equations
+     * @property {Number} frictionEquationRelaxation
+     */
+    this.frictionEquationRelaxation = options.frictionEquationRelaxation;
+}
+
+ContactMaterial.idCounter = 0;
+
+},{"../utils/Utils":66}],38:[function(require,module,exports){
+module.exports = Material;
+
+/**
+ * Defines a physics material.
+ * @class Material
+ * @constructor
+ * @param {object} [options]
+ * @author schteppe
+ */
+function Material(options){
+    var name = '';
+    options = options || {};
+
+    // Backwards compatibility fix
+    if(typeof(options) === 'string'){
+        name = options;
+        options = {};
+    } else if(typeof(options) === 'object') {
+        name = '';
+    }
+
+    /**
+     * @property name
+     * @type {String}
+     */
+    this.name = name;
+
+    /**
+     * material id.
+     * @property id
+     * @type {number}
+     */
+    this.id = Material.idCounter++;
+
+    /**
+     * Friction for this material. If non-negative, it will be used instead of the friction given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.
+     * @property {number} friction
+     */
+    this.friction = typeof(options.friction) !== 'undefined' ? options.friction : -1;
+
+    /**
+     * Restitution for this material. If non-negative, it will be used instead of the restitution given by ContactMaterials. If there's no matching ContactMaterial, the value from .defaultContactMaterial in the World will be used.
+     * @property {number} restitution
+     */
+    this.restitution = typeof(options.restitution) !== 'undefined' ? options.restitution : -1;
+}
+
+Material.idCounter = 0;
+
+},{}],39:[function(require,module,exports){
+module.exports = JacobianElement;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * An element containing 6 entries, 3 spatial and 3 rotational degrees of freedom.
+ * @class JacobianElement
+ * @constructor
+ */
+function JacobianElement(){
+
+    /**
+     * @property {Vec3} spatial
+     */
+    this.spatial = new Vec3();
+
+    /**
+     * @property {Vec3} rotational
+     */
+    this.rotational = new Vec3();
+}
+
+/**
+ * Multiply with other JacobianElement
+ * @method multiplyElement
+ * @param  {JacobianElement} element
+ * @return {Number}
+ */
+JacobianElement.prototype.multiplyElement = function(element){
+    return element.spatial.dot(this.spatial) + element.rotational.dot(this.rotational);
+};
+
+/**
+ * Multiply with two vectors
+ * @method multiplyVectors
+ * @param  {Vec3} spatial
+ * @param  {Vec3} rotational
+ * @return {Number}
+ */
+JacobianElement.prototype.multiplyVectors = function(spatial,rotational){
+    return spatial.dot(this.spatial) + rotational.dot(this.rotational);
+};
+
+},{"./Vec3":43}],40:[function(require,module,exports){
+module.exports = Mat3;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * A 3x3 matrix.
+ * @class Mat3
+ * @constructor
+ * @param array elements Array of nine elements. Optional.
+ * @author schteppe / http://github.com/schteppe
+ */
+function Mat3(elements){
+    /**
+     * A vector of length 9, containing all matrix elements
+     * @property {Array} elements
+     */
+    if(elements){
+        this.elements = elements;
+    } else {
+        this.elements = [0,0,0,0,0,0,0,0,0];
+    }
+}
+
+/**
+ * Sets the matrix to identity
+ * @method identity
+ * @todo Should perhaps be renamed to setIdentity() to be more clear.
+ * @todo Create another function that immediately creates an identity matrix eg. eye()
+ */
+Mat3.prototype.identity = function(){
+    var e = this.elements;
+    e[0] = 1;
+    e[1] = 0;
+    e[2] = 0;
+
+    e[3] = 0;
+    e[4] = 1;
+    e[5] = 0;
+
+    e[6] = 0;
+    e[7] = 0;
+    e[8] = 1;
+};
+
+/**
+ * Set all elements to zero
+ * @method setZero
+ */
+Mat3.prototype.setZero = function(){
+    var e = this.elements;
+    e[0] = 0;
+    e[1] = 0;
+    e[2] = 0;
+    e[3] = 0;
+    e[4] = 0;
+    e[5] = 0;
+    e[6] = 0;
+    e[7] = 0;
+    e[8] = 0;
+};
+
+/**
+ * Sets the matrix diagonal elements from a Vec3
+ * @method setTrace
+ * @param {Vec3} vec3
+ */
+Mat3.prototype.setTrace = function(vec3){
+    var e = this.elements;
+    e[0] = vec3.x;
+    e[4] = vec3.y;
+    e[8] = vec3.z;
+};
+
+/**
+ * Gets the matrix diagonal elements
+ * @method getTrace
+ * @return {Vec3}
+ */
+Mat3.prototype.getTrace = function(target){
+    var target = target || new Vec3();
+    var e = this.elements;
+    target.x = e[0];
+    target.y = e[4];
+    target.z = e[8];
+};
+
+/**
+ * Matrix-Vector multiplication
+ * @method vmult
+ * @param {Vec3} v The vector to multiply with
+ * @param {Vec3} target Optional, target to save the result in.
+ */
+Mat3.prototype.vmult = function(v,target){
+    target = target || new Vec3();
+
+    var e = this.elements,
+        x = v.x,
+        y = v.y,
+        z = v.z;
+    target.x = e[0]*x + e[1]*y + e[2]*z;
+    target.y = e[3]*x + e[4]*y + e[5]*z;
+    target.z = e[6]*x + e[7]*y + e[8]*z;
+
+    return target;
+};
+
+/**
+ * Matrix-scalar multiplication
+ * @method smult
+ * @param {Number} s
+ */
+Mat3.prototype.smult = function(s){
+    for(var i=0; i<this.elements.length; i++){
+        this.elements[i] *= s;
+    }
+};
+
+/**
+ * Matrix multiplication
+ * @method mmult
+ * @param {Mat3} m Matrix to multiply with from left side.
+ * @return {Mat3} The result.
+ */
+Mat3.prototype.mmult = function(m,target){
+    var r = target || new Mat3();
+    for(var i=0; i<3; i++){
+        for(var j=0; j<3; j++){
+            var sum = 0.0;
+            for(var k=0; k<3; k++){
+                sum += m.elements[i+k*3] * this.elements[k+j*3];
+            }
+            r.elements[i+j*3] = sum;
+        }
+    }
+    return r;
+};
+
+/**
+ * Scale each column of the matrix
+ * @method scale
+ * @param {Vec3} v
+ * @return {Mat3} The result.
+ */
+Mat3.prototype.scale = function(v,target){
+    target = target || new Mat3();
+    var e = this.elements,
+        t = target.elements;
+    for(var i=0; i!==3; i++){
+        t[3*i + 0] = v.x * e[3*i + 0];
+        t[3*i + 1] = v.y * e[3*i + 1];
+        t[3*i + 2] = v.z * e[3*i + 2];
+    }
+    return target;
+};
+
+/**
+ * Solve Ax=b
+ * @method solve
+ * @param {Vec3} b The right hand side
+ * @param {Vec3} target Optional. Target vector to save in.
+ * @return {Vec3} The solution x
+ * @todo should reuse arrays
+ */
+Mat3.prototype.solve = function(b,target){
+    target = target || new Vec3();
+
+    // Construct equations
+    var nr = 3; // num rows
+    var nc = 4; // num cols
+    var eqns = [];
+    for(var i=0; i<nr*nc; i++){
+        eqns.push(0);
+    }
+    var i,j;
+    for(i=0; i<3; i++){
+        for(j=0; j<3; j++){
+            eqns[i+nc*j] = this.elements[i+3*j];
+        }
+    }
+    eqns[3+4*0] = b.x;
+    eqns[3+4*1] = b.y;
+    eqns[3+4*2] = b.z;
+
+    // Compute right upper triangular version of the matrix - Gauss elimination
+    var n = 3, k = n, np;
+    var kp = 4; // num rows
+    var p, els;
+    do {
+        i = k - n;
+        if (eqns[i+nc*i] === 0) {
+            // the pivot is null, swap lines
+            for (j = i + 1; j < k; j++) {
+                if (eqns[i+nc*j] !== 0) {
+                    np = kp;
+                    do {  // do ligne( i ) = ligne( i ) + ligne( k )
+                        p = kp - np;
+                        eqns[p+nc*i] += eqns[p+nc*j];
+                    } while (--np);
+                    break;
+                }
+            }
+        }
+        if (eqns[i+nc*i] !== 0) {
+            for (j = i + 1; j < k; j++) {
+                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+                np = kp;
+                do {  // do ligne( k ) = ligne( k ) - multiplier * ligne( i )
+                    p = kp - np;
+                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+                } while (--np);
+            }
+        }
+    } while (--n);
+
+    // Get the solution
+    target.z = eqns[2*nc+3] / eqns[2*nc+2];
+    target.y = (eqns[1*nc+3] - eqns[1*nc+2]*target.z) / eqns[1*nc+1];
+    target.x = (eqns[0*nc+3] - eqns[0*nc+2]*target.z - eqns[0*nc+1]*target.y) / eqns[0*nc+0];
+
+    if(isNaN(target.x) || isNaN(target.y) || isNaN(target.z) || target.x===Infinity || target.y===Infinity || target.z===Infinity){
+        throw "Could not solve equation! Got x=["+target.toString()+"], b=["+b.toString()+"], A=["+this.toString()+"]";
+    }
+
+    return target;
+};
+
+/**
+ * Get an element in the matrix by index. Index starts at 0, not 1!!!
+ * @method e
+ * @param {Number} row
+ * @param {Number} column
+ * @param {Number} value Optional. If provided, the matrix element will be set to this value.
+ * @return {Number}
+ */
+Mat3.prototype.e = function( row , column ,value){
+    if(value===undefined){
+        return this.elements[column+3*row];
+    } else {
+        // Set value
+        this.elements[column+3*row] = value;
+    }
+};
+
+/**
+ * Copy another matrix into this matrix object.
+ * @method copy
+ * @param {Mat3} source
+ * @return {Mat3} this
+ */
+Mat3.prototype.copy = function(source){
+    for(var i=0; i < source.elements.length; i++){
+        this.elements[i] = source.elements[i];
+    }
+    return this;
+};
+
+/**
+ * Returns a string representation of the matrix.
+ * @method toString
+ * @return string
+ */
+Mat3.prototype.toString = function(){
+    var r = "";
+    var sep = ",";
+    for(var i=0; i<9; i++){
+        r += this.elements[i] + sep;
+    }
+    return r;
+};
+
+/**
+ * reverse the matrix
+ * @method reverse
+ * @param {Mat3} target Optional. Target matrix to save in.
+ * @return {Mat3} The solution x
+ */
+Mat3.prototype.reverse = function(target){
+
+    target = target || new Mat3();
+
+    // Construct equations
+    var nr = 3; // num rows
+    var nc = 6; // num cols
+    var eqns = [];
+    for(var i=0; i<nr*nc; i++){
+        eqns.push(0);
+    }
+    var i,j;
+    for(i=0; i<3; i++){
+        for(j=0; j<3; j++){
+            eqns[i+nc*j] = this.elements[i+3*j];
+        }
+    }
+    eqns[3+6*0] = 1;
+    eqns[3+6*1] = 0;
+    eqns[3+6*2] = 0;
+    eqns[4+6*0] = 0;
+    eqns[4+6*1] = 1;
+    eqns[4+6*2] = 0;
+    eqns[5+6*0] = 0;
+    eqns[5+6*1] = 0;
+    eqns[5+6*2] = 1;
+
+    // Compute right upper triangular version of the matrix - Gauss elimination
+    var n = 3, k = n, np;
+    var kp = nc; // num rows
+    var p;
+    do {
+        i = k - n;
+        if (eqns[i+nc*i] === 0) {
+            // the pivot is null, swap lines
+            for (j = i + 1; j < k; j++) {
+                if (eqns[i+nc*j] !== 0) {
+                    np = kp;
+                    do { // do line( i ) = line( i ) + line( k )
+                        p = kp - np;
+                        eqns[p+nc*i] += eqns[p+nc*j];
+                    } while (--np);
+                    break;
+                }
+            }
+        }
+        if (eqns[i+nc*i] !== 0) {
+            for (j = i + 1; j < k; j++) {
+                var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+                np = kp;
+                do { // do line( k ) = line( k ) - multiplier * line( i )
+                    p = kp - np;
+                    eqns[p+nc*j] = p <= i ? 0 : eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+                } while (--np);
+            }
+        }
+    } while (--n);
+
+    // eliminate the upper left triangle of the matrix
+    i = 2;
+    do {
+        j = i-1;
+        do {
+            var multiplier = eqns[i+nc*j] / eqns[i+nc*i];
+            np = nc;
+            do {
+                p = nc - np;
+                eqns[p+nc*j] =  eqns[p+nc*j] - eqns[p+nc*i] * multiplier ;
+            } while (--np);
+        } while (j--);
+    } while (--i);
+
+    // operations on the diagonal
+    i = 2;
+    do {
+        var multiplier = 1 / eqns[i+nc*i];
+        np = nc;
+        do {
+            p = nc - np;
+            eqns[p+nc*i] = eqns[p+nc*i] * multiplier ;
+        } while (--np);
+    } while (i--);
+
+    i = 2;
+    do {
+        j = 2;
+        do {
+            p = eqns[nr+j+nc*i];
+            if( isNaN( p ) || p ===Infinity ){
+                throw "Could not reverse! A=["+this.toString()+"]";
+            }
+            target.e( i , j , p );
+        } while (j--);
+    } while (i--);
+
+    return target;
+};
+
+/**
+ * Set the matrix from a quaterion
+ * @method setRotationFromQuaternion
+ * @param {Quaternion} q
+ */
+Mat3.prototype.setRotationFromQuaternion = function( q ) {
+    var x = q.x, y = q.y, z = q.z, w = q.w,
+        x2 = x + x, y2 = y + y, z2 = z + z,
+        xx = x * x2, xy = x * y2, xz = x * z2,
+        yy = y * y2, yz = y * z2, zz = z * z2,
+        wx = w * x2, wy = w * y2, wz = w * z2,
+        e = this.elements;
+
+    e[3*0 + 0] = 1 - ( yy + zz );
+    e[3*0 + 1] = xy - wz;
+    e[3*0 + 2] = xz + wy;
+
+    e[3*1 + 0] = xy + wz;
+    e[3*1 + 1] = 1 - ( xx + zz );
+    e[3*1 + 2] = yz - wx;
+
+    e[3*2 + 0] = xz - wy;
+    e[3*2 + 1] = yz + wx;
+    e[3*2 + 2] = 1 - ( xx + yy );
+
+    return this;
+};
+
+/**
+ * Transpose the matrix
+ * @method transpose
+ * @param  {Mat3} target Where to store the result.
+ * @return {Mat3} The target Mat3, or a new Mat3 if target was omitted.
+ */
+Mat3.prototype.transpose = function( target ) {
+    target = target || new Mat3();
+
+    var Mt = target.elements,
+        M = this.elements;
+
+    for(var i=0; i!==3; i++){
+        for(var j=0; j!==3; j++){
+            Mt[3*i + j] = M[3*j + i];
+        }
+    }
+
+    return target;
+};
+
+},{"./Vec3":43}],41:[function(require,module,exports){
+module.exports = Quaternion;
+
+var Vec3 = require('./Vec3');
+
+/**
+ * A Quaternion describes a rotation in 3D space. The Quaternion is mathematically defined as Q = x*i + y*j + z*k + w, where (i,j,k) are imaginary basis vectors. (x,y,z) can be seen as a vector related to the axis of rotation, while the real multiplier, w, is related to the amount of rotation.
+ * @class Quaternion
+ * @constructor
+ * @param {Number} x Multiplier of the imaginary basis vector i.
+ * @param {Number} y Multiplier of the imaginary basis vector j.
+ * @param {Number} z Multiplier of the imaginary basis vector k.
+ * @param {Number} w Multiplier of the real part.
+ * @see http://en.wikipedia.org/wiki/Quaternion
+ */
+function Quaternion(x,y,z,w){
+    /**
+     * @property {Number} x
+     */
+    this.x = x!==undefined ? x : 0;
+
+    /**
+     * @property {Number} y
+     */
+    this.y = y!==undefined ? y : 0;
+
+    /**
+     * @property {Number} z
+     */
+    this.z = z!==undefined ? z : 0;
+
+    /**
+     * The multiplier of the real quaternion basis vector.
+     * @property {Number} w
+     */
+    this.w = w!==undefined ? w : 1;
+}
+
+/**
+ * Set the value of the quaternion.
+ * @method set
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @param {Number} w
+ */
+Quaternion.prototype.set = function(x,y,z,w){
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.w = w;
+    return this;
+};
+
+/**
+ * Convert to a readable format
+ * @method toString
+ * @return string
+ */
+Quaternion.prototype.toString = function(){
+    return this.x+","+this.y+","+this.z+","+this.w;
+};
+
+/**
+ * Convert to an Array
+ * @method toArray
+ * @return Array
+ */
+Quaternion.prototype.toArray = function(){
+    return [this.x, this.y, this.z, this.w];
+};
+
+/**
+ * Set the quaternion components given an axis and an angle.
+ * @method setFromAxisAngle
+ * @param {Vec3} axis
+ * @param {Number} angle in radians
+ */
+Quaternion.prototype.setFromAxisAngle = function(axis,angle){
+    var s = Math.sin(angle*0.5);
+    this.x = axis.x * s;
+    this.y = axis.y * s;
+    this.z = axis.z * s;
+    this.w = Math.cos(angle*0.5);
+    return this;
+};
+
+/**
+ * Converts the quaternion to axis/angle representation.
+ * @method toAxisAngle
+ * @param {Vec3} [targetAxis] A vector object to reuse for storing the axis.
+ * @return {Array} An array, first elemnt is the axis and the second is the angle in radians.
+ */
+Quaternion.prototype.toAxisAngle = function(targetAxis){
+    targetAxis = targetAxis || new Vec3();
+    this.normalize(); // if w>1 acos and sqrt will produce errors, this cant happen if quaternion is normalised
+    var angle = 2 * Math.acos(this.w);
+    var s = Math.sqrt(1-this.w*this.w); // assuming quaternion normalised then w is less than 1, so term always positive.
+    if (s < 0.001) { // test to avoid divide by zero, s is always positive due to sqrt
+        // if s close to zero then direction of axis not important
+        targetAxis.x = this.x; // if it is important that axis is normalised then replace with x=1; y=z=0;
+        targetAxis.y = this.y;
+        targetAxis.z = this.z;
+    } else {
+        targetAxis.x = this.x / s; // normalise axis
+        targetAxis.y = this.y / s;
+        targetAxis.z = this.z / s;
+    }
+    return [targetAxis,angle];
+};
+
+var sfv_t1 = new Vec3(),
+    sfv_t2 = new Vec3();
+
+/**
+ * Set the quaternion value given two vectors. The resulting rotation will be the needed rotation to rotate u to v.
+ * @method setFromVectors
+ * @param {Vec3} u
+ * @param {Vec3} v
+ */
+Quaternion.prototype.setFromVectors = function(u,v){
+    if(u.isAntiparallelTo(v)){
+        var t1 = sfv_t1;
+        var t2 = sfv_t2;
+
+        u.tangents(t1,t2);
+        this.setFromAxisAngle(t1,Math.PI);
+    } else {
+        var a = u.cross(v);
+        this.x = a.x;
+        this.y = a.y;
+        this.z = a.z;
+        this.w = Math.sqrt(Math.pow(u.norm(),2) * Math.pow(v.norm(),2)) + u.dot(v);
+        this.normalize();
+    }
+    return this;
+};
+
+/**
+ * Quaternion multiplication
+ * @method mult
+ * @param {Quaternion} q
+ * @param {Quaternion} target Optional.
+ * @return {Quaternion}
+ */
+var Quaternion_mult_va = new Vec3();
+var Quaternion_mult_vb = new Vec3();
+var Quaternion_mult_vaxvb = new Vec3();
+Quaternion.prototype.mult = function(q,target){
+    target = target || new Quaternion();
+
+    var ax = this.x, ay = this.y, az = this.z, aw = this.w,
+        bx = q.x, by = q.y, bz = q.z, bw = q.w;
+
+    target.x = ax * bw + aw * bx + ay * bz - az * by;
+    target.y = ay * bw + aw * by + az * bx - ax * bz;
+    target.z = az * bw + aw * bz + ax * by - ay * bx;
+    target.w = aw * bw - ax * bx - ay * by - az * bz;
+
+    return target;
+};
+
+/**
+ * Get the inverse quaternion rotation.
+ * @method inverse
+ * @param {Quaternion} target
+ * @return {Quaternion}
+ */
+Quaternion.prototype.inverse = function(target){
+    var x = this.x, y = this.y, z = this.z, w = this.w;
+    target = target || new Quaternion();
+
+    this.conjugate(target);
+    var inorm2 = 1/(x*x + y*y + z*z + w*w);
+    target.x *= inorm2;
+    target.y *= inorm2;
+    target.z *= inorm2;
+    target.w *= inorm2;
+
+    return target;
+};
+
+/**
+ * Get the quaternion conjugate
+ * @method conjugate
+ * @param {Quaternion} target
+ * @return {Quaternion}
+ */
+Quaternion.prototype.conjugate = function(target){
+    target = target || new Quaternion();
+
+    target.x = -this.x;
+    target.y = -this.y;
+    target.z = -this.z;
+    target.w = this.w;
+
+    return target;
+};
+
+/**
+ * Normalize the quaternion. Note that this changes the values of the quaternion.
+ * @method normalize
+ */
+Quaternion.prototype.normalize = function(){
+    var l = Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);
+    if ( l === 0 ) {
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+        this.w = 0;
+    } else {
+        l = 1 / l;
+        this.x *= l;
+        this.y *= l;
+        this.z *= l;
+        this.w *= l;
+    }
+    return this;
+};
+
+/**
+ * Approximation of quaternion normalization. Works best when quat is already almost-normalized.
+ * @method normalizeFast
+ * @see http://jsperf.com/fast-quaternion-normalization
+ * @author unphased, https://github.com/unphased
+ */
+Quaternion.prototype.normalizeFast = function () {
+    var f = (3.0-(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w))/2.0;
+    if ( f === 0 ) {
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+        this.w = 0;
+    } else {
+        this.x *= f;
+        this.y *= f;
+        this.z *= f;
+        this.w *= f;
+    }
+    return this;
+};
+
+/**
+ * Multiply the quaternion by a vector
+ * @method vmult
+ * @param {Vec3} v
+ * @param {Vec3} target Optional
+ * @return {Vec3}
+ */
+Quaternion.prototype.vmult = function(v,target){
+    target = target || new Vec3();
+
+    var x = v.x,
+        y = v.y,
+        z = v.z;
+
+    var qx = this.x,
+        qy = this.y,
+        qz = this.z,
+        qw = this.w;
+
+    // q*v
+    var ix =  qw * x + qy * z - qz * y,
+    iy =  qw * y + qz * x - qx * z,
+    iz =  qw * z + qx * y - qy * x,
+    iw = -qx * x - qy * y - qz * z;
+
+    target.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;
+    target.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;
+    target.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;
+
+    return target;
+};
+
+/**
+ * Copies value of source to this quaternion.
+ * @method copy
+ * @param {Quaternion} source
+ * @return {Quaternion} this
+ */
+Quaternion.prototype.copy = function(source){
+    this.x = source.x;
+    this.y = source.y;
+    this.z = source.z;
+    this.w = source.w;
+    return this;
+};
+
+/**
+ * Convert the quaternion to euler angle representation. Order: YZX, as this page describes: http://www.euclideanspace.com/maths/standards/index.htm
+ * @method toEuler
+ * @param {Vec3} target
+ * @param string order Three-character string e.g. "YZX", which also is default.
+ */
+Quaternion.prototype.toEuler = function(target,order){
+    order = order || "YZX";
+
+    var heading, attitude, bank;
+    var x = this.x, y = this.y, z = this.z, w = this.w;
+
+    switch(order){
+    case "YZX":
+        var test = x*y + z*w;
+        if (test > 0.499) { // singularity at north pole
+            heading = 2 * Math.atan2(x,w);
+            attitude = Math.PI/2;
+            bank = 0;
+        }
+        if (test < -0.499) { // singularity at south pole
+            heading = -2 * Math.atan2(x,w);
+            attitude = - Math.PI/2;
+            bank = 0;
+        }
+        if(isNaN(heading)){
+            var sqx = x*x;
+            var sqy = y*y;
+            var sqz = z*z;
+            heading = Math.atan2(2*y*w - 2*x*z , 1 - 2*sqy - 2*sqz); // Heading
+            attitude = Math.asin(2*test); // attitude
+            bank = Math.atan2(2*x*w - 2*y*z , 1 - 2*sqx - 2*sqz); // bank
+        }
+        break;
+    default:
+        throw new Error("Euler order "+order+" not supported yet.");
+    }
+
+    target.y = heading;
+    target.z = attitude;
+    target.x = bank;
+};
+
+/**
+ * See http://www.mathworks.com/matlabcentral/fileexchange/20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/content/SpinCalc.m
+ * @method setFromEuler
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @param {String} order The order to apply angles: 'XYZ' or 'YXZ' or any other combination
+ */
+Quaternion.prototype.setFromEuler = function ( x, y, z, order ) {
+    order = order || "XYZ";
+
+    var c1 = Math.cos( x / 2 );
+    var c2 = Math.cos( y / 2 );
+    var c3 = Math.cos( z / 2 );
+    var s1 = Math.sin( x / 2 );
+    var s2 = Math.sin( y / 2 );
+    var s3 = Math.sin( z / 2 );
+
+    if ( order === 'XYZ' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'YXZ' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    } else if ( order === 'ZXY' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'ZYX' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    } else if ( order === 'YZX' ) {
+
+        this.x = s1 * c2 * c3 + c1 * s2 * s3;
+        this.y = c1 * s2 * c3 + s1 * c2 * s3;
+        this.z = c1 * c2 * s3 - s1 * s2 * c3;
+        this.w = c1 * c2 * c3 - s1 * s2 * s3;
+
+    } else if ( order === 'XZY' ) {
+
+        this.x = s1 * c2 * c3 - c1 * s2 * s3;
+        this.y = c1 * s2 * c3 - s1 * c2 * s3;
+        this.z = c1 * c2 * s3 + s1 * s2 * c3;
+        this.w = c1 * c2 * c3 + s1 * s2 * s3;
+
+    }
+
+    return this;
+};
+
+/**
+ * @method clone
+ * @return {Quaternion}
+ */
+Quaternion.prototype.clone = function(){
+    return new Quaternion(this.x, this.y, this.z, this.w);
+};
+
+/**
+ * Performs a spherical linear interpolation between two quat
+ *
+ * @method slerp
+ * @param {Quaternion} toQuat second operand
+ * @param {Number} t interpolation amount between the self quaternion and toQuat
+ * @param {Quaternion} [target] A quaternion to store the result in. If not provided, a new one will be created.
+ * @returns {Quaternion} The "target" object
+ */
+Quaternion.prototype.slerp = function (toQuat, t, target) {
+    target = target || new Quaternion();
+
+    var ax = this.x,
+        ay = this.y,
+        az = this.z,
+        aw = this.w,
+        bx = toQuat.x,
+        by = toQuat.y,
+        bz = toQuat.z,
+        bw = toQuat.w;
+
+    var omega, cosom, sinom, scale0, scale1;
+
+    // calc cosine
+    cosom = ax * bx + ay * by + az * bz + aw * bw;
+
+    // adjust signs (if necessary)
+    if ( cosom < 0.0 ) {
+        cosom = -cosom;
+        bx = - bx;
+        by = - by;
+        bz = - bz;
+        bw = - bw;
+    }
+
+    // calculate coefficients
+    if ( (1.0 - cosom) > 0.000001 ) {
+        // standard case (slerp)
+        omega  = Math.acos(cosom);
+        sinom  = Math.sin(omega);
+        scale0 = Math.sin((1.0 - t) * omega) / sinom;
+        scale1 = Math.sin(t * omega) / sinom;
+    } else {
+        // "from" and "to" quaternions are very close
+        //  ... so we can do a linear interpolation
+        scale0 = 1.0 - t;
+        scale1 = t;
+    }
+
+    // calculate final values
+    target.x = scale0 * ax + scale1 * bx;
+    target.y = scale0 * ay + scale1 * by;
+    target.z = scale0 * az + scale1 * bz;
+    target.w = scale0 * aw + scale1 * bw;
+
+    return target;
+};
+
+/**
+ * Rotate an absolute orientation quaternion given an angular velocity and a time step.
+ * @param  {Vec3} angularVelocity
+ * @param  {number} dt
+ * @param  {Vec3} angularFactor
+ * @param  {Quaternion} target
+ * @return {Quaternion} The "target" object
+ */
+Quaternion.prototype.integrate = function(angularVelocity, dt, angularFactor, target){
+    target = target || new Quaternion();
+
+    var ax = angularVelocity.x * angularFactor.x,
+        ay = angularVelocity.y * angularFactor.y,
+        az = angularVelocity.z * angularFactor.z,
+        bx = this.x,
+        by = this.y,
+        bz = this.z,
+        bw = this.w;
+
+    var half_dt = dt * 0.5;
+
+    target.x += half_dt * (ax * bw + ay * bz - az * by);
+    target.y += half_dt * (ay * bw + az * bx - ax * bz);
+    target.z += half_dt * (az * bw + ax * by - ay * bx);
+    target.w += half_dt * (- ax * bx - ay * by - az * bz);
+
+    return target;
+};
+},{"./Vec3":43}],42:[function(require,module,exports){
+var Vec3 = require('./Vec3');
+var Quaternion = require('./Quaternion');
+
+module.exports = Transform;
+
+/**
+ * @class Transform
+ * @constructor
+ */
+function Transform(options) {
+    options = options || {};
+
+	/**
+	 * @property {Vec3} position
+	 */
+	this.position = new Vec3();
+    if(options.position){
+        this.position.copy(options.position);
+    }
+
+	/**
+	 * @property {Quaternion} quaternion
+	 */
+	this.quaternion = new Quaternion();
+    if(options.quaternion){
+        this.quaternion.copy(options.quaternion);
+    }
+}
+
+var tmpQuat = new Quaternion();
+
+/**
+ * @static
+ * @method pointToLocaFrame
+ * @param {Vec3} position
+ * @param {Quaternion} quaternion
+ * @param {Vec3} worldPoint
+ * @param {Vec3} result
+ */
+Transform.pointToLocalFrame = function(position, quaternion, worldPoint, result){
+    var result = result || new Vec3();
+    worldPoint.vsub(position, result);
+    quaternion.conjugate(tmpQuat);
+    tmpQuat.vmult(result, result);
+    return result;
+};
+
+/**
+ * Get a global point in local transform coordinates.
+ * @method pointToLocal
+ * @param  {Vec3} point
+ * @param  {Vec3} result
+ * @return {Vec3} The "result" vector object
+ */
+Transform.prototype.pointToLocal = function(worldPoint, result){
+    return Transform.pointToLocalFrame(this.position, this.quaternion, worldPoint, result);
+};
+
+/**
+ * @static
+ * @method pointToWorldFrame
+ * @param {Vec3} position
+ * @param {Vec3} quaternion
+ * @param {Vec3} localPoint
+ * @param {Vec3} result
+ */
+Transform.pointToWorldFrame = function(position, quaternion, localPoint, result){
+    var result = result || new Vec3();
+    quaternion.vmult(localPoint, result);
+    result.vadd(position, result);
+    return result;
+};
+
+/**
+ * Get a local point in global transform coordinates.
+ * @method pointToWorld
+ * @param  {Vec3} point
+ * @param  {Vec3} result
+ * @return {Vec3} The "result" vector object
+ */
+Transform.prototype.pointToWorld = function(localPoint, result){
+    return Transform.pointToWorldFrame(this.position, this.quaternion, localPoint, result);
+};
+
+
+Transform.prototype.vectorToWorldFrame = function(localVector, result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localVector, result);
+    return result;
+};
+
+Transform.vectorToWorldFrame = function(quaternion, localVector, result){
+    quaternion.vmult(localVector, result);
+    return result;
+};
+
+Transform.vectorToLocalFrame = function(position, quaternion, worldVector, result){
+    var result = result || new Vec3();
+    quaternion.w *= -1;
+    quaternion.vmult(worldVector, result);
+    quaternion.w *= -1;
+    return result;
+};
+
+},{"./Quaternion":41,"./Vec3":43}],43:[function(require,module,exports){
+module.exports = Vec3;
+
+var Mat3 = require('./Mat3');
+
+/**
+ * 3-dimensional vector
+ * @class Vec3
+ * @constructor
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @author schteppe
+ * @example
+ *     var v = new Vec3(1, 2, 3);
+ *     console.log('x=' + v.x); // x=1
+ */
+function Vec3(x,y,z){
+    /**
+     * @property x
+     * @type {Number}
+     */
+    this.x = x||0.0;
+
+    /**
+     * @property y
+     * @type {Number}
+     */
+    this.y = y||0.0;
+
+    /**
+     * @property z
+     * @type {Number}
+     */
+    this.z = z||0.0;
+}
+
+/**
+ * @static
+ * @property {Vec3} ZERO
+ */
+Vec3.ZERO = new Vec3(0, 0, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_X
+ */
+Vec3.UNIT_X = new Vec3(1, 0, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_Y
+ */
+Vec3.UNIT_Y = new Vec3(0, 1, 0);
+
+/**
+ * @static
+ * @property {Vec3} UNIT_Z
+ */
+Vec3.UNIT_Z = new Vec3(0, 0, 1);
+
+/**
+ * Vector cross product
+ * @method cross
+ * @param {Vec3} v
+ * @param {Vec3} target Optional. Target to save in.
+ * @return {Vec3}
+ */
+Vec3.prototype.cross = function(v,target){
+    var vx=v.x, vy=v.y, vz=v.z, x=this.x, y=this.y, z=this.z;
+    target = target || new Vec3();
+
+    target.x = (y * vz) - (z * vy);
+    target.y = (z * vx) - (x * vz);
+    target.z = (x * vy) - (y * vx);
+
+    return target;
+};
+
+/**
+ * Set the vectors' 3 elements
+ * @method set
+ * @param {Number} x
+ * @param {Number} y
+ * @param {Number} z
+ * @return Vec3
+ */
+Vec3.prototype.set = function(x,y,z){
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    return this;
+};
+
+/**
+ * Set all components of the vector to zero.
+ * @method setZero
+ */
+Vec3.prototype.setZero = function(){
+    this.x = this.y = this.z = 0;
+};
+
+/**
+ * Vector addition
+ * @method vadd
+ * @param {Vec3} v
+ * @param {Vec3} target Optional.
+ * @return {Vec3}
+ */
+Vec3.prototype.vadd = function(v,target){
+    if(target){
+        target.x = v.x + this.x;
+        target.y = v.y + this.y;
+        target.z = v.z + this.z;
+    } else {
+        return new Vec3(this.x + v.x,
+                               this.y + v.y,
+                               this.z + v.z);
+    }
+};
+
+/**
+ * Vector subtraction
+ * @method vsub
+ * @param {Vec3} v
+ * @param {Vec3} target Optional. Target to save in.
+ * @return {Vec3}
+ */
+Vec3.prototype.vsub = function(v,target){
+    if(target){
+        target.x = this.x - v.x;
+        target.y = this.y - v.y;
+        target.z = this.z - v.z;
+    } else {
+        return new Vec3(this.x-v.x,
+                               this.y-v.y,
+                               this.z-v.z);
+    }
+};
+
+/**
+ * Get the cross product matrix a_cross from a vector, such that a x b = a_cross * b = c
+ * @method crossmat
+ * @see http://www8.cs.umu.se/kurser/TDBD24/VT06/lectures/Lecture6.pdf
+ * @return {Mat3}
+ */
+Vec3.prototype.crossmat = function(){
+    return new Mat3([     0,  -this.z,   this.y,
+                            this.z,        0,  -this.x,
+                           -this.y,   this.x,        0]);
+};
+
+/**
+ * Normalize the vector. Note that this changes the values in the vector.
+ * @method normalize
+ * @return {Number} Returns the norm of the vector
+ */
+Vec3.prototype.normalize = function(){
+    var x=this.x, y=this.y, z=this.z;
+    var n = Math.sqrt(x*x + y*y + z*z);
+    if(n>0.0){
+        var invN = 1/n;
+        this.x *= invN;
+        this.y *= invN;
+        this.z *= invN;
+    } else {
+        // Make something up
+        this.x = 0;
+        this.y = 0;
+        this.z = 0;
+    }
+    return n;
+};
+
+/**
+ * Get the version of this vector that is of length 1.
+ * @method unit
+ * @param {Vec3} target Optional target to save in
+ * @return {Vec3} Returns the unit vector
+ */
+Vec3.prototype.unit = function(target){
+    target = target || new Vec3();
+    var x=this.x, y=this.y, z=this.z;
+    var ninv = Math.sqrt(x*x + y*y + z*z);
+    if(ninv>0.0){
+        ninv = 1.0/ninv;
+        target.x = x * ninv;
+        target.y = y * ninv;
+        target.z = z * ninv;
+    } else {
+        target.x = 1;
+        target.y = 0;
+        target.z = 0;
+    }
+    return target;
+};
+
+/**
+ * Get the length of the vector
+ * @method norm
+ * @return {Number}
+ * @deprecated Use .length() instead
+ */
+Vec3.prototype.norm = function(){
+    var x=this.x, y=this.y, z=this.z;
+    return Math.sqrt(x*x + y*y + z*z);
+};
+
+/**
+ * Get the length of the vector
+ * @method length
+ * @return {Number}
+ */
+Vec3.prototype.length = Vec3.prototype.norm;
+
+/**
+ * Get the squared length of the vector
+ * @method norm2
+ * @return {Number}
+ * @deprecated Use .lengthSquared() instead.
+ */
+Vec3.prototype.norm2 = function(){
+    return this.dot(this);
+};
+
+/**
+ * Get the squared length of the vector.
+ * @method lengthSquared
+ * @return {Number}
+ */
+Vec3.prototype.lengthSquared = Vec3.prototype.norm2;
+
+/**
+ * Get distance from this point to another point
+ * @method distanceTo
+ * @param  {Vec3} p
+ * @return {Number}
+ */
+Vec3.prototype.distanceTo = function(p){
+    var x=this.x, y=this.y, z=this.z;
+    var px=p.x, py=p.y, pz=p.z;
+    return Math.sqrt((px-x)*(px-x)+
+                     (py-y)*(py-y)+
+                     (pz-z)*(pz-z));
+};
+
+/**
+ * Get squared distance from this point to another point
+ * @method distanceSquared
+ * @param  {Vec3} p
+ * @return {Number}
+ */
+Vec3.prototype.distanceSquared = function(p){
+    var x=this.x, y=this.y, z=this.z;
+    var px=p.x, py=p.y, pz=p.z;
+    return (px-x)*(px-x) + (py-y)*(py-y) + (pz-z)*(pz-z);
+};
+
+/**
+ * Multiply all the components of the vector with a scalar.
+ * @deprecated Use .scale instead
+ * @method mult
+ * @param {Number} scalar
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ * @deprecated Use .scale() instead
+ */
+Vec3.prototype.mult = function(scalar,target){
+    target = target || new Vec3();
+    var x = this.x,
+        y = this.y,
+        z = this.z;
+    target.x = scalar * x;
+    target.y = scalar * y;
+    target.z = scalar * z;
+    return target;
+};
+
+/**
+ * Multiply the vector with an other vector, component-wise.
+ * @method mult
+ * @param {Number} vector
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ */
+Vec3.prototype.vmul = function(vector, target){
+    target = target || new Vec3();
+    target.x = vector.x * this.x;
+    target.y = vector.y * this.y;
+    target.z = vector.z * this.z;
+    return target;
+};
+
+/**
+ * Multiply the vector with a scalar.
+ * @method scale
+ * @param {Number} scalar
+ * @param {Vec3} target
+ * @return {Vec3}
+ */
+Vec3.prototype.scale = Vec3.prototype.mult;
+
+/**
+ * Scale a vector and add it to this vector. Save the result in "target". (target = this + vector * scalar)
+ * @method addScaledVector
+ * @param {Number} scalar
+ * @param {Vec3} vector
+ * @param {Vec3} target The vector to save the result in.
+ * @return {Vec3}
+ */
+Vec3.prototype.addScaledVector = function(scalar, vector, target){
+    target = target || new Vec3();
+    target.x = this.x + scalar * vector.x;
+    target.y = this.y + scalar * vector.y;
+    target.z = this.z + scalar * vector.z;
+    return target;
+};
+
+/**
+ * Calculate dot product
+ * @method dot
+ * @param {Vec3} v
+ * @return {Number}
+ */
+Vec3.prototype.dot = function(v){
+    return this.x * v.x + this.y * v.y + this.z * v.z;
+};
+
+/**
+ * @method isZero
+ * @return bool
+ */
+Vec3.prototype.isZero = function(){
+    return this.x===0 && this.y===0 && this.z===0;
+};
+
+/**
+ * Make the vector point in the opposite direction.
+ * @method negate
+ * @param {Vec3} target Optional target to save in
+ * @return {Vec3}
+ */
+Vec3.prototype.negate = function(target){
+    target = target || new Vec3();
+    target.x = -this.x;
+    target.y = -this.y;
+    target.z = -this.z;
+    return target;
+};
+
+/**
+ * Compute two artificial tangents to the vector
+ * @method tangents
+ * @param {Vec3} t1 Vector object to save the first tangent in
+ * @param {Vec3} t2 Vector object to save the second tangent in
+ */
+var Vec3_tangents_n = new Vec3();
+var Vec3_tangents_randVec = new Vec3();
+Vec3.prototype.tangents = function(t1,t2){
+    var norm = this.norm();
+    if(norm>0.0){
+        var n = Vec3_tangents_n;
+        var inorm = 1/norm;
+        n.set(this.x*inorm,this.y*inorm,this.z*inorm);
+        var randVec = Vec3_tangents_randVec;
+        if(Math.abs(n.x) < 0.9){
+            randVec.set(1,0,0);
+            n.cross(randVec,t1);
+        } else {
+            randVec.set(0,1,0);
+            n.cross(randVec,t1);
+        }
+        n.cross(t1,t2);
+    } else {
+        // The normal length is zero, make something up
+        t1.set(1, 0, 0);
+        t2.set(0, 1, 0);
+    }
+};
+
+/**
+ * Converts to a more readable format
+ * @method toString
+ * @return string
+ */
+Vec3.prototype.toString = function(){
+    return this.x+","+this.y+","+this.z;
+};
+
+/**
+ * Converts to an array
+ * @method toArray
+ * @return Array
+ */
+Vec3.prototype.toArray = function(){
+    return [this.x, this.y, this.z];
+};
+
+/**
+ * Copies value of source to this vector.
+ * @method copy
+ * @param {Vec3} source
+ * @return {Vec3} this
+ */
+Vec3.prototype.copy = function(source){
+    this.x = source.x;
+    this.y = source.y;
+    this.z = source.z;
+    return this;
+};
+
+
+/**
+ * Do a linear interpolation between two vectors
+ * @method lerp
+ * @param {Vec3} v
+ * @param {Number} t A number between 0 and 1. 0 will make this function return u, and 1 will make it return v. Numbers in between will generate a vector in between them.
+ * @param {Vec3} target
+ */
+Vec3.prototype.lerp = function(v,t,target){
+    var x=this.x, y=this.y, z=this.z;
+    target.x = x + (v.x-x)*t;
+    target.y = y + (v.y-y)*t;
+    target.z = z + (v.z-z)*t;
+};
+
+/**
+ * Check if a vector equals is almost equal to another one.
+ * @method almostEquals
+ * @param {Vec3} v
+ * @param {Number} precision
+ * @return bool
+ */
+Vec3.prototype.almostEquals = function(v,precision){
+    if(precision===undefined){
+        precision = 1e-6;
+    }
+    if( Math.abs(this.x-v.x)>precision ||
+        Math.abs(this.y-v.y)>precision ||
+        Math.abs(this.z-v.z)>precision){
+        return false;
+    }
+    return true;
+};
+
+/**
+ * Check if a vector is almost zero
+ * @method almostZero
+ * @param {Number} precision
+ */
+Vec3.prototype.almostZero = function(precision){
+    if(precision===undefined){
+        precision = 1e-6;
+    }
+    if( Math.abs(this.x)>precision ||
+        Math.abs(this.y)>precision ||
+        Math.abs(this.z)>precision){
+        return false;
+    }
+    return true;
+};
+
+var antip_neg = new Vec3();
+
+/**
+ * Check if the vector is anti-parallel to another vector.
+ * @method isAntiparallelTo
+ * @param  {Vec3}  v
+ * @param  {Number}  precision Set to zero for exact comparisons
+ * @return {Boolean}
+ */
+Vec3.prototype.isAntiparallelTo = function(v,precision){
+    this.negate(antip_neg);
+    return antip_neg.almostEquals(v,precision);
+};
+
+/**
+ * Clone the vector
+ * @method clone
+ * @return {Vec3}
+ */
+Vec3.prototype.clone = function(){
+    return new Vec3(this.x, this.y, this.z);
+};
+},{"./Mat3":40}],44:[function(require,module,exports){
+module.exports = Body;
+
+var EventTarget = require('../utils/EventTarget');
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Mat3 = require('../math/Mat3');
+var Quaternion = require('../math/Quaternion');
+var Material = require('../material/Material');
+var AABB = require('../collision/AABB');
+var Box = require('../shapes/Box');
+
+/**
+ * Base class for all body types.
+ * @class Body
+ * @constructor
+ * @extends EventTarget
+ * @param {object} [options]
+ * @param {Vec3} [options.position]
+ * @param {Vec3} [options.velocity]
+ * @param {Vec3} [options.angularVelocity]
+ * @param {Quaternion} [options.quaternion]
+ * @param {number} [options.mass]
+ * @param {Material} [options.material]
+ * @param {number} [options.type]
+ * @param {number} [options.linearDamping=0.01]
+ * @param {number} [options.angularDamping=0.01]
+ * @param {boolean} [options.allowSleep=true]
+ * @param {number} [options.sleepSpeedLimit=0.1]
+ * @param {number} [options.sleepTimeLimit=1]
+ * @param {number} [options.collisionFilterGroup=1]
+ * @param {number} [options.collisionFilterMask=1]
+ * @param {boolean} [options.fixedRotation=false]
+ * @param {Vec3} [options.linearFactor]
+ * @param {Vec3} [options.angularFactor]
+ * @param {Shape} [options.shape]
+ * @example
+ *     var body = new Body({
+ *         mass: 1
+ *     });
+ *     var shape = new Sphere(1);
+ *     body.addShape(shape);
+ *     world.addBody(body);
+ */
+function Body(options){
+    options = options || {};
+
+    EventTarget.apply(this);
+
+    this.id = Body.idCounter++;
+
+    /**
+     * Reference to the world the body is living in
+     * @property world
+     * @type {World}
+     */
+    this.world = null;
+
+    /**
+     * Callback function that is used BEFORE stepping the system. Use it to apply forces, for example. Inside the function, "this" will refer to this Body object.
+     * @property preStep
+     * @type {Function}
+     * @deprecated Use World events instead
+     */
+    this.preStep = null;
+
+    /**
+     * Callback function that is used AFTER stepping the system. Inside the function, "this" will refer to this Body object.
+     * @property postStep
+     * @type {Function}
+     * @deprecated Use World events instead
+     */
+    this.postStep = null;
+
+    this.vlambda = new Vec3();
+
+    /**
+     * @property {Number} collisionFilterGroup
+     */
+    this.collisionFilterGroup = typeof(options.collisionFilterGroup) === 'number' ? options.collisionFilterGroup : 1;
+
+    /**
+     * @property {Number} collisionFilterMask
+     */
+    this.collisionFilterMask = typeof(options.collisionFilterMask) === 'number' ? options.collisionFilterMask : 1;
+
+    /**
+     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.
+     * @property {Number} collisionResponse
+     */
+	this.collisionResponse = true;
+
+    /**
+     * @property position
+     * @type {Vec3}
+     */
+    this.position = new Vec3();
+
+    /**
+     * @property {Vec3} previousPosition
+     */
+    this.previousPosition = new Vec3();
+
+    /**
+     * Interpolated position of the body.
+     * @property {Vec3} interpolatedPosition
+     */
+    this.interpolatedPosition = new Vec3();
+
+    /**
+     * Initial position of the body
+     * @property initPosition
+     * @type {Vec3}
+     */
+    this.initPosition = new Vec3();
+
+    if(options.position){
+        this.position.copy(options.position);
+        this.previousPosition.copy(options.position);
+        this.interpolatedPosition.copy(options.position);
+        this.initPosition.copy(options.position);
+    }
+
+    /**
+     * @property velocity
+     * @type {Vec3}
+     */
+    this.velocity = new Vec3();
+
+    if(options.velocity){
+        this.velocity.copy(options.velocity);
+    }
+
+    /**
+     * @property initVelocity
+     * @type {Vec3}
+     */
+    this.initVelocity = new Vec3();
+
+    /**
+     * Linear force on the body
+     * @property force
+     * @type {Vec3}
+     */
+    this.force = new Vec3();
+
+    var mass = typeof(options.mass) === 'number' ? options.mass : 0;
+
+    /**
+     * @property mass
+     * @type {Number}
+     * @default 0
+     */
+    this.mass = mass;
+
+    /**
+     * @property invMass
+     * @type {Number}
+     */
+    this.invMass = mass > 0 ? 1.0 / mass : 0;
+
+    /**
+     * @property material
+     * @type {Material}
+     */
+    this.material = options.material || null;
+
+    /**
+     * @property linearDamping
+     * @type {Number}
+     */
+    this.linearDamping = typeof(options.linearDamping) === 'number' ? options.linearDamping : 0.01;
+
+    /**
+     * One of: Body.DYNAMIC, Body.STATIC and Body.KINEMATIC.
+     * @property type
+     * @type {Number}
+     */
+    this.type = (mass <= 0.0 ? Body.STATIC : Body.DYNAMIC);
+    if(typeof(options.type) === typeof(Body.STATIC)){
+        this.type = options.type;
+    }
+
+    /**
+     * If true, the body will automatically fall to sleep.
+     * @property allowSleep
+     * @type {Boolean}
+     * @default true
+     */
+    this.allowSleep = typeof(options.allowSleep) !== 'undefined' ? options.allowSleep : true;
+
+    /**
+     * Current sleep state.
+     * @property sleepState
+     * @type {Number}
+     */
+    this.sleepState = 0;
+
+    /**
+     * If the speed (the norm of the velocity) is smaller than this value, the body is considered sleepy.
+     * @property sleepSpeedLimit
+     * @type {Number}
+     * @default 0.1
+     */
+    this.sleepSpeedLimit = typeof(options.sleepSpeedLimit) !== 'undefined' ? options.sleepSpeedLimit : 0.1;
+
+    /**
+     * If the body has been sleepy for this sleepTimeLimit seconds, it is considered sleeping.
+     * @property sleepTimeLimit
+     * @type {Number}
+     * @default 1
+     */
+    this.sleepTimeLimit = typeof(options.sleepTimeLimit) !== 'undefined' ? options.sleepTimeLimit : 1;
+
+    this.timeLastSleepy = 0;
+
+    this._wakeUpAfterNarrowphase = false;
+
+
+    /**
+     * Rotational force on the body, around center of mass
+     * @property {Vec3} torque
+     */
+    this.torque = new Vec3();
+
+    /**
+     * Orientation of the body
+     * @property quaternion
+     * @type {Quaternion}
+     */
+    this.quaternion = new Quaternion();
+
+    /**
+     * @property initQuaternion
+     * @type {Quaternion}
+     */
+    this.initQuaternion = new Quaternion();
+
+    /**
+     * @property {Quaternion} previousQuaternion
+     */
+    this.previousQuaternion = new Quaternion();
+
+    /**
+     * Interpolated orientation of the body.
+     * @property {Quaternion} interpolatedQuaternion
+     */
+    this.interpolatedQuaternion = new Quaternion();
+
+    if(options.quaternion){
+        this.quaternion.copy(options.quaternion);
+        this.initQuaternion.copy(options.quaternion);
+        this.previousQuaternion.copy(options.quaternion);
+        this.interpolatedQuaternion.copy(options.quaternion);
+    }
+
+    /**
+     * @property angularVelocity
+     * @type {Vec3}
+     */
+    this.angularVelocity = new Vec3();
+
+    if(options.angularVelocity){
+        this.angularVelocity.copy(options.angularVelocity);
+    }
+
+    /**
+     * @property initAngularVelocity
+     * @type {Vec3}
+     */
+    this.initAngularVelocity = new Vec3();
+
+    /**
+     * @property shapes
+     * @type {array}
+     */
+    this.shapes = [];
+
+    /**
+     * @property shapeOffsets
+     * @type {array}
+     */
+    this.shapeOffsets = [];
+
+    /**
+     * @property shapeOrientations
+     * @type {array}
+     */
+    this.shapeOrientations = [];
+
+    /**
+     * @property inertia
+     * @type {Vec3}
+     */
+    this.inertia = new Vec3();
+
+    /**
+     * @property {Vec3} invInertia
+     */
+    this.invInertia = new Vec3();
+
+    /**
+     * @property {Mat3} invInertiaWorld
+     */
+    this.invInertiaWorld = new Mat3();
+
+    this.invMassSolve = 0;
+
+    /**
+     * @property {Vec3} invInertiaSolve
+     */
+    this.invInertiaSolve = new Vec3();
+
+    /**
+     * @property {Mat3} invInertiaWorldSolve
+     */
+    this.invInertiaWorldSolve = new Mat3();
+
+    /**
+     * Set to true if you don't want the body to rotate. Make sure to run .updateMassProperties() after changing this.
+     * @property {Boolean} fixedRotation
+     * @default false
+     */
+    this.fixedRotation = typeof(options.fixedRotation) !== "undefined" ? options.fixedRotation : false;
+
+    /**
+     * @property {Number} angularDamping
+     */
+    this.angularDamping = typeof(options.angularDamping) !== 'undefined' ? options.angularDamping : 0.01;
+
+    /**
+     * @property {Vec3} linearFactor
+     */
+    this.linearFactor = new Vec3(1,1,1);
+    if(options.linearFactor){
+        this.linearFactor.copy(options.linearFactor);
+    }
+
+    /**
+     * @property {Vec3} angularFactor
+     */
+    this.angularFactor = new Vec3(1,1,1);
+    if(options.angularFactor){
+        this.angularFactor.copy(options.angularFactor);
+    }
+
+    /**
+     * @property aabb
+     * @type {AABB}
+     */
+    this.aabb = new AABB();
+
+    /**
+     * Indicates if the AABB needs to be updated before use.
+     * @property aabbNeedsUpdate
+     * @type {Boolean}
+     */
+    this.aabbNeedsUpdate = true;
+
+    this.wlambda = new Vec3();
+
+    if(options.shape){
+        this.addShape(options.shape);
+    }
+
+    this.updateMassProperties();
+}
+Body.prototype = new EventTarget();
+Body.prototype.constructor = Body;
+
+/**
+ * Dispatched after two bodies collide. This event is dispatched on each
+ * of the two bodies involved in the collision.
+ * @event collide
+ * @param {Body} body The body that was involved in the collision.
+ * @param {ContactEquation} contact The details of the collision.
+ */
+Body.COLLIDE_EVENT_NAME = "collide";
+
+/**
+ * A dynamic body is fully simulated. Can be moved manually by the user, but normally they move according to forces. A dynamic body can collide with all body types. A dynamic body always has finite, non-zero mass.
+ * @static
+ * @property DYNAMIC
+ * @type {Number}
+ */
+Body.DYNAMIC = 1;
+
+/**
+ * A static body does not move during simulation and behaves as if it has infinite mass. Static bodies can be moved manually by setting the position of the body. The velocity of a static body is always zero. Static bodies do not collide with other static or kinematic bodies.
+ * @static
+ * @property STATIC
+ * @type {Number}
+ */
+Body.STATIC = 2;
+
+/**
+ * A kinematic body moves under simulation according to its velocity. They do not respond to forces. They can be moved manually, but normally a kinematic body is moved by setting its velocity. A kinematic body behaves as if it has infinite mass. Kinematic bodies do not collide with other static or kinematic bodies.
+ * @static
+ * @property KINEMATIC
+ * @type {Number}
+ */
+Body.KINEMATIC = 4;
+
+
+
+/**
+ * @static
+ * @property AWAKE
+ * @type {number}
+ */
+Body.AWAKE = 0;
+
+/**
+ * @static
+ * @property SLEEPY
+ * @type {number}
+ */
+Body.SLEEPY = 1;
+
+/**
+ * @static
+ * @property SLEEPING
+ * @type {number}
+ */
+Body.SLEEPING = 2;
+
+Body.idCounter = 0;
+
+/**
+ * Dispatched after a sleeping body has woken up.
+ * @event wakeup
+ */
+Body.wakeupEvent = {
+    type: "wakeup"
+};
+
+/**
+ * Wake the body up.
+ * @method wakeUp
+ */
+Body.prototype.wakeUp = function(){
+    var s = this.sleepState;
+    this.sleepState = 0;
+    this._wakeUpAfterNarrowphase = false;
+    if(s === Body.SLEEPING){
+        this.dispatchEvent(Body.wakeupEvent);
+    }
+};
+
+/**
+ * Force body sleep
+ * @method sleep
+ */
+Body.prototype.sleep = function(){
+    this.sleepState = Body.SLEEPING;
+    this.velocity.set(0,0,0);
+    this.angularVelocity.set(0,0,0);
+    this._wakeUpAfterNarrowphase = false;
+};
+
+/**
+ * Dispatched after a body has gone in to the sleepy state.
+ * @event sleepy
+ */
+Body.sleepyEvent = {
+    type: "sleepy"
+};
+
+/**
+ * Dispatched after a body has fallen asleep.
+ * @event sleep
+ */
+Body.sleepEvent = {
+    type: "sleep"
+};
+
+/**
+ * Called every timestep to update internal sleep timer and change sleep state if needed.
+ * @method sleepTick
+ * @param {Number} time The world time in seconds
+ */
+Body.prototype.sleepTick = function(time){
+    if(this.allowSleep){
+        var sleepState = this.sleepState;
+        var speedSquared = this.velocity.norm2() + this.angularVelocity.norm2();
+        var speedLimitSquared = Math.pow(this.sleepSpeedLimit,2);
+        if(sleepState===Body.AWAKE && speedSquared < speedLimitSquared){
+            this.sleepState = Body.SLEEPY; // Sleepy
+            this.timeLastSleepy = time;
+            this.dispatchEvent(Body.sleepyEvent);
+        } else if(sleepState===Body.SLEEPY && speedSquared > speedLimitSquared){
+            this.wakeUp(); // Wake up
+        } else if(sleepState===Body.SLEEPY && (time - this.timeLastSleepy ) > this.sleepTimeLimit){
+            this.sleep(); // Sleeping
+            this.dispatchEvent(Body.sleepEvent);
+        }
+    }
+};
+
+/**
+ * If the body is sleeping, it should be immovable / have infinite mass during solve. We solve it by having a separate "solve mass".
+ * @method updateSolveMassProperties
+ */
+Body.prototype.updateSolveMassProperties = function(){
+    if(this.sleepState === Body.SLEEPING || this.type === Body.KINEMATIC){
+        this.invMassSolve = 0;
+        this.invInertiaSolve.setZero();
+        this.invInertiaWorldSolve.setZero();
+    } else {
+        this.invMassSolve = this.invMass;
+        this.invInertiaSolve.copy(this.invInertia);
+        this.invInertiaWorldSolve.copy(this.invInertiaWorld);
+    }
+};
+
+/**
+ * Convert a world point to local body frame.
+ * @method pointToLocalFrame
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.pointToLocalFrame = function(worldPoint,result){
+    var result = result || new Vec3();
+    worldPoint.vsub(this.position,result);
+    this.quaternion.conjugate().vmult(result,result);
+    return result;
+};
+
+/**
+ * Convert a world vector to local body frame.
+ * @method vectorToLocalFrame
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.vectorToLocalFrame = function(worldVector, result){
+    var result = result || new Vec3();
+    this.quaternion.conjugate().vmult(worldVector,result);
+    return result;
+};
+
+/**
+ * Convert a local body point to world frame.
+ * @method pointToWorldFrame
+ * @param  {Vec3} localPoint
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.pointToWorldFrame = function(localPoint,result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localPoint,result);
+    result.vadd(this.position,result);
+    return result;
+};
+
+/**
+ * Convert a local body point to world frame.
+ * @method vectorToWorldFrame
+ * @param  {Vec3} localVector
+ * @param  {Vec3} result
+ * @return {Vec3}
+ */
+Body.prototype.vectorToWorldFrame = function(localVector, result){
+    var result = result || new Vec3();
+    this.quaternion.vmult(localVector, result);
+    return result;
+};
+
+var tmpVec = new Vec3();
+var tmpQuat = new Quaternion();
+
+/**
+ * Add a shape to the body with a local offset and orientation.
+ * @method addShape
+ * @param {Shape} shape
+ * @param {Vec3} [_offset]
+ * @param {Quaternion} [_orientation]
+ * @return {Body} The body object, for chainability.
+ */
+Body.prototype.addShape = function(shape, _offset, _orientation){
+    var offset = new Vec3();
+    var orientation = new Quaternion();
+
+    if(_offset){
+        offset.copy(_offset);
+    }
+    if(_orientation){
+        orientation.copy(_orientation);
+    }
+
+    this.shapes.push(shape);
+    this.shapeOffsets.push(offset);
+    this.shapeOrientations.push(orientation);
+    this.updateMassProperties();
+    this.updateBoundingRadius();
+
+    this.aabbNeedsUpdate = true;
+
+    shape.body = this;
+
+    return this;
+};
+
+/**
+ * Update the bounding radius of the body. Should be done if any of the shapes are changed.
+ * @method updateBoundingRadius
+ */
+Body.prototype.updateBoundingRadius = function(){
+    var shapes = this.shapes,
+        shapeOffsets = this.shapeOffsets,
+        N = shapes.length,
+        radius = 0;
+
+    for(var i=0; i!==N; i++){
+        var shape = shapes[i];
+        shape.updateBoundingSphereRadius();
+        var offset = shapeOffsets[i].norm(),
+            r = shape.boundingSphereRadius;
+        if(offset + r > radius){
+            radius = offset + r;
+        }
+    }
+
+    this.boundingRadius = radius;
+};
+
+var computeAABB_shapeAABB = new AABB();
+
+/**
+ * Updates the .aabb
+ * @method computeAABB
+ * @todo rename to updateAABB()
+ */
+Body.prototype.computeAABB = function(){
+    var shapes = this.shapes,
+        shapeOffsets = this.shapeOffsets,
+        shapeOrientations = this.shapeOrientations,
+        N = shapes.length,
+        offset = tmpVec,
+        orientation = tmpQuat,
+        bodyQuat = this.quaternion,
+        aabb = this.aabb,
+        shapeAABB = computeAABB_shapeAABB;
+
+    for(var i=0; i!==N; i++){
+        var shape = shapes[i];
+
+        // Get shape world position
+        bodyQuat.vmult(shapeOffsets[i], offset);
+        offset.vadd(this.position, offset);
+
+        // Get shape world quaternion
+        shapeOrientations[i].mult(bodyQuat, orientation);
+
+        // Get shape AABB
+        shape.calculateWorldAABB(offset, orientation, shapeAABB.lowerBound, shapeAABB.upperBound);
+
+        if(i === 0){
+            aabb.copy(shapeAABB);
+        } else {
+            aabb.extend(shapeAABB);
+        }
+    }
+
+    this.aabbNeedsUpdate = false;
+};
+
+var uiw_m1 = new Mat3(),
+    uiw_m2 = new Mat3(),
+    uiw_m3 = new Mat3();
+
+/**
+ * Update .inertiaWorld and .invInertiaWorld
+ * @method updateInertiaWorld
+ */
+Body.prototype.updateInertiaWorld = function(force){
+    var I = this.invInertia;
+    if (I.x === I.y && I.y === I.z && !force) {
+        // If inertia M = s*I, where I is identity and s a scalar, then
+        //    R*M*R' = R*(s*I)*R' = s*R*I*R' = s*R*R' = s*I = M
+        // where R is the rotation matrix.
+        // In other words, we don't have to transform the inertia if all
+        // inertia diagonal entries are equal.
+    } else {
+        var m1 = uiw_m1,
+            m2 = uiw_m2,
+            m3 = uiw_m3;
+        m1.setRotationFromQuaternion(this.quaternion);
+        m1.transpose(m2);
+        m1.scale(I,m1);
+        m1.mmult(m2,this.invInertiaWorld);
+    }
+};
+
+/**
+ * Apply force to a world point. This could for example be a point on the Body surface. Applying force this way will add to Body.force and Body.torque.
+ * @method applyForce
+ * @param  {Vec3} force The amount of force to add.
+ * @param  {Vec3} relativePoint A point relative to the center of mass to apply the force on.
+ */
+var Body_applyForce_r = new Vec3();
+var Body_applyForce_rotForce = new Vec3();
+Body.prototype.applyForce = function(force,relativePoint){
+    if(this.type !== Body.DYNAMIC){ // Needed?
+        return;
+    }
+
+    // Compute produced rotational force
+    var rotForce = Body_applyForce_rotForce;
+    relativePoint.cross(force,rotForce);
+
+    // Add linear force
+    this.force.vadd(force,this.force);
+
+    // Add rotational force
+    this.torque.vadd(rotForce,this.torque);
+};
+
+/**
+ * Apply force to a local point in the body.
+ * @method applyLocalForce
+ * @param  {Vec3} force The force vector to apply, defined locally in the body frame.
+ * @param  {Vec3} localPoint A local point in the body to apply the force on.
+ */
+var Body_applyLocalForce_worldForce = new Vec3();
+var Body_applyLocalForce_relativePointWorld = new Vec3();
+Body.prototype.applyLocalForce = function(localForce, localPoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    var worldForce = Body_applyLocalForce_worldForce;
+    var relativePointWorld = Body_applyLocalForce_relativePointWorld;
+
+    // Transform the force vector to world space
+    this.vectorToWorldFrame(localForce, worldForce);
+    this.vectorToWorldFrame(localPoint, relativePointWorld);
+
+    this.applyForce(worldForce, relativePointWorld);
+};
+
+/**
+ * Apply impulse to a world point. This could for example be a point on the Body surface. An impulse is a force added to a body during a short period of time (impulse = force * time). Impulses will be added to Body.velocity and Body.angularVelocity.
+ * @method applyImpulse
+ * @param  {Vec3} impulse The amount of impulse to add.
+ * @param  {Vec3} relativePoint A point relative to the center of mass to apply the force on.
+ */
+var Body_applyImpulse_r = new Vec3();
+var Body_applyImpulse_velo = new Vec3();
+var Body_applyImpulse_rotVelo = new Vec3();
+Body.prototype.applyImpulse = function(impulse, relativePoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    // Compute point position relative to the body center
+    var r = relativePoint;
+
+    // Compute produced central impulse velocity
+    var velo = Body_applyImpulse_velo;
+    velo.copy(impulse);
+    velo.mult(this.invMass,velo);
+
+    // Add linear impulse
+    this.velocity.vadd(velo, this.velocity);
+
+    // Compute produced rotational impulse velocity
+    var rotVelo = Body_applyImpulse_rotVelo;
+    r.cross(impulse,rotVelo);
+
+    /*
+    rotVelo.x *= this.invInertia.x;
+    rotVelo.y *= this.invInertia.y;
+    rotVelo.z *= this.invInertia.z;
+    */
+    this.invInertiaWorld.vmult(rotVelo,rotVelo);
+
+    // Add rotational Impulse
+    this.angularVelocity.vadd(rotVelo, this.angularVelocity);
+};
+
+/**
+ * Apply locally-defined impulse to a local point in the body.
+ * @method applyLocalImpulse
+ * @param  {Vec3} force The force vector to apply, defined locally in the body frame.
+ * @param  {Vec3} localPoint A local point in the body to apply the force on.
+ */
+var Body_applyLocalImpulse_worldImpulse = new Vec3();
+var Body_applyLocalImpulse_relativePoint = new Vec3();
+Body.prototype.applyLocalImpulse = function(localImpulse, localPoint){
+    if(this.type !== Body.DYNAMIC){
+        return;
+    }
+
+    var worldImpulse = Body_applyLocalImpulse_worldImpulse;
+    var relativePointWorld = Body_applyLocalImpulse_relativePoint;
+
+    // Transform the force vector to world space
+    this.vectorToWorldFrame(localImpulse, worldImpulse);
+    this.vectorToWorldFrame(localPoint, relativePointWorld);
+
+    this.applyImpulse(worldImpulse, relativePointWorld);
+};
+
+var Body_updateMassProperties_halfExtents = new Vec3();
+
+/**
+ * Should be called whenever you change the body shape or mass.
+ * @method updateMassProperties
+ */
+Body.prototype.updateMassProperties = function(){
+    var halfExtents = Body_updateMassProperties_halfExtents;
+
+    this.invMass = this.mass > 0 ? 1.0 / this.mass : 0;
+    var I = this.inertia;
+    var fixed = this.fixedRotation;
+
+    // Approximate with AABB box
+    this.computeAABB();
+    halfExtents.set(
+        (this.aabb.upperBound.x-this.aabb.lowerBound.x) / 2,
+        (this.aabb.upperBound.y-this.aabb.lowerBound.y) / 2,
+        (this.aabb.upperBound.z-this.aabb.lowerBound.z) / 2
+    );
+    Box.calculateInertia(halfExtents, this.mass, I);
+
+    this.invInertia.set(
+        I.x > 0 && !fixed ? 1.0 / I.x : 0,
+        I.y > 0 && !fixed ? 1.0 / I.y : 0,
+        I.z > 0 && !fixed ? 1.0 / I.z : 0
+    );
+    this.updateInertiaWorld(true);
+};
+
+/**
+ * Get world velocity of a point in the body.
+ * @method getVelocityAtWorldPoint
+ * @param  {Vec3} worldPoint
+ * @param  {Vec3} result
+ * @return {Vec3} The result vector.
+ */
+Body.prototype.getVelocityAtWorldPoint = function(worldPoint, result){
+    var r = new Vec3();
+    worldPoint.vsub(this.position, r);
+    this.angularVelocity.cross(r, result);
+    this.velocity.vadd(result, result);
+    return result;
+};
+
+var torque = new Vec3();
+var invI_tau_dt = new Vec3();
+var w = new Quaternion();
+var wq = new Quaternion();
+
+/**
+ * Move the body forward in time.
+ * @param {number} dt Time step
+ * @param {boolean} quatNormalize Set to true to normalize the body quaternion
+ * @param {boolean} quatNormalizeFast If the quaternion should be normalized using "fast" quaternion normalization
+ */
+Body.prototype.integrate = function(dt, quatNormalize, quatNormalizeFast){
+
+    // Save previous position
+    this.previousPosition.copy(this.position);
+    this.previousQuaternion.copy(this.quaternion);
+
+    if(!(this.type === Body.DYNAMIC || this.type === Body.KINEMATIC) || this.sleepState === Body.SLEEPING){ // Only for dynamic
+        return;
+    }
+
+    var velo = this.velocity,
+        angularVelo = this.angularVelocity,
+        pos = this.position,
+        force = this.force,
+        torque = this.torque,
+        quat = this.quaternion,
+        invMass = this.invMass,
+        invInertia = this.invInertiaWorld,
+        linearFactor = this.linearFactor;
+
+    var iMdt = invMass * dt;
+    velo.x += force.x * iMdt * linearFactor.x;
+    velo.y += force.y * iMdt * linearFactor.y;
+    velo.z += force.z * iMdt * linearFactor.z;
+
+    var e = invInertia.elements;
+    var angularFactor = this.angularFactor;
+    var tx = torque.x * angularFactor.x;
+    var ty = torque.y * angularFactor.y;
+    var tz = torque.z * angularFactor.z;
+    angularVelo.x += dt * (e[0] * tx + e[1] * ty + e[2] * tz);
+    angularVelo.y += dt * (e[3] * tx + e[4] * ty + e[5] * tz);
+    angularVelo.z += dt * (e[6] * tx + e[7] * ty + e[8] * tz);
+
+    // Use new velocity  - leap frog
+    pos.x += velo.x * dt;
+    pos.y += velo.y * dt;
+    pos.z += velo.z * dt;
+
+    quat.integrate(this.angularVelocity, dt, this.angularFactor, quat);
+
+    if(quatNormalize){
+        if(quatNormalizeFast){
+            quat.normalizeFast();
+        } else {
+            quat.normalize();
+        }
+    }
+
+    this.aabbNeedsUpdate = true;
+
+    // Update world inertia
+    this.updateInertiaWorld();
+};
+
+},{"../collision/AABB":15,"../material/Material":38,"../math/Mat3":40,"../math/Quaternion":41,"../math/Vec3":43,"../shapes/Box":50,"../shapes/Shape":56,"../utils/EventTarget":62}],45:[function(require,module,exports){
+var Body = require('./Body');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var RaycastResult = require('../collision/RaycastResult');
+var Ray = require('../collision/Ray');
+var WheelInfo = require('../objects/WheelInfo');
+
+module.exports = RaycastVehicle;
+
+/**
+ * Vehicle helper class that casts rays from the wheel positions towards the ground and applies forces.
+ * @class RaycastVehicle
+ * @constructor
+ * @param {object} [options]
+ * @param {Body} [options.chassisBody] The car chassis body.
+ * @param {integer} [options.indexRightAxis] Axis to use for right. x=0, y=1, z=2
+ * @param {integer} [options.indexLeftAxis]
+ * @param {integer} [options.indexUpAxis]
+ */
+function RaycastVehicle(options){
+
+    /**
+     * @property {Body} chassisBody
+     */
+    this.chassisBody = options.chassisBody;
+
+    /**
+     * An array of WheelInfo objects.
+     * @property {array} wheelInfos
+     */
+    this.wheelInfos = [];
+
+    /**
+     * Will be set to true if the car is sliding.
+     * @property {boolean} sliding
+     */
+    this.sliding = false;
+
+    /**
+     * @property {World} world
+     */
+    this.world = null;
+
+    /**
+     * Index of the right axis, 0=x, 1=y, 2=z
+     * @property {integer} indexRightAxis
+     * @default 1
+     */
+    this.indexRightAxis = typeof(options.indexRightAxis) !== 'undefined' ? options.indexRightAxis : 1;
+
+    /**
+     * Index of the forward axis, 0=x, 1=y, 2=z
+     * @property {integer} indexForwardAxis
+     * @default 0
+     */
+    this.indexForwardAxis = typeof(options.indexForwardAxis) !== 'undefined' ? options.indexForwardAxis : 0;
+
+    /**
+     * Index of the up axis, 0=x, 1=y, 2=z
+     * @property {integer} indexUpAxis
+     * @default 2
+     */
+    this.indexUpAxis = typeof(options.indexUpAxis) !== 'undefined' ? options.indexUpAxis : 2;
+}
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+var tmpVec3 = new Vec3();
+var tmpVec4 = new Vec3();
+var tmpVec5 = new Vec3();
+var tmpVec6 = new Vec3();
+var tmpRay = new Ray();
+
+/**
+ * Add a wheel. For information about the options, see WheelInfo.
+ * @method addWheel
+ * @param {object} [options]
+ */
+RaycastVehicle.prototype.addWheel = function(options){
+    options = options || {};
+
+    var info = new WheelInfo(options);
+    var index = this.wheelInfos.length;
+    this.wheelInfos.push(info);
+
+    return index;
+};
+
+/**
+ * Set the steering value of a wheel.
+ * @method setSteeringValue
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RaycastVehicle.prototype.setSteeringValue = function(value, wheelIndex){
+    var wheel = this.wheelInfos[wheelIndex];
+    wheel.steering = value;
+};
+
+var torque = new Vec3();
+
+/**
+ * Set the wheel force to apply on one of the wheels each time step
+ * @method applyEngineForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RaycastVehicle.prototype.applyEngineForce = function(value, wheelIndex){
+    this.wheelInfos[wheelIndex].engineForce = value;
+};
+
+/**
+ * Set the braking force of a wheel
+ * @method setBrake
+ * @param {number} brake
+ * @param {integer} wheelIndex
+ */
+RaycastVehicle.prototype.setBrake = function(brake, wheelIndex){
+    this.wheelInfos[wheelIndex].brake = brake;
+};
+
+/**
+ * Add the vehicle including its constraints to the world.
+ * @method addToWorld
+ * @param {World} world
+ */
+RaycastVehicle.prototype.addToWorld = function(world){
+    var constraints = this.constraints;
+    world.addBody(this.chassisBody);
+    var that = this;
+    this.preStepCallback = function(){
+        that.updateVehicle(world.dt);
+    };
+    world.addEventListener('preStep', this.preStepCallback);
+    this.world = world;
+};
+
+/**
+ * Get one of the wheel axles, world-oriented.
+ * @private
+ * @method getVehicleAxisWorld
+ * @param  {integer} axisIndex
+ * @param  {Vec3} result
+ */
+RaycastVehicle.prototype.getVehicleAxisWorld = function(axisIndex, result){
+    result.set(
+        axisIndex === 0 ? 1 : 0,
+        axisIndex === 1 ? 1 : 0,
+        axisIndex === 2 ? 1 : 0
+    );
+    this.chassisBody.vectorToWorldFrame(result, result);
+};
+
+RaycastVehicle.prototype.updateVehicle = function(timeStep){
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+    var chassisBody = this.chassisBody;
+
+    for (var i = 0; i < numWheels; i++) {
+        this.updateWheelTransform(i);
+    }
+
+    this.currentVehicleSpeedKmHour = 3.6 * chassisBody.velocity.norm();
+
+    var forwardWorld = new Vec3();
+    this.getVehicleAxisWorld(this.indexForwardAxis, forwardWorld);
+
+    if (forwardWorld.dot(chassisBody.velocity) < 0){
+        this.currentVehicleSpeedKmHour *= -1;
+    }
+
+    // simulate suspension
+    for (var i = 0; i < numWheels; i++) {
+        this.castRay(wheelInfos[i]);
+    }
+
+    this.updateSuspension(timeStep);
+
+    var impulse = new Vec3();
+    var relpos = new Vec3();
+    for (var i = 0; i < numWheels; i++) {
+        //apply suspension force
+        var wheel = wheelInfos[i];
+        var suspensionForce = wheel.suspensionForce;
+        if (suspensionForce > wheel.maxSuspensionForce) {
+            suspensionForce = wheel.maxSuspensionForce;
+        }
+        wheel.raycastResult.hitNormalWorld.scale(suspensionForce * timeStep, impulse);
+
+        wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, relpos);
+        chassisBody.applyImpulse(impulse, relpos);
+    }
+
+    this.updateFriction(timeStep);
+
+    var hitNormalWorldScaledWithProj = new Vec3();
+    var fwd  = new Vec3();
+    var vel = new Vec3();
+    for (i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+        //var relpos = new Vec3();
+        //wheel.chassisConnectionPointWorld.vsub(chassisBody.position, relpos);
+        chassisBody.getVelocityAtWorldPoint(wheel.chassisConnectionPointWorld, vel);
+
+        // Hack to get the rotation in the correct direction
+        var m = 1;
+        switch(this.indexUpAxis){
+        case 1:
+            m = -1;
+            break;
+        }
+
+        if (wheel.isInContact) {
+
+            this.getVehicleAxisWorld(this.indexForwardAxis, fwd);
+            var proj = fwd.dot(wheel.raycastResult.hitNormalWorld);
+            wheel.raycastResult.hitNormalWorld.scale(proj, hitNormalWorldScaledWithProj);
+
+            fwd.vsub(hitNormalWorldScaledWithProj, fwd);
+
+            var proj2 = fwd.dot(vel);
+            wheel.deltaRotation = m * proj2 * timeStep / wheel.radius;
+        }
+
+        if((wheel.sliding || !wheel.isInContact) && wheel.engineForce !== 0 && wheel.useCustomSlidingRotationalSpeed){
+            // Apply custom rotation when accelerating and sliding
+            wheel.deltaRotation = (wheel.engineForce > 0 ? 1 : -1) * wheel.customSlidingRotationalSpeed * timeStep;
+        }
+
+        // Lock wheels
+        if(Math.abs(wheel.brake) > Math.abs(wheel.engineForce)){
+            wheel.deltaRotation = 0;
+        }
+
+        wheel.rotation += wheel.deltaRotation; // Use the old value
+        wheel.deltaRotation *= 0.99; // damping of rotation when not in contact
+    }
+};
+
+RaycastVehicle.prototype.updateSuspension = function(deltaTime) {
+    var chassisBody = this.chassisBody;
+    var chassisMass = chassisBody.mass;
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+
+    for (var w_it = 0; w_it < numWheels; w_it++){
+        var wheel = wheelInfos[w_it];
+
+        if (wheel.isInContact){
+            var force;
+
+            // Spring
+            var susp_length = wheel.suspensionRestLength;
+            var current_length = wheel.suspensionLength;
+            var length_diff = (susp_length - current_length);
+
+            force = wheel.suspensionStiffness * length_diff * wheel.clippedInvContactDotSuspension;
+
+            // Damper
+            var projected_rel_vel = wheel.suspensionRelativeVelocity;
+            var susp_damping;
+            if (projected_rel_vel < 0) {
+                susp_damping = wheel.dampingCompression;
+            } else {
+                susp_damping = wheel.dampingRelaxation;
+            }
+            force -= susp_damping * projected_rel_vel;
+
+            wheel.suspensionForce = force * chassisMass;
+            if (wheel.suspensionForce < 0) {
+                wheel.suspensionForce = 0;
+            }
+        } else {
+            wheel.suspensionForce = 0;
+        }
+    }
+};
+
+/**
+ * Remove the vehicle including its constraints from the world.
+ * @method removeFromWorld
+ * @param {World} world
+ */
+RaycastVehicle.prototype.removeFromWorld = function(world){
+    var constraints = this.constraints;
+    world.remove(this.chassisBody);
+    world.removeEventListener('preStep', this.preStepCallback);
+    this.world = null;
+};
+
+var castRay_rayvector = new Vec3();
+var castRay_target = new Vec3();
+RaycastVehicle.prototype.castRay = function(wheel) {
+    var rayvector = castRay_rayvector;
+    var target = castRay_target;
+
+    this.updateWheelTransformWorld(wheel);
+    var chassisBody = this.chassisBody;
+
+    var depth = -1;
+
+    var raylen = wheel.suspensionRestLength + wheel.radius;
+
+    wheel.directionWorld.scale(raylen, rayvector);
+    var source = wheel.chassisConnectionPointWorld;
+    source.vadd(rayvector, target);
+    var raycastResult = wheel.raycastResult;
+
+    var param = 0;
+
+    raycastResult.reset();
+    // Turn off ray collision with the chassis temporarily
+    var oldState = chassisBody.collisionResponse;
+    chassisBody.collisionResponse = false;
+
+    // Cast ray against world
+    this.world.rayTest(source, target, raycastResult);
+    chassisBody.collisionResponse = oldState;
+
+    var object = raycastResult.body;
+
+    wheel.raycastResult.groundObject = 0;
+
+    if (object) {
+        depth = raycastResult.distance;
+        wheel.raycastResult.hitNormalWorld  = raycastResult.hitNormalWorld;
+        wheel.isInContact = true;
+
+        var hitDistance = raycastResult.distance;
+        wheel.suspensionLength = hitDistance - wheel.radius;
+
+        // clamp on max suspension travel
+        var minSuspensionLength = wheel.suspensionRestLength - wheel.maxSuspensionTravel;
+        var maxSuspensionLength = wheel.suspensionRestLength + wheel.maxSuspensionTravel;
+        if (wheel.suspensionLength < minSuspensionLength) {
+            wheel.suspensionLength = minSuspensionLength;
+        }
+        if (wheel.suspensionLength > maxSuspensionLength) {
+            wheel.suspensionLength = maxSuspensionLength;
+            wheel.raycastResult.reset();
+        }
+
+        var denominator = wheel.raycastResult.hitNormalWorld.dot(wheel.directionWorld);
+
+        var chassis_velocity_at_contactPoint = new Vec3();
+        chassisBody.getVelocityAtWorldPoint(wheel.raycastResult.hitPointWorld, chassis_velocity_at_contactPoint);
+
+        var projVel = wheel.raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );
+
+        if (denominator >= -0.1) {
+            wheel.suspensionRelativeVelocity = 0;
+            wheel.clippedInvContactDotSuspension = 1 / 0.1;
+        } else {
+            var inv = -1 / denominator;
+            wheel.suspensionRelativeVelocity = projVel * inv;
+            wheel.clippedInvContactDotSuspension = inv;
+        }
+
+    } else {
+
+        //put wheel info as in rest position
+        wheel.suspensionLength = wheel.suspensionRestLength + 0 * wheel.maxSuspensionTravel;
+        wheel.suspensionRelativeVelocity = 0.0;
+        wheel.directionWorld.scale(-1, wheel.raycastResult.hitNormalWorld);
+        wheel.clippedInvContactDotSuspension = 1.0;
+    }
+
+    return depth;
+};
+
+RaycastVehicle.prototype.updateWheelTransformWorld = function(wheel){
+    wheel.isInContact = false;
+    var chassisBody = this.chassisBody;
+    chassisBody.pointToWorldFrame(wheel.chassisConnectionPointLocal, wheel.chassisConnectionPointWorld);
+    chassisBody.vectorToWorldFrame(wheel.directionLocal, wheel.directionWorld);
+    chassisBody.vectorToWorldFrame(wheel.axleLocal, wheel.axleWorld);
+};
+
+
+/**
+ * Update one of the wheel transform.
+ * Note when rendering wheels: during each step, wheel transforms are updated BEFORE the chassis; ie. their position becomes invalid after the step. Thus when you render wheels, you must update wheel transforms before rendering them. See raycastVehicle demo for an example.
+ * @method updateWheelTransform
+ * @param {integer} wheelIndex The wheel index to update.
+ */
+RaycastVehicle.prototype.updateWheelTransform = function(wheelIndex){
+    var up = tmpVec4;
+    var right = tmpVec5;
+    var fwd = tmpVec6;
+
+    var wheel = this.wheelInfos[wheelIndex];
+    this.updateWheelTransformWorld(wheel);
+
+    wheel.directionLocal.scale(-1, up);
+    right.copy(wheel.axleLocal);
+    up.cross(right, fwd);
+    fwd.normalize();
+    right.normalize();
+
+    // Rotate around steering over the wheelAxle
+    var steering = wheel.steering;
+    var steeringOrn = new Quaternion();
+    steeringOrn.setFromAxisAngle(up, steering);
+
+    var rotatingOrn = new Quaternion();
+    rotatingOrn.setFromAxisAngle(right, wheel.rotation);
+
+    // World rotation of the wheel
+    var q = wheel.worldTransform.quaternion;
+    this.chassisBody.quaternion.mult(steeringOrn, q);
+    q.mult(rotatingOrn, q);
+
+    q.normalize();
+
+    // world position of the wheel
+    var p = wheel.worldTransform.position;
+    p.copy(wheel.directionWorld);
+    p.scale(wheel.suspensionLength, p);
+    p.vadd(wheel.chassisConnectionPointWorld, p);
+};
+
+var directions = [
+    new Vec3(1, 0, 0),
+    new Vec3(0, 1, 0),
+    new Vec3(0, 0, 1)
+];
+
+/**
+ * Get the world transform of one of the wheels
+ * @method getWheelTransformWorld
+ * @param  {integer} wheelIndex
+ * @return {Transform}
+ */
+RaycastVehicle.prototype.getWheelTransformWorld = function(wheelIndex) {
+    return this.wheelInfos[wheelIndex].worldTransform;
+};
+
+
+var updateFriction_surfNormalWS_scaled_proj = new Vec3();
+var updateFriction_axle = [];
+var updateFriction_forwardWS = [];
+var sideFrictionStiffness2 = 1;
+RaycastVehicle.prototype.updateFriction = function(timeStep) {
+    var surfNormalWS_scaled_proj = updateFriction_surfNormalWS_scaled_proj;
+
+    //calculate the impulse, so that the wheels don't move sidewards
+    var wheelInfos = this.wheelInfos;
+    var numWheels = wheelInfos.length;
+    var chassisBody = this.chassisBody;
+    var forwardWS = updateFriction_forwardWS;
+    var axle = updateFriction_axle;
+
+    var numWheelsOnGround = 0;
+
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+
+        var groundObject = wheel.raycastResult.body;
+        if (groundObject){
+            numWheelsOnGround++;
+        }
+
+        wheel.sideImpulse = 0;
+        wheel.forwardImpulse = 0;
+        if(!forwardWS[i]){
+            forwardWS[i] = new Vec3();
+        }
+        if(!axle[i]){
+            axle[i] = new Vec3();
+        }
+    }
+
+    for (var i = 0; i < numWheels; i++){
+        var wheel = wheelInfos[i];
+
+        var groundObject = wheel.raycastResult.body;
+
+        if (groundObject) {
+            var axlei = axle[i];
+            var wheelTrans = this.getWheelTransformWorld(i);
+
+            // Get world axle
+            wheelTrans.vectorToWorldFrame(directions[this.indexRightAxis], axlei);
+
+            var surfNormalWS = wheel.raycastResult.hitNormalWorld;
+            var proj = axlei.dot(surfNormalWS);
+            surfNormalWS.scale(proj, surfNormalWS_scaled_proj);
+            axlei.vsub(surfNormalWS_scaled_proj, axlei);
+            axlei.normalize();
+
+            surfNormalWS.cross(axlei, forwardWS[i]);
+            forwardWS[i].normalize();
+
+            wheel.sideImpulse = resolveSingleBilateral(
+                chassisBody,
+                wheel.raycastResult.hitPointWorld,
+                groundObject,
+                wheel.raycastResult.hitPointWorld,
+                axlei
+            );
+
+            wheel.sideImpulse *= sideFrictionStiffness2;
+        }
+    }
+
+    var sideFactor = 1;
+    var fwdFactor = 0.5;
+
+    this.sliding = false;
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+        var groundObject = wheel.raycastResult.body;
+
+        var rollingFriction = 0;
+
+        wheel.slipInfo = 1;
+        if (groundObject) {
+            var defaultRollingFrictionImpulse = 0;
+            var maxImpulse = wheel.brake ? wheel.brake : defaultRollingFrictionImpulse;
+
+            // btWheelContactPoint contactPt(chassisBody,groundObject,wheelInfraycastInfo.hitPointWorld,forwardWS[wheel],maxImpulse);
+            // rollingFriction = calcRollingFriction(contactPt);
+            rollingFriction = calcRollingFriction(chassisBody, groundObject, wheel.raycastResult.hitPointWorld, forwardWS[i], maxImpulse);
+
+            rollingFriction += wheel.engineForce * timeStep;
+
+            // rollingFriction = 0;
+            var factor = maxImpulse / rollingFriction;
+            wheel.slipInfo *= factor;
+        }
+
+        //switch between active rolling (throttle), braking and non-active rolling friction (nthrottle/break)
+
+        wheel.forwardImpulse = 0;
+        wheel.skidInfo = 1;
+
+        if (groundObject) {
+            wheel.skidInfo = 1;
+
+            var maximp = wheel.suspensionForce * timeStep * wheel.frictionSlip;
+            var maximpSide = maximp;
+
+            var maximpSquared = maximp * maximpSide;
+
+            wheel.forwardImpulse = rollingFriction;//wheelInfo.engineForce* timeStep;
+
+            var x = wheel.forwardImpulse * fwdFactor;
+            var y = wheel.sideImpulse * sideFactor;
+
+            var impulseSquared = x * x + y * y;
+
+            wheel.sliding = false;
+            if (impulseSquared > maximpSquared) {
+                this.sliding = true;
+                wheel.sliding = true;
+
+                var factor = maximp / Math.sqrt(impulseSquared);
+
+                wheel.skidInfo *= factor;
+            }
+        }
+    }
+
+    if (this.sliding) {
+        for (var i = 0; i < numWheels; i++) {
+            var wheel = wheelInfos[i];
+            if (wheel.sideImpulse !== 0) {
+                if (wheel.skidInfo < 1){
+                    wheel.forwardImpulse *= wheel.skidInfo;
+                    wheel.sideImpulse *= wheel.skidInfo;
+                }
+            }
+        }
+    }
+
+    // apply the impulses
+    for (var i = 0; i < numWheels; i++) {
+        var wheel = wheelInfos[i];
+
+        var rel_pos = new Vec3();
+        wheel.raycastResult.hitPointWorld.vsub(chassisBody.position, rel_pos);
+        // cannons applyimpulse is using world coord for the position
+        //rel_pos.copy(wheel.raycastResult.hitPointWorld);
+
+        if (wheel.forwardImpulse !== 0) {
+            var impulse = new Vec3();
+            forwardWS[i].scale(wheel.forwardImpulse, impulse);
+            chassisBody.applyImpulse(impulse, rel_pos);
+        }
+
+        if (wheel.sideImpulse !== 0){
+            var groundObject = wheel.raycastResult.body;
+
+            var rel_pos2 = new Vec3();
+            wheel.raycastResult.hitPointWorld.vsub(groundObject.position, rel_pos2);
+            //rel_pos2.copy(wheel.raycastResult.hitPointWorld);
+            var sideImp = new Vec3();
+            axle[i].scale(wheel.sideImpulse, sideImp);
+
+            // Scale the relative position in the up direction with rollInfluence.
+            // If rollInfluence is 1, the impulse will be applied on the hitPoint (easy to roll over), if it is zero it will be applied in the same plane as the center of mass (not easy to roll over).
+            chassisBody.vectorToLocalFrame(rel_pos, rel_pos);
+            rel_pos['xyz'[this.indexUpAxis]] *= wheel.rollInfluence;
+            chassisBody.vectorToWorldFrame(rel_pos, rel_pos);
+            chassisBody.applyImpulse(sideImp, rel_pos);
+
+            //apply friction impulse on the ground
+            sideImp.scale(-1, sideImp);
+            groundObject.applyImpulse(sideImp, rel_pos2);
+        }
+    }
+};
+
+var calcRollingFriction_vel1 = new Vec3();
+var calcRollingFriction_vel2 = new Vec3();
+var calcRollingFriction_vel = new Vec3();
+
+function calcRollingFriction(body0, body1, frictionPosWorld, frictionDirectionWorld, maxImpulse) {
+    var j1 = 0;
+    var contactPosWorld = frictionPosWorld;
+
+    // var rel_pos1 = new Vec3();
+    // var rel_pos2 = new Vec3();
+    var vel1 = calcRollingFriction_vel1;
+    var vel2 = calcRollingFriction_vel2;
+    var vel = calcRollingFriction_vel;
+    // contactPosWorld.vsub(body0.position, rel_pos1);
+    // contactPosWorld.vsub(body1.position, rel_pos2);
+
+    body0.getVelocityAtWorldPoint(contactPosWorld, vel1);
+    body1.getVelocityAtWorldPoint(contactPosWorld, vel2);
+    vel1.vsub(vel2, vel);
+
+    var vrel = frictionDirectionWorld.dot(vel);
+
+    var denom0 = computeImpulseDenominator(body0, frictionPosWorld, frictionDirectionWorld);
+    var denom1 = computeImpulseDenominator(body1, frictionPosWorld, frictionDirectionWorld);
+    var relaxation = 1;
+    var jacDiagABInv = relaxation / (denom0 + denom1);
+
+    // calculate j that moves us to zero relative velocity
+    j1 = -vrel * jacDiagABInv;
+
+    if (maxImpulse < j1) {
+        j1 = maxImpulse;
+    }
+    if (j1 < -maxImpulse) {
+        j1 = -maxImpulse;
+    }
+
+    return j1;
+}
+
+var computeImpulseDenominator_r0 = new Vec3();
+var computeImpulseDenominator_c0 = new Vec3();
+var computeImpulseDenominator_vec = new Vec3();
+var computeImpulseDenominator_m = new Vec3();
+function computeImpulseDenominator(body, pos, normal) {
+    var r0 = computeImpulseDenominator_r0;
+    var c0 = computeImpulseDenominator_c0;
+    var vec = computeImpulseDenominator_vec;
+    var m = computeImpulseDenominator_m;
+
+    pos.vsub(body.position, r0);
+    r0.cross(normal, c0);
+    body.invInertiaWorld.vmult(c0, m);
+    m.cross(r0, vec);
+
+    return body.invMass + normal.dot(vec);
+}
+
+
+var resolveSingleBilateral_vel1 = new Vec3();
+var resolveSingleBilateral_vel2 = new Vec3();
+var resolveSingleBilateral_vel = new Vec3();
+
+//bilateral constraint between two dynamic objects
+function resolveSingleBilateral(body1, pos1, body2, pos2, normal, impulse){
+    var normalLenSqr = normal.norm2();
+    if (normalLenSqr > 1.1){
+        return 0; // no impulse
+    }
+    // var rel_pos1 = new Vec3();
+    // var rel_pos2 = new Vec3();
+    // pos1.vsub(body1.position, rel_pos1);
+    // pos2.vsub(body2.position, rel_pos2);
+
+    var vel1 = resolveSingleBilateral_vel1;
+    var vel2 = resolveSingleBilateral_vel2;
+    var vel = resolveSingleBilateral_vel;
+    body1.getVelocityAtWorldPoint(pos1, vel1);
+    body2.getVelocityAtWorldPoint(pos2, vel2);
+
+    vel1.vsub(vel2, vel);
+
+    var rel_vel = normal.dot(vel);
+
+    var contactDamping = 0.2;
+    var massTerm = 1 / (body1.invMass + body2.invMass);
+    var impulse = - contactDamping * rel_vel * massTerm;
+
+    return impulse;
+}
+},{"../collision/Ray":22,"../collision/RaycastResult":23,"../math/Quaternion":41,"../math/Vec3":43,"../objects/WheelInfo":49,"./Body":44}],46:[function(require,module,exports){
+var Body = require('./Body');
+var Sphere = require('../shapes/Sphere');
+var Box = require('../shapes/Box');
+var Vec3 = require('../math/Vec3');
+var HingeConstraint = require('../constraints/HingeConstraint');
+
+module.exports = RigidVehicle;
+
+/**
+ * Simple vehicle helper class with spherical rigid body wheels.
+ * @class RigidVehicle
+ * @constructor
+ * @param {Body} [options.chassisBody]
+ */
+function RigidVehicle(options){
+    this.wheelBodies = [];
+
+    /**
+     * @property coordinateSystem
+     * @type {Vec3}
+     */
+    this.coordinateSystem = typeof(options.coordinateSystem)==='undefined' ? new Vec3(1, 2, 3) : options.coordinateSystem.clone();
+
+    /**
+     * @property {Body} chassisBody
+     */
+    this.chassisBody = options.chassisBody;
+
+    if(!this.chassisBody){
+        // No chassis body given. Create it!
+        var chassisShape = new Box(new Vec3(5, 2, 0.5));
+        this.chassisBody = new Body(1, chassisShape);
+    }
+
+    /**
+     * @property constraints
+     * @type {Array}
+     */
+    this.constraints = [];
+
+    this.wheelAxes = [];
+    this.wheelForces = [];
+}
+
+/**
+ * Add a wheel
+ * @method addWheel
+ * @param {object} options
+ * @param {boolean} [options.isFrontWheel]
+ * @param {Vec3} [options.position] Position of the wheel, locally in the chassis body.
+ * @param {Vec3} [options.direction] Slide direction of the wheel along the suspension.
+ * @param {Vec3} [options.axis] Axis of rotation of the wheel, locally defined in the chassis.
+ * @param {Body} [options.body] The wheel body.
+ */
+RigidVehicle.prototype.addWheel = function(options){
+    options = options || {};
+    var wheelBody = options.body;
+    if(!wheelBody){
+        wheelBody =  new Body(1, new Sphere(1.2));
+    }
+    this.wheelBodies.push(wheelBody);
+    this.wheelForces.push(0);
+
+    // Position constrain wheels
+    var zero = new Vec3();
+    var position = typeof(options.position) !== 'undefined' ? options.position.clone() : new Vec3();
+
+    // Set position locally to the chassis
+    var worldPosition = new Vec3();
+    this.chassisBody.pointToWorldFrame(position, worldPosition);
+    wheelBody.position.set(worldPosition.x, worldPosition.y, worldPosition.z);
+
+    // Constrain wheel
+    var axis = typeof(options.axis) !== 'undefined' ? options.axis.clone() : new Vec3(0, 1, 0);
+    this.wheelAxes.push(axis);
+
+    var hingeConstraint = new HingeConstraint(this.chassisBody, wheelBody, {
+        pivotA: position,
+        axisA: axis,
+        pivotB: Vec3.ZERO,
+        axisB: axis,
+        collideConnected: false
+    });
+    this.constraints.push(hingeConstraint);
+
+    return this.wheelBodies.length - 1;
+};
+
+/**
+ * Set the steering value of a wheel.
+ * @method setSteeringValue
+ * @param {number} value
+ * @param {integer} wheelIndex
+ * @todo check coordinateSystem
+ */
+RigidVehicle.prototype.setSteeringValue = function(value, wheelIndex){
+    // Set angle of the hinge axis
+    var axis = this.wheelAxes[wheelIndex];
+
+    var c = Math.cos(value),
+        s = Math.sin(value),
+        x = axis.x,
+        y = axis.y;
+    this.constraints[wheelIndex].axisA.set(
+        c*x -s*y,
+        s*x +c*y,
+        0
+    );
+};
+
+/**
+ * Set the target rotational speed of the hinge constraint.
+ * @method setMotorSpeed
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.setMotorSpeed = function(value, wheelIndex){
+    var hingeConstraint = this.constraints[wheelIndex];
+    hingeConstraint.enableMotor();
+    hingeConstraint.motorTargetVelocity = value;
+};
+
+/**
+ * Set the target rotational speed of the hinge constraint.
+ * @method disableMotor
+ * @param {number} value
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.disableMotor = function(wheelIndex){
+    var hingeConstraint = this.constraints[wheelIndex];
+    hingeConstraint.disableMotor();
+};
+
+var torque = new Vec3();
+
+/**
+ * Set the wheel force to apply on one of the wheels each time step
+ * @method setWheelForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RigidVehicle.prototype.setWheelForce = function(value, wheelIndex){
+    this.wheelForces[wheelIndex] = value;
+};
+
+/**
+ * Apply a torque on one of the wheels.
+ * @method applyWheelForce
+ * @param  {number} value
+ * @param  {integer} wheelIndex
+ */
+RigidVehicle.prototype.applyWheelForce = function(value, wheelIndex){
+    var axis = this.wheelAxes[wheelIndex];
+    var wheelBody = this.wheelBodies[wheelIndex];
+    var bodyTorque = wheelBody.torque;
+
+    axis.scale(value, torque);
+    wheelBody.vectorToWorldFrame(torque, torque);
+    bodyTorque.vadd(torque, bodyTorque);
+};
+
+/**
+ * Add the vehicle including its constraints to the world.
+ * @method addToWorld
+ * @param {World} world
+ */
+RigidVehicle.prototype.addToWorld = function(world){
+    var constraints = this.constraints;
+    var bodies = this.wheelBodies.concat([this.chassisBody]);
+
+    for (var i = 0; i < bodies.length; i++) {
+        world.addBody(bodies[i]);
+    }
+
+    for (var i = 0; i < constraints.length; i++) {
+        world.addConstraint(constraints[i]);
+    }
+
+    world.addEventListener('preStep', this._update.bind(this));
+};
+
+RigidVehicle.prototype._update = function(){
+    var wheelForces = this.wheelForces;
+    for (var i = 0; i < wheelForces.length; i++) {
+        this.applyWheelForce(wheelForces[i], i);
+    }
+};
+
+/**
+ * Remove the vehicle including its constraints from the world.
+ * @method removeFromWorld
+ * @param {World} world
+ */
+RigidVehicle.prototype.removeFromWorld = function(world){
+    var constraints = this.constraints;
+    var bodies = this.wheelBodies.concat([this.chassisBody]);
+
+    for (var i = 0; i < bodies.length; i++) {
+        world.remove(bodies[i]);
+    }
+
+    for (var i = 0; i < constraints.length; i++) {
+        world.removeConstraint(constraints[i]);
+    }
+};
+
+var worldAxis = new Vec3();
+
+/**
+ * Get current rotational velocity of a wheel
+ * @method getWheelSpeed
+ * @param {integer} wheelIndex
+ */
+RigidVehicle.prototype.getWheelSpeed = function(wheelIndex){
+    var axis = this.wheelAxes[wheelIndex];
+    var wheelBody = this.wheelBodies[wheelIndex];
+    var w = wheelBody.angularVelocity;
+    this.chassisBody.vectorToWorldFrame(axis, worldAxis);
+    return w.dot(worldAxis);
+};
+
+},{"../constraints/HingeConstraint":28,"../math/Vec3":43,"../shapes/Box":50,"../shapes/Sphere":57,"./Body":44}],47:[function(require,module,exports){
+module.exports = SPHSystem;
+
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Particle = require('../shapes/Particle');
+var Body = require('../objects/Body');
+var Material = require('../material/Material');
+
+/**
+ * Smoothed-particle hydrodynamics system
+ * @class SPHSystem
+ * @constructor
+ */
+function SPHSystem(){
+    this.particles = [];
+	
+    /**
+     * Density of the system (kg/m3).
+     * @property {number} density
+     */
+    this.density = 1;
+	
+    /**
+     * Distance below which two particles are considered to be neighbors.
+     * It should be adjusted so there are about 15-20 neighbor particles within this radius.
+     * @property {number} smoothingRadius
+     */
+    this.smoothingRadius = 1;
+    this.speedOfSound = 1;
+	
+    /**
+     * Viscosity of the system.
+     * @property {number} viscosity
+     */
+    this.viscosity = 0.01;
+    this.eps = 0.000001;
+
+    // Stuff Computed per particle
+    this.pressures = [];
+    this.densities = [];
+    this.neighbors = [];
+}
+
+/**
+ * Add a particle to the system.
+ * @method add
+ * @param {Body} particle
+ */
+SPHSystem.prototype.add = function(particle){
+    this.particles.push(particle);
+    if(this.neighbors.length < this.particles.length){
+        this.neighbors.push([]);
+    }
+};
+
+/**
+ * Remove a particle from the system.
+ * @method remove
+ * @param {Body} particle
+ */
+SPHSystem.prototype.remove = function(particle){
+    var idx = this.particles.indexOf(particle);
+    if(idx !== -1){
+        this.particles.splice(idx,1);
+        if(this.neighbors.length > this.particles.length){
+            this.neighbors.pop();
+        }
+    }
+};
+
+/**
+ * Get neighbors within smoothing volume, save in the array neighbors
+ * @method getNeighbors
+ * @param {Body} particle
+ * @param {Array} neighbors
+ */
+var SPHSystem_getNeighbors_dist = new Vec3();
+SPHSystem.prototype.getNeighbors = function(particle,neighbors){
+    var N = this.particles.length,
+        id = particle.id,
+        R2 = this.smoothingRadius * this.smoothingRadius,
+        dist = SPHSystem_getNeighbors_dist;
+    for(var i=0; i!==N; i++){
+        var p = this.particles[i];
+        p.position.vsub(particle.position,dist);
+        if(id!==p.id && dist.norm2() < R2){
+            neighbors.push(p);
+        }
+    }
+};
+
+// Temp vectors for calculation
+var SPHSystem_update_dist = new Vec3(),
+    SPHSystem_update_a_pressure = new Vec3(),
+    SPHSystem_update_a_visc = new Vec3(),
+    SPHSystem_update_gradW = new Vec3(),
+    SPHSystem_update_r_vec = new Vec3(),
+    SPHSystem_update_u = new Vec3(); // Relative velocity
+SPHSystem.prototype.update = function(){
+    var N = this.particles.length,
+        dist = SPHSystem_update_dist,
+        cs = this.speedOfSound,
+        eps = this.eps;
+
+    for(var i=0; i!==N; i++){
+        var p = this.particles[i]; // Current particle
+        var neighbors = this.neighbors[i];
+
+        // Get neighbors
+        neighbors.length = 0;
+        this.getNeighbors(p,neighbors);
+        neighbors.push(this.particles[i]); // Add current too
+        var numNeighbors = neighbors.length;
+
+        // Accumulate density for the particle
+        var sum = 0.0;
+        for(var j=0; j!==numNeighbors; j++){
+
+            //printf("Current particle has position %f %f %f\n",objects[id].pos.x(),objects[id].pos.y(),objects[id].pos.z());
+            p.position.vsub(neighbors[j].position, dist);
+            var len = dist.norm();
+
+            var weight = this.w(len);
+            sum += neighbors[j].mass * weight;
+        }
+
+        // Save
+        this.densities[i] = sum;
+        this.pressures[i] = cs * cs * (this.densities[i] - this.density);
+    }
+
+    // Add forces
+
+    // Sum to these accelerations
+    var a_pressure= SPHSystem_update_a_pressure;
+    var a_visc =    SPHSystem_update_a_visc;
+    var gradW =     SPHSystem_update_gradW;
+    var r_vec =     SPHSystem_update_r_vec;
+    var u =         SPHSystem_update_u;
+
+    for(var i=0; i!==N; i++){
+
+        var particle = this.particles[i];
+
+        a_pressure.set(0,0,0);
+        a_visc.set(0,0,0);
+
+        // Init vars
+        var Pij;
+        var nabla;
+        var Vij;
+
+        // Sum up for all other neighbors
+        var neighbors = this.neighbors[i];
+        var numNeighbors = neighbors.length;
+
+        //printf("Neighbors: ");
+        for(var j=0; j!==numNeighbors; j++){
+
+            var neighbor = neighbors[j];
+            //printf("%d ",nj);
+
+            // Get r once for all..
+            particle.position.vsub(neighbor.position,r_vec);
+            var r = r_vec.norm();
+
+            // Pressure contribution
+            Pij = -neighbor.mass * (this.pressures[i] / (this.densities[i]*this.densities[i] + eps) + this.pressures[j] / (this.densities[j]*this.densities[j] + eps));
+            this.gradw(r_vec, gradW);
+            // Add to pressure acceleration
+            gradW.mult(Pij , gradW);
+            a_pressure.vadd(gradW, a_pressure);
+
+            // Viscosity contribution
+            neighbor.velocity.vsub(particle.velocity, u);
+            u.mult( 1.0 / (0.0001+this.densities[i] * this.densities[j]) * this.viscosity * neighbor.mass , u );
+            nabla = this.nablaw(r);
+            u.mult(nabla,u);
+            // Add to viscosity acceleration
+            a_visc.vadd( u, a_visc );
+        }
+
+        // Calculate force
+        a_visc.mult(particle.mass, a_visc);
+        a_pressure.mult(particle.mass, a_pressure);
+
+        // Add force to particles
+        particle.force.vadd(a_visc, particle.force);
+        particle.force.vadd(a_pressure, particle.force);
+    }
+};
+
+// Calculate the weight using the W(r) weightfunction
+SPHSystem.prototype.w = function(r){
+    // 315
+    var h = this.smoothingRadius;
+    return 315.0/(64.0*Math.PI*Math.pow(h,9)) * Math.pow(h*h-r*r,3);
+};
+
+// calculate gradient of the weight function
+SPHSystem.prototype.gradw = function(rVec,resultVec){
+    var r = rVec.norm(),
+        h = this.smoothingRadius;
+    rVec.mult(945.0/(32.0*Math.PI*Math.pow(h,9)) * Math.pow((h*h-r*r),2) , resultVec);
+};
+
+// Calculate nabla(W)
+SPHSystem.prototype.nablaw = function(r){
+    var h = this.smoothingRadius;
+    var nabla = 945.0/(32.0*Math.PI*Math.pow(h,9)) * (h*h-r*r)*(7*r*r - 3*h*h);
+    return nabla;
+};
+
+},{"../material/Material":38,"../math/Quaternion":41,"../math/Vec3":43,"../objects/Body":44,"../shapes/Particle":54,"../shapes/Shape":56}],48:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+
+module.exports = Spring;
+
+/**
+ * A spring, connecting two bodies.
+ *
+ * @class Spring
+ * @constructor
+ * @param {Body} bodyA
+ * @param {Body} bodyB
+ * @param {Object} [options]
+ * @param {number} [options.restLength]   A number > 0. Default: 1
+ * @param {number} [options.stiffness]    A number >= 0. Default: 100
+ * @param {number} [options.damping]      A number >= 0. Default: 1
+ * @param {Vec3}  [options.worldAnchorA] Where to hook the spring to body A, in world coordinates.
+ * @param {Vec3}  [options.worldAnchorB]
+ * @param {Vec3}  [options.localAnchorA] Where to hook the spring to body A, in local body coordinates.
+ * @param {Vec3}  [options.localAnchorB]
+ */
+function Spring(bodyA,bodyB,options){
+    options = options || {};
+
+    /**
+     * Rest length of the spring.
+     * @property restLength
+     * @type {number}
+     */
+    this.restLength = typeof(options.restLength) === "number" ? options.restLength : 1;
+
+    /**
+     * Stiffness of the spring.
+     * @property stiffness
+     * @type {number}
+     */
+    this.stiffness = options.stiffness || 100;
+
+    /**
+     * Damping of the spring.
+     * @property damping
+     * @type {number}
+     */
+    this.damping = options.damping || 1;
+
+    /**
+     * First connected body.
+     * @property bodyA
+     * @type {Body}
+     */
+    this.bodyA = bodyA;
+
+    /**
+     * Second connected body.
+     * @property bodyB
+     * @type {Body}
+     */
+    this.bodyB = bodyB;
+
+    /**
+     * Anchor for bodyA in local bodyA coordinates.
+     * @property localAnchorA
+     * @type {Vec3}
+     */
+    this.localAnchorA = new Vec3();
+
+    /**
+     * Anchor for bodyB in local bodyB coordinates.
+     * @property localAnchorB
+     * @type {Vec3}
+     */
+    this.localAnchorB = new Vec3();
+
+    if(options.localAnchorA){
+        this.localAnchorA.copy(options.localAnchorA);
+    }
+    if(options.localAnchorB){
+        this.localAnchorB.copy(options.localAnchorB);
+    }
+    if(options.worldAnchorA){
+        this.setWorldAnchorA(options.worldAnchorA);
+    }
+    if(options.worldAnchorB){
+        this.setWorldAnchorB(options.worldAnchorB);
+    }
+}
+
+/**
+ * Set the anchor point on body A, using world coordinates.
+ * @method setWorldAnchorA
+ * @param {Vec3} worldAnchorA
+ */
+Spring.prototype.setWorldAnchorA = function(worldAnchorA){
+    this.bodyA.pointToLocalFrame(worldAnchorA,this.localAnchorA);
+};
+
+/**
+ * Set the anchor point on body B, using world coordinates.
+ * @method setWorldAnchorB
+ * @param {Vec3} worldAnchorB
+ */
+Spring.prototype.setWorldAnchorB = function(worldAnchorB){
+    this.bodyB.pointToLocalFrame(worldAnchorB,this.localAnchorB);
+};
+
+/**
+ * Get the anchor point on body A, in world coordinates.
+ * @method getWorldAnchorA
+ * @param {Vec3} result The vector to store the result in.
+ */
+Spring.prototype.getWorldAnchorA = function(result){
+    this.bodyA.pointToWorldFrame(this.localAnchorA,result);
+};
+
+/**
+ * Get the anchor point on body B, in world coordinates.
+ * @method getWorldAnchorB
+ * @param {Vec3} result The vector to store the result in.
+ */
+Spring.prototype.getWorldAnchorB = function(result){
+    this.bodyB.pointToWorldFrame(this.localAnchorB,result);
+};
+
+var applyForce_r =              new Vec3(),
+    applyForce_r_unit =         new Vec3(),
+    applyForce_u =              new Vec3(),
+    applyForce_f =              new Vec3(),
+    applyForce_worldAnchorA =   new Vec3(),
+    applyForce_worldAnchorB =   new Vec3(),
+    applyForce_ri =             new Vec3(),
+    applyForce_rj =             new Vec3(),
+    applyForce_ri_x_f =         new Vec3(),
+    applyForce_rj_x_f =         new Vec3(),
+    applyForce_tmp =            new Vec3();
+
+/**
+ * Apply the spring force to the connected bodies.
+ * @method applyForce
+ */
+Spring.prototype.applyForce = function(){
+    var k = this.stiffness,
+        d = this.damping,
+        l = this.restLength,
+        bodyA = this.bodyA,
+        bodyB = this.bodyB,
+        r = applyForce_r,
+        r_unit = applyForce_r_unit,
+        u = applyForce_u,
+        f = applyForce_f,
+        tmp = applyForce_tmp;
+
+    var worldAnchorA = applyForce_worldAnchorA,
+        worldAnchorB = applyForce_worldAnchorB,
+        ri = applyForce_ri,
+        rj = applyForce_rj,
+        ri_x_f = applyForce_ri_x_f,
+        rj_x_f = applyForce_rj_x_f;
+
+    // Get world anchors
+    this.getWorldAnchorA(worldAnchorA);
+    this.getWorldAnchorB(worldAnchorB);
+
+    // Get offset points
+    worldAnchorA.vsub(bodyA.position,ri);
+    worldAnchorB.vsub(bodyB.position,rj);
+
+    // Compute distance vector between world anchor points
+    worldAnchorB.vsub(worldAnchorA,r);
+    var rlen = r.norm();
+    r_unit.copy(r);
+    r_unit.normalize();
+
+    // Compute relative velocity of the anchor points, u
+    bodyB.velocity.vsub(bodyA.velocity,u);
+    // Add rotational velocity
+
+    bodyB.angularVelocity.cross(rj,tmp);
+    u.vadd(tmp,u);
+    bodyA.angularVelocity.cross(ri,tmp);
+    u.vsub(tmp,u);
+
+    // F = - k * ( x - L ) - D * ( u )
+    r_unit.mult(-k*(rlen-l) - d*u.dot(r_unit), f);
+
+    // Add forces to bodies
+    bodyA.force.vsub(f,bodyA.force);
+    bodyB.force.vadd(f,bodyB.force);
+
+    // Angular force
+    ri.cross(f,ri_x_f);
+    rj.cross(f,rj_x_f);
+    bodyA.torque.vsub(ri_x_f,bodyA.torque);
+    bodyB.torque.vadd(rj_x_f,bodyB.torque);
+};
+
+},{"../math/Vec3":43}],49:[function(require,module,exports){
+var Vec3 = require('../math/Vec3');
+var Transform = require('../math/Transform');
+var RaycastResult = require('../collision/RaycastResult');
+var Utils = require('../utils/Utils');
+
+module.exports = WheelInfo;
+
+/**
+ * @class WheelInfo
+ * @constructor
+ * @param {Object} [options]
+ *
+ * @param {Vec3} [options.chassisConnectionPointLocal]
+ * @param {Vec3} [options.chassisConnectionPointWorld]
+ * @param {Vec3} [options.directionLocal]
+ * @param {Vec3} [options.directionWorld]
+ * @param {Vec3} [options.axleLocal]
+ * @param {Vec3} [options.axleWorld]
+ * @param {number} [options.suspensionRestLength=1]
+ * @param {number} [options.suspensionMaxLength=2]
+ * @param {number} [options.radius=1]
+ * @param {number} [options.suspensionStiffness=100]
+ * @param {number} [options.dampingCompression=10]
+ * @param {number} [options.dampingRelaxation=10]
+ * @param {number} [options.frictionSlip=10000]
+ * @param {number} [options.steering=0]
+ * @param {number} [options.rotation=0]
+ * @param {number} [options.deltaRotation=0]
+ * @param {number} [options.rollInfluence=0.01]
+ * @param {number} [options.maxSuspensionForce]
+ * @param {boolean} [options.isFrontWheel=true]
+ * @param {number} [options.clippedInvContactDotSuspension=1]
+ * @param {number} [options.suspensionRelativeVelocity=0]
+ * @param {number} [options.suspensionForce=0]
+ * @param {number} [options.skidInfo=0]
+ * @param {number} [options.suspensionLength=0]
+ * @param {number} [options.maxSuspensionTravel=1]
+ * @param {boolean} [options.useCustomSlidingRotationalSpeed=false]
+ * @param {number} [options.customSlidingRotationalSpeed=-0.1]
+ */
+function WheelInfo(options){
+    options = Utils.defaults(options, {
+        chassisConnectionPointLocal: new Vec3(),
+        chassisConnectionPointWorld: new Vec3(),
+        directionLocal: new Vec3(),
+        directionWorld: new Vec3(),
+        axleLocal: new Vec3(),
+        axleWorld: new Vec3(),
+        suspensionRestLength: 1,
+        suspensionMaxLength: 2,
+        radius: 1,
+        suspensionStiffness: 100,
+        dampingCompression: 10,
+        dampingRelaxation: 10,
+        frictionSlip: 10000,
+        steering: 0,
+        rotation: 0,
+        deltaRotation: 0,
+        rollInfluence: 0.01,
+        maxSuspensionForce: Number.MAX_VALUE,
+        isFrontWheel: true,
+        clippedInvContactDotSuspension: 1,
+        suspensionRelativeVelocity: 0,
+        suspensionForce: 0,
+        skidInfo: 0,
+        suspensionLength: 0,
+        maxSuspensionTravel: 1,
+        useCustomSlidingRotationalSpeed: false,
+        customSlidingRotationalSpeed: -0.1
+    });
+
+    /**
+     * Max travel distance of the suspension, in meters.
+     * @property {number} maxSuspensionTravel
+     */
+    this.maxSuspensionTravel = options.maxSuspensionTravel;
+
+    /**
+     * Speed to apply to the wheel rotation when the wheel is sliding.
+     * @property {number} customSlidingRotationalSpeed
+     */
+    this.customSlidingRotationalSpeed = options.customSlidingRotationalSpeed;
+
+    /**
+     * If the customSlidingRotationalSpeed should be used.
+     * @property {Boolean} useCustomSlidingRotationalSpeed
+     */
+    this.useCustomSlidingRotationalSpeed = options.useCustomSlidingRotationalSpeed;
+
+    /**
+     * @property {Boolean} sliding
+     */
+    this.sliding = false;
+
+    /**
+     * Connection point, defined locally in the chassis body frame.
+     * @property {Vec3} chassisConnectionPointLocal
+     */
+    this.chassisConnectionPointLocal = options.chassisConnectionPointLocal.clone();
+
+    /**
+     * @property {Vec3} chassisConnectionPointWorld
+     */
+    this.chassisConnectionPointWorld = options.chassisConnectionPointWorld.clone();
+
+    /**
+     * @property {Vec3} directionLocal
+     */
+    this.directionLocal = options.directionLocal.clone();
+
+    /**
+     * @property {Vec3} directionWorld
+     */
+    this.directionWorld = options.directionWorld.clone();
+
+    /**
+     * @property {Vec3} axleLocal
+     */
+    this.axleLocal = options.axleLocal.clone();
+
+    /**
+     * @property {Vec3} axleWorld
+     */
+    this.axleWorld = options.axleWorld.clone();
+
+    /**
+     * @property {number} suspensionRestLength
+     */
+    this.suspensionRestLength = options.suspensionRestLength;
+
+    /**
+     * @property {number} suspensionMaxLength
+     */
+    this.suspensionMaxLength = options.suspensionMaxLength;
+
+    /**
+     * @property {number} radius
+     */
+    this.radius = options.radius;
+
+    /**
+     * @property {number} suspensionStiffness
+     */
+    this.suspensionStiffness = options.suspensionStiffness;
+
+    /**
+     * @property {number} dampingCompression
+     */
+    this.dampingCompression = options.dampingCompression;
+
+    /**
+     * @property {number} dampingRelaxation
+     */
+    this.dampingRelaxation = options.dampingRelaxation;
+
+    /**
+     * @property {number} frictionSlip
+     */
+    this.frictionSlip = options.frictionSlip;
+
+    /**
+     * @property {number} steering
+     */
+    this.steering = 0;
+
+    /**
+     * Rotation value, in radians.
+     * @property {number} rotation
+     */
+    this.rotation = 0;
+
+    /**
+     * @property {number} deltaRotation
+     */
+    this.deltaRotation = 0;
+
+    /**
+     * @property {number} rollInfluence
+     */
+    this.rollInfluence = options.rollInfluence;
+
+    /**
+     * @property {number} maxSuspensionForce
+     */
+    this.maxSuspensionForce = options.maxSuspensionForce;
+
+    /**
+     * @property {number} engineForce
+     */
+    this.engineForce = 0;
+
+    /**
+     * @property {number} brake
+     */
+    this.brake = 0;
+
+    /**
+     * @property {number} isFrontWheel
+     */
+    this.isFrontWheel = options.isFrontWheel;
+
+    /**
+     * @property {number} clippedInvContactDotSuspension
+     */
+    this.clippedInvContactDotSuspension = 1;
+
+    /**
+     * @property {number} suspensionRelativeVelocity
+     */
+    this.suspensionRelativeVelocity = 0;
+
+    /**
+     * @property {number} suspensionForce
+     */
+    this.suspensionForce = 0;
+
+    /**
+     * @property {number} skidInfo
+     */
+    this.skidInfo = 0;
+
+    /**
+     * @property {number} suspensionLength
+     */
+    this.suspensionLength = 0;
+
+    /**
+     * @property {number} sideImpulse
+     */
+    this.sideImpulse = 0;
+
+    /**
+     * @property {number} forwardImpulse
+     */
+    this.forwardImpulse = 0;
+
+    /**
+     * The result from raycasting
+     * @property {RaycastResult} raycastResult
+     */
+    this.raycastResult = new RaycastResult();
+
+    /**
+     * Wheel world transform
+     * @property {Transform} worldTransform
+     */
+    this.worldTransform = new Transform();
+
+    /**
+     * @property {boolean} isInContact
+     */
+    this.isInContact = false;
+}
+
+var chassis_velocity_at_contactPoint = new Vec3();
+var relpos = new Vec3();
+var chassis_velocity_at_contactPoint = new Vec3();
+WheelInfo.prototype.updateWheel = function(chassis){
+    var raycastResult = this.raycastResult;
+
+    if (this.isInContact){
+        var project= raycastResult.hitNormalWorld.dot(raycastResult.directionWorld);
+        raycastResult.hitPointWorld.vsub(chassis.position, relpos);
+        chassis.getVelocityAtWorldPoint(relpos, chassis_velocity_at_contactPoint);
+        var projVel = raycastResult.hitNormalWorld.dot( chassis_velocity_at_contactPoint );
+        if (project >= -0.1) {
+            this.suspensionRelativeVelocity = 0.0;
+            this.clippedInvContactDotSuspension = 1.0 / 0.1;
+        } else {
+            var inv = -1 / project;
+            this.suspensionRelativeVelocity = projVel * inv;
+            this.clippedInvContactDotSuspension = inv;
+        }
+
+    } else {
+        // Not in contact : position wheel in a nice (rest length) position
+        raycastResult.suspensionLength = this.suspensionRestLength;
+        this.suspensionRelativeVelocity = 0.0;
+        raycastResult.directionWorld.scale(-1, raycastResult.hitNormalWorld);
+        this.clippedInvContactDotSuspension = 1.0;
+    }
+};
+},{"../collision/RaycastResult":23,"../math/Transform":42,"../math/Vec3":43,"../utils/Utils":66}],50:[function(require,module,exports){
+module.exports = Box;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+
+/**
+ * A 3d box shape.
+ * @class Box
+ * @constructor
+ * @param {Vec3} halfExtents
+ * @author schteppe
+ * @extends Shape
+ */
+function Box(halfExtents){
+    Shape.call(this);
+
+    this.type = Shape.types.BOX;
+
+    /**
+     * @property halfExtents
+     * @type {Vec3}
+     */
+    this.halfExtents = halfExtents;
+
+    /**
+     * Used by the contact generator to make contacts with other convex polyhedra for example
+     * @property convexPolyhedronRepresentation
+     * @type {ConvexPolyhedron}
+     */
+    this.convexPolyhedronRepresentation = null;
+
+    this.updateConvexPolyhedronRepresentation();
+    this.updateBoundingSphereRadius();
+}
+Box.prototype = new Shape();
+Box.prototype.constructor = Box;
+
+/**
+ * Updates the local convex polyhedron representation used for some collisions.
+ * @method updateConvexPolyhedronRepresentation
+ */
+Box.prototype.updateConvexPolyhedronRepresentation = function(){
+    var sx = this.halfExtents.x;
+    var sy = this.halfExtents.y;
+    var sz = this.halfExtents.z;
+    var V = Vec3;
+
+    var vertices = [
+        new V(-sx,-sy,-sz),
+        new V( sx,-sy,-sz),
+        new V( sx, sy,-sz),
+        new V(-sx, sy,-sz),
+        new V(-sx,-sy, sz),
+        new V( sx,-sy, sz),
+        new V( sx, sy, sz),
+        new V(-sx, sy, sz)
+    ];
+
+    var indices = [
+        [3,2,1,0], // -z
+        [4,5,6,7], // +z
+        [5,4,0,1], // -y
+        [2,3,7,6], // +y
+        [0,4,7,3], // -x
+        [1,2,6,5], // +x
+    ];
+
+    var axes = [
+        new V(0, 0, 1),
+        new V(0, 1, 0),
+        new V(1, 0, 0)
+    ];
+
+    var h = new ConvexPolyhedron(vertices, indices);
+    this.convexPolyhedronRepresentation = h;
+    h.material = this.material;
+};
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+Box.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    Box.calculateInertia(this.halfExtents, mass, target);
+    return target;
+};
+
+Box.calculateInertia = function(halfExtents,mass,target){
+    var e = halfExtents;
+    target.x = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.z*2*e.z );
+    target.y = 1.0 / 12.0 * mass * (   2*e.x*2*e.x + 2*e.z*2*e.z );
+    target.z = 1.0 / 12.0 * mass * (   2*e.y*2*e.y + 2*e.x*2*e.x );
+};
+
+/**
+ * Get the box 6 side normals
+ * @method getSideNormals
+ * @param {array}      sixTargetVectors An array of 6 vectors, to store the resulting side normals in.
+ * @param {Quaternion} quat             Orientation to apply to the normal vectors. If not provided, the vectors will be in respect to the local frame.
+ * @return {array}
+ */
+Box.prototype.getSideNormals = function(sixTargetVectors,quat){
+    var sides = sixTargetVectors;
+    var ex = this.halfExtents;
+    sides[0].set(  ex.x,     0,     0);
+    sides[1].set(     0,  ex.y,     0);
+    sides[2].set(     0,     0,  ex.z);
+    sides[3].set( -ex.x,     0,     0);
+    sides[4].set(     0, -ex.y,     0);
+    sides[5].set(     0,     0, -ex.z);
+
+    if(quat!==undefined){
+        for(var i=0; i!==sides.length; i++){
+            quat.vmult(sides[i],sides[i]);
+        }
+    }
+
+    return sides;
+};
+
+Box.prototype.volume = function(){
+    return 8.0 * this.halfExtents.x * this.halfExtents.y * this.halfExtents.z;
+};
+
+Box.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = this.halfExtents.norm();
+};
+
+var worldCornerTempPos = new Vec3();
+var worldCornerTempNeg = new Vec3();
+Box.prototype.forEachWorldCorner = function(pos,quat,callback){
+
+    var e = this.halfExtents;
+    var corners = [[  e.x,  e.y,  e.z],
+                   [ -e.x,  e.y,  e.z],
+                   [ -e.x, -e.y,  e.z],
+                   [ -e.x, -e.y, -e.z],
+                   [  e.x, -e.y, -e.z],
+                   [  e.x,  e.y, -e.z],
+                   [ -e.x,  e.y, -e.z],
+                   [  e.x, -e.y,  e.z]];
+    for(var i=0; i<corners.length; i++){
+        worldCornerTempPos.set(corners[i][0],corners[i][1],corners[i][2]);
+        quat.vmult(worldCornerTempPos,worldCornerTempPos);
+        pos.vadd(worldCornerTempPos,worldCornerTempPos);
+        callback(worldCornerTempPos.x,
+                 worldCornerTempPos.y,
+                 worldCornerTempPos.z);
+    }
+};
+
+var worldCornersTemp = [
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3(),
+    new Vec3()
+];
+Box.prototype.calculateWorldAABB = function(pos,quat,min,max){
+
+    var e = this.halfExtents;
+    worldCornersTemp[0].set(e.x, e.y, e.z);
+    worldCornersTemp[1].set(-e.x,  e.y, e.z);
+    worldCornersTemp[2].set(-e.x, -e.y, e.z);
+    worldCornersTemp[3].set(-e.x, -e.y, -e.z);
+    worldCornersTemp[4].set(e.x, -e.y, -e.z);
+    worldCornersTemp[5].set(e.x,  e.y, -e.z);
+    worldCornersTemp[6].set(-e.x,  e.y, -e.z);
+    worldCornersTemp[7].set(e.x, -e.y,  e.z);
+
+    var wc = worldCornersTemp[0];
+    quat.vmult(wc, wc);
+    pos.vadd(wc, wc);
+    max.copy(wc);
+    min.copy(wc);
+    for(var i=1; i<8; i++){
+        var wc = worldCornersTemp[i];
+        quat.vmult(wc, wc);
+        pos.vadd(wc, wc);
+        var x = wc.x;
+        var y = wc.y;
+        var z = wc.z;
+        if(x > max.x){
+            max.x = x;
+        }
+        if(y > max.y){
+            max.y = y;
+        }
+        if(z > max.z){
+            max.z = z;
+        }
+
+        if(x < min.x){
+            min.x = x;
+        }
+        if(y < min.y){
+            min.y = y;
+        }
+        if(z < min.z){
+            min.z = z;
+        }
+    }
+
+    // Get each axis max
+    // min.set(Infinity,Infinity,Infinity);
+    // max.set(-Infinity,-Infinity,-Infinity);
+    // this.forEachWorldCorner(pos,quat,function(x,y,z){
+    //     if(x > max.x){
+    //         max.x = x;
+    //     }
+    //     if(y > max.y){
+    //         max.y = y;
+    //     }
+    //     if(z > max.z){
+    //         max.z = z;
+    //     }
+
+    //     if(x < min.x){
+    //         min.x = x;
+    //     }
+    //     if(y < min.y){
+    //         min.y = y;
+    //     }
+    //     if(z < min.z){
+    //         min.z = z;
+    //     }
+    // });
+};
+
+},{"../math/Vec3":43,"./ConvexPolyhedron":51,"./Shape":56}],51:[function(require,module,exports){
+module.exports = ConvexPolyhedron;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+
+/**
+ * A set of polygons describing a convex shape.
+ * @class ConvexPolyhedron
+ * @constructor
+ * @extends Shape
+ * @description The shape MUST be convex for the code to work properly. No polygons may be coplanar (contained
+ * in the same 3D plane), instead these should be merged into one polygon.
+ *
+ * @param {array} points An array of Vec3's
+ * @param {array} faces Array of integer arrays, describing which vertices that is included in each face.
+ *
+ * @author qiao / https://github.com/qiao (original author, see https://github.com/qiao/three.js/commit/85026f0c769e4000148a67d45a9e9b9c5108836f)
+ * @author schteppe / https://github.com/schteppe
+ * @see http://www.altdevblogaday.com/2011/05/13/contact-generation-between-3d-convex-meshes/
+ * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+ *
+ * @todo Move the clipping functions to ContactGenerator?
+ * @todo Automatically merge coplanar polygons in constructor.
+ */
+function ConvexPolyhedron(points, faces, uniqueAxes) {
+    var that = this;
+    Shape.call(this);
+    this.type = Shape.types.CONVEXPOLYHEDRON;
+
+    /**
+     * Array of Vec3
+     * @property vertices
+     * @type {Array}
+     */
+    this.vertices = points||[];
+
+    this.worldVertices = []; // World transformed version of .vertices
+    this.worldVerticesNeedsUpdate = true;
+
+    /**
+     * Array of integer arrays, indicating which vertices each face consists of
+     * @property faces
+     * @type {Array}
+     */
+    this.faces = faces||[];
+
+    /**
+     * Array of Vec3
+     * @property faceNormals
+     * @type {Array}
+     */
+    this.faceNormals = [];
+    this.computeNormals();
+
+    this.worldFaceNormalsNeedsUpdate = true;
+    this.worldFaceNormals = []; // World transformed version of .faceNormals
+
+    /**
+     * Array of Vec3
+     * @property uniqueEdges
+     * @type {Array}
+     */
+    this.uniqueEdges = [];
+
+    /**
+     * If given, these locally defined, normalized axes are the only ones being checked when doing separating axis check.
+     * @property {Array} uniqueAxes
+     */
+    this.uniqueAxes = uniqueAxes ? uniqueAxes.slice() : null;
+
+    this.computeEdges();
+    this.updateBoundingSphereRadius();
+}
+ConvexPolyhedron.prototype = new Shape();
+ConvexPolyhedron.prototype.constructor = ConvexPolyhedron;
+
+var computeEdges_tmpEdge = new Vec3();
+/**
+ * Computes uniqueEdges
+ * @method computeEdges
+ */
+ConvexPolyhedron.prototype.computeEdges = function(){
+    var faces = this.faces;
+    var vertices = this.vertices;
+    var nv = vertices.length;
+    var edges = this.uniqueEdges;
+
+    edges.length = 0;
+
+    var edge = computeEdges_tmpEdge;
+
+    for(var i=0; i !== faces.length; i++){
+        var face = faces[i];
+        var numVertices = face.length;
+        for(var j = 0; j !== numVertices; j++){
+            var k = ( j+1 ) % numVertices;
+            vertices[face[j]].vsub(vertices[face[k]], edge);
+            edge.normalize();
+            var found = false;
+            for(var p=0; p !== edges.length; p++){
+                if (edges[p].almostEquals(edge) || edges[p].almostEquals(edge)){
+                    found = true;
+                    break;
+                }
+            }
+
+            if (!found){
+                edges.push(edge.clone());
+            }
+        }
+    }
+};
+
+/**
+ * Compute the normals of the faces. Will reuse existing Vec3 objects in the .faceNormals array if they exist.
+ * @method computeNormals
+ */
+ConvexPolyhedron.prototype.computeNormals = function(){
+    this.faceNormals.length = this.faces.length;
+
+    // Generate normals
+    for(var i=0; i<this.faces.length; i++){
+
+        // Check so all vertices exists for this face
+        for(var j=0; j<this.faces[i].length; j++){
+            if(!this.vertices[this.faces[i][j]]){
+                throw new Error("Vertex "+this.faces[i][j]+" not found!");
+            }
+        }
+
+        var n = this.faceNormals[i] || new Vec3();
+        this.getFaceNormal(i,n);
+        n.negate(n);
+        this.faceNormals[i] = n;
+        var vertex = this.vertices[this.faces[i][0]];
+        if(n.dot(vertex) < 0){
+            console.error(".faceNormals[" + i + "] = Vec3("+n.toString()+") looks like it points into the shape? The vertices follow. Make sure they are ordered CCW around the normal, using the right hand rule.");
+            for(var j=0; j<this.faces[i].length; j++){
+                console.warn(".vertices["+this.faces[i][j]+"] = Vec3("+this.vertices[this.faces[i][j]].toString()+")");
+            }
+        }
+    }
+};
+
+/**
+ * Get face normal given 3 vertices
+ * @static
+ * @method getFaceNormal
+ * @param {Vec3} va
+ * @param {Vec3} vb
+ * @param {Vec3} vc
+ * @param {Vec3} target
+ */
+var cb = new Vec3();
+var ab = new Vec3();
+ConvexPolyhedron.computeNormal = function ( va, vb, vc, target ) {
+    vb.vsub(va,ab);
+    vc.vsub(vb,cb);
+    cb.cross(ab,target);
+    if ( !target.isZero() ) {
+        target.normalize();
+    }
+};
+
+/**
+ * Compute the normal of a face from its vertices
+ * @method getFaceNormal
+ * @param  {Number} i
+ * @param  {Vec3} target
+ */
+ConvexPolyhedron.prototype.getFaceNormal = function(i,target){
+    var f = this.faces[i];
+    var va = this.vertices[f[0]];
+    var vb = this.vertices[f[1]];
+    var vc = this.vertices[f[2]];
+    return ConvexPolyhedron.computeNormal(va,vb,vc,target);
+};
+
+/**
+ * @method clipAgainstHull
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @param {Vec3} separatingNormal
+ * @param {Number} minDist Clamp distance
+ * @param {Number} maxDist
+ * @param {array} result The an array of contact point objects, see clipFaceAgainstHull
+ * @see http://bullet.googlecode.com/svn/trunk/src/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp
+ */
+var cah_WorldNormal = new Vec3();
+ConvexPolyhedron.prototype.clipAgainstHull = function(posA,quatA,hullB,posB,quatB,separatingNormal,minDist,maxDist,result){
+    var WorldNormal = cah_WorldNormal;
+    var hullA = this;
+    var curMaxDist = maxDist;
+    var closestFaceB = -1;
+    var dmax = -Number.MAX_VALUE;
+    for(var face=0; face < hullB.faces.length; face++){
+        WorldNormal.copy(hullB.faceNormals[face]);
+        quatB.vmult(WorldNormal,WorldNormal);
+        //posB.vadd(WorldNormal,WorldNormal);
+        var d = WorldNormal.dot(separatingNormal);
+        if (d > dmax){
+            dmax = d;
+            closestFaceB = face;
+        }
+    }
+    var worldVertsB1 = [];
+    var polyB = hullB.faces[closestFaceB];
+    var numVertices = polyB.length;
+    for(var e0=0; e0<numVertices; e0++){
+        var b = hullB.vertices[polyB[e0]];
+        var worldb = new Vec3();
+        worldb.copy(b);
+        quatB.vmult(worldb,worldb);
+        posB.vadd(worldb,worldb);
+        worldVertsB1.push(worldb);
+    }
+
+    if (closestFaceB>=0){
+        this.clipFaceAgainstHull(separatingNormal,
+                                 posA,
+                                 quatA,
+                                 worldVertsB1,
+                                 minDist,
+                                 maxDist,
+                                 result);
+    }
+};
+
+/**
+ * Find the separating axis between this hull and another
+ * @method findSeparatingAxis
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @param {Vec3} target The target vector to save the axis in
+ * @return {bool} Returns false if a separation is found, else true
+ */
+var fsa_faceANormalWS3 = new Vec3(),
+    fsa_Worldnormal1 = new Vec3(),
+    fsa_deltaC = new Vec3(),
+    fsa_worldEdge0 = new Vec3(),
+    fsa_worldEdge1 = new Vec3(),
+    fsa_Cross = new Vec3();
+ConvexPolyhedron.prototype.findSeparatingAxis = function(hullB,posA,quatA,posB,quatB,target, faceListA, faceListB){
+    var faceANormalWS3 = fsa_faceANormalWS3,
+        Worldnormal1 = fsa_Worldnormal1,
+        deltaC = fsa_deltaC,
+        worldEdge0 = fsa_worldEdge0,
+        worldEdge1 = fsa_worldEdge1,
+        Cross = fsa_Cross;
+
+    var dmin = Number.MAX_VALUE;
+    var hullA = this;
+    var curPlaneTests=0;
+
+    if(!hullA.uniqueAxes){
+
+        var numFacesA = faceListA ? faceListA.length : hullA.faces.length;
+
+        // Test face normals from hullA
+        for(var i=0; i<numFacesA; i++){
+            var fi = faceListA ? faceListA[i] : i;
+
+            // Get world face normal
+            faceANormalWS3.copy(hullA.faceNormals[fi]);
+            quatA.vmult(faceANormalWS3,faceANormalWS3);
+
+            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(faceANormalWS3);
+            }
+        }
+
+    } else {
+
+        // Test unique axes
+        for(var i = 0; i !== hullA.uniqueAxes.length; i++){
+
+            // Get world axis
+            quatA.vmult(hullA.uniqueAxes[i],faceANormalWS3);
+
+            var d = hullA.testSepAxis(faceANormalWS3, hullB, posA, quatA, posB, quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(faceANormalWS3);
+            }
+        }
+    }
+
+    if(!hullB.uniqueAxes){
+
+        // Test face normals from hullB
+        var numFacesB = faceListB ? faceListB.length : hullB.faces.length;
+        for(var i=0;i<numFacesB;i++){
+
+            var fi = faceListB ? faceListB[i] : i;
+
+            Worldnormal1.copy(hullB.faceNormals[fi]);
+            quatB.vmult(Worldnormal1,Worldnormal1);
+            curPlaneTests++;
+            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(Worldnormal1);
+            }
+        }
+    } else {
+
+        // Test unique axes in B
+        for(var i = 0; i !== hullB.uniqueAxes.length; i++){
+            quatB.vmult(hullB.uniqueAxes[i],Worldnormal1);
+
+            curPlaneTests++;
+            var d = hullA.testSepAxis(Worldnormal1, hullB,posA,quatA,posB,quatB);
+            if(d===false){
+                return false;
+            }
+
+            if(d<dmin){
+                dmin = d;
+                target.copy(Worldnormal1);
+            }
+        }
+    }
+
+    // Test edges
+    for(var e0=0; e0 !== hullA.uniqueEdges.length; e0++){
+
+        // Get world edge
+        quatA.vmult(hullA.uniqueEdges[e0],worldEdge0);
+
+        for(var e1=0; e1 !== hullB.uniqueEdges.length; e1++){
+
+            // Get world edge 2
+            quatB.vmult(hullB.uniqueEdges[e1], worldEdge1);
+            worldEdge0.cross(worldEdge1,Cross);
+
+            if(!Cross.almostZero()){
+                Cross.normalize();
+                var dist = hullA.testSepAxis(Cross, hullB, posA, quatA, posB, quatB);
+                if(dist === false){
+                    return false;
+                }
+                if(dist < dmin){
+                    dmin = dist;
+                    target.copy(Cross);
+                }
+            }
+        }
+    }
+
+    posB.vsub(posA,deltaC);
+    if((deltaC.dot(target))>0.0){
+        target.negate(target);
+    }
+
+    return true;
+};
+
+var maxminA=[], maxminB=[];
+
+/**
+ * Test separating axis against two hulls. Both hulls are projected onto the axis and the overlap size is returned if there is one.
+ * @method testSepAxis
+ * @param {Vec3} axis
+ * @param {ConvexPolyhedron} hullB
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Vec3} posB
+ * @param {Quaternion} quatB
+ * @return {number} The overlap depth, or FALSE if no penetration.
+ */
+ConvexPolyhedron.prototype.testSepAxis = function(axis, hullB, posA, quatA, posB, quatB){
+    var hullA=this;
+    ConvexPolyhedron.project(hullA, axis, posA, quatA, maxminA);
+    ConvexPolyhedron.project(hullB, axis, posB, quatB, maxminB);
+    var maxA = maxminA[0];
+    var minA = maxminA[1];
+    var maxB = maxminB[0];
+    var minB = maxminB[1];
+    if(maxA<minB || maxB<minA){
+        return false; // Separated
+    }
+    var d0 = maxA - minB;
+    var d1 = maxB - minA;
+    var depth = d0<d1 ? d0:d1;
+    return depth;
+};
+
+var cli_aabbmin = new Vec3(),
+    cli_aabbmax = new Vec3();
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ */
+ConvexPolyhedron.prototype.calculateLocalInertia = function(mass,target){
+    // Approximate with box inertia
+    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it
+    this.computeLocalAABB(cli_aabbmin,cli_aabbmax);
+    var x = cli_aabbmax.x - cli_aabbmin.x,
+        y = cli_aabbmax.y - cli_aabbmin.y,
+        z = cli_aabbmax.z - cli_aabbmin.z;
+    target.x = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z );
+    target.y = 1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z );
+    target.z = 1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x );
+};
+
+/**
+ * @method getPlaneConstantOfFace
+ * @param  {Number} face_i Index of the face
+ * @return {Number}
+ */
+ConvexPolyhedron.prototype.getPlaneConstantOfFace = function(face_i){
+    var f = this.faces[face_i];
+    var n = this.faceNormals[face_i];
+    var v = this.vertices[f[0]];
+    var c = -n.dot(v);
+    return c;
+};
+
+/**
+ * Clip a face against a hull.
+ * @method clipFaceAgainstHull
+ * @param {Vec3} separatingNormal
+ * @param {Vec3} posA
+ * @param {Quaternion} quatA
+ * @param {Array} worldVertsB1 An array of Vec3 with vertices in the world frame.
+ * @param {Number} minDist Distance clamping
+ * @param {Number} maxDist
+ * @param Array result Array to store resulting contact points in. Will be objects with properties: point, depth, normal. These are represented in world coordinates.
+ */
+var cfah_faceANormalWS = new Vec3(),
+    cfah_edge0 = new Vec3(),
+    cfah_WorldEdge0 = new Vec3(),
+    cfah_worldPlaneAnormal1 = new Vec3(),
+    cfah_planeNormalWS1 = new Vec3(),
+    cfah_worldA1 = new Vec3(),
+    cfah_localPlaneNormal = new Vec3(),
+    cfah_planeNormalWS = new Vec3();
+ConvexPolyhedron.prototype.clipFaceAgainstHull = function(separatingNormal, posA, quatA, worldVertsB1, minDist, maxDist,result){
+    var faceANormalWS = cfah_faceANormalWS,
+        edge0 = cfah_edge0,
+        WorldEdge0 = cfah_WorldEdge0,
+        worldPlaneAnormal1 = cfah_worldPlaneAnormal1,
+        planeNormalWS1 = cfah_planeNormalWS1,
+        worldA1 = cfah_worldA1,
+        localPlaneNormal = cfah_localPlaneNormal,
+        planeNormalWS = cfah_planeNormalWS;
+
+    var hullA = this;
+    var worldVertsB2 = [];
+    var pVtxIn = worldVertsB1;
+    var pVtxOut = worldVertsB2;
+    // Find the face with normal closest to the separating axis
+    var closestFaceA = -1;
+    var dmin = Number.MAX_VALUE;
+    for(var face=0; face<hullA.faces.length; face++){
+        faceANormalWS.copy(hullA.faceNormals[face]);
+        quatA.vmult(faceANormalWS,faceANormalWS);
+        //posA.vadd(faceANormalWS,faceANormalWS);
+        var d = faceANormalWS.dot(separatingNormal);
+        if (d < dmin){
+            dmin = d;
+            closestFaceA = face;
+        }
+    }
+    if (closestFaceA < 0){
+        // console.log("--- did not find any closest face... ---");
+        return;
+    }
+    //console.log("closest A: ",closestFaceA);
+    // Get the face and construct connected faces
+    var polyA = hullA.faces[closestFaceA];
+    polyA.connectedFaces = [];
+    for(var i=0; i<hullA.faces.length; i++){
+        for(var j=0; j<hullA.faces[i].length; j++){
+            if(polyA.indexOf(hullA.faces[i][j])!==-1 /* Sharing a vertex*/ && i!==closestFaceA /* Not the one we are looking for connections from */ && polyA.connectedFaces.indexOf(i)===-1 /* Not already added */ ){
+                polyA.connectedFaces.push(i);
+            }
+        }
+    }
+    // Clip the polygon to the back of the planes of all faces of hull A, that are adjacent to the witness face
+    var numContacts = pVtxIn.length;
+    var numVerticesA = polyA.length;
+    var res = [];
+    for(var e0=0; e0<numVerticesA; e0++){
+        var a = hullA.vertices[polyA[e0]];
+        var b = hullA.vertices[polyA[(e0+1)%numVerticesA]];
+        a.vsub(b,edge0);
+        WorldEdge0.copy(edge0);
+        quatA.vmult(WorldEdge0,WorldEdge0);
+        posA.vadd(WorldEdge0,WorldEdge0);
+        worldPlaneAnormal1.copy(this.faceNormals[closestFaceA]);//transA.getBasis()* btVector3(polyA.m_plane[0],polyA.m_plane[1],polyA.m_plane[2]);
+        quatA.vmult(worldPlaneAnormal1,worldPlaneAnormal1);
+        posA.vadd(worldPlaneAnormal1,worldPlaneAnormal1);
+        WorldEdge0.cross(worldPlaneAnormal1,planeNormalWS1);
+        planeNormalWS1.negate(planeNormalWS1);
+        worldA1.copy(a);
+        quatA.vmult(worldA1,worldA1);
+        posA.vadd(worldA1,worldA1);
+        var planeEqWS1 = -worldA1.dot(planeNormalWS1);
+        var planeEqWS;
+        if(true){
+            var otherFace = polyA.connectedFaces[e0];
+            localPlaneNormal.copy(this.faceNormals[otherFace]);
+            var localPlaneEq = this.getPlaneConstantOfFace(otherFace);
+
+            planeNormalWS.copy(localPlaneNormal);
+            quatA.vmult(planeNormalWS,planeNormalWS);
+            //posA.vadd(planeNormalWS,planeNormalWS);
+            var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);
+        } else  {
+            planeNormalWS.copy(planeNormalWS1);
+            planeEqWS = planeEqWS1;
+        }
+
+        // Clip face against our constructed plane
+        this.clipFaceAgainstPlane(pVtxIn, pVtxOut, planeNormalWS, planeEqWS);
+
+        // Throw away all clipped points, but save the reamining until next clip
+        while(pVtxIn.length){
+            pVtxIn.shift();
+        }
+        while(pVtxOut.length){
+            pVtxIn.push(pVtxOut.shift());
+        }
+    }
+
+    //console.log("Resulting points after clip:",pVtxIn);
+
+    // only keep contact points that are behind the witness face
+    localPlaneNormal.copy(this.faceNormals[closestFaceA]);
+
+    var localPlaneEq = this.getPlaneConstantOfFace(closestFaceA);
+    planeNormalWS.copy(localPlaneNormal);
+    quatA.vmult(planeNormalWS,planeNormalWS);
+
+    var planeEqWS = localPlaneEq - planeNormalWS.dot(posA);
+    for (var i=0; i<pVtxIn.length; i++){
+        var depth = planeNormalWS.dot(pVtxIn[i]) + planeEqWS; //???
+        /*console.log("depth calc from normal=",planeNormalWS.toString()," and constant "+planeEqWS+" and vertex ",pVtxIn[i].toString()," gives "+depth);*/
+        if (depth <=minDist){
+            console.log("clamped: depth="+depth+" to minDist="+(minDist+""));
+            depth = minDist;
+        }
+
+        if (depth <=maxDist){
+            var point = pVtxIn[i];
+            if(depth<=0){
+                /*console.log("Got contact point ",point.toString(),
+                  ", depth=",depth,
+                  "contact normal=",separatingNormal.toString(),
+                  "plane",planeNormalWS.toString(),
+                  "planeConstant",planeEqWS);*/
+                var p = {
+                    point:point,
+                    normal:planeNormalWS,
+                    depth: depth,
+                };
+                result.push(p);
+            }
+        }
+    }
+};
+
+/**
+ * Clip a face in a hull against the back of a plane.
+ * @method clipFaceAgainstPlane
+ * @param {Array} inVertices
+ * @param {Array} outVertices
+ * @param {Vec3} planeNormal
+ * @param {Number} planeConstant The constant in the mathematical plane equation
+ */
+ConvexPolyhedron.prototype.clipFaceAgainstPlane = function(inVertices,outVertices, planeNormal, planeConstant){
+    var n_dot_first, n_dot_last;
+    var numVerts = inVertices.length;
+
+    if(numVerts < 2){
+        return outVertices;
+    }
+
+    var firstVertex = inVertices[inVertices.length-1],
+        lastVertex =   inVertices[0];
+
+    n_dot_first = planeNormal.dot(firstVertex) + planeConstant;
+
+    for(var vi = 0; vi < numVerts; vi++){
+        lastVertex = inVertices[vi];
+        n_dot_last = planeNormal.dot(lastVertex) + planeConstant;
+        if(n_dot_first < 0){
+            if(n_dot_last < 0){
+                // Start < 0, end < 0, so output lastVertex
+                var newv = new Vec3();
+                newv.copy(lastVertex);
+                outVertices.push(newv);
+            } else {
+                // Start < 0, end >= 0, so output intersection
+                var newv = new Vec3();
+                firstVertex.lerp(lastVertex,
+                                 n_dot_first / (n_dot_first - n_dot_last),
+                                 newv);
+                outVertices.push(newv);
+            }
+        } else {
+            if(n_dot_last<0){
+                // Start >= 0, end < 0 so output intersection and end
+                var newv = new Vec3();
+                firstVertex.lerp(lastVertex,
+                                 n_dot_first / (n_dot_first - n_dot_last),
+                                 newv);
+                outVertices.push(newv);
+                outVertices.push(lastVertex);
+            }
+        }
+        firstVertex = lastVertex;
+        n_dot_first = n_dot_last;
+    }
+    return outVertices;
+};
+
+// Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.
+ConvexPolyhedron.prototype.computeWorldVertices = function(position,quat){
+    var N = this.vertices.length;
+    while(this.worldVertices.length < N){
+        this.worldVertices.push( new Vec3() );
+    }
+
+    var verts = this.vertices,
+        worldVerts = this.worldVertices;
+    for(var i=0; i!==N; i++){
+        quat.vmult( verts[i] , worldVerts[i] );
+        position.vadd( worldVerts[i] , worldVerts[i] );
+    }
+
+    this.worldVerticesNeedsUpdate = false;
+};
+
+var computeLocalAABB_worldVert = new Vec3();
+ConvexPolyhedron.prototype.computeLocalAABB = function(aabbmin,aabbmax){
+    var n = this.vertices.length,
+        vertices = this.vertices,
+        worldVert = computeLocalAABB_worldVert;
+
+    aabbmin.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
+    aabbmax.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
+
+    for(var i=0; i<n; i++){
+        var v = vertices[i];
+        if     (v.x < aabbmin.x){
+            aabbmin.x = v.x;
+        } else if(v.x > aabbmax.x){
+            aabbmax.x = v.x;
+        }
+        if     (v.y < aabbmin.y){
+            aabbmin.y = v.y;
+        } else if(v.y > aabbmax.y){
+            aabbmax.y = v.y;
+        }
+        if     (v.z < aabbmin.z){
+            aabbmin.z = v.z;
+        } else if(v.z > aabbmax.z){
+            aabbmax.z = v.z;
+        }
+    }
+};
+
+/**
+ * Updates .worldVertices and sets .worldVerticesNeedsUpdate to false.
+ * @method computeWorldFaceNormals
+ * @param  {Quaternion} quat
+ */
+ConvexPolyhedron.prototype.computeWorldFaceNormals = function(quat){
+    var N = this.faceNormals.length;
+    while(this.worldFaceNormals.length < N){
+        this.worldFaceNormals.push( new Vec3() );
+    }
+
+    var normals = this.faceNormals,
+        worldNormals = this.worldFaceNormals;
+    for(var i=0; i!==N; i++){
+        quat.vmult( normals[i] , worldNormals[i] );
+    }
+
+    this.worldFaceNormalsNeedsUpdate = false;
+};
+
+/**
+ * @method updateBoundingSphereRadius
+ */
+ConvexPolyhedron.prototype.updateBoundingSphereRadius = function(){
+    // Assume points are distributed with local (0,0,0) as center
+    var max2 = 0;
+    var verts = this.vertices;
+    for(var i=0, N=verts.length; i!==N; i++) {
+        var norm2 = verts[i].norm2();
+        if(norm2 > max2){
+            max2 = norm2;
+        }
+    }
+    this.boundingSphereRadius = Math.sqrt(max2);
+};
+
+var tempWorldVertex = new Vec3();
+
+/**
+ * @method calculateWorldAABB
+ * @param {Vec3}        pos
+ * @param {Quaternion}  quat
+ * @param {Vec3}        min
+ * @param {Vec3}        max
+ */
+ConvexPolyhedron.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    var n = this.vertices.length, verts = this.vertices;
+    var minx,miny,minz,maxx,maxy,maxz;
+    for(var i=0; i<n; i++){
+        tempWorldVertex.copy(verts[i]);
+        quat.vmult(tempWorldVertex,tempWorldVertex);
+        pos.vadd(tempWorldVertex,tempWorldVertex);
+        var v = tempWorldVertex;
+        if     (v.x < minx || minx===undefined){
+            minx = v.x;
+        } else if(v.x > maxx || maxx===undefined){
+            maxx = v.x;
+        }
+
+        if     (v.y < miny || miny===undefined){
+            miny = v.y;
+        } else if(v.y > maxy || maxy===undefined){
+            maxy = v.y;
+        }
+
+        if     (v.z < minz || minz===undefined){
+            minz = v.z;
+        } else if(v.z > maxz || maxz===undefined){
+            maxz = v.z;
+        }
+    }
+    min.set(minx,miny,minz);
+    max.set(maxx,maxy,maxz);
+};
+
+/**
+ * Get approximate convex volume
+ * @method volume
+ * @return {Number}
+ */
+ConvexPolyhedron.prototype.volume = function(){
+    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;
+};
+
+/**
+ * Get an average of all the vertices positions
+ * @method getAveragePointLocal
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+ConvexPolyhedron.prototype.getAveragePointLocal = function(target){
+    target = target || new Vec3();
+    var n = this.vertices.length,
+        verts = this.vertices;
+    for(var i=0; i<n; i++){
+        target.vadd(verts[i],target);
+    }
+    target.mult(1/n,target);
+    return target;
+};
+
+/**
+ * Transform all local points. Will change the .vertices
+ * @method transformAllPoints
+ * @param  {Vec3} offset
+ * @param  {Quaternion} quat
+ */
+ConvexPolyhedron.prototype.transformAllPoints = function(offset,quat){
+    var n = this.vertices.length,
+        verts = this.vertices;
+
+    // Apply rotation
+    if(quat){
+        // Rotate vertices
+        for(var i=0; i<n; i++){
+            var v = verts[i];
+            quat.vmult(v,v);
+        }
+        // Rotate face normals
+        for(var i=0; i<this.faceNormals.length; i++){
+            var v = this.faceNormals[i];
+            quat.vmult(v,v);
+        }
+        /*
+        // Rotate edges
+        for(var i=0; i<this.uniqueEdges.length; i++){
+            var v = this.uniqueEdges[i];
+            quat.vmult(v,v);
+        }*/
+    }
+
+    // Apply offset
+    if(offset){
+        for(var i=0; i<n; i++){
+            var v = verts[i];
+            v.vadd(offset,v);
+        }
+    }
+};
+
+/**
+ * Checks whether p is inside the polyhedra. Must be in local coords. The point lies outside of the convex hull of the other points if and only if the direction of all the vectors from it to those other points are on less than one half of a sphere around it.
+ * @method pointIsInside
+ * @param  {Vec3} p      A point given in local coordinates
+ * @return {Boolean}
+ */
+var ConvexPolyhedron_pointIsInside = new Vec3();
+var ConvexPolyhedron_vToP = new Vec3();
+var ConvexPolyhedron_vToPointInside = new Vec3();
+ConvexPolyhedron.prototype.pointIsInside = function(p){
+    var n = this.vertices.length,
+        verts = this.vertices,
+        faces = this.faces,
+        normals = this.faceNormals;
+    var positiveResult = null;
+    var N = this.faces.length;
+    var pointInside = ConvexPolyhedron_pointIsInside;
+    this.getAveragePointLocal(pointInside);
+    for(var i=0; i<N; i++){
+        var numVertices = this.faces[i].length;
+        var n = normals[i];
+        var v = verts[faces[i][0]]; // We only need one point in the face
+
+        // This dot product determines which side of the edge the point is
+        var vToP = ConvexPolyhedron_vToP;
+        p.vsub(v,vToP);
+        var r1 = n.dot(vToP);
+
+        var vToPointInside = ConvexPolyhedron_vToPointInside;
+        pointInside.vsub(v,vToPointInside);
+        var r2 = n.dot(vToPointInside);
+
+        if((r1<0 && r2>0) || (r1>0 && r2<0)){
+            return false; // Encountered some other sign. Exit.
+        } else {
+        }
+    }
+
+    // If we got here, all dot products were of the same sign.
+    return positiveResult ? 1 : -1;
+};
+
+/**
+ * Get max and min dot product of a convex hull at position (pos,quat) projected onto an axis. Results are saved in the array maxmin.
+ * @static
+ * @method project
+ * @param {ConvexPolyhedron} hull
+ * @param {Vec3} axis
+ * @param {Vec3} pos
+ * @param {Quaternion} quat
+ * @param {array} result result[0] and result[1] will be set to maximum and minimum, respectively.
+ */
+var project_worldVertex = new Vec3();
+var project_localAxis = new Vec3();
+var project_localOrigin = new Vec3();
+ConvexPolyhedron.project = function(hull, axis, pos, quat, result){
+    var n = hull.vertices.length,
+        worldVertex = project_worldVertex,
+        localAxis = project_localAxis,
+        max = 0,
+        min = 0,
+        localOrigin = project_localOrigin,
+        vs = hull.vertices;
+
+    localOrigin.setZero();
+
+    // Transform the axis to local
+    Transform.vectorToLocalFrame(pos, quat, axis, localAxis);
+    Transform.pointToLocalFrame(pos, quat, localOrigin, localOrigin);
+    var add = localOrigin.dot(localAxis);
+
+    min = max = vs[0].dot(localAxis);
+
+    for(var i = 1; i < n; i++){
+        var val = vs[i].dot(localAxis);
+
+        if(val > max){
+            max = val;
+        }
+
+        if(val < min){
+            min = val;
+        }
+    }
+
+    min -= add;
+    max -= add;
+
+    if(min > max){
+        // Inconsistent - swap
+        var temp = min;
+        min = max;
+        max = temp;
+    }
+    // Output
+    result[0] = max;
+    result[1] = min;
+};
+
+},{"../math/Quaternion":41,"../math/Transform":42,"../math/Vec3":43,"./Shape":56}],52:[function(require,module,exports){
+module.exports = Cylinder;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+
+/**
+ * @class Cylinder
+ * @constructor
+ * @extends ConvexPolyhedron
+ * @author schteppe / https://github.com/schteppe
+ * @param {Number} radiusTop
+ * @param {Number} radiusBottom
+ * @param {Number} height
+ * @param {Number} numSegments The number of segments to build the cylinder out of
+ */
+function Cylinder( radiusTop, radiusBottom, height , numSegments ) {
+    var N = numSegments,
+        verts = [],
+        axes = [],
+        faces = [],
+        bottomface = [],
+        topface = [],
+        cos = Math.cos,
+        sin = Math.sin;
+
+    // First bottom point
+    verts.push(new Vec3(radiusBottom*cos(0),
+                               radiusBottom*sin(0),
+                               -height*0.5));
+    bottomface.push(0);
+
+    // First top point
+    verts.push(new Vec3(radiusTop*cos(0),
+                               radiusTop*sin(0),
+                               height*0.5));
+    topface.push(1);
+
+    for(var i=0; i<N; i++){
+        var theta = 2*Math.PI/N * (i+1);
+        var thetaN = 2*Math.PI/N * (i+0.5);
+        if(i<N-1){
+            // Bottom
+            verts.push(new Vec3(radiusBottom*cos(theta),
+                                       radiusBottom*sin(theta),
+                                       -height*0.5));
+            bottomface.push(2*i+2);
+            // Top
+            verts.push(new Vec3(radiusTop*cos(theta),
+                                       radiusTop*sin(theta),
+                                       height*0.5));
+            topface.push(2*i+3);
+
+            // Face
+            faces.push([2*i+2, 2*i+3, 2*i+1,2*i]);
+        } else {
+            faces.push([0,1, 2*i+1, 2*i]); // Connect
+        }
+
+        // Axis: we can cut off half of them if we have even number of segments
+        if(N % 2 === 1 || i < N / 2){
+            axes.push(new Vec3(cos(thetaN), sin(thetaN), 0));
+        }
+    }
+    faces.push(topface);
+    axes.push(new Vec3(0,0,1));
+
+    // Reorder bottom face
+    var temp = [];
+    for(var i=0; i<bottomface.length; i++){
+        temp.push(bottomface[bottomface.length - i - 1]);
+    }
+    faces.push(temp);
+
+    this.type = Shape.types.CONVEXPOLYHEDRON;
+    ConvexPolyhedron.call( this, verts, faces, axes );
+}
+
+Cylinder.prototype = new ConvexPolyhedron();
+
+},{"../math/Quaternion":41,"../math/Vec3":43,"./ConvexPolyhedron":51,"./Shape":56}],53:[function(require,module,exports){
+var Shape = require('./Shape');
+var ConvexPolyhedron = require('./ConvexPolyhedron');
+var Vec3 = require('../math/Vec3');
+var Utils = require('../utils/Utils');
+
+module.exports = Heightfield;
+
+/**
+ * Heightfield shape class. Height data is given as an array. These data points are spread out evenly with a given distance.
+ * @class Heightfield
+ * @extends Shape
+ * @constructor
+ * @param {Array} data An array of Y values that will be used to construct the terrain.
+ * @param {object} options
+ * @param {Number} [options.minValue] Minimum value of the data points in the data array. Will be computed automatically if not given.
+ * @param {Number} [options.maxValue] Maximum value.
+ * @param {Number} [options.elementSize=0.1] World spacing between the data points in X direction.
+ * @todo Should be possible to use along all axes, not just y
+ * @todo should be possible to scale along all axes
+ *
+ * @example
+ *     // Generate some height data (y-values).
+ *     var data = [];
+ *     for(var i = 0; i < 1000; i++){
+ *         var y = 0.5 * Math.cos(0.2 * i);
+ *         data.push(y);
+ *     }
+ *
+ *     // Create the heightfield shape
+ *     var heightfieldShape = new Heightfield(data, {
+ *         elementSize: 1 // Distance between the data points in X and Y directions
+ *     });
+ *     var heightfieldBody = new Body();
+ *     heightfieldBody.addShape(heightfieldShape);
+ *     world.addBody(heightfieldBody);
+ */
+function Heightfield(data, options){
+    options = Utils.defaults(options, {
+        maxValue : null,
+        minValue : null,
+        elementSize : 1
+    });
+
+    /**
+     * An array of numbers, or height values, that are spread out along the x axis.
+     * @property {array} data
+     */
+    this.data = data;
+
+    /**
+     * Max value of the data
+     * @property {number} maxValue
+     */
+    this.maxValue = options.maxValue;
+
+    /**
+     * Max value of the data
+     * @property {number} minValue
+     */
+    this.minValue = options.minValue;
+
+    /**
+     * The width of each element
+     * @property {number} elementSize
+     * @todo elementSizeX and Y
+     */
+    this.elementSize = options.elementSize;
+
+    if(options.minValue === null){
+        this.updateMinValue();
+    }
+    if(options.maxValue === null){
+        this.updateMaxValue();
+    }
+
+    this.cacheEnabled = true;
+
+    Shape.call(this);
+
+    this.pillarConvex = new ConvexPolyhedron();
+    this.pillarOffset = new Vec3();
+
+    this.type = Shape.types.HEIGHTFIELD;
+    this.updateBoundingSphereRadius();
+
+    // "i_j_isUpper" => { convex: ..., offset: ... }
+    // for example:
+    // _cachedPillars["0_2_1"]
+    this._cachedPillars = {};
+}
+Heightfield.prototype = new Shape();
+
+/**
+ * Call whenever you change the data array.
+ * @method update
+ */
+Heightfield.prototype.update = function(){
+    this._cachedPillars = {};
+};
+
+/**
+ * Update the .minValue property
+ * @method updateMinValue
+ */
+Heightfield.prototype.updateMinValue = function(){
+    var data = this.data;
+    var minValue = data[0][0];
+    for(var i=0; i !== data.length; i++){
+        for(var j=0; j !== data[i].length; j++){
+            var v = data[i][j];
+            if(v < minValue){
+                minValue = v;
+            }
+        }
+    }
+    this.minValue = minValue;
+};
+
+/**
+ * Update the .maxValue property
+ * @method updateMaxValue
+ */
+Heightfield.prototype.updateMaxValue = function(){
+    var data = this.data;
+    var maxValue = data[0][0];
+    for(var i=0; i !== data.length; i++){
+        for(var j=0; j !== data[i].length; j++){
+            var v = data[i][j];
+            if(v > maxValue){
+                maxValue = v;
+            }
+        }
+    }
+    this.maxValue = maxValue;
+};
+
+/**
+ * Set the height value at an index. Don't forget to update maxValue and minValue after you're done.
+ * @method setHeightValueAtIndex
+ * @param {integer} xi
+ * @param {integer} yi
+ * @param {number} value
+ */
+Heightfield.prototype.setHeightValueAtIndex = function(xi, yi, value){
+    var data = this.data;
+    data[xi][yi] = value;
+
+    // Invalidate cache
+    this.clearCachedConvexTrianglePillar(xi, yi, false);
+    if(xi > 0){
+        this.clearCachedConvexTrianglePillar(xi - 1, yi, true);
+        this.clearCachedConvexTrianglePillar(xi - 1, yi, false);
+    }
+    if(yi > 0){
+        this.clearCachedConvexTrianglePillar(xi, yi - 1, true);
+        this.clearCachedConvexTrianglePillar(xi, yi - 1, false);
+    }
+    if(yi > 0 && xi > 0){
+        this.clearCachedConvexTrianglePillar(xi - 1, yi - 1, true);
+    }
+};
+
+/**
+ * Get max/min in a rectangle in the matrix data
+ * @method getRectMinMax
+ * @param  {integer} iMinX
+ * @param  {integer} iMinY
+ * @param  {integer} iMaxX
+ * @param  {integer} iMaxY
+ * @param  {array} [result] An array to store the results in.
+ * @return {array} The result array, if it was passed in. Minimum will be at position 0 and max at 1.
+ */
+Heightfield.prototype.getRectMinMax = function (iMinX, iMinY, iMaxX, iMaxY, result) {
+    result = result || [];
+
+    // Get max and min of the data
+    var data = this.data,
+        max = this.minValue; // Set first value
+    for(var i = iMinX; i <= iMaxX; i++){
+        for(var j = iMinY; j <= iMaxY; j++){
+            var height = data[i][j];
+            if(height > max){
+                max = height;
+            }
+        }
+    }
+
+    result[0] = this.minValue;
+    result[1] = max;
+};
+
+
+
+/**
+ * Get the index of a local position on the heightfield. The indexes indicate the rectangles, so if your terrain is made of N x N height data points, you will have rectangle indexes ranging from 0 to N-1.
+ * @method getIndexOfPosition
+ * @param  {number} x
+ * @param  {number} y
+ * @param  {array} result Two-element array
+ * @param  {boolean} clamp If the position should be clamped to the heightfield edge.
+ * @return {boolean}
+ */
+Heightfield.prototype.getIndexOfPosition = function (x, y, result, clamp) {
+
+    // Get the index of the data points to test against
+    var w = this.elementSize;
+    var data = this.data;
+    var xi = Math.floor(x / w);
+    var yi = Math.floor(y / w);
+
+    result[0] = xi;
+    result[1] = yi;
+
+    if(clamp){
+        // Clamp index to edges
+        if(xi < 0){ xi = 0; }
+        if(yi < 0){ yi = 0; }
+        if(xi >= data.length - 1){ xi = data.length - 1; }
+        if(yi >= data[0].length - 1){ yi = data[0].length - 1; }
+    }
+
+    // Bail out if we are out of the terrain
+    if(xi < 0 || yi < 0 || xi >= data.length-1 || yi >= data[0].length-1){
+        return false;
+    }
+
+    return true;
+};
+
+
+var getHeightAt_idx = [];
+var getHeightAt_weights = new Vec3();
+var getHeightAt_a = new Vec3();
+var getHeightAt_b = new Vec3();
+var getHeightAt_c = new Vec3();
+
+Heightfield.prototype.getTriangleAt = function(x, y, edgeClamp, a, b, c){
+    var idx = getHeightAt_idx;
+    this.getIndexOfPosition(x, y, idx, edgeClamp);
+    var xi = idx[0];
+    var yi = idx[1];
+
+    var data = this.data;
+    if(edgeClamp){
+        xi = Math.min(data.length - 2, Math.max(0, xi));
+        yi = Math.min(data[0].length - 2, Math.max(0, yi));
+    }
+
+    var elementSize = this.elementSize;
+    var lowerDist2 = Math.pow(x / elementSize - xi, 2) + Math.pow(y / elementSize - yi, 2);
+    var upperDist2 = Math.pow(x / elementSize - (xi + 1), 2) + Math.pow(y / elementSize - (yi + 1), 2);
+    var upper = lowerDist2 > upperDist2;
+    this.getTriangle(xi, yi, upper, a, b, c);
+    return upper;
+};
+
+var getNormalAt_a = new Vec3();
+var getNormalAt_b = new Vec3();
+var getNormalAt_c = new Vec3();
+var getNormalAt_e0 = new Vec3();
+var getNormalAt_e1 = new Vec3();
+Heightfield.prototype.getNormalAt = function(x, y, edgeClamp, result){
+    var a = getNormalAt_a;
+    var b = getNormalAt_b;
+    var c = getNormalAt_c;
+    var e0 = getNormalAt_e0;
+    var e1 = getNormalAt_e1;
+    this.getTriangleAt(x, y, edgeClamp, a, b, c);
+    b.vsub(a, e0);
+    c.vsub(a, e1);
+    e0.cross(e1, result);
+    result.normalize();
+};
+
+
+/**
+ * Get an AABB of a square in the heightfield
+ * @param  {number} xi
+ * @param  {number} yi
+ * @param  {AABB} result
+ */
+Heightfield.prototype.getAabbAtIndex = function(xi, yi, result){
+    var data = this.data;
+    var elementSize = this.elementSize;
+
+    result.lowerBound.set(
+        xi * elementSize,
+        yi * elementSize,
+        data[xi][yi]
+    );
+    result.upperBound.set(
+        (xi + 1) * elementSize,
+        (yi + 1) * elementSize,
+        data[xi + 1][yi + 1]
+    );
+};
+
+
+/**
+ * Get the height in the heightfield at a given position
+ * @param  {number} x
+ * @param  {number} y
+ * @param  {boolean} edgeClamp
+ * @return {number}
+ */
+Heightfield.prototype.getHeightAt = function(x, y, edgeClamp){
+    var data = this.data;
+    var a = getHeightAt_a;
+    var b = getHeightAt_b;
+    var c = getHeightAt_c;
+    var idx = getHeightAt_idx;
+
+    this.getIndexOfPosition(x, y, idx, edgeClamp);
+    var xi = idx[0];
+    var yi = idx[1];
+    if(edgeClamp){
+        xi = Math.min(data.length - 2, Math.max(0, xi));
+        yi = Math.min(data[0].length - 2, Math.max(0, yi));
+    }
+    var upper = this.getTriangleAt(x, y, edgeClamp, a, b, c);
+    barycentricWeights(x, y, a.x, a.y, b.x, b.y, c.x, c.y, getHeightAt_weights);
+
+    var w = getHeightAt_weights;
+
+    if(upper){
+
+        // Top triangle verts
+        return data[xi + 1][yi + 1] * w.x + data[xi][yi + 1] * w.y + data[xi + 1][yi] * w.z;
+
+    } else {
+
+        // Top triangle verts
+        return data[xi][yi] * w.x + data[xi + 1][yi] * w.y + data[xi][yi + 1] * w.z;
+    }
+};
+
+// from https://en.wikipedia.org/wiki/Barycentric_coordinate_system
+function barycentricWeights(x, y, ax, ay, bx, by, cx, cy, result){
+    result.x = ((by - cy) * (x - cx) + (cx - bx) * (y - cy)) / ((by - cy) * (ax - cx) + (cx - bx) * (ay - cy));
+    result.y = ((cy - ay) * (x - cx) + (ax - cx) * (y - cy)) / ((by - cy) * (ax - cx) + (cx - bx) * (ay - cy));
+    result.z = 1 - result.x - result.y;
+}
+
+Heightfield.prototype.getCacheConvexTrianglePillarKey = function(xi, yi, getUpperTriangle){
+    return xi + '_' + yi + '_' + (getUpperTriangle ? 1 : 0);
+};
+
+Heightfield.prototype.getCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    return this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];
+};
+
+Heightfield.prototype.setCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle, convex, offset){
+    this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)] = {
+        convex: convex,
+        offset: offset
+    };
+};
+
+Heightfield.prototype.clearCachedConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    delete this._cachedPillars[this.getCacheConvexTrianglePillarKey(xi, yi, getUpperTriangle)];
+};
+
+/**
+ * Get a triangle from the heightfield
+ * @param  {number} xi
+ * @param  {number} yi
+ * @param  {boolean} upper
+ * @param  {Vec3} a
+ * @param  {Vec3} b
+ * @param  {Vec3} c
+ */
+Heightfield.prototype.getTriangle = function(xi, yi, upper, a, b, c){
+    var data = this.data;
+    var elementSize = this.elementSize;
+
+    if(upper){
+
+        // Top triangle verts
+        a.set(
+            (xi + 1) * elementSize,
+            (yi + 1) * elementSize,
+            data[xi + 1][yi + 1]
+        );
+        b.set(
+            xi * elementSize,
+            (yi + 1) * elementSize,
+            data[xi][yi + 1]
+        );
+        c.set(
+            (xi + 1) * elementSize,
+            yi * elementSize,
+            data[xi + 1][yi]
+        );
+
+    } else {
+
+        // Top triangle verts
+        a.set(
+            xi * elementSize,
+            yi * elementSize,
+            data[xi][yi]
+        );
+        b.set(
+            (xi + 1) * elementSize,
+            yi * elementSize,
+            data[xi + 1][yi]
+        );
+        c.set(
+            xi * elementSize,
+            (yi + 1) * elementSize,
+            data[xi][yi + 1]
+        );
+    }
+};
+
+/**
+ * Get a triangle in the terrain in the form of a triangular convex shape.
+ * @method getConvexTrianglePillar
+ * @param  {integer} i
+ * @param  {integer} j
+ * @param  {boolean} getUpperTriangle
+ */
+Heightfield.prototype.getConvexTrianglePillar = function(xi, yi, getUpperTriangle){
+    var result = this.pillarConvex;
+    var offsetResult = this.pillarOffset;
+
+    if(this.cacheEnabled){
+        var data = this.getCachedConvexTrianglePillar(xi, yi, getUpperTriangle);
+        if(data){
+            this.pillarConvex = data.convex;
+            this.pillarOffset = data.offset;
+            return;
+        }
+
+        result = new ConvexPolyhedron();
+        offsetResult = new Vec3();
+
+        this.pillarConvex = result;
+        this.pillarOffset = offsetResult;
+    }
+
+    var data = this.data;
+    var elementSize = this.elementSize;
+    var faces = result.faces;
+
+    // Reuse verts if possible
+    result.vertices.length = 6;
+    for (var i = 0; i < 6; i++) {
+        if(!result.vertices[i]){
+            result.vertices[i] = new Vec3();
+        }
+    }
+
+    // Reuse faces if possible
+    faces.length = 5;
+    for (var i = 0; i < 5; i++) {
+        if(!faces[i]){
+            faces[i] = [];
+        }
+    }
+
+    var verts = result.vertices;
+
+    var h = (Math.min(
+        data[xi][yi],
+        data[xi+1][yi],
+        data[xi][yi+1],
+        data[xi+1][yi+1]
+    ) - this.minValue ) / 2 + this.minValue;
+
+    if (!getUpperTriangle) {
+
+        // Center of the triangle pillar - all polygons are given relative to this one
+        offsetResult.set(
+            (xi + 0.25) * elementSize, // sort of center of a triangle
+            (yi + 0.25) * elementSize,
+            h // vertical center
+        );
+
+        // Top triangle verts
+        verts[0].set(
+            -0.25 * elementSize,
+            -0.25 * elementSize,
+            data[xi][yi] - h
+        );
+        verts[1].set(
+            0.75 * elementSize,
+            -0.25 * elementSize,
+            data[xi + 1][yi] - h
+        );
+        verts[2].set(
+            -0.25 * elementSize,
+            0.75 * elementSize,
+            data[xi][yi + 1] - h
+        );
+
+        // bottom triangle verts
+        verts[3].set(
+            -0.25 * elementSize,
+            -0.25 * elementSize,
+            -h-1
+        );
+        verts[4].set(
+            0.75 * elementSize,
+            -0.25 * elementSize,
+            -h-1
+        );
+        verts[5].set(
+            -0.25 * elementSize,
+            0.75  * elementSize,
+            -h-1
+        );
+
+        // top triangle
+        faces[0][0] = 0;
+        faces[0][1] = 1;
+        faces[0][2] = 2;
+
+        // bottom triangle
+        faces[1][0] = 5;
+        faces[1][1] = 4;
+        faces[1][2] = 3;
+
+        // -x facing quad
+        faces[2][0] = 0;
+        faces[2][1] = 2;
+        faces[2][2] = 5;
+        faces[2][3] = 3;
+
+        // -y facing quad
+        faces[3][0] = 1;
+        faces[3][1] = 0;
+        faces[3][2] = 3;
+        faces[3][3] = 4;
+
+        // +xy facing quad
+        faces[4][0] = 4;
+        faces[4][1] = 5;
+        faces[4][2] = 2;
+        faces[4][3] = 1;
+
+
+    } else {
+
+        // Center of the triangle pillar - all polygons are given relative to this one
+        offsetResult.set(
+            (xi + 0.75) * elementSize, // sort of center of a triangle
+            (yi + 0.75) * elementSize,
+            h // vertical center
+        );
+
+        // Top triangle verts
+        verts[0].set(
+            0.25 * elementSize,
+            0.25 * elementSize,
+            data[xi + 1][yi + 1] - h
+        );
+        verts[1].set(
+            -0.75 * elementSize,
+            0.25 * elementSize,
+            data[xi][yi + 1] - h
+        );
+        verts[2].set(
+            0.25 * elementSize,
+            -0.75 * elementSize,
+            data[xi + 1][yi] - h
+        );
+
+        // bottom triangle verts
+        verts[3].set(
+            0.25 * elementSize,
+            0.25 * elementSize,
+            - h-1
+        );
+        verts[4].set(
+            -0.75 * elementSize,
+            0.25 * elementSize,
+            - h-1
+        );
+        verts[5].set(
+            0.25 * elementSize,
+            -0.75 * elementSize,
+            - h-1
+        );
+
+        // Top triangle
+        faces[0][0] = 0;
+        faces[0][1] = 1;
+        faces[0][2] = 2;
+
+        // bottom triangle
+        faces[1][0] = 5;
+        faces[1][1] = 4;
+        faces[1][2] = 3;
+
+        // +x facing quad
+        faces[2][0] = 2;
+        faces[2][1] = 5;
+        faces[2][2] = 3;
+        faces[2][3] = 0;
+
+        // +y facing quad
+        faces[3][0] = 3;
+        faces[3][1] = 4;
+        faces[3][2] = 1;
+        faces[3][3] = 0;
+
+        // -xy facing quad
+        faces[4][0] = 1;
+        faces[4][1] = 4;
+        faces[4][2] = 5;
+        faces[4][3] = 2;
+    }
+
+    result.computeNormals();
+    result.computeEdges();
+    result.updateBoundingSphereRadius();
+
+    this.setCachedConvexTrianglePillar(xi, yi, getUpperTriangle, result, offsetResult);
+};
+
+Heightfield.prototype.calculateLocalInertia = function(mass, target){
+    target = target || new Vec3();
+    target.set(0, 0, 0);
+    return target;
+};
+
+Heightfield.prototype.volume = function(){
+    return Number.MAX_VALUE; // The terrain is infinite
+};
+
+Heightfield.prototype.calculateWorldAABB = function(pos, quat, min, max){
+    // TODO: do it properly
+    min.set(-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE);
+    max.set(Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE);
+};
+
+Heightfield.prototype.updateBoundingSphereRadius = function(){
+    // Use the bounding box of the min/max values
+    var data = this.data,
+        s = this.elementSize;
+    this.boundingSphereRadius = new Vec3(data.length * s, data[0].length * s, Math.max(Math.abs(this.maxValue), Math.abs(this.minValue))).norm();
+};
+
+/**
+ * Sets the height values from an image. Currently only supported in browser.
+ * @method setHeightsFromImage
+ * @param {Image} image
+ * @param {Vec3} scale
+ */
+Heightfield.prototype.setHeightsFromImage = function(image, scale){
+    var canvas = document.createElement('canvas');
+    canvas.width = image.width;
+    canvas.height = image.height;
+    var context = canvas.getContext('2d');
+    context.drawImage(image, 0, 0);
+    var imageData = context.getImageData(0, 0, image.width, image.height);
+
+    var matrix = this.data;
+    matrix.length = 0;
+    this.elementSize = Math.abs(scale.x) / imageData.width;
+    for(var i=0; i<imageData.height; i++){
+        var row = [];
+        for(var j=0; j<imageData.width; j++){
+            var a = imageData.data[(i*imageData.height + j) * 4];
+            var b = imageData.data[(i*imageData.height + j) * 4 + 1];
+            var c = imageData.data[(i*imageData.height + j) * 4 + 2];
+            var height = (a + b + c) / 4 / 255 * scale.z;
+            if(scale.x < 0){
+                row.push(height);
+            } else {
+                row.unshift(height);
+            }
+        }
+        if(scale.y < 0){
+            matrix.unshift(row);
+        } else {
+            matrix.push(row);
+        }
+    }
+    this.updateMaxValue();
+    this.updateMinValue();
+    this.update();
+};
+},{"../math/Vec3":43,"../utils/Utils":66,"./ConvexPolyhedron":51,"./Shape":56}],54:[function(require,module,exports){
+module.exports = Particle;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Particle shape.
+ * @class Particle
+ * @constructor
+ * @author schteppe
+ * @extends Shape
+ */
+function Particle(){
+    Shape.call(this);
+
+    this.type = Shape.types.PARTICLE;
+}
+Particle.prototype = new Shape();
+Particle.prototype.constructor = Particle;
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3}
+ */
+Particle.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    target.set(0, 0, 0);
+    return target;
+};
+
+Particle.prototype.volume = function(){
+    return 0;
+};
+
+Particle.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = 0;
+};
+
+Particle.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    // Get each axis max
+    min.copy(pos);
+    max.copy(pos);
+};
+
+},{"../math/Vec3":43,"./Shape":56}],55:[function(require,module,exports){
+module.exports = Plane;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * A plane, facing in the Z direction. The plane has its surface at z=0 and everything below z=0 is assumed to be solid plane. To make the plane face in some other direction than z, you must put it inside a RigidBody and rotate that body. See the demos.
+ * @class Plane
+ * @constructor
+ * @extends Shape
+ * @author schteppe
+ */
+function Plane(){
+    Shape.call(this);
+    this.type = Shape.types.PLANE;
+
+    // World oriented normal
+    this.worldNormal = new Vec3();
+    this.worldNormalNeedsUpdate = true;
+
+    this.boundingSphereRadius = Number.MAX_VALUE;
+}
+Plane.prototype = new Shape();
+Plane.prototype.constructor = Plane;
+
+Plane.prototype.computeWorldNormal = function(quat){
+    var n = this.worldNormal;
+    n.set(0,0,1);
+    quat.vmult(n,n);
+    this.worldNormalNeedsUpdate = false;
+};
+
+Plane.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    return target;
+};
+
+Plane.prototype.volume = function(){
+    return Number.MAX_VALUE; // The plane is infinite...
+};
+
+var tempNormal = new Vec3();
+Plane.prototype.calculateWorldAABB = function(pos, quat, min, max){
+    // The plane AABB is infinite, except if the normal is pointing along any axis
+    tempNormal.set(0,0,1); // Default plane normal is z
+    quat.vmult(tempNormal,tempNormal);
+    var maxVal = Number.MAX_VALUE;
+    min.set(-maxVal, -maxVal, -maxVal);
+    max.set(maxVal, maxVal, maxVal);
+
+    if(tempNormal.x === 1){ max.x = pos.x; }
+    if(tempNormal.y === 1){ max.y = pos.y; }
+    if(tempNormal.z === 1){ max.z = pos.z; }
+
+    if(tempNormal.x === -1){ min.x = pos.x; }
+    if(tempNormal.y === -1){ min.y = pos.y; }
+    if(tempNormal.z === -1){ min.z = pos.z; }
+};
+
+Plane.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = Number.MAX_VALUE;
+};
+},{"../math/Vec3":43,"./Shape":56}],56:[function(require,module,exports){
+module.exports = Shape;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Material = require('../material/Material');
+
+/**
+ * Base class for shapes
+ * @class Shape
+ * @constructor
+ * @author schteppe
+ * @todo Should have a mechanism for caching bounding sphere radius instead of calculating it each time
+ */
+function Shape(){
+
+    /**
+     * Identifyer of the Shape.
+     * @property {number} id
+     */
+    this.id = Shape.idCounter++;
+
+    /**
+     * The type of this shape. Must be set to an int > 0 by subclasses.
+     * @property type
+     * @type {Number}
+     * @see Shape.types
+     */
+    this.type = 0;
+
+    /**
+     * The local bounding sphere radius of this shape.
+     * @property {Number} boundingSphereRadius
+     */
+    this.boundingSphereRadius = 0;
+
+    /**
+     * Whether to produce contact forces when in contact with other bodies. Note that contacts will be generated, but they will be disabled.
+     * @property {boolean} collisionResponse
+     */
+    this.collisionResponse = true;
+
+    /**
+     * @property {Material} material
+     */
+    this.material = null;
+
+    /**
+     * @property {Body} body
+     */
+    this.body = null;
+}
+Shape.prototype.constructor = Shape;
+
+/**
+ * Computes the bounding sphere radius. The result is stored in the property .boundingSphereRadius
+ * @method updateBoundingSphereRadius
+ */
+Shape.prototype.updateBoundingSphereRadius = function(){
+    throw "computeBoundingSphereRadius() not implemented for shape type "+this.type;
+};
+
+/**
+ * Get the volume of this shape
+ * @method volume
+ * @return {Number}
+ */
+Shape.prototype.volume = function(){
+    throw "volume() not implemented for shape type "+this.type;
+};
+
+/**
+ * Calculates the inertia in the local frame for this shape.
+ * @method calculateLocalInertia
+ * @param {Number} mass
+ * @param {Vec3} target
+ * @see http://en.wikipedia.org/wiki/List_of_moments_of_inertia
+ */
+Shape.prototype.calculateLocalInertia = function(mass,target){
+    throw "calculateLocalInertia() not implemented for shape type "+this.type;
+};
+
+Shape.idCounter = 0;
+
+/**
+ * The available shape types.
+ * @static
+ * @property types
+ * @type {Object}
+ */
+Shape.types = {
+    SPHERE:1,
+    PLANE:2,
+    BOX:4,
+    COMPOUND:8,
+    CONVEXPOLYHEDRON:16,
+    HEIGHTFIELD:32,
+    PARTICLE:64,
+    CYLINDER:128,
+    TRIMESH:256
+};
+
+
+},{"../material/Material":38,"../math/Quaternion":41,"../math/Vec3":43,"./Shape":56}],57:[function(require,module,exports){
+module.exports = Sphere;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+
+/**
+ * Spherical shape
+ * @class Sphere
+ * @constructor
+ * @extends Shape
+ * @param {Number} radius The radius of the sphere, a non-negative number.
+ * @author schteppe / http://github.com/schteppe
+ */
+function Sphere(radius){
+    Shape.call(this);
+
+    /**
+     * @property {Number} radius
+     */
+    this.radius = radius!==undefined ? Number(radius) : 1.0;
+    this.type = Shape.types.SPHERE;
+
+    if(this.radius < 0){
+        throw new Error('The sphere radius cannot be negative.');
+    }
+
+    this.updateBoundingSphereRadius();
+}
+Sphere.prototype = new Shape();
+Sphere.prototype.constructor = Sphere;
+
+Sphere.prototype.calculateLocalInertia = function(mass,target){
+    target = target || new Vec3();
+    var I = 2.0*mass*this.radius*this.radius/5.0;
+    target.x = I;
+    target.y = I;
+    target.z = I;
+    return target;
+};
+
+Sphere.prototype.volume = function(){
+    return 4.0 * Math.PI * this.radius / 3.0;
+};
+
+Sphere.prototype.updateBoundingSphereRadius = function(){
+    this.boundingSphereRadius = this.radius;
+};
+
+Sphere.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    var r = this.radius;
+    var axes = ['x','y','z'];
+    for(var i=0; i<axes.length; i++){
+        var ax = axes[i];
+        min[ax] = pos[ax] - r;
+        max[ax] = pos[ax] + r;
+    }
+};
+
+},{"../math/Vec3":43,"./Shape":56}],58:[function(require,module,exports){
+module.exports = Trimesh;
+
+var Shape = require('./Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Transform = require('../math/Transform');
+var AABB = require('../collision/AABB');
+var Octree = require('../utils/Octree');
+
+/**
+ * @class Trimesh
+ * @constructor
+ * @param {array} vertices
+ * @param {array} indices
+ * @extends Shape
+ * @example
+ *     // How to make a mesh with a single triangle
+ *     var vertices = [
+ *         0, 0, 0, // vertex 0
+ *         1, 0, 0, // vertex 1
+ *         0, 1, 0  // vertex 2
+ *     ];
+ *     var indices = [
+ *         0, 1, 2  // triangle 0
+ *     ];
+ *     var trimeshShape = new Trimesh(vertices, indices);
+ */
+function Trimesh(vertices, indices) {
+    Shape.call(this);
+    this.type = Shape.types.TRIMESH;
+
+    /**
+     * @property vertices
+     * @type {Array}
+     */
+    this.vertices = new Float32Array(vertices);
+
+    /**
+     * Array of integers, indicating which vertices each triangle consists of. The length of this array is thus 3 times the number of triangles.
+     * @property indices
+     * @type {Array}
+     */
+    this.indices = new Int16Array(indices);
+
+    /**
+     * The normals data.
+     * @property normals
+     * @type {Array}
+     */
+    this.normals = new Float32Array(indices.length);
+
+    /**
+     * The local AABB of the mesh.
+     * @property aabb
+     * @type {Array}
+     */
+    this.aabb = new AABB();
+
+    /**
+     * References to vertex pairs, making up all unique edges in the trimesh.
+     * @property {array} edges
+     */
+    this.edges = null;
+
+    /**
+     * Local scaling of the mesh. Use .setScale() to set it.
+     * @property {Vec3} scale
+     */
+    this.scale = new Vec3(1, 1, 1);
+
+    /**
+     * The indexed triangles. Use .updateTree() to update it.
+     * @property {Octree} tree
+     */
+    this.tree = new Octree();
+
+    this.updateEdges();
+    this.updateNormals();
+    this.updateAABB();
+    this.updateBoundingSphereRadius();
+    this.updateTree();
+}
+Trimesh.prototype = new Shape();
+Trimesh.prototype.constructor = Trimesh;
+
+var computeNormals_n = new Vec3();
+
+/**
+ * @method updateTree
+ */
+Trimesh.prototype.updateTree = function(){
+    var tree = this.tree;
+
+    tree.reset();
+    tree.aabb.copy(this.aabb);
+    var scale = this.scale; // The local mesh AABB is scaled, but the octree AABB should be unscaled
+    tree.aabb.lowerBound.x *= 1 / scale.x;
+    tree.aabb.lowerBound.y *= 1 / scale.y;
+    tree.aabb.lowerBound.z *= 1 / scale.z;
+    tree.aabb.upperBound.x *= 1 / scale.x;
+    tree.aabb.upperBound.y *= 1 / scale.y;
+    tree.aabb.upperBound.z *= 1 / scale.z;
+
+    // Insert all triangles
+    var triangleAABB = new AABB();
+    var a = new Vec3();
+    var b = new Vec3();
+    var c = new Vec3();
+    var points = [a, b, c];
+    for (var i = 0; i < this.indices.length / 3; i++) {
+        //this.getTriangleVertices(i, a, b, c);
+
+        // Get unscaled triangle verts
+        var i3 = i * 3;
+        this._getUnscaledVertex(this.indices[i3], a);
+        this._getUnscaledVertex(this.indices[i3 + 1], b);
+        this._getUnscaledVertex(this.indices[i3 + 2], c);
+
+        triangleAABB.setFromPoints(points);
+        tree.insert(triangleAABB, i);
+    }
+    tree.removeEmptyNodes();
+};
+
+var unscaledAABB = new AABB();
+
+/**
+ * Get triangles in a local AABB from the trimesh.
+ * @method getTrianglesInAABB
+ * @param  {AABB} aabb
+ * @param  {array} result An array of integers, referencing the queried triangles.
+ */
+Trimesh.prototype.getTrianglesInAABB = function(aabb, result){
+    unscaledAABB.copy(aabb);
+
+    // Scale it to local
+    var scale = this.scale;
+    var isx = scale.x;
+    var isy = scale.y;
+    var isz = scale.z;
+    var l = unscaledAABB.lowerBound;
+    var u = unscaledAABB.upperBound;
+    l.x /= isx;
+    l.y /= isy;
+    l.z /= isz;
+    u.x /= isx;
+    u.y /= isy;
+    u.z /= isz;
+
+    return this.tree.aabbQuery(unscaledAABB, result);
+};
+
+/**
+ * @method setScale
+ * @param {Vec3} scale
+ */
+Trimesh.prototype.setScale = function(scale){
+    var wasUniform = this.scale.x === this.scale.y === this.scale.z;
+    var isUniform = scale.x === scale.y === scale.z;
+
+    if(!(wasUniform && isUniform)){
+        // Non-uniform scaling. Need to update normals.
+        this.updateNormals();
+    }
+    this.scale.copy(scale);
+    this.updateAABB();
+    this.updateBoundingSphereRadius();
+};
+
+/**
+ * Compute the normals of the faces. Will save in the .normals array.
+ * @method updateNormals
+ */
+Trimesh.prototype.updateNormals = function(){
+    var n = computeNormals_n;
+
+    // Generate normals
+    var normals = this.normals;
+    for(var i=0; i < this.indices.length / 3; i++){
+        var i3 = i * 3;
+
+        var a = this.indices[i3],
+            b = this.indices[i3 + 1],
+            c = this.indices[i3 + 2];
+
+        this.getVertex(a, va);
+        this.getVertex(b, vb);
+        this.getVertex(c, vc);
+
+        Trimesh.computeNormal(vb, va, vc, n);
+
+        normals[i3] = n.x;
+        normals[i3 + 1] = n.y;
+        normals[i3 + 2] = n.z;
+    }
+};
+
+/**
+ * Update the .edges property
+ * @method updateEdges
+ */
+Trimesh.prototype.updateEdges = function(){
+    var edges = {};
+    var add = function(indexA, indexB){
+        var key = a < b ? a + '_' + b : b + '_' + a;
+        edges[key] = true;
+    };
+    for(var i=0; i < this.indices.length / 3; i++){
+        var i3 = i * 3;
+        var a = this.indices[i3],
+            b = this.indices[i3 + 1],
+            c = this.indices[i3 + 2];
+        add(a,b);
+        add(b,c);
+        add(c,a);
+    }
+    var keys = Object.keys(edges);
+    this.edges = new Int16Array(keys.length * 2);
+    for (var i = 0; i < keys.length; i++) {
+        var indices = keys[i].split('_');
+        this.edges[2 * i] = parseInt(indices[0], 10);
+        this.edges[2 * i + 1] = parseInt(indices[1], 10);
+    }
+};
+
+/**
+ * Get an edge vertex
+ * @method getEdgeVertex
+ * @param  {number} edgeIndex
+ * @param  {number} firstOrSecond 0 or 1, depending on which one of the vertices you need.
+ * @param  {Vec3} vertexStore Where to store the result
+ */
+Trimesh.prototype.getEdgeVertex = function(edgeIndex, firstOrSecond, vertexStore){
+    var vertexIndex = this.edges[edgeIndex * 2 + (firstOrSecond ? 1 : 0)];
+    this.getVertex(vertexIndex, vertexStore);
+};
+
+var getEdgeVector_va = new Vec3();
+var getEdgeVector_vb = new Vec3();
+
+/**
+ * Get a vector along an edge.
+ * @method getEdgeVector
+ * @param  {number} edgeIndex
+ * @param  {Vec3} vectorStore
+ */
+Trimesh.prototype.getEdgeVector = function(edgeIndex, vectorStore){
+    var va = getEdgeVector_va;
+    var vb = getEdgeVector_vb;
+    this.getEdgeVertex(edgeIndex, 0, va);
+    this.getEdgeVertex(edgeIndex, 1, vb);
+    vb.vsub(va, vectorStore);
+};
+
+/**
+ * Get face normal given 3 vertices
+ * @static
+ * @method computeNormal
+ * @param {Vec3} va
+ * @param {Vec3} vb
+ * @param {Vec3} vc
+ * @param {Vec3} target
+ */
+var cb = new Vec3();
+var ab = new Vec3();
+Trimesh.computeNormal = function ( va, vb, vc, target ) {
+    vb.vsub(va,ab);
+    vc.vsub(vb,cb);
+    cb.cross(ab,target);
+    if ( !target.isZero() ) {
+        target.normalize();
+    }
+};
+
+var va = new Vec3();
+var vb = new Vec3();
+var vc = new Vec3();
+
+/**
+ * Get vertex i.
+ * @method getVertex
+ * @param  {number} i
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype.getVertex = function(i, out){
+    var scale = this.scale;
+    this._getUnscaledVertex(i, out);
+    out.x *= scale.x;
+    out.y *= scale.y;
+    out.z *= scale.z;
+    return out;
+};
+
+/**
+ * Get raw vertex i
+ * @private
+ * @method _getUnscaledVertex
+ * @param  {number} i
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype._getUnscaledVertex = function(i, out){
+    var i3 = i * 3;
+    var vertices = this.vertices;
+    return out.set(
+        vertices[i3],
+        vertices[i3 + 1],
+        vertices[i3 + 2]
+    );
+};
+
+/**
+ * Get a vertex from the trimesh,transformed by the given position and quaternion.
+ * @method getWorldVertex
+ * @param  {number} i
+ * @param  {Vec3} pos
+ * @param  {Quaternion} quat
+ * @param  {Vec3} out
+ * @return {Vec3} The "out" vector object
+ */
+Trimesh.prototype.getWorldVertex = function(i, pos, quat, out){
+    this.getVertex(i, out);
+    Transform.pointToWorldFrame(pos, quat, out, out);
+    return out;
+};
+
+/**
+ * Get the three vertices for triangle i.
+ * @method getTriangleVertices
+ * @param  {number} i
+ * @param  {Vec3} a
+ * @param  {Vec3} b
+ * @param  {Vec3} c
+ */
+Trimesh.prototype.getTriangleVertices = function(i, a, b, c){
+    var i3 = i * 3;
+    this.getVertex(this.indices[i3], a);
+    this.getVertex(this.indices[i3 + 1], b);
+    this.getVertex(this.indices[i3 + 2], c);
+};
+
+/**
+ * Compute the normal of triangle i.
+ * @method getNormal
+ * @param  {Number} i
+ * @param  {Vec3} target
+ * @return {Vec3} The "target" vector object
+ */
+Trimesh.prototype.getNormal = function(i, target){
+    var i3 = i * 3;
+    return target.set(
+        this.normals[i3],
+        this.normals[i3 + 1],
+        this.normals[i3 + 2]
+    );
+};
+
+var cli_aabb = new AABB();
+
+/**
+ * @method calculateLocalInertia
+ * @param  {Number} mass
+ * @param  {Vec3} target
+ * @return {Vec3} The "target" vector object
+ */
+Trimesh.prototype.calculateLocalInertia = function(mass,target){
+    // Approximate with box inertia
+    // Exact inertia calculation is overkill, but see http://geometrictools.com/Documentation/PolyhedralMassProperties.pdf for the correct way to do it
+    this.computeLocalAABB(cli_aabb);
+    var x = cli_aabb.upperBound.x - cli_aabb.lowerBound.x,
+        y = cli_aabb.upperBound.y - cli_aabb.lowerBound.y,
+        z = cli_aabb.upperBound.z - cli_aabb.lowerBound.z;
+    return target.set(
+        1.0 / 12.0 * mass * ( 2*y*2*y + 2*z*2*z ),
+        1.0 / 12.0 * mass * ( 2*x*2*x + 2*z*2*z ),
+        1.0 / 12.0 * mass * ( 2*y*2*y + 2*x*2*x )
+    );
+};
+
+var computeLocalAABB_worldVert = new Vec3();
+
+/**
+ * Compute the local AABB for the trimesh
+ * @method computeLocalAABB
+ * @param  {AABB} aabb
+ */
+Trimesh.prototype.computeLocalAABB = function(aabb){
+    var l = aabb.lowerBound,
+        u = aabb.upperBound,
+        n = this.vertices.length,
+        vertices = this.vertices,
+        v = computeLocalAABB_worldVert;
+
+    this.getVertex(0, v);
+    l.copy(v);
+    u.copy(v);
+
+    for(var i=0; i !== n; i++){
+        this.getVertex(i, v);
+
+        if(v.x < l.x){
+            l.x = v.x;
+        } else if(v.x > u.x){
+            u.x = v.x;
+        }
+
+        if(v.y < l.y){
+            l.y = v.y;
+        } else if(v.y > u.y){
+            u.y = v.y;
+        }
+
+        if(v.z < l.z){
+            l.z = v.z;
+        } else if(v.z > u.z){
+            u.z = v.z;
+        }
+    }
+};
+
+
+/**
+ * Update the .aabb property
+ * @method updateAABB
+ */
+Trimesh.prototype.updateAABB = function(){
+    this.computeLocalAABB(this.aabb);
+};
+
+/**
+ * Will update the .boundingSphereRadius property
+ * @method updateBoundingSphereRadius
+ */
+Trimesh.prototype.updateBoundingSphereRadius = function(){
+    // Assume points are distributed with local (0,0,0) as center
+    var max2 = 0;
+    var vertices = this.vertices;
+    var v = new Vec3();
+    for(var i=0, N=vertices.length / 3; i !== N; i++) {
+        this.getVertex(i, v);
+        var norm2 = v.norm2();
+        if(norm2 > max2){
+            max2 = norm2;
+        }
+    }
+    this.boundingSphereRadius = Math.sqrt(max2);
+};
+
+var tempWorldVertex = new Vec3();
+var calculateWorldAABB_frame = new Transform();
+var calculateWorldAABB_aabb = new AABB();
+
+/**
+ * @method calculateWorldAABB
+ * @param {Vec3}        pos
+ * @param {Quaternion}  quat
+ * @param {Vec3}        min
+ * @param {Vec3}        max
+ */
+Trimesh.prototype.calculateWorldAABB = function(pos,quat,min,max){
+    /*
+    var n = this.vertices.length / 3,
+        verts = this.vertices;
+    var minx,miny,minz,maxx,maxy,maxz;
+
+    var v = tempWorldVertex;
+    for(var i=0; i<n; i++){
+        this.getVertex(i, v);
+        quat.vmult(v, v);
+        pos.vadd(v, v);
+        if (v.x < minx || minx===undefined){
+            minx = v.x;
+        } else if(v.x > maxx || maxx===undefined){
+            maxx = v.x;
+        }
+
+        if (v.y < miny || miny===undefined){
+            miny = v.y;
+        } else if(v.y > maxy || maxy===undefined){
+            maxy = v.y;
+        }
+
+        if (v.z < minz || minz===undefined){
+            minz = v.z;
+        } else if(v.z > maxz || maxz===undefined){
+            maxz = v.z;
+        }
+    }
+    min.set(minx,miny,minz);
+    max.set(maxx,maxy,maxz);
+    */
+
+    // Faster approximation using local AABB
+    var frame = calculateWorldAABB_frame;
+    var result = calculateWorldAABB_aabb;
+    frame.position = pos;
+    frame.quaternion = quat;
+    this.aabb.toWorldFrame(frame, result);
+    min.copy(result.lowerBound);
+    max.copy(result.upperBound);
+};
+
+/**
+ * Get approximate volume
+ * @method volume
+ * @return {Number}
+ */
+Trimesh.prototype.volume = function(){
+    return 4.0 * Math.PI * this.boundingSphereRadius / 3.0;
+};
+
+/**
+ * Create a Trimesh instance, shaped as a torus.
+ * @static
+ * @method createTorus
+ * @param  {number} [radius=1]
+ * @param  {number} [tube=0.5]
+ * @param  {number} [radialSegments=8]
+ * @param  {number} [tubularSegments=6]
+ * @param  {number} [arc=6.283185307179586]
+ * @return {Trimesh} A torus
+ */
+Trimesh.createTorus = function (radius, tube, radialSegments, tubularSegments, arc) {
+    radius = radius || 1;
+    tube = tube || 0.5;
+    radialSegments = radialSegments || 8;
+    tubularSegments = tubularSegments || 6;
+    arc = arc || Math.PI * 2;
+
+    var vertices = [];
+    var indices = [];
+
+    for ( var j = 0; j <= radialSegments; j ++ ) {
+        for ( var i = 0; i <= tubularSegments; i ++ ) {
+            var u = i / tubularSegments * arc;
+            var v = j / radialSegments * Math.PI * 2;
+
+            var x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
+            var y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
+            var z = tube * Math.sin( v );
+
+            vertices.push( x, y, z );
+        }
+    }
+
+    for ( var j = 1; j <= radialSegments; j ++ ) {
+        for ( var i = 1; i <= tubularSegments; i ++ ) {
+            var a = ( tubularSegments + 1 ) * j + i - 1;
+            var b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
+            var c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
+            var d = ( tubularSegments + 1 ) * j + i;
+
+            indices.push(a, b, d);
+            indices.push(b, c, d);
+        }
+    }
+
+    return new Trimesh(vertices, indices);
+};
+
+},{"../collision/AABB":15,"../math/Quaternion":41,"../math/Transform":42,"../math/Vec3":43,"../utils/Octree":63,"./Shape":56}],59:[function(require,module,exports){
+module.exports = GSSolver;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('./Solver');
+
+/**
+ * Constraint equation Gauss-Seidel solver.
+ * @class GSSolver
+ * @constructor
+ * @todo The spook parameters should be specified for each constraint, not globally.
+ * @author schteppe / https://github.com/schteppe
+ * @see https://www8.cs.umu.se/kurser/5DV058/VT09/lectures/spooknotes.pdf
+ * @extends Solver
+ */
+function GSSolver(){
+    Solver.call(this);
+
+    /**
+     * The number of solver iterations determines quality of the constraints in the world. The more iterations, the more correct simulation. More iterations need more computations though. If you have a large gravity force in your world, you will need more iterations.
+     * @property iterations
+     * @type {Number}
+     * @todo write more about solver and iterations in the wiki
+     */
+    this.iterations = 10;
+
+    /**
+     * When tolerance is reached, the system is assumed to be converged.
+     * @property tolerance
+     * @type {Number}
+     */
+    this.tolerance = 1e-7;
+}
+GSSolver.prototype = new Solver();
+
+var GSSolver_solve_lambda = []; // Just temporary number holders that we want to reuse each solve.
+var GSSolver_solve_invCs = [];
+var GSSolver_solve_Bs = [];
+GSSolver.prototype.solve = function(dt,world){
+    var iter = 0,
+        maxIter = this.iterations,
+        tolSquared = this.tolerance*this.tolerance,
+        equations = this.equations,
+        Neq = equations.length,
+        bodies = world.bodies,
+        Nbodies = bodies.length,
+        h = dt,
+        q, B, invC, deltalambda, deltalambdaTot, GWlambda, lambdaj;
+
+    // Update solve mass
+    if(Neq !== 0){
+        for(var i=0; i!==Nbodies; i++){
+            bodies[i].updateSolveMassProperties();
+        }
+    }
+
+    // Things that does not change during iteration can be computed once
+    var invCs = GSSolver_solve_invCs,
+        Bs = GSSolver_solve_Bs,
+        lambda = GSSolver_solve_lambda;
+    invCs.length = Neq;
+    Bs.length = Neq;
+    lambda.length = Neq;
+    for(var i=0; i!==Neq; i++){
+        var c = equations[i];
+        lambda[i] = 0.0;
+        Bs[i] = c.computeB(h);
+        invCs[i] = 1.0 / c.computeC();
+    }
+
+    if(Neq !== 0){
+
+        // Reset vlambda
+        for(var i=0; i!==Nbodies; i++){
+            var b=bodies[i],
+                vlambda=b.vlambda,
+                wlambda=b.wlambda;
+            vlambda.set(0,0,0);
+            wlambda.set(0,0,0);
+        }
+
+        // Iterate over equations
+        for(iter=0; iter!==maxIter; iter++){
+
+            // Accumulate the total error for each iteration.
+            deltalambdaTot = 0.0;
+
+            for(var j=0; j!==Neq; j++){
+
+                var c = equations[j];
+
+                // Compute iteration
+                B = Bs[j];
+                invC = invCs[j];
+                lambdaj = lambda[j];
+                GWlambda = c.computeGWlambda();
+                deltalambda = invC * ( B - GWlambda - c.eps * lambdaj );
+
+                // Clamp if we are not within the min/max interval
+                if(lambdaj + deltalambda < c.minForce){
+                    deltalambda = c.minForce - lambdaj;
+                } else if(lambdaj + deltalambda > c.maxForce){
+                    deltalambda = c.maxForce - lambdaj;
+                }
+                lambda[j] += deltalambda;
+
+                deltalambdaTot += deltalambda > 0.0 ? deltalambda : -deltalambda; // abs(deltalambda)
+
+                c.addToWlambda(deltalambda);
+            }
+
+            // If the total error is small enough - stop iterate
+            if(deltalambdaTot*deltalambdaTot < tolSquared){
+                break;
+            }
+        }
+
+        // Add result to velocity
+        for(var i=0; i!==Nbodies; i++){
+            var b=bodies[i],
+                v=b.velocity,
+                w=b.angularVelocity;
+
+            b.vlambda.vmul(b.linearFactor, b.vlambda);
+            v.vadd(b.vlambda, v);
+
+            b.wlambda.vmul(b.angularFactor, b.wlambda);
+            w.vadd(b.wlambda, w);
+        }
+
+        // Set the .multiplier property of each equation
+        var l = equations.length;
+        var invDt = 1 / h;
+        while(l--){
+            equations[l].multiplier = lambda[l] * invDt;
+        }
+    }
+
+    return iter;
+};
+
+},{"../math/Quaternion":41,"../math/Vec3":43,"./Solver":60}],60:[function(require,module,exports){
+module.exports = Solver;
+
+/**
+ * Constraint equation solver base class.
+ * @class Solver
+ * @constructor
+ * @author schteppe / https://github.com/schteppe
+ */
+function Solver(){
+    /**
+     * All equations to be solved
+     * @property {Array} equations
+     */
+    this.equations = [];
+}
+
+/**
+ * Should be implemented in subclasses!
+ * @method solve
+ * @param  {Number} dt
+ * @param  {World} world
+ */
+Solver.prototype.solve = function(dt,world){
+    // Should return the number of iterations done!
+    return 0;
+};
+
+/**
+ * Add an equation
+ * @method addEquation
+ * @param {Equation} eq
+ */
+Solver.prototype.addEquation = function(eq){
+    if (eq.enabled) {
+        this.equations.push(eq);
+    }
+};
+
+/**
+ * Remove an equation
+ * @method removeEquation
+ * @param {Equation} eq
+ */
+Solver.prototype.removeEquation = function(eq){
+    var eqs = this.equations;
+    var i = eqs.indexOf(eq);
+    if(i !== -1){
+        eqs.splice(i,1);
+    }
+};
+
+/**
+ * Add all equations
+ * @method removeAllEquations
+ */
+Solver.prototype.removeAllEquations = function(){
+    this.equations.length = 0;
+};
+
+
+},{}],61:[function(require,module,exports){
+module.exports = SplitSolver;
+
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('./Solver');
+var Body = require('../objects/Body');
+
+/**
+ * Splits the equations into islands and solves them independently. Can improve performance.
+ * @class SplitSolver
+ * @constructor
+ * @extends Solver
+ * @param {Solver} subsolver
+ */
+function SplitSolver(subsolver){
+    Solver.call(this);
+    this.iterations = 10;
+    this.tolerance = 1e-7;
+    this.subsolver = subsolver;
+    this.nodes = [];
+    this.nodePool = [];
+
+    // Create needed nodes, reuse if possible
+    while(this.nodePool.length < 128){
+        this.nodePool.push(this.createNode());
+    }
+}
+SplitSolver.prototype = new Solver();
+
+// Returns the number of subsystems
+var SplitSolver_solve_nodes = []; // All allocated node objects
+var SplitSolver_solve_nodePool = []; // All allocated node objects
+var SplitSolver_solve_eqs = [];   // Temp array
+var SplitSolver_solve_bds = [];   // Temp array
+var SplitSolver_solve_dummyWorld = {bodies:[]}; // Temp object
+
+var STATIC = Body.STATIC;
+function getUnvisitedNode(nodes){
+    var Nnodes = nodes.length;
+    for(var i=0; i!==Nnodes; i++){
+        var node = nodes[i];
+        if(!node.visited && !(node.body.type & STATIC)){
+            return node;
+        }
+    }
+    return false;
+}
+
+var queue = [];
+function bfs(root,visitFunc,bds,eqs){
+    queue.push(root);
+    root.visited = true;
+    visitFunc(root,bds,eqs);
+    while(queue.length) {
+        var node = queue.pop();
+        // Loop over unvisited child nodes
+        var child;
+        while((child = getUnvisitedNode(node.children))) {
+            child.visited = true;
+            visitFunc(child,bds,eqs);
+            queue.push(child);
+        }
+    }
+}
+
+function visitFunc(node,bds,eqs){
+    bds.push(node.body);
+    var Neqs = node.eqs.length;
+    for(var i=0; i!==Neqs; i++){
+        var eq = node.eqs[i];
+        if(eqs.indexOf(eq) === -1){
+            eqs.push(eq);
+        }
+    }
+}
+
+SplitSolver.prototype.createNode = function(){
+    return { body:null, children:[], eqs:[], visited:false };
+};
+
+/**
+ * Solve the subsystems
+ * @method solve
+ * @param  {Number} dt
+ * @param  {World} world
+ */
+SplitSolver.prototype.solve = function(dt,world){
+    var nodes=SplitSolver_solve_nodes,
+        nodePool=this.nodePool,
+        bodies=world.bodies,
+        equations=this.equations,
+        Neq=equations.length,
+        Nbodies=bodies.length,
+        subsolver=this.subsolver;
+
+    // Create needed nodes, reuse if possible
+    while(nodePool.length < Nbodies){
+        nodePool.push(this.createNode());
+    }
+    nodes.length = Nbodies;
+    for (var i = 0; i < Nbodies; i++) {
+        nodes[i] = nodePool[i];
+    }
+
+    // Reset node values
+    for(var i=0; i!==Nbodies; i++){
+        var node = nodes[i];
+        node.body = bodies[i];
+        node.children.length = 0;
+        node.eqs.length = 0;
+        node.visited = false;
+    }
+    for(var k=0; k!==Neq; k++){
+        var eq=equations[k],
+            i=bodies.indexOf(eq.bi),
+            j=bodies.indexOf(eq.bj),
+            ni=nodes[i],
+            nj=nodes[j];
+        ni.children.push(nj);
+        ni.eqs.push(eq);
+        nj.children.push(ni);
+        nj.eqs.push(eq);
+    }
+
+    var child, n=0, eqs=SplitSolver_solve_eqs;
+
+    subsolver.tolerance = this.tolerance;
+    subsolver.iterations = this.iterations;
+
+    var dummyWorld = SplitSolver_solve_dummyWorld;
+    while((child = getUnvisitedNode(nodes))){
+        eqs.length = 0;
+        dummyWorld.bodies.length = 0;
+        bfs(child, visitFunc, dummyWorld.bodies, eqs);
+
+        var Neqs = eqs.length;
+
+        eqs = eqs.sort(sortById);
+
+        for(var i=0; i!==Neqs; i++){
+            subsolver.addEquation(eqs[i]);
+        }
+
+        var iter = subsolver.solve(dt,dummyWorld);
+        subsolver.removeAllEquations();
+        n++;
+    }
+
+    return n;
+};
+
+function sortById(a, b){
+    return b.id - a.id;
+}
+},{"../math/Quaternion":41,"../math/Vec3":43,"../objects/Body":44,"./Solver":60}],62:[function(require,module,exports){
+/**
+ * Base class for objects that dispatches events.
+ * @class EventTarget
+ * @constructor
+ */
+var EventTarget = function () {
+
+};
+
+module.exports = EventTarget;
+
+EventTarget.prototype = {
+    constructor: EventTarget,
+
+    /**
+     * Add an event listener
+     * @method addEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {EventTarget} The self object, for chainability.
+     */
+    addEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ this._listeners = {}; }
+        var listeners = this._listeners;
+        if ( listeners[ type ] === undefined ) {
+            listeners[ type ] = [];
+        }
+        if ( listeners[ type ].indexOf( listener ) === - 1 ) {
+            listeners[ type ].push( listener );
+        }
+        return this;
+    },
+
+    /**
+     * Check if an event listener is added
+     * @method hasEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {Boolean}
+     */
+    hasEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ return false; }
+        var listeners = this._listeners;
+        if ( listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1 ) {
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * Check if any event listener of the given type is added
+     * @method hasAnyEventListener
+     * @param  {String} type
+     * @return {Boolean}
+     */
+    hasAnyEventListener: function ( type ) {
+        if ( this._listeners === undefined ){ return false; }
+        var listeners = this._listeners;
+        return ( listeners[ type ] !== undefined );
+    },
+
+    /**
+     * Remove an event listener
+     * @method removeEventListener
+     * @param  {String} type
+     * @param  {Function} listener
+     * @return {EventTarget} The self object, for chainability.
+     */
+    removeEventListener: function ( type, listener ) {
+        if ( this._listeners === undefined ){ return this; }
+        var listeners = this._listeners;
+        if ( listeners[type] === undefined ){ return this; }
+        var index = listeners[ type ].indexOf( listener );
+        if ( index !== - 1 ) {
+            listeners[ type ].splice( index, 1 );
+        }
+        return this;
+    },
+
+    /**
+     * Emit an event.
+     * @method dispatchEvent
+     * @param  {Object} event
+     * @param  {String} event.type
+     * @return {EventTarget} The self object, for chainability.
+     */
+    dispatchEvent: function ( event ) {
+        if ( this._listeners === undefined ){ return this; }
+        var listeners = this._listeners;
+        var listenerArray = listeners[ event.type ];
+        if ( listenerArray !== undefined ) {
+            event.target = this;
+            for ( var i = 0, l = listenerArray.length; i < l; i ++ ) {
+                listenerArray[ i ].call( this, event );
+            }
+        }
+        return this;
+    }
+};
+
+},{}],63:[function(require,module,exports){
+var AABB = require('../collision/AABB');
+var Vec3 = require('../math/Vec3');
+
+module.exports = Octree;
+
+/**
+ * @class OctreeNode
+ * @param {object} [options]
+ * @param {Octree} [options.root]
+ * @param {AABB} [options.aabb]
+ */
+function OctreeNode(options){
+    options = options || {};
+
+    /**
+     * The root node
+     * @property {OctreeNode} root
+     */
+    this.root = options.root || null;
+
+    /**
+     * Boundary of this node
+     * @property {AABB} aabb
+     */
+    this.aabb = options.aabb ? options.aabb.clone() : new AABB();
+
+    /**
+     * Contained data at the current node level.
+     * @property {Array} data
+     */
+    this.data = [];
+
+    /**
+     * Children to this node
+     * @property {Array} children
+     */
+    this.children = [];
+}
+
+/**
+ * @class Octree
+ * @param {AABB} aabb The total AABB of the tree
+ * @param {object} [options]
+ * @param {number} [options.maxDepth=8]
+ * @extends OctreeNode
+ */
+function Octree(aabb, options){
+    options = options || {};
+    options.root = null;
+    options.aabb = aabb;
+    OctreeNode.call(this, options);
+
+    /**
+     * Maximum subdivision depth
+     * @property {number} maxDepth
+     */
+    this.maxDepth = typeof(options.maxDepth) !== 'undefined' ? options.maxDepth : 8;
+}
+Octree.prototype = new OctreeNode();
+
+OctreeNode.prototype.reset = function(aabb, options){
+    this.children.length = this.data.length = 0;
+};
+
+/**
+ * Insert data into this node
+ * @method insert
+ * @param  {AABB} aabb
+ * @param  {object} elementData
+ * @return {boolean} True if successful, otherwise false
+ */
+OctreeNode.prototype.insert = function(aabb, elementData, level){
+    var nodeData = this.data;
+    level = level || 0;
+
+    // Ignore objects that do not belong in this node
+    if (!this.aabb.contains(aabb)){
+        return false; // object cannot be added
+    }
+
+    var children = this.children;
+
+    if(level < (this.maxDepth || this.root.maxDepth)){
+        // Subdivide if there are no children yet
+        var subdivided = false;
+        if (!children.length){
+            this.subdivide();
+            subdivided = true;
+        }
+
+        // add to whichever node will accept it
+        for (var i = 0; i !== 8; i++) {
+            if (children[i].insert(aabb, elementData, level + 1)){
+                return true;
+            }
+        }
+
+        if(subdivided){
+            // No children accepted! Might as well just remove em since they contain none
+            children.length = 0;
+        }
+    }
+
+    // Too deep, or children didnt want it. add it in current node
+    nodeData.push(elementData);
+
+    return true;
+};
+
+var halfDiagonal = new Vec3();
+
+/**
+ * Create 8 equally sized children nodes and put them in the .children array.
+ * @method subdivide
+ */
+OctreeNode.prototype.subdivide = function() {
+    var aabb = this.aabb;
+    var l = aabb.lowerBound;
+    var u = aabb.upperBound;
+
+    var children = this.children;
+
+    children.push(
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,0) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,1,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,0,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(1,0,1) }) }),
+        new OctreeNode({ aabb: new AABB({ lowerBound: new Vec3(0,1,0) }) })
+    );
+
+    u.vsub(l, halfDiagonal);
+    halfDiagonal.scale(0.5, halfDiagonal);
+
+    var root = this.root || this;
+
+    for (var i = 0; i !== 8; i++) {
+        var child = children[i];
+
+        // Set current node as root
+        child.root = root;
+
+        // Compute bounds
+        var lowerBound = child.aabb.lowerBound;
+        lowerBound.x *= halfDiagonal.x;
+        lowerBound.y *= halfDiagonal.y;
+        lowerBound.z *= halfDiagonal.z;
+
+        lowerBound.vadd(l, lowerBound);
+
+        // Upper bound is always lower bound + halfDiagonal
+        lowerBound.vadd(halfDiagonal, child.aabb.upperBound);
+    }
+};
+
+/**
+ * Get all data, potentially within an AABB
+ * @method aabbQuery
+ * @param  {AABB} aabb
+ * @param  {array} result
+ * @return {array} The "result" object
+ */
+OctreeNode.prototype.aabbQuery = function(aabb, result) {
+
+    var nodeData = this.data;
+
+    // abort if the range does not intersect this node
+    // if (!this.aabb.overlaps(aabb)){
+    //     return result;
+    // }
+
+    // Add objects at this level
+    // Array.prototype.push.apply(result, nodeData);
+
+    // Add child data
+    // @todo unwrap recursion into a queue / loop, that's faster in JS
+    var children = this.children;
+
+
+    // for (var i = 0, N = this.children.length; i !== N; i++) {
+    //     children[i].aabbQuery(aabb, result);
+    // }
+
+    var queue = [this];
+    while (queue.length) {
+        var node = queue.pop();
+        if (node.aabb.overlaps(aabb)){
+            Array.prototype.push.apply(result, node.data);
+        }
+        Array.prototype.push.apply(queue, node.children);
+    }
+
+    return result;
+};
+
+var tmpAABB = new AABB();
+
+/**
+ * Get all data, potentially intersected by a ray.
+ * @method rayQuery
+ * @param  {Ray} ray
+ * @param  {Transform} treeTransform
+ * @param  {array} result
+ * @return {array} The "result" object
+ */
+OctreeNode.prototype.rayQuery = function(ray, treeTransform, result) {
+
+    // Use aabb query for now.
+    // @todo implement real ray query which needs less lookups
+    ray.getAABB(tmpAABB);
+    tmpAABB.toLocalFrame(treeTransform, tmpAABB);
+    this.aabbQuery(tmpAABB, result);
+
+    return result;
+};
+
+/**
+ * @method removeEmptyNodes
+ */
+OctreeNode.prototype.removeEmptyNodes = function() {
+    var queue = [this];
+    while (queue.length) {
+        var node = queue.pop();
+        for (var i = node.children.length - 1; i >= 0; i--) {
+            if(!node.children[i].data.length){
+                node.children.splice(i, 1);
+            }
+        }
+        Array.prototype.push.apply(queue, node.children);
+    }
+};
+
+},{"../collision/AABB":15,"../math/Vec3":43}],64:[function(require,module,exports){
+module.exports = Pool;
+
+/**
+ * For pooling objects that can be reused.
+ * @class Pool
+ * @constructor
+ */
+function Pool(){
+    /**
+     * The pooled objects
+     * @property {Array} objects
+     */
+    this.objects = [];
+
+    /**
+     * Constructor of the objects
+     * @property {mixed} type
+     */
+    this.type = Object;
+}
+
+/**
+ * Release an object after use
+ * @method release
+ * @param {Object} obj
+ */
+Pool.prototype.release = function(){
+    var Nargs = arguments.length;
+    for(var i=0; i!==Nargs; i++){
+        this.objects.push(arguments[i]);
+    }
+    return this;
+};
+
+/**
+ * Get an object
+ * @method get
+ * @return {mixed}
+ */
+Pool.prototype.get = function(){
+    if(this.objects.length===0){
+        return this.constructObject();
+    } else {
+        return this.objects.pop();
+    }
+};
+
+/**
+ * Construct an object. Should be implmented in each subclass.
+ * @method constructObject
+ * @return {mixed}
+ */
+Pool.prototype.constructObject = function(){
+    throw new Error("constructObject() not implemented in this Pool subclass yet!");
+};
+
+/**
+ * @method resize
+ * @param {number} size
+ * @return {Pool} Self, for chaining
+ */
+Pool.prototype.resize = function (size) {
+    var objects = this.objects;
+
+    while (objects.length > size) {
+        objects.pop();
+    }
+
+    while (objects.length < size) {
+        objects.push(this.constructObject());
+    }
+
+    return this;
+};
+
+
+},{}],65:[function(require,module,exports){
+module.exports = TupleDictionary;
+
+/**
+ * @class TupleDictionary
+ * @constructor
+ */
+function TupleDictionary() {
+
+    /**
+     * The data storage
+     * @property data
+     * @type {Object}
+     */
+    this.data = { keys:[] };
+}
+
+/**
+ * @method get
+ * @param  {Number} i
+ * @param  {Number} j
+ * @return {Number}
+ */
+TupleDictionary.prototype.get = function(i, j) {
+    if (i > j) {
+        // swap
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    return this.data[i+'-'+j];
+};
+
+/**
+ * @method set
+ * @param  {Number} i
+ * @param  {Number} j
+ * @param {Number} value
+ */
+TupleDictionary.prototype.set = function(i, j, value) {
+    if (i > j) {
+        var temp = j;
+        j = i;
+        i = temp;
+    }
+    var key = i+'-'+j;
+
+    // Check if key already exists
+    if(!this.get(i,j)){
+        this.data.keys.push(key);
+    }
+
+    this.data[key] = value;
+};
+
+/**
+ * @method reset
+ */
+TupleDictionary.prototype.reset = function() {
+    var data = this.data,
+        keys = data.keys;
+    while(keys.length > 0){
+        var key = keys.pop();
+        delete data[key];
+    }
+};
+
+},{}],66:[function(require,module,exports){
+function Utils(){}
+
+module.exports = Utils;
+
+/**
+ * Extend an options object with default values.
+ * @static
+ * @method defaults
+ * @param  {object} options The options object. May be falsy: in this case, a new object is created and returned.
+ * @param  {object} defaults An object containing default values.
+ * @return {object} The modified options object.
+ */
+Utils.defaults = function(options, defaults){
+    options = options || {};
+
+    for(var key in defaults){
+        if(!(key in options)){
+            options[key] = defaults[key];
+        }
+    }
+
+    return options;
+};
+
+},{}],67:[function(require,module,exports){
+module.exports = Vec3Pool;
+
+var Vec3 = require('../math/Vec3');
+var Pool = require('./Pool');
+
+/**
+ * @class Vec3Pool
+ * @constructor
+ * @extends Pool
+ */
+function Vec3Pool(){
+    Pool.call(this);
+    this.type = Vec3;
+}
+Vec3Pool.prototype = new Pool();
+
+/**
+ * Construct a vector
+ * @method constructObject
+ * @return {Vec3}
+ */
+Vec3Pool.prototype.constructObject = function(){
+    return new Vec3();
+};
+
+},{"../math/Vec3":43,"./Pool":64}],68:[function(require,module,exports){
+module.exports = Narrowphase;
+
+var AABB = require('../collision/AABB');
+var Body = require('../objects/Body');
+var Shape = require('../shapes/Shape');
+var Ray = require('../collision/Ray');
+var Vec3 = require('../math/Vec3');
+var Transform = require('../math/Transform');
+var ConvexPolyhedron = require('../shapes/ConvexPolyhedron');
+var Quaternion = require('../math/Quaternion');
+var Solver = require('../solver/Solver');
+var Vec3Pool = require('../utils/Vec3Pool');
+var ContactEquation = require('../equations/ContactEquation');
+var FrictionEquation = require('../equations/FrictionEquation');
+
+/**
+ * Helper class for the World. Generates ContactEquations.
+ * @class Narrowphase
+ * @constructor
+ * @todo Sphere-ConvexPolyhedron contacts
+ * @todo Contact reduction
+ * @todo  should move methods to prototype
+ */
+function Narrowphase(world){
+
+    /**
+     * Internal storage of pooled contact points.
+     * @property {Array} contactPointPool
+     */
+    this.contactPointPool = [];
+
+    this.frictionEquationPool = [];
+
+    this.result = [];
+    this.frictionResult = [];
+
+    /**
+     * Pooled vectors.
+     * @property {Vec3Pool} v3pool
+     */
+    this.v3pool = new Vec3Pool();
+
+    this.world = world;
+    this.currentContactMaterial = null;
+
+    /**
+     * @property {Boolean} enableFrictionReduction
+     */
+    this.enableFrictionReduction = false;
+}
+
+/**
+ * Make a contact object, by using the internal pool or creating a new one.
+ * @method createContactEquation
+ * @param {Body} bi
+ * @param {Body} bj
+ * @param {Shape} si
+ * @param {Shape} sj
+ * @param {Shape} overrideShapeA
+ * @param {Shape} overrideShapeB
+ * @return {ContactEquation}
+ */
+Narrowphase.prototype.createContactEquation = function(bi, bj, si, sj, overrideShapeA, overrideShapeB){
+    var c;
+    if(this.contactPointPool.length){
+        c = this.contactPointPool.pop();
+        c.bi = bi;
+        c.bj = bj;
+    } else {
+        c = new ContactEquation(bi, bj);
+    }
+
+    c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;
+
+    var cm = this.currentContactMaterial;
+
+    c.restitution = cm.restitution;
+
+    c.setSpookParams(
+        cm.contactEquationStiffness,
+        cm.contactEquationRelaxation,
+        this.world.dt
+    );
+
+    var matA = si.material || bi.material;
+    var matB = sj.material || bj.material;
+    if(matA && matB && matA.restitution >= 0 && matB.restitution >= 0){
+        c.restitution = matA.restitution * matB.restitution;
+    }
+
+    c.si = overrideShapeA || si;
+    c.sj = overrideShapeB || sj;
+
+    return c;
+};
+
+Narrowphase.prototype.createFrictionEquationsFromContact = function(contactEquation, outArray){
+    var bodyA = contactEquation.bi;
+    var bodyB = contactEquation.bj;
+    var shapeA = contactEquation.si;
+    var shapeB = contactEquation.sj;
+
+    var world = this.world;
+    var cm = this.currentContactMaterial;
+
+    // If friction or restitution were specified in the material, use them
+    var friction = cm.friction;
+    var matA = shapeA.material || bodyA.material;
+    var matB = shapeB.material || bodyB.material;
+    if(matA && matB && matA.friction >= 0 && matB.friction >= 0){
+        friction = matA.friction * matB.friction;
+    }
+
+    if(friction > 0){
+
+        // Create 2 tangent equations
+        var mug = friction * world.gravity.length();
+        var reducedMass = (bodyA.invMass + bodyB.invMass);
+        if(reducedMass > 0){
+            reducedMass = 1/reducedMass;
+        }
+        var pool = this.frictionEquationPool;
+        var c1 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);
+        var c2 = pool.length ? pool.pop() : new FrictionEquation(bodyA,bodyB,mug*reducedMass);
+
+        c1.bi = c2.bi = bodyA;
+        c1.bj = c2.bj = bodyB;
+        c1.minForce = c2.minForce = -mug*reducedMass;
+        c1.maxForce = c2.maxForce = mug*reducedMass;
+
+        // Copy over the relative vectors
+        c1.ri.copy(contactEquation.ri);
+        c1.rj.copy(contactEquation.rj);
+        c2.ri.copy(contactEquation.ri);
+        c2.rj.copy(contactEquation.rj);
+
+        // Construct tangents
+        contactEquation.ni.tangents(c1.t, c2.t);
+
+        // Set spook params
+        c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);
+        c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, world.dt);
+
+        c1.enabled = c2.enabled = contactEquation.enabled;
+
+        outArray.push(c1, c2);
+
+        return true;
+    }
+
+    return false;
+};
+
+var averageNormal = new Vec3();
+var averageContactPointA = new Vec3();
+var averageContactPointB = new Vec3();
+
+// Take the average N latest contact point on the plane.
+Narrowphase.prototype.createFrictionFromAverage = function(numContacts){
+    // The last contactEquation
+    var c = this.result[this.result.length - 1];
+
+    // Create the result: two "average" friction equations
+    if (!this.createFrictionEquationsFromContact(c, this.frictionResult) || numContacts === 1) {
+        return;
+    }
+
+    var f1 = this.frictionResult[this.frictionResult.length - 2];
+    var f2 = this.frictionResult[this.frictionResult.length - 1];
+
+    averageNormal.setZero();
+    averageContactPointA.setZero();
+    averageContactPointB.setZero();
+
+    var bodyA = c.bi;
+    var bodyB = c.bj;
+    for(var i=0; i!==numContacts; i++){
+        c = this.result[this.result.length - 1 - i];
+        if(c.bodyA !== bodyA){
+            averageNormal.vadd(c.ni, averageNormal);
+            averageContactPointA.vadd(c.ri, averageContactPointA);
+            averageContactPointB.vadd(c.rj, averageContactPointB);
+        } else {
+            averageNormal.vsub(c.ni, averageNormal);
+            averageContactPointA.vadd(c.rj, averageContactPointA);
+            averageContactPointB.vadd(c.ri, averageContactPointB);
+        }
+    }
+
+    var invNumContacts = 1 / numContacts;
+    averageContactPointA.scale(invNumContacts, f1.ri);
+    averageContactPointB.scale(invNumContacts, f1.rj);
+    f2.ri.copy(f1.ri); // Should be the same
+    f2.rj.copy(f1.rj);
+    averageNormal.normalize();
+    averageNormal.tangents(f1.t, f2.t);
+    // return eq;
+};
+
+
+var tmpVec1 = new Vec3();
+var tmpVec2 = new Vec3();
+var tmpQuat1 = new Quaternion();
+var tmpQuat2 = new Quaternion();
+
+/**
+ * Generate all contacts between a list of body pairs
+ * @method getContacts
+ * @param {array} p1 Array of body indices
+ * @param {array} p2 Array of body indices
+ * @param {World} world
+ * @param {array} result Array to store generated contacts
+ * @param {array} oldcontacts Optional. Array of reusable contact objects
+ */
+Narrowphase.prototype.getContacts = function(p1, p2, world, result, oldcontacts, frictionResult, frictionPool){
+    // Save old contact objects
+    this.contactPointPool = oldcontacts;
+    this.frictionEquationPool = frictionPool;
+    this.result = result;
+    this.frictionResult = frictionResult;
+
+    var qi = tmpQuat1;
+    var qj = tmpQuat2;
+    var xi = tmpVec1;
+    var xj = tmpVec2;
+
+    for(var k=0, N=p1.length; k!==N; k++){
+
+        // Get current collision bodies
+        var bi = p1[k],
+            bj = p2[k];
+
+        // Get contact material
+        var bodyContactMaterial = null;
+        if(bi.material && bj.material){
+            bodyContactMaterial = world.getContactMaterial(bi.material,bj.material) || null;
+        }
+
+        var justTest = (
+            (
+                (bi.type & Body.KINEMATIC) && (bj.type & Body.STATIC)
+            ) || (
+                (bi.type & Body.STATIC) && (bj.type & Body.KINEMATIC)
+            ) || (
+                (bi.type & Body.KINEMATIC) && (bj.type & Body.KINEMATIC)
+            )
+        );
+
+        for (var i = 0; i < bi.shapes.length; i++) {
+            bi.quaternion.mult(bi.shapeOrientations[i], qi);
+            bi.quaternion.vmult(bi.shapeOffsets[i], xi);
+            xi.vadd(bi.position, xi);
+            var si = bi.shapes[i];
+
+            for (var j = 0; j < bj.shapes.length; j++) {
+
+                // Compute world transform of shapes
+                bj.quaternion.mult(bj.shapeOrientations[j], qj);
+                bj.quaternion.vmult(bj.shapeOffsets[j], xj);
+                xj.vadd(bj.position, xj);
+                var sj = bj.shapes[j];
+
+                if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+                    continue;
+                }
+
+                // Get collision material
+                var shapeContactMaterial = null;
+                if(si.material && sj.material){
+                    shapeContactMaterial = world.getContactMaterial(si.material,sj.material) || null;
+                }
+
+                this.currentContactMaterial = shapeContactMaterial || bodyContactMaterial || world.defaultContactMaterial;
+
+                // Get contacts
+                var resolver = this[si.type | sj.type];
+                if(resolver){
+                    var retval = false;
+                    if (si.type < sj.type) {
+                        retval = resolver.call(this, si, sj, xi, xj, qi, qj, bi, bj, si, sj, justTest);
+                    } else {
+                        retval = resolver.call(this, sj, si, xj, xi, qj, qi, bj, bi, si, sj, justTest);
+                    }
+
+                    if(retval && justTest){
+                        // Register overlap
+                        world.shapeOverlapKeeper.set(si.id, sj.id);
+                        world.bodyOverlapKeeper.set(bi.id, bj.id);
+                    }
+                }
+            }
+        }
+    }
+};
+
+var numWarnings = 0;
+var maxWarnings = 10;
+
+function warn(msg){
+    if(numWarnings > maxWarnings){
+        return;
+    }
+
+    numWarnings++;
+
+    console.warn(msg);
+}
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.BOX] =
+Narrowphase.prototype.boxBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    sj.convexPolyhedronRepresentation.material = sj.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;
+    return this.convexConvex(si.convexPolyhedronRepresentation,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.boxConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexConvex(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.PARTICLE] =
+Narrowphase.prototype.boxParticle = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexParticle(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+/**
+ * @method sphereSphere
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE] =
+Narrowphase.prototype.sphereSphere = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    if(justTest){
+        return xi.distanceSquared(xj) < Math.pow(si.radius + sj.radius, 2);
+    }
+
+    // We will have only one contact in this case
+    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+    // Contact normal
+    xj.vsub(xi, r.ni);
+    r.ni.normalize();
+
+    // Contact point locations
+    r.ri.copy(r.ni);
+    r.rj.copy(r.ni);
+    r.ri.mult(si.radius, r.ri);
+    r.rj.mult(-sj.radius, r.rj);
+
+    r.ri.vadd(xi, r.ri);
+    r.ri.vsub(bi.position, r.ri);
+
+    r.rj.vadd(xj, r.rj);
+    r.rj.vsub(bj.position, r.rj);
+
+    this.result.push(r);
+
+    this.createFrictionEquationsFromContact(r, this.frictionResult);
+};
+
+/**
+ * @method planeTrimesh
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+var planeTrimesh_normal = new Vec3();
+var planeTrimesh_relpos = new Vec3();
+var planeTrimesh_projected = new Vec3();
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.TRIMESH] =
+Narrowphase.prototype.planeTrimesh = function(
+    planeShape,
+    trimeshShape,
+    planePos,
+    trimeshPos,
+    planeQuat,
+    trimeshQuat,
+    planeBody,
+    trimeshBody,
+    rsi,
+    rsj,
+    justTest
+){
+    // Make contacts!
+    var v = new Vec3();
+
+    var normal = planeTrimesh_normal;
+    normal.set(0,0,1);
+    planeQuat.vmult(normal,normal); // Turn normal according to plane
+
+    for(var i=0; i<trimeshShape.vertices.length / 3; i++){
+
+        // Get world vertex from trimesh
+        trimeshShape.getVertex(i, v);
+
+        // Safe up
+        var v2 = new Vec3();
+        v2.copy(v);
+        Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);
+
+        // Check plane side
+        var relpos = planeTrimesh_relpos;
+        v.vsub(planePos, relpos);
+        var dot = normal.dot(relpos);
+
+        if(dot <= 0.0){
+            if(justTest){
+                return true;
+            }
+
+            var r = this.createContactEquation(planeBody,trimeshBody,planeShape,trimeshShape,rsi,rsj);
+
+            r.ni.copy(normal); // Contact normal is the plane normal
+
+            // Get vertex position projected on plane
+            var projected = planeTrimesh_projected;
+            normal.scale(relpos.dot(normal), projected);
+            v.vsub(projected,projected);
+
+            // ri is the projected world position minus plane position
+            r.ri.copy(projected);
+            r.ri.vsub(planeBody.position, r.ri);
+
+            r.rj.copy(v);
+            r.rj.vsub(trimeshBody.position, r.rj);
+
+            // Store result
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        }
+    }
+};
+
+/**
+ * @method sphereTrimesh
+ * @param  {Shape}      sphereShape
+ * @param  {Shape}      trimeshShape
+ * @param  {Vec3}       spherePos
+ * @param  {Vec3}       trimeshPos
+ * @param  {Quaternion} sphereQuat
+ * @param  {Quaternion} trimeshQuat
+ * @param  {Body}       sphereBody
+ * @param  {Body}       trimeshBody
+ */
+var sphereTrimesh_normal = new Vec3();
+var sphereTrimesh_relpos = new Vec3();
+var sphereTrimesh_projected = new Vec3();
+var sphereTrimesh_v = new Vec3();
+var sphereTrimesh_v2 = new Vec3();
+var sphereTrimesh_edgeVertexA = new Vec3();
+var sphereTrimesh_edgeVertexB = new Vec3();
+var sphereTrimesh_edgeVector = new Vec3();
+var sphereTrimesh_edgeVectorUnit = new Vec3();
+var sphereTrimesh_localSpherePos = new Vec3();
+var sphereTrimesh_tmp = new Vec3();
+var sphereTrimesh_va = new Vec3();
+var sphereTrimesh_vb = new Vec3();
+var sphereTrimesh_vc = new Vec3();
+var sphereTrimesh_localSphereAABB = new AABB();
+var sphereTrimesh_triangles = [];
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.TRIMESH] =
+Narrowphase.prototype.sphereTrimesh = function (
+    sphereShape,
+    trimeshShape,
+    spherePos,
+    trimeshPos,
+    sphereQuat,
+    trimeshQuat,
+    sphereBody,
+    trimeshBody,
+    rsi,
+    rsj,
+    justTest
+) {
+
+    var edgeVertexA = sphereTrimesh_edgeVertexA;
+    var edgeVertexB = sphereTrimesh_edgeVertexB;
+    var edgeVector = sphereTrimesh_edgeVector;
+    var edgeVectorUnit = sphereTrimesh_edgeVectorUnit;
+    var localSpherePos = sphereTrimesh_localSpherePos;
+    var tmp = sphereTrimesh_tmp;
+    var localSphereAABB = sphereTrimesh_localSphereAABB;
+    var v2 = sphereTrimesh_v2;
+    var relpos = sphereTrimesh_relpos;
+    var triangles = sphereTrimesh_triangles;
+
+    // Convert sphere position to local in the trimesh
+    Transform.pointToLocalFrame(trimeshPos, trimeshQuat, spherePos, localSpherePos);
+
+    // Get the aabb of the sphere locally in the trimesh
+    var sphereRadius = sphereShape.radius;
+    localSphereAABB.lowerBound.set(
+        localSpherePos.x - sphereRadius,
+        localSpherePos.y - sphereRadius,
+        localSpherePos.z - sphereRadius
+    );
+    localSphereAABB.upperBound.set(
+        localSpherePos.x + sphereRadius,
+        localSpherePos.y + sphereRadius,
+        localSpherePos.z + sphereRadius
+    );
+
+    trimeshShape.getTrianglesInAABB(localSphereAABB, triangles);
+    //for (var i = 0; i < trimeshShape.indices.length / 3; i++) triangles.push(i); // All
+
+    // Vertices
+    var v = sphereTrimesh_v;
+    var radiusSquared = sphereShape.radius * sphereShape.radius;
+    for(var i=0; i<triangles.length; i++){
+        for (var j = 0; j < 3; j++) {
+
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], v);
+
+            // Check vertex overlap in sphere
+            v.vsub(localSpherePos, relpos);
+
+            if(relpos.norm2() <= radiusSquared){
+
+                // Safe up
+                v2.copy(v);
+                Transform.pointToWorldFrame(trimeshPos, trimeshQuat, v2, v);
+
+                v.vsub(spherePos, relpos);
+
+                if(justTest){
+                    return true;
+                }
+
+                var r = this.createContactEquation(sphereBody,trimeshBody,sphereShape,trimeshShape,rsi,rsj);
+                r.ni.copy(relpos);
+                r.ni.normalize();
+
+                // ri is the vector from sphere center to the sphere surface
+                r.ri.copy(r.ni);
+                r.ri.scale(sphereShape.radius, r.ri);
+                r.ri.vadd(spherePos, r.ri);
+                r.ri.vsub(sphereBody.position, r.ri);
+
+                r.rj.copy(v);
+                r.rj.vsub(trimeshBody.position, r.rj);
+
+                // Store result
+                this.result.push(r);
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+    }
+
+    // Check all edges
+    for(var i=0; i<triangles.length; i++){
+        for (var j = 0; j < 3; j++) {
+
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + j], edgeVertexA);
+            trimeshShape.getVertex(trimeshShape.indices[triangles[i] * 3 + ((j+1)%3)], edgeVertexB);
+            edgeVertexB.vsub(edgeVertexA, edgeVector);
+
+            // Project sphere position to the edge
+            localSpherePos.vsub(edgeVertexB, tmp);
+            var positionAlongEdgeB = tmp.dot(edgeVector);
+
+            localSpherePos.vsub(edgeVertexA, tmp);
+            var positionAlongEdgeA = tmp.dot(edgeVector);
+
+            if(positionAlongEdgeA > 0 && positionAlongEdgeB < 0){
+
+                // Now check the orthogonal distance from edge to sphere center
+                localSpherePos.vsub(edgeVertexA, tmp);
+
+                edgeVectorUnit.copy(edgeVector);
+                edgeVectorUnit.normalize();
+                positionAlongEdgeA = tmp.dot(edgeVectorUnit);
+
+                edgeVectorUnit.scale(positionAlongEdgeA, tmp);
+                tmp.vadd(edgeVertexA, tmp);
+
+                // tmp is now the sphere center position projected to the edge, defined locally in the trimesh frame
+                var dist = tmp.distanceTo(localSpherePos);
+                if(dist < sphereShape.radius){
+
+                    if(justTest){
+                        return true;
+                    }
+
+                    var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape,rsi,rsj);
+
+                    tmp.vsub(localSpherePos, r.ni);
+                    r.ni.normalize();
+                    r.ni.scale(sphereShape.radius, r.ri);
+
+                    Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);
+                    tmp.vsub(trimeshBody.position, r.rj);
+
+                    Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);
+                    Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);
+
+                    this.result.push(r);
+                    this.createFrictionEquationsFromContact(r, this.frictionResult);
+                }
+            }
+        }
+    }
+
+    // Triangle faces
+    var va = sphereTrimesh_va;
+    var vb = sphereTrimesh_vb;
+    var vc = sphereTrimesh_vc;
+    var normal = sphereTrimesh_normal;
+    for(var i=0, N = triangles.length; i !== N; i++){
+        trimeshShape.getTriangleVertices(triangles[i], va, vb, vc);
+        trimeshShape.getNormal(triangles[i], normal);
+        localSpherePos.vsub(va, tmp);
+        var dist = tmp.dot(normal);
+        normal.scale(dist, tmp);
+        localSpherePos.vsub(tmp, tmp);
+
+        // tmp is now the sphere position projected to the triangle plane
+        dist = tmp.distanceTo(localSpherePos);
+        if(Ray.pointInTriangle(tmp, va, vb, vc) && dist < sphereShape.radius){
+            if(justTest){
+                return true;
+            }
+            var r = this.createContactEquation(sphereBody, trimeshBody, sphereShape, trimeshShape,rsi,rsj);
+
+            tmp.vsub(localSpherePos, r.ni);
+            r.ni.normalize();
+            r.ni.scale(sphereShape.radius, r.ri);
+
+            Transform.pointToWorldFrame(trimeshPos, trimeshQuat, tmp, tmp);
+            tmp.vsub(trimeshBody.position, r.rj);
+
+            Transform.vectorToWorldFrame(trimeshQuat, r.ni, r.ni);
+            Transform.vectorToWorldFrame(trimeshQuat, r.ri, r.ri);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        }
+    }
+
+    triangles.length = 0;
+};
+
+var point_on_plane_to_sphere = new Vec3();
+var plane_to_sphere_ortho = new Vec3();
+
+/**
+ * @method spherePlane
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.PLANE] =
+Narrowphase.prototype.spherePlane = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    // We will have one contact in this case
+    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+    // Contact normal
+    r.ni.set(0,0,1);
+    qj.vmult(r.ni, r.ni);
+    r.ni.negate(r.ni); // body i is the sphere, flip normal
+    r.ni.normalize(); // Needed?
+
+    // Vector from sphere center to contact point
+    r.ni.mult(si.radius, r.ri);
+
+    // Project down sphere on plane
+    xi.vsub(xj, point_on_plane_to_sphere);
+    r.ni.mult(r.ni.dot(point_on_plane_to_sphere), plane_to_sphere_ortho);
+    point_on_plane_to_sphere.vsub(plane_to_sphere_ortho,r.rj); // The sphere position projected to plane
+
+    if(-point_on_plane_to_sphere.dot(r.ni) <= si.radius){
+
+        if(justTest){
+            return true;
+        }
+
+        // Make it relative to the body
+        var ri = r.ri;
+        var rj = r.rj;
+        ri.vadd(xi, ri);
+        ri.vsub(bi.position, ri);
+        rj.vadd(xj, rj);
+        rj.vsub(bj.position, rj);
+
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+// See http://bulletphysics.com/Bullet/BulletFull/SphereTriangleDetector_8cpp_source.html
+var pointInPolygon_edge = new Vec3();
+var pointInPolygon_edge_x_normal = new Vec3();
+var pointInPolygon_vtp = new Vec3();
+function pointInPolygon(verts, normal, p){
+    var positiveResult = null;
+    var N = verts.length;
+    for(var i=0; i!==N; i++){
+        var v = verts[i];
+
+        // Get edge to the next vertex
+        var edge = pointInPolygon_edge;
+        verts[(i+1) % (N)].vsub(v,edge);
+
+        // Get cross product between polygon normal and the edge
+        var edge_x_normal = pointInPolygon_edge_x_normal;
+        //var edge_x_normal = new Vec3();
+        edge.cross(normal,edge_x_normal);
+
+        // Get vector between point and current vertex
+        var vertex_to_p = pointInPolygon_vtp;
+        p.vsub(v,vertex_to_p);
+
+        // This dot product determines which side of the edge the point is
+        var r = edge_x_normal.dot(vertex_to_p);
+
+        // If all such dot products have same sign, we are inside the polygon.
+        if(positiveResult===null || (r>0 && positiveResult===true) || (r<=0 && positiveResult===false)){
+            if(positiveResult===null){
+                positiveResult = r>0;
+            }
+            continue;
+        } else {
+            return false; // Encountered some other sign. Exit.
+        }
+    }
+
+    // If we got here, all dot products were of the same sign.
+    return true;
+}
+
+var box_to_sphere = new Vec3();
+var sphereBox_ns = new Vec3();
+var sphereBox_ns1 = new Vec3();
+var sphereBox_ns2 = new Vec3();
+var sphereBox_sides = [new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3(),new Vec3()];
+var sphereBox_sphere_to_corner = new Vec3();
+var sphereBox_side_ns = new Vec3();
+var sphereBox_side_ns1 = new Vec3();
+var sphereBox_side_ns2 = new Vec3();
+
+/**
+ * @method sphereBox
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.BOX] =
+Narrowphase.prototype.sphereBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    var v3pool = this.v3pool;
+
+    // we refer to the box as body j
+    var sides = sphereBox_sides;
+    xi.vsub(xj,box_to_sphere);
+    sj.getSideNormals(sides,qj);
+    var R =     si.radius;
+    var penetrating_sides = [];
+
+    // Check side (plane) intersections
+    var found = false;
+
+    // Store the resulting side penetration info
+    var side_ns = sphereBox_side_ns;
+    var side_ns1 = sphereBox_side_ns1;
+    var side_ns2 = sphereBox_side_ns2;
+    var side_h = null;
+    var side_penetrations = 0;
+    var side_dot1 = 0;
+    var side_dot2 = 0;
+    var side_distance = null;
+    for(var idx=0,nsides=sides.length; idx!==nsides && found===false; idx++){
+        // Get the plane side normal (ns)
+        var ns = sphereBox_ns;
+        ns.copy(sides[idx]);
+
+        var h = ns.norm();
+        ns.normalize();
+
+        // The normal/distance dot product tells which side of the plane we are
+        var dot = box_to_sphere.dot(ns);
+
+        if(dot<h+R && dot>0){
+            // Intersects plane. Now check the other two dimensions
+            var ns1 = sphereBox_ns1;
+            var ns2 = sphereBox_ns2;
+            ns1.copy(sides[(idx+1)%3]);
+            ns2.copy(sides[(idx+2)%3]);
+            var h1 = ns1.norm();
+            var h2 = ns2.norm();
+            ns1.normalize();
+            ns2.normalize();
+            var dot1 = box_to_sphere.dot(ns1);
+            var dot2 = box_to_sphere.dot(ns2);
+            if(dot1<h1 && dot1>-h1 && dot2<h2 && dot2>-h2){
+                var dist = Math.abs(dot-h-R);
+                if(side_distance===null || dist < side_distance){
+                    side_distance = dist;
+                    side_dot1 = dot1;
+                    side_dot2 = dot2;
+                    side_h = h;
+                    side_ns.copy(ns);
+                    side_ns1.copy(ns1);
+                    side_ns2.copy(ns2);
+                    side_penetrations++;
+
+                    if(justTest){
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+    if(side_penetrations){
+        found = true;
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        side_ns.mult(-R,r.ri); // Sphere r
+        r.ni.copy(side_ns);
+        r.ni.negate(r.ni); // Normal should be out of sphere
+        side_ns.mult(side_h,side_ns);
+        side_ns1.mult(side_dot1,side_ns1);
+        side_ns.vadd(side_ns1,side_ns);
+        side_ns2.mult(side_dot2,side_ns2);
+        side_ns.vadd(side_ns2,r.rj);
+
+        // Make relative to bodies
+        r.ri.vadd(xi, r.ri);
+        r.ri.vsub(bi.position, r.ri);
+        r.rj.vadd(xj, r.rj);
+        r.rj.vsub(bj.position, r.rj);
+
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+
+    // Check corners
+    var rj = v3pool.get();
+    var sphere_to_corner = sphereBox_sphere_to_corner;
+    for(var j=0; j!==2 && !found; j++){
+        for(var k=0; k!==2 && !found; k++){
+            for(var l=0; l!==2 && !found; l++){
+                rj.set(0,0,0);
+                if(j){
+                    rj.vadd(sides[0],rj);
+                } else {
+                    rj.vsub(sides[0],rj);
+                }
+                if(k){
+                    rj.vadd(sides[1],rj);
+                } else {
+                    rj.vsub(sides[1],rj);
+                }
+                if(l){
+                    rj.vadd(sides[2],rj);
+                } else {
+                    rj.vsub(sides[2],rj);
+                }
+
+                // World position of corner
+                xj.vadd(rj,sphere_to_corner);
+                sphere_to_corner.vsub(xi,sphere_to_corner);
+
+                if(sphere_to_corner.norm2() < R*R){
+                    if(justTest){
+                        return true;
+                    }
+                    found = true;
+                    var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                    r.ri.copy(sphere_to_corner);
+                    r.ri.normalize();
+                    r.ni.copy(r.ri);
+                    r.ri.mult(R,r.ri);
+                    r.rj.copy(rj);
+
+                    // Make relative to bodies
+                    r.ri.vadd(xi, r.ri);
+                    r.ri.vsub(bi.position, r.ri);
+                    r.rj.vadd(xj, r.rj);
+                    r.rj.vsub(bj.position, r.rj);
+
+                    this.result.push(r);
+                    this.createFrictionEquationsFromContact(r, this.frictionResult);
+                }
+            }
+        }
+    }
+    v3pool.release(rj);
+    rj = null;
+
+    // Check edges
+    var edgeTangent = v3pool.get();
+    var edgeCenter = v3pool.get();
+    var r = v3pool.get(); // r = edge center to sphere center
+    var orthogonal = v3pool.get();
+    var dist = v3pool.get();
+    var Nsides = sides.length;
+    for(var j=0; j!==Nsides && !found; j++){
+        for(var k=0; k!==Nsides && !found; k++){
+            if(j%3 !== k%3){
+                // Get edge tangent
+                sides[k].cross(sides[j],edgeTangent);
+                edgeTangent.normalize();
+                sides[j].vadd(sides[k], edgeCenter);
+                r.copy(xi);
+                r.vsub(edgeCenter,r);
+                r.vsub(xj,r);
+                var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction
+                edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction
+
+                // Find the third side orthogonal to this one
+                var l = 0;
+                while(l===j%3 || l===k%3){
+                    l++;
+                }
+
+                // vec from edge center to sphere projected to the plane orthogonal to the edge tangent
+                dist.copy(xi);
+                dist.vsub(orthogonal,dist);
+                dist.vsub(edgeCenter,dist);
+                dist.vsub(xj,dist);
+
+                // Distances in tangent direction and distance in the plane orthogonal to it
+                var tdist = Math.abs(orthonorm);
+                var ndist = dist.norm();
+
+                if(tdist < sides[l].norm() && ndist<R){
+                    if(justTest){
+                        return true;
+                    }
+                    found = true;
+                    var res = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                    edgeCenter.vadd(orthogonal,res.rj); // box rj
+                    res.rj.copy(res.rj);
+                    dist.negate(res.ni);
+                    res.ni.normalize();
+
+                    res.ri.copy(res.rj);
+                    res.ri.vadd(xj,res.ri);
+                    res.ri.vsub(xi,res.ri);
+                    res.ri.normalize();
+                    res.ri.mult(R,res.ri);
+
+                    // Make relative to bodies
+                    res.ri.vadd(xi, res.ri);
+                    res.ri.vsub(bi.position, res.ri);
+                    res.rj.vadd(xj, res.rj);
+                    res.rj.vsub(bj.position, res.rj);
+
+                    this.result.push(res);
+                    this.createFrictionEquationsFromContact(res, this.frictionResult);
+                }
+            }
+        }
+    }
+    v3pool.release(edgeTangent,edgeCenter,r,orthogonal,dist);
+};
+
+var convex_to_sphere = new Vec3();
+var sphereConvex_edge = new Vec3();
+var sphereConvex_edgeUnit = new Vec3();
+var sphereConvex_sphereToCorner = new Vec3();
+var sphereConvex_worldCorner = new Vec3();
+var sphereConvex_worldNormal = new Vec3();
+var sphereConvex_worldPoint = new Vec3();
+var sphereConvex_worldSpherePointClosestToPlane = new Vec3();
+var sphereConvex_penetrationVec = new Vec3();
+var sphereConvex_sphereToWorldPoint = new Vec3();
+
+/**
+ * @method sphereConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.sphereConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    var v3pool = this.v3pool;
+    xi.vsub(xj,convex_to_sphere);
+    var normals = sj.faceNormals;
+    var faces = sj.faces;
+    var verts = sj.vertices;
+    var R =     si.radius;
+    var penetrating_sides = [];
+
+    // if(convex_to_sphere.norm2() > si.boundingSphereRadius + sj.boundingSphereRadius){
+    //     return;
+    // }
+
+    // Check corners
+    for(var i=0; i!==verts.length; i++){
+        var v = verts[i];
+
+        // World position of corner
+        var worldCorner = sphereConvex_worldCorner;
+        qj.vmult(v,worldCorner);
+        xj.vadd(worldCorner,worldCorner);
+        var sphere_to_corner = sphereConvex_sphereToCorner;
+        worldCorner.vsub(xi, sphere_to_corner);
+        if(sphere_to_corner.norm2() < R * R){
+            if(justTest){
+                return true;
+            }
+            found = true;
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+            r.ri.copy(sphere_to_corner);
+            r.ri.normalize();
+            r.ni.copy(r.ri);
+            r.ri.mult(R,r.ri);
+            worldCorner.vsub(xj,r.rj);
+
+            // Should be relative to the body.
+            r.ri.vadd(xi, r.ri);
+            r.ri.vsub(bi.position, r.ri);
+
+            // Should be relative to the body.
+            r.rj.vadd(xj, r.rj);
+            r.rj.vsub(bj.position, r.rj);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+            return;
+        }
+    }
+
+    // Check side (plane) intersections
+    var found = false;
+    for(var i=0, nfaces=faces.length; i!==nfaces && found===false; i++){
+        var normal = normals[i];
+        var face = faces[i];
+
+        // Get world-transformed normal of the face
+        var worldNormal = sphereConvex_worldNormal;
+        qj.vmult(normal,worldNormal);
+
+        // Get a world vertex from the face
+        var worldPoint = sphereConvex_worldPoint;
+        qj.vmult(verts[face[0]],worldPoint);
+        worldPoint.vadd(xj,worldPoint);
+
+        // Get a point on the sphere, closest to the face normal
+        var worldSpherePointClosestToPlane = sphereConvex_worldSpherePointClosestToPlane;
+        worldNormal.mult(-R, worldSpherePointClosestToPlane);
+        xi.vadd(worldSpherePointClosestToPlane, worldSpherePointClosestToPlane);
+
+        // Vector from a face point to the closest point on the sphere
+        var penetrationVec = sphereConvex_penetrationVec;
+        worldSpherePointClosestToPlane.vsub(worldPoint,penetrationVec);
+
+        // The penetration. Negative value means overlap.
+        var penetration = penetrationVec.dot(worldNormal);
+
+        var worldPointToSphere = sphereConvex_sphereToWorldPoint;
+        xi.vsub(worldPoint, worldPointToSphere);
+
+        if(penetration < 0 && worldPointToSphere.dot(worldNormal)>0){
+            // Intersects plane. Now check if the sphere is inside the face polygon
+            var faceVerts = []; // Face vertices, in world coords
+            for(var j=0, Nverts=face.length; j!==Nverts; j++){
+                var worldVertex = v3pool.get();
+                qj.vmult(verts[face[j]], worldVertex);
+                xj.vadd(worldVertex,worldVertex);
+                faceVerts.push(worldVertex);
+            }
+
+            if(pointInPolygon(faceVerts,worldNormal,xi)){ // Is the sphere center in the face polygon?
+                if(justTest){
+                    return true;
+                }
+                found = true;
+                var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+
+                worldNormal.mult(-R, r.ri); // Contact offset, from sphere center to contact
+                worldNormal.negate(r.ni); // Normal pointing out of sphere
+
+                var penetrationVec2 = v3pool.get();
+                worldNormal.mult(-penetration, penetrationVec2);
+                var penetrationSpherePoint = v3pool.get();
+                worldNormal.mult(-R, penetrationSpherePoint);
+
+                //xi.vsub(xj).vadd(penetrationSpherePoint).vadd(penetrationVec2 , r.rj);
+                xi.vsub(xj,r.rj);
+                r.rj.vadd(penetrationSpherePoint,r.rj);
+                r.rj.vadd(penetrationVec2 , r.rj);
+
+                // Should be relative to the body.
+                r.rj.vadd(xj, r.rj);
+                r.rj.vsub(bj.position, r.rj);
+
+                // Should be relative to the body.
+                r.ri.vadd(xi, r.ri);
+                r.ri.vsub(bi.position, r.ri);
+
+                v3pool.release(penetrationVec2);
+                v3pool.release(penetrationSpherePoint);
+
+                this.result.push(r);
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+
+                // Release world vertices
+                for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                    v3pool.release(faceVerts[j]);
+                }
+
+                return; // We only expect *one* face contact
+            } else {
+                // Edge?
+                for(var j=0; j!==face.length; j++){
+
+                    // Get two world transformed vertices
+                    var v1 = v3pool.get();
+                    var v2 = v3pool.get();
+                    qj.vmult(verts[face[(j+1)%face.length]], v1);
+                    qj.vmult(verts[face[(j+2)%face.length]], v2);
+                    xj.vadd(v1, v1);
+                    xj.vadd(v2, v2);
+
+                    // Construct edge vector
+                    var edge = sphereConvex_edge;
+                    v2.vsub(v1,edge);
+
+                    // Construct the same vector, but normalized
+                    var edgeUnit = sphereConvex_edgeUnit;
+                    edge.unit(edgeUnit);
+
+                    // p is xi projected onto the edge
+                    var p = v3pool.get();
+                    var v1_to_xi = v3pool.get();
+                    xi.vsub(v1, v1_to_xi);
+                    var dot = v1_to_xi.dot(edgeUnit);
+                    edgeUnit.mult(dot, p);
+                    p.vadd(v1, p);
+
+                    // Compute a vector from p to the center of the sphere
+                    var xi_to_p = v3pool.get();
+                    p.vsub(xi, xi_to_p);
+
+                    // Collision if the edge-sphere distance is less than the radius
+                    // AND if p is in between v1 and v2
+                    if(dot > 0 && dot*dot<edge.norm2() && xi_to_p.norm2() < R*R){ // Collision if the edge-sphere distance is less than the radius
+                        // Edge contact!
+                        if(justTest){
+                            return true;
+                        }
+                        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+                        p.vsub(xj,r.rj);
+
+                        p.vsub(xi,r.ni);
+                        r.ni.normalize();
+
+                        r.ni.mult(R,r.ri);
+
+                        // Should be relative to the body.
+                        r.rj.vadd(xj, r.rj);
+                        r.rj.vsub(bj.position, r.rj);
+
+                        // Should be relative to the body.
+                        r.ri.vadd(xi, r.ri);
+                        r.ri.vsub(bi.position, r.ri);
+
+                        this.result.push(r);
+                        this.createFrictionEquationsFromContact(r, this.frictionResult);
+
+                        // Release world vertices
+                        for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                            v3pool.release(faceVerts[j]);
+                        }
+
+                        v3pool.release(v1);
+                        v3pool.release(v2);
+                        v3pool.release(p);
+                        v3pool.release(xi_to_p);
+                        v3pool.release(v1_to_xi);
+
+                        return;
+                    }
+
+                    v3pool.release(v1);
+                    v3pool.release(v2);
+                    v3pool.release(p);
+                    v3pool.release(xi_to_p);
+                    v3pool.release(v1_to_xi);
+                }
+            }
+
+            // Release world vertices
+            for(var j=0, Nfaceverts=faceVerts.length; j!==Nfaceverts; j++){
+                v3pool.release(faceVerts[j]);
+            }
+        }
+    }
+};
+
+var planeBox_normal = new Vec3();
+var plane_to_corner = new Vec3();
+
+/**
+ * @method planeBox
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.BOX] =
+Narrowphase.prototype.planeBox = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    sj.convexPolyhedronRepresentation.material = sj.material;
+    sj.convexPolyhedronRepresentation.collisionResponse = sj.collisionResponse;
+    sj.convexPolyhedronRepresentation.id = sj.id;
+    return this.planeConvex(si,sj.convexPolyhedronRepresentation,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+var planeConvex_v = new Vec3();
+var planeConvex_normal = new Vec3();
+var planeConvex_relpos = new Vec3();
+var planeConvex_projected = new Vec3();
+
+/**
+ * @method planeConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.planeConvex = function(
+    planeShape,
+    convexShape,
+    planePosition,
+    convexPosition,
+    planeQuat,
+    convexQuat,
+    planeBody,
+    convexBody,
+    si,
+    sj,
+    justTest
+){
+    // Simply return the points behind the plane.
+    var worldVertex = planeConvex_v,
+        worldNormal = planeConvex_normal;
+    worldNormal.set(0,0,1);
+    planeQuat.vmult(worldNormal,worldNormal); // Turn normal according to plane orientation
+
+    var numContacts = 0;
+    var relpos = planeConvex_relpos;
+    for(var i = 0; i !== convexShape.vertices.length; i++){
+
+        // Get world convex vertex
+        worldVertex.copy(convexShape.vertices[i]);
+        convexQuat.vmult(worldVertex, worldVertex);
+        convexPosition.vadd(worldVertex, worldVertex);
+        worldVertex.vsub(planePosition, relpos);
+
+        var dot = worldNormal.dot(relpos);
+        if(dot <= 0.0){
+            if(justTest){
+                return true;
+            }
+
+            var r = this.createContactEquation(planeBody, convexBody, planeShape, convexShape, si, sj);
+
+            // Get vertex position projected on plane
+            var projected = planeConvex_projected;
+            worldNormal.mult(worldNormal.dot(relpos),projected);
+            worldVertex.vsub(projected, projected);
+            projected.vsub(planePosition, r.ri); // From plane to vertex projected on plane
+
+            r.ni.copy(worldNormal); // Contact normal is the plane normal out from plane
+
+            // rj is now just the vector from the convex center to the vertex
+            worldVertex.vsub(convexPosition, r.rj);
+
+            // Make it relative to the body
+            r.ri.vadd(planePosition, r.ri);
+            r.ri.vsub(planeBody.position, r.ri);
+            r.rj.vadd(convexPosition, r.rj);
+            r.rj.vsub(convexBody.position, r.rj);
+
+            this.result.push(r);
+            numContacts++;
+            if(!this.enableFrictionReduction){
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+    }
+
+    if(this.enableFrictionReduction && numContacts){
+        this.createFrictionFromAverage(numContacts);
+    }
+};
+
+var convexConvex_sepAxis = new Vec3();
+var convexConvex_q = new Vec3();
+
+/**
+ * @method convexConvex
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.convexConvex = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest,faceListA,faceListB){
+    var sepAxis = convexConvex_sepAxis;
+
+    if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+        return;
+    }
+
+    if(si.findSeparatingAxis(sj,xi,qi,xj,qj,sepAxis,faceListA,faceListB)){
+        var res = [];
+        var q = convexConvex_q;
+        si.clipAgainstHull(xi,qi,sj,xj,qj,sepAxis,-100,100,res);
+        var numContacts = 0;
+        for(var j = 0; j !== res.length; j++){
+            if(justTest){
+                return true;
+            }
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),
+                ri = r.ri,
+                rj = r.rj;
+            sepAxis.negate(r.ni);
+            res[j].normal.negate(q);
+            q.mult(res[j].depth, q);
+            res[j].point.vadd(q, ri);
+            rj.copy(res[j].point);
+
+            // Contact points are in world coordinates. Transform back to relative
+            ri.vsub(xi,ri);
+            rj.vsub(xj,rj);
+
+            // Make relative to bodies
+            ri.vadd(xi, ri);
+            ri.vsub(bi.position, ri);
+            rj.vadd(xj, rj);
+            rj.vsub(bj.position, rj);
+
+            this.result.push(r);
+            numContacts++;
+            if(!this.enableFrictionReduction){
+                this.createFrictionEquationsFromContact(r, this.frictionResult);
+            }
+        }
+        if(this.enableFrictionReduction && numContacts){
+            this.createFrictionFromAverage(numContacts);
+        }
+    }
+};
+
+
+/**
+ * @method convexTrimesh
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+// Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.TRIMESH] =
+// Narrowphase.prototype.convexTrimesh = function(si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,faceListA,faceListB){
+//     var sepAxis = convexConvex_sepAxis;
+
+//     if(xi.distanceTo(xj) > si.boundingSphereRadius + sj.boundingSphereRadius){
+//         return;
+//     }
+
+//     // Construct a temp hull for each triangle
+//     var hullB = new ConvexPolyhedron();
+
+//     hullB.faces = [[0,1,2]];
+//     var va = new Vec3();
+//     var vb = new Vec3();
+//     var vc = new Vec3();
+//     hullB.vertices = [
+//         va,
+//         vb,
+//         vc
+//     ];
+
+//     for (var i = 0; i < sj.indices.length / 3; i++) {
+
+//         var triangleNormal = new Vec3();
+//         sj.getNormal(i, triangleNormal);
+//         hullB.faceNormals = [triangleNormal];
+
+//         sj.getTriangleVertices(i, va, vb, vc);
+
+//         var d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);
+//         if(!d){
+//             triangleNormal.scale(-1, triangleNormal);
+//             d = si.testSepAxis(triangleNormal, hullB, xi, qi, xj, qj);
+
+//             if(!d){
+//                 continue;
+//             }
+//         }
+
+//         var res = [];
+//         var q = convexConvex_q;
+//         si.clipAgainstHull(xi,qi,hullB,xj,qj,triangleNormal,-100,100,res);
+//         for(var j = 0; j !== res.length; j++){
+//             var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj),
+//                 ri = r.ri,
+//                 rj = r.rj;
+//             r.ni.copy(triangleNormal);
+//             r.ni.negate(r.ni);
+//             res[j].normal.negate(q);
+//             q.mult(res[j].depth, q);
+//             res[j].point.vadd(q, ri);
+//             rj.copy(res[j].point);
+
+//             // Contact points are in world coordinates. Transform back to relative
+//             ri.vsub(xi,ri);
+//             rj.vsub(xj,rj);
+
+//             // Make relative to bodies
+//             ri.vadd(xi, ri);
+//             ri.vsub(bi.position, ri);
+//             rj.vadd(xj, rj);
+//             rj.vsub(bj.position, rj);
+
+//             result.push(r);
+//         }
+//     }
+// };
+
+var particlePlane_normal = new Vec3();
+var particlePlane_relpos = new Vec3();
+var particlePlane_projected = new Vec3();
+
+/**
+ * @method particlePlane
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PLANE | Shape.types.PARTICLE] =
+Narrowphase.prototype.planeParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    var normal = particlePlane_normal;
+    normal.set(0,0,1);
+    bj.quaternion.vmult(normal,normal); // Turn normal according to plane orientation
+    var relpos = particlePlane_relpos;
+    xi.vsub(bj.position,relpos);
+    var dot = normal.dot(relpos);
+    if(dot <= 0.0){
+
+        if(justTest){
+            return true;
+        }
+
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        r.ni.copy(normal); // Contact normal is the plane normal
+        r.ni.negate(r.ni);
+        r.ri.set(0,0,0); // Center of particle
+
+        // Get particle position projected on plane
+        var projected = particlePlane_projected;
+        normal.mult(normal.dot(xi),projected);
+        xi.vsub(projected,projected);
+        //projected.vadd(bj.position,projected);
+
+        // rj is now the projected world position minus plane position
+        r.rj.copy(projected);
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+var particleSphere_normal = new Vec3();
+
+/**
+ * @method particleSphere
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.SPHERE] =
+Narrowphase.prototype.sphereParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    // The normal is the unit vector from sphere center to particle center
+    var normal = particleSphere_normal;
+    normal.set(0,0,1);
+    xi.vsub(xj,normal);
+    var lengthSquared = normal.norm2();
+
+    if(lengthSquared <= sj.radius * sj.radius){
+        if(justTest){
+            return true;
+        }
+        var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+        normal.normalize();
+        r.rj.copy(normal);
+        r.rj.mult(sj.radius,r.rj);
+        r.ni.copy(normal); // Contact normal
+        r.ni.negate(r.ni);
+        r.ri.set(0,0,0); // Center of particle
+        this.result.push(r);
+        this.createFrictionEquationsFromContact(r, this.frictionResult);
+    }
+};
+
+// WIP
+var cqj = new Quaternion();
+var convexParticle_local = new Vec3();
+var convexParticle_normal = new Vec3();
+var convexParticle_penetratedFaceNormal = new Vec3();
+var convexParticle_vertexToParticle = new Vec3();
+var convexParticle_worldPenetrationVec = new Vec3();
+
+/**
+ * @method convexParticle
+ * @param  {Array}      result
+ * @param  {Shape}      si
+ * @param  {Shape}      sj
+ * @param  {Vec3}       xi
+ * @param  {Vec3}       xj
+ * @param  {Quaternion} qi
+ * @param  {Quaternion} qj
+ * @param  {Body}       bi
+ * @param  {Body}       bj
+ */
+Narrowphase.prototype[Shape.types.PARTICLE | Shape.types.CONVEXPOLYHEDRON] =
+Narrowphase.prototype.convexParticle = function(sj,si,xj,xi,qj,qi,bj,bi,rsi,rsj,justTest){
+    var penetratedFaceIndex = -1;
+    var penetratedFaceNormal = convexParticle_penetratedFaceNormal;
+    var worldPenetrationVec = convexParticle_worldPenetrationVec;
+    var minPenetration = null;
+    var numDetectedFaces = 0;
+
+    // Convert particle position xi to local coords in the convex
+    var local = convexParticle_local;
+    local.copy(xi);
+    local.vsub(xj,local); // Convert position to relative the convex origin
+    qj.conjugate(cqj);
+    cqj.vmult(local,local);
+
+    if(sj.pointIsInside(local)){
+
+        if(sj.worldVerticesNeedsUpdate){
+            sj.computeWorldVertices(xj,qj);
+        }
+        if(sj.worldFaceNormalsNeedsUpdate){
+            sj.computeWorldFaceNormals(qj);
+        }
+
+        // For each world polygon in the polyhedra
+        for(var i=0,nfaces=sj.faces.length; i!==nfaces; i++){
+
+            // Construct world face vertices
+            var verts = [ sj.worldVertices[ sj.faces[i][0] ] ];
+            var normal = sj.worldFaceNormals[i];
+
+            // Check how much the particle penetrates the polygon plane.
+            xi.vsub(verts[0],convexParticle_vertexToParticle);
+            var penetration = -normal.dot(convexParticle_vertexToParticle);
+            if(minPenetration===null || Math.abs(penetration)<Math.abs(minPenetration)){
+
+                if(justTest){
+                    return true;
+                }
+
+                minPenetration = penetration;
+                penetratedFaceIndex = i;
+                penetratedFaceNormal.copy(normal);
+                numDetectedFaces++;
+            }
+        }
+
+        if(penetratedFaceIndex!==-1){
+            // Setup contact
+            var r = this.createContactEquation(bi,bj,si,sj,rsi,rsj);
+            penetratedFaceNormal.mult(minPenetration, worldPenetrationVec);
+
+            // rj is the particle position projected to the face
+            worldPenetrationVec.vadd(xi,worldPenetrationVec);
+            worldPenetrationVec.vsub(xj,worldPenetrationVec);
+            r.rj.copy(worldPenetrationVec);
+            //var projectedToFace = xi.vsub(xj).vadd(worldPenetrationVec);
+            //projectedToFace.copy(r.rj);
+
+            //qj.vmult(r.rj,r.rj);
+            penetratedFaceNormal.negate( r.ni ); // Contact normal
+            r.ri.set(0,0,0); // Center of particle
+
+            var ri = r.ri,
+                rj = r.rj;
+
+            // Make relative to bodies
+            ri.vadd(xi, ri);
+            ri.vsub(bi.position, ri);
+            rj.vadd(xj, rj);
+            rj.vsub(bj.position, rj);
+
+            this.result.push(r);
+            this.createFrictionEquationsFromContact(r, this.frictionResult);
+        } else {
+            console.warn("Point found inside convex, but did not find penetrating face!");
+        }
+    }
+};
+
+Narrowphase.prototype[Shape.types.BOX | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.boxHeightfield = function (si,sj,xi,xj,qi,qj,bi,bj,rsi,rsj,justTest){
+    si.convexPolyhedronRepresentation.material = si.material;
+    si.convexPolyhedronRepresentation.collisionResponse = si.collisionResponse;
+    return this.convexHeightfield(si.convexPolyhedronRepresentation,sj,xi,xj,qi,qj,bi,bj,si,sj,justTest);
+};
+
+var convexHeightfield_tmp1 = new Vec3();
+var convexHeightfield_tmp2 = new Vec3();
+var convexHeightfield_faceList = [0];
+
+/**
+ * @method convexHeightfield
+ */
+Narrowphase.prototype[Shape.types.CONVEXPOLYHEDRON | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.convexHeightfield = function (
+    convexShape,
+    hfShape,
+    convexPos,
+    hfPos,
+    convexQuat,
+    hfQuat,
+    convexBody,
+    hfBody,
+    rsi,
+    rsj,
+    justTest
+){
+    var data = hfShape.data,
+        w = hfShape.elementSize,
+        radius = convexShape.boundingSphereRadius,
+        worldPillarOffset = convexHeightfield_tmp2,
+        faceList = convexHeightfield_faceList;
+
+    // Get sphere position to heightfield local!
+    var localConvexPos = convexHeightfield_tmp1;
+    Transform.pointToLocalFrame(hfPos, hfQuat, convexPos, localConvexPos);
+
+    // Get the index of the data points to test against
+    var iMinX = Math.floor((localConvexPos.x - radius) / w) - 1,
+        iMaxX = Math.ceil((localConvexPos.x + radius) / w) + 1,
+        iMinY = Math.floor((localConvexPos.y - radius) / w) - 1,
+        iMaxY = Math.ceil((localConvexPos.y + radius) / w) + 1;
+
+    // Bail out if we are out of the terrain
+    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMinY > data[0].length){
+        return;
+    }
+
+    // Clamp index to edges
+    if(iMinX < 0){ iMinX = 0; }
+    if(iMaxX < 0){ iMaxX = 0; }
+    if(iMinY < 0){ iMinY = 0; }
+    if(iMaxY < 0){ iMaxY = 0; }
+    if(iMinX >= data.length){ iMinX = data.length - 1; }
+    if(iMaxX >= data.length){ iMaxX = data.length - 1; }
+    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }
+    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }
+
+    var minMax = [];
+    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);
+    var min = minMax[0];
+    var max = minMax[1];
+
+    // Bail out if we're cant touch the bounding height box
+    if(localConvexPos.z - radius > max || localConvexPos.z + radius < min){
+        return;
+    }
+
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            var intersecting = false;
+
+            // Lower triangle
+            hfShape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {
+                intersecting = this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, justTest, faceList, null);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            // Upper triangle
+            hfShape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (convexPos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + convexShape.boundingSphereRadius) {
+                intersecting = this.convexConvex(convexShape, hfShape.pillarConvex, convexPos, worldPillarOffset, convexQuat, hfQuat, convexBody, hfBody, null, null, justTest, faceList, null);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+        }
+    }
+};
+
+var sphereHeightfield_tmp1 = new Vec3();
+var sphereHeightfield_tmp2 = new Vec3();
+
+/**
+ * @method sphereHeightfield
+ */
+Narrowphase.prototype[Shape.types.SPHERE | Shape.types.HEIGHTFIELD] =
+Narrowphase.prototype.sphereHeightfield = function (
+    sphereShape,
+    hfShape,
+    spherePos,
+    hfPos,
+    sphereQuat,
+    hfQuat,
+    sphereBody,
+    hfBody,
+    rsi,
+    rsj,
+    justTest
+){
+    var data = hfShape.data,
+        radius = sphereShape.radius,
+        w = hfShape.elementSize,
+        worldPillarOffset = sphereHeightfield_tmp2;
+
+    // Get sphere position to heightfield local!
+    var localSpherePos = sphereHeightfield_tmp1;
+    Transform.pointToLocalFrame(hfPos, hfQuat, spherePos, localSpherePos);
+
+    // Get the index of the data points to test against
+    var iMinX = Math.floor((localSpherePos.x - radius) / w) - 1,
+        iMaxX = Math.ceil((localSpherePos.x + radius) / w) + 1,
+        iMinY = Math.floor((localSpherePos.y - radius) / w) - 1,
+        iMaxY = Math.ceil((localSpherePos.y + radius) / w) + 1;
+
+    // Bail out if we are out of the terrain
+    if(iMaxX < 0 || iMaxY < 0 || iMinX > data.length || iMaxY > data[0].length){
+        return;
+    }
+
+    // Clamp index to edges
+    if(iMinX < 0){ iMinX = 0; }
+    if(iMaxX < 0){ iMaxX = 0; }
+    if(iMinY < 0){ iMinY = 0; }
+    if(iMaxY < 0){ iMaxY = 0; }
+    if(iMinX >= data.length){ iMinX = data.length - 1; }
+    if(iMaxX >= data.length){ iMaxX = data.length - 1; }
+    if(iMaxY >= data[0].length){ iMaxY = data[0].length - 1; }
+    if(iMinY >= data[0].length){ iMinY = data[0].length - 1; }
+
+    var minMax = [];
+    hfShape.getRectMinMax(iMinX, iMinY, iMaxX, iMaxY, minMax);
+    var min = minMax[0];
+    var max = minMax[1];
+
+    // Bail out if we're cant touch the bounding height box
+    if(localSpherePos.z - radius > max || localSpherePos.z + radius < min){
+        return;
+    }
+
+    var result = this.result;
+    for(var i = iMinX; i < iMaxX; i++){
+        for(var j = iMinY; j < iMaxY; j++){
+
+            var numContactsBefore = result.length;
+
+            var intersecting = false;
+
+            // Lower triangle
+            hfShape.getConvexTrianglePillar(i, j, false);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {
+                intersecting = this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody, sphereShape, hfShape, justTest);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            // Upper triangle
+            hfShape.getConvexTrianglePillar(i, j, true);
+            Transform.pointToWorldFrame(hfPos, hfQuat, hfShape.pillarOffset, worldPillarOffset);
+            if (spherePos.distanceTo(worldPillarOffset) < hfShape.pillarConvex.boundingSphereRadius + sphereShape.boundingSphereRadius) {
+                intersecting = this.sphereConvex(sphereShape, hfShape.pillarConvex, spherePos, worldPillarOffset, sphereQuat, hfQuat, sphereBody, hfBody, sphereShape, hfShape, justTest);
+            }
+
+            if(justTest && intersecting){
+                return true;
+            }
+
+            var numContacts = result.length - numContactsBefore;
+
+            if(numContacts > 2){
+                return;
+            }
+            /*
+            // Skip all but 1
+            for (var k = 0; k < numContacts - 1; k++) {
+                result.pop();
+            }
+            */
+        }
+    }
+};
+
+},{"../collision/AABB":15,"../collision/Ray":22,"../equations/ContactEquation":32,"../equations/FrictionEquation":34,"../math/Quaternion":41,"../math/Transform":42,"../math/Vec3":43,"../objects/Body":44,"../shapes/ConvexPolyhedron":51,"../shapes/Shape":56,"../solver/Solver":60,"../utils/Vec3Pool":67}],69:[function(require,module,exports){
+/* global performance */
+
+module.exports = World;
+
+var Shape = require('../shapes/Shape');
+var Vec3 = require('../math/Vec3');
+var Quaternion = require('../math/Quaternion');
+var GSSolver = require('../solver/GSSolver');
+var ContactEquation = require('../equations/ContactEquation');
+var FrictionEquation = require('../equations/FrictionEquation');
+var Narrowphase = require('./Narrowphase');
+var EventTarget = require('../utils/EventTarget');
+var ArrayCollisionMatrix = require('../collision/ArrayCollisionMatrix');
+var OverlapKeeper = require('../collision/OverlapKeeper');
+var Material = require('../material/Material');
+var ContactMaterial = require('../material/ContactMaterial');
+var Body = require('../objects/Body');
+var TupleDictionary = require('../utils/TupleDictionary');
+var RaycastResult = require('../collision/RaycastResult');
+var AABB = require('../collision/AABB');
+var Ray = require('../collision/Ray');
+var NaiveBroadphase = require('../collision/NaiveBroadphase');
+
+/**
+ * The physics world
+ * @class World
+ * @constructor
+ * @extends EventTarget
+ * @param {object} [options]
+ * @param {Vec3} [options.gravity]
+ * @param {boolean} [options.allowSleep]
+ * @param {Broadphase} [options.broadphase]
+ * @param {Solver} [options.solver]
+ * @param {boolean} [options.quatNormalizeFast]
+ * @param {number} [options.quatNormalizeSkip]
+ */
+function World(options){
+    options = options || {};
+    EventTarget.apply(this);
+
+    /**
+     * Currently / last used timestep. Is set to -1 if not available. This value is updated before each internal step, which means that it is "fresh" inside event callbacks.
+     * @property {Number} dt
+     */
+    this.dt = -1;
+
+    /**
+     * Makes bodies go to sleep when they've been inactive
+     * @property allowSleep
+     * @type {Boolean}
+     * @default false
+     */
+    this.allowSleep = !!options.allowSleep;
+
+    /**
+     * All the current contacts (instances of ContactEquation) in the world.
+     * @property contacts
+     * @type {Array}
+     */
+    this.contacts = [];
+    this.frictionEquations = [];
+
+    /**
+     * How often to normalize quaternions. Set to 0 for every step, 1 for every second etc.. A larger value increases performance. If bodies tend to explode, set to a smaller value (zero to be sure nothing can go wrong).
+     * @property quatNormalizeSkip
+     * @type {Number}
+     * @default 0
+     */
+    this.quatNormalizeSkip = options.quatNormalizeSkip !== undefined ? options.quatNormalizeSkip : 0;
+
+    /**
+     * Set to true to use fast quaternion normalization. It is often enough accurate to use. If bodies tend to explode, set to false.
+     * @property quatNormalizeFast
+     * @type {Boolean}
+     * @see Quaternion.normalizeFast
+     * @see Quaternion.normalize
+     * @default false
+     */
+    this.quatNormalizeFast = options.quatNormalizeFast !== undefined ? options.quatNormalizeFast : false;
+
+    /**
+     * The wall-clock time since simulation start
+     * @property time
+     * @type {Number}
+     */
+    this.time = 0.0;
+
+    /**
+     * Number of timesteps taken since start
+     * @property stepnumber
+     * @type {Number}
+     */
+    this.stepnumber = 0;
+
+    /// Default and last timestep sizes
+    this.default_dt = 1/60;
+
+    this.nextId = 0;
+    /**
+     * @property gravity
+     * @type {Vec3}
+     */
+    this.gravity = new Vec3();
+    if(options.gravity){
+        this.gravity.copy(options.gravity);
+    }
+
+    /**
+     * The broadphase algorithm to use. Default is NaiveBroadphase
+     * @property broadphase
+     * @type {Broadphase}
+     */
+    this.broadphase = options.broadphase !== undefined ? options.broadphase : new NaiveBroadphase();
+
+    /**
+     * @property bodies
+     * @type {Array}
+     */
+    this.bodies = [];
+
+    /**
+     * The solver algorithm to use. Default is GSSolver
+     * @property solver
+     * @type {Solver}
+     */
+    this.solver = options.solver !== undefined ? options.solver : new GSSolver();
+
+    /**
+     * @property constraints
+     * @type {Array}
+     */
+    this.constraints = [];
+
+    /**
+     * @property narrowphase
+     * @type {Narrowphase}
+     */
+    this.narrowphase = new Narrowphase(this);
+
+    /**
+     * @property {ArrayCollisionMatrix} collisionMatrix
+	 * @type {ArrayCollisionMatrix}
+	 */
+	this.collisionMatrix = new ArrayCollisionMatrix();
+
+    /**
+     * CollisionMatrix from the previous step.
+     * @property {ArrayCollisionMatrix} collisionMatrixPrevious
+	 * @type {ArrayCollisionMatrix}
+	 */
+	this.collisionMatrixPrevious = new ArrayCollisionMatrix();
+
+    this.bodyOverlapKeeper = new OverlapKeeper();
+    this.shapeOverlapKeeper = new OverlapKeeper();
+
+    /**
+     * All added materials
+     * @property materials
+     * @type {Array}
+     */
+    this.materials = [];
+
+    /**
+     * @property contactmaterials
+     * @type {Array}
+     */
+    this.contactmaterials = [];
+
+    /**
+     * Used to look up a ContactMaterial given two instances of Material.
+     * @property {TupleDictionary} contactMaterialTable
+     */
+    this.contactMaterialTable = new TupleDictionary();
+
+    this.defaultMaterial = new Material("default");
+
+    /**
+     * This contact material is used if no suitable contactmaterial is found for a contact.
+     * @property defaultContactMaterial
+     * @type {ContactMaterial}
+     */
+    this.defaultContactMaterial = new ContactMaterial(this.defaultMaterial, this.defaultMaterial, { friction: 0.3, restitution: 0.0 });
+
+    /**
+     * @property doProfiling
+     * @type {Boolean}
+     */
+    this.doProfiling = false;
+
+    /**
+     * @property profile
+     * @type {Object}
+     */
+    this.profile = {
+        solve:0,
+        makeContactConstraints:0,
+        broadphase:0,
+        integrate:0,
+        narrowphase:0,
+    };
+
+    /**
+     * Time accumulator for interpolation. See http://gafferongames.com/game-physics/fix-your-timestep/
+     * @property {Number} accumulator
+     */
+    this.accumulator = 0;
+
+    /**
+     * @property subsystems
+     * @type {Array}
+     */
+    this.subsystems = [];
+
+    /**
+     * Dispatched after a body has been added to the world.
+     * @event addBody
+     * @param {Body} body The body that has been added to the world.
+     */
+    this.addBodyEvent = {
+        type:"addBody",
+        body : null
+    };
+
+    /**
+     * Dispatched after a body has been removed from the world.
+     * @event removeBody
+     * @param {Body} body The body that has been removed from the world.
+     */
+    this.removeBodyEvent = {
+        type:"removeBody",
+        body : null
+    };
+
+    this.idToBodyMap = {};
+
+    this.broadphase.setWorld(this);
+}
+World.prototype = new EventTarget();
+
+// Temp stuff
+var tmpAABB1 = new AABB();
+var tmpArray1 = [];
+var tmpRay = new Ray();
+
+/**
+ * Get the contact material between materials m1 and m2
+ * @method getContactMaterial
+ * @param {Material} m1
+ * @param {Material} m2
+ * @return {ContactMaterial} The contact material if it was found.
+ */
+World.prototype.getContactMaterial = function(m1,m2){
+    return this.contactMaterialTable.get(m1.id,m2.id); //this.contactmaterials[this.mats2cmat[i+j*this.materials.length]];
+};
+
+/**
+ * Get number of objects in the world.
+ * @method numObjects
+ * @return {Number}
+ * @deprecated
+ */
+World.prototype.numObjects = function(){
+    return this.bodies.length;
+};
+
+/**
+ * Store old collision state info
+ * @method collisionMatrixTick
+ */
+World.prototype.collisionMatrixTick = function(){
+	var temp = this.collisionMatrixPrevious;
+	this.collisionMatrixPrevious = this.collisionMatrix;
+	this.collisionMatrix = temp;
+	this.collisionMatrix.reset();
+
+    this.bodyOverlapKeeper.tick();
+    this.shapeOverlapKeeper.tick();
+};
+
+/**
+ * Add a rigid body to the simulation.
+ * @method add
+ * @param {Body} body
+ * @todo If the simulation has not yet started, why recrete and copy arrays for each body? Accumulate in dynamic arrays in this case.
+ * @todo Adding an array of bodies should be possible. This would save some loops too
+ * @deprecated Use .addBody instead
+ */
+World.prototype.add = World.prototype.addBody = function(body){
+    if(this.bodies.indexOf(body) !== -1){
+        return;
+    }
+    body.index = this.bodies.length;
+    this.bodies.push(body);
+    body.world = this;
+    body.initPosition.copy(body.position);
+    body.initVelocity.copy(body.velocity);
+    body.timeLastSleepy = this.time;
+    if(body instanceof Body){
+        body.initAngularVelocity.copy(body.angularVelocity);
+        body.initQuaternion.copy(body.quaternion);
+    }
+	this.collisionMatrix.setNumObjects(this.bodies.length);
+    this.addBodyEvent.body = body;
+    this.idToBodyMap[body.id] = body;
+    this.dispatchEvent(this.addBodyEvent);
+};
+
+/**
+ * Add a constraint to the simulation.
+ * @method addConstraint
+ * @param {Constraint} c
+ */
+World.prototype.addConstraint = function(c){
+    this.constraints.push(c);
+};
+
+/**
+ * Removes a constraint
+ * @method removeConstraint
+ * @param {Constraint} c
+ */
+World.prototype.removeConstraint = function(c){
+    var idx = this.constraints.indexOf(c);
+    if(idx!==-1){
+        this.constraints.splice(idx,1);
+    }
+};
+
+/**
+ * Raycast test
+ * @method rayTest
+ * @param {Vec3} from
+ * @param {Vec3} to
+ * @param {RaycastResult} result
+ * @deprecated Use .raycastAll, .raycastClosest or .raycastAny instead.
+ */
+World.prototype.rayTest = function(from, to, result){
+    if(result instanceof RaycastResult){
+        // Do raycastclosest
+        this.raycastClosest(from, to, {
+            skipBackfaces: true
+        }, result);
+    } else {
+        // Do raycastAll
+        this.raycastAll(from, to, {
+            skipBackfaces: true
+        }, result);
+    }
+};
+
+/**
+ * Ray cast against all bodies. The provided callback will be executed for each hit with a RaycastResult as single argument.
+ * @method raycastAll
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {Function} callback
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastAll = function(from, to, options, callback){
+    options.mode = Ray.ALL;
+    options.from = from;
+    options.to = to;
+    options.callback = callback;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Ray cast, and stop at the first result. Note that the order is random - but the method is fast.
+ * @method raycastAny
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {RaycastResult} result
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastAny = function(from, to, options, result){
+    options.mode = Ray.ANY;
+    options.from = from;
+    options.to = to;
+    options.result = result;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Ray cast, and return information of the closest hit.
+ * @method raycastClosest
+ * @param  {Vec3} from
+ * @param  {Vec3} to
+ * @param  {Object} options
+ * @param  {number} [options.collisionFilterMask=-1]
+ * @param  {number} [options.collisionFilterGroup=-1]
+ * @param  {boolean} [options.skipBackfaces=false]
+ * @param  {boolean} [options.checkCollisionResponse=true]
+ * @param  {RaycastResult} result
+ * @return {boolean} True if any body was hit.
+ */
+World.prototype.raycastClosest = function(from, to, options, result){
+    options.mode = Ray.CLOSEST;
+    options.from = from;
+    options.to = to;
+    options.result = result;
+    return tmpRay.intersectWorld(this, options);
+};
+
+/**
+ * Remove a rigid body from the simulation.
+ * @method remove
+ * @param {Body} body
+ * @deprecated Use .removeBody instead
+ */
+World.prototype.remove = function(body){
+    body.world = null;
+    var n = this.bodies.length - 1,
+        bodies = this.bodies,
+        idx = bodies.indexOf(body);
+    if(idx !== -1){
+        bodies.splice(idx, 1); // Todo: should use a garbage free method
+
+        // Recompute index
+        for(var i=0; i!==bodies.length; i++){
+            bodies[i].index = i;
+        }
+
+        this.collisionMatrix.setNumObjects(n);
+        this.removeBodyEvent.body = body;
+        delete this.idToBodyMap[body.id];
+        this.dispatchEvent(this.removeBodyEvent);
+    }
+};
+
+/**
+ * Remove a rigid body from the simulation.
+ * @method removeBody
+ * @param {Body} body
+ */
+World.prototype.removeBody = World.prototype.remove;
+
+World.prototype.getBodyById = function(id){
+    return this.idToBodyMap[id];
+};
+
+// TODO Make a faster map
+World.prototype.getShapeById = function(id){
+    var bodies = this.bodies;
+    for(var i=0, bl = bodies.length; i<bl; i++){
+        var shapes = bodies[i].shapes;
+        for (var j = 0, sl = shapes.length; j < sl; j++) {
+            var shape = shapes[j];
+            if(shape.id === id){
+                return shape;
+            }
+        }
+    }
+};
+
+/**
+ * Adds a material to the World.
+ * @method addMaterial
+ * @param {Material} m
+ * @todo Necessary?
+ */
+World.prototype.addMaterial = function(m){
+    this.materials.push(m);
+};
+
+/**
+ * Adds a contact material to the World
+ * @method addContactMaterial
+ * @param {ContactMaterial} cmat
+ */
+World.prototype.addContactMaterial = function(cmat) {
+
+    // Add contact material
+    this.contactmaterials.push(cmat);
+
+    // Add current contact material to the material table
+    this.contactMaterialTable.set(cmat.materials[0].id,cmat.materials[1].id,cmat);
+};
+
+// performance.now()
+if(typeof performance === 'undefined'){
+    performance = {};
+}
+if(!performance.now){
+    var nowOffset = Date.now();
+    if (performance.timing && performance.timing.navigationStart){
+        nowOffset = performance.timing.navigationStart;
+    }
+    performance.now = function(){
+        return Date.now() - nowOffset;
+    };
+}
+
+var step_tmp1 = new Vec3();
+
+/**
+ * Step the physics world forward in time.
+ *
+ * There are two modes. The simple mode is fixed timestepping without interpolation. In this case you only use the first argument. The second case uses interpolation. In that you also provide the time since the function was last used, as well as the maximum fixed timesteps to take.
+ *
+ * @method step
+ * @param {Number} dt                       The fixed time step size to use.
+ * @param {Number} [timeSinceLastCalled]    The time elapsed since the function was last called.
+ * @param {Number} [maxSubSteps=10]         Maximum number of fixed steps to take per function call.
+ *
+ * @example
+ *     // fixed timestepping without interpolation
+ *     world.step(1/60);
+ *
+ * @see http://bulletphysics.org/mediawiki-1.5.8/index.php/Stepping_The_World
+ */
+World.prototype.step = function(dt, timeSinceLastCalled, maxSubSteps){
+    maxSubSteps = maxSubSteps || 10;
+    timeSinceLastCalled = timeSinceLastCalled || 0;
+
+    if(timeSinceLastCalled === 0){ // Fixed, simple stepping
+
+        this.internalStep(dt);
+
+        // Increment time
+        this.time += dt;
+
+    } else {
+
+        this.accumulator += timeSinceLastCalled;
+        var substeps = 0;
+        while (this.accumulator >= dt && substeps < maxSubSteps) {
+            // Do fixed steps to catch up
+            this.internalStep(dt);
+            this.accumulator -= dt;
+            substeps++;
+        }
+
+        var t = (this.accumulator % dt) / dt;
+        for(var j=0; j !== this.bodies.length; j++){
+            var b = this.bodies[j];
+            b.previousPosition.lerp(b.position, t, b.interpolatedPosition);
+            b.previousQuaternion.slerp(b.quaternion, t, b.interpolatedQuaternion);
+            b.previousQuaternion.normalize();
+        }
+        this.time += timeSinceLastCalled;
+    }
+};
+
+var
+    /**
+     * Dispatched after the world has stepped forward in time.
+     * @event postStep
+     */
+    World_step_postStepEvent = {type:"postStep"}, // Reusable event objects to save memory
+    /**
+     * Dispatched before the world steps forward in time.
+     * @event preStep
+     */
+    World_step_preStepEvent = {type:"preStep"},
+    World_step_collideEvent = {type:Body.COLLIDE_EVENT_NAME, body:null, contact:null },
+    World_step_oldContacts = [], // Pools for unused objects
+    World_step_frictionEquationPool = [],
+    World_step_p1 = [], // Reusable arrays for collision pairs
+    World_step_p2 = [],
+    World_step_gvec = new Vec3(), // Temporary vectors and quats
+    World_step_vi = new Vec3(),
+    World_step_vj = new Vec3(),
+    World_step_wi = new Vec3(),
+    World_step_wj = new Vec3(),
+    World_step_t1 = new Vec3(),
+    World_step_t2 = new Vec3(),
+    World_step_rixn = new Vec3(),
+    World_step_rjxn = new Vec3(),
+    World_step_step_q = new Quaternion(),
+    World_step_step_w = new Quaternion(),
+    World_step_step_wq = new Quaternion(),
+    invI_tau_dt = new Vec3();
+World.prototype.internalStep = function(dt){
+    this.dt = dt;
+
+    var world = this,
+        that = this,
+        contacts = this.contacts,
+        p1 = World_step_p1,
+        p2 = World_step_p2,
+        N = this.numObjects(),
+        bodies = this.bodies,
+        solver = this.solver,
+        gravity = this.gravity,
+        doProfiling = this.doProfiling,
+        profile = this.profile,
+        DYNAMIC = Body.DYNAMIC,
+        profilingStart,
+        constraints = this.constraints,
+        frictionEquationPool = World_step_frictionEquationPool,
+        gnorm = gravity.norm(),
+        gx = gravity.x,
+        gy = gravity.y,
+        gz = gravity.z,
+        i=0;
+
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+
+    // Add gravity to all objects
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.type === DYNAMIC){ // Only for dynamic bodies
+            var f = bi.force, m = bi.mass;
+            f.x += m*gx;
+            f.y += m*gy;
+            f.z += m*gz;
+        }
+    }
+
+    // Update subsystems
+    for(var i=0, Nsubsystems=this.subsystems.length; i!==Nsubsystems; i++){
+        this.subsystems[i].update();
+    }
+
+    // Collision detection
+    if(doProfiling){ profilingStart = performance.now(); }
+    p1.length = 0; // Clean up pair arrays from last step
+    p2.length = 0;
+    this.broadphase.collisionPairs(this,p1,p2);
+    if(doProfiling){ profile.broadphase = performance.now() - profilingStart; }
+
+    // Remove constrained pairs with collideConnected == false
+    var Nconstraints = constraints.length;
+    for(i=0; i!==Nconstraints; i++){
+        var c = constraints[i];
+        if(!c.collideConnected){
+            for(var j = p1.length-1; j>=0; j-=1){
+                if( (c.bodyA === p1[j] && c.bodyB === p2[j]) ||
+                    (c.bodyB === p1[j] && c.bodyA === p2[j])){
+                    p1.splice(j, 1);
+                    p2.splice(j, 1);
+                }
+            }
+        }
+    }
+
+    this.collisionMatrixTick();
+
+    // Generate contacts
+    if(doProfiling){ profilingStart = performance.now(); }
+    var oldcontacts = World_step_oldContacts;
+    var NoldContacts = contacts.length;
+
+    for(i=0; i!==NoldContacts; i++){
+        oldcontacts.push(contacts[i]);
+    }
+    contacts.length = 0;
+
+    // Transfer FrictionEquation from current list to the pool for reuse
+    var NoldFrictionEquations = this.frictionEquations.length;
+    for(i=0; i!==NoldFrictionEquations; i++){
+        frictionEquationPool.push(this.frictionEquations[i]);
+    }
+    this.frictionEquations.length = 0;
+
+    this.narrowphase.getContacts(
+        p1,
+        p2,
+        this,
+        contacts,
+        oldcontacts, // To be reused
+        this.frictionEquations,
+        frictionEquationPool
+    );
+
+    if(doProfiling){
+        profile.narrowphase = performance.now() - profilingStart;
+    }
+
+    // Loop over all collisions
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+
+    // Add all friction eqs
+    for (var i = 0; i < this.frictionEquations.length; i++) {
+        solver.addEquation(this.frictionEquations[i]);
+    }
+
+    var ncontacts = contacts.length;
+    for(var k=0; k!==ncontacts; k++){
+
+        // Current contact
+        var c = contacts[k];
+
+        // Get current collision indeces
+        var bi = c.bi,
+            bj = c.bj,
+            si = c.si,
+            sj = c.sj;
+
+        // Get collision properties
+        var cm;
+        if(bi.material && bj.material){
+            cm = this.getContactMaterial(bi.material,bj.material) || this.defaultContactMaterial;
+        } else {
+            cm = this.defaultContactMaterial;
+        }
+
+        // c.enabled = bi.collisionResponse && bj.collisionResponse && si.collisionResponse && sj.collisionResponse;
+
+        var mu = cm.friction;
+        // c.restitution = cm.restitution;
+
+        // If friction or restitution were specified in the material, use them
+        if(bi.material && bj.material){
+            if(bi.material.friction >= 0 && bj.material.friction >= 0){
+                mu = bi.material.friction * bj.material.friction;
+            }
+
+            if(bi.material.restitution >= 0 && bj.material.restitution >= 0){
+                c.restitution = bi.material.restitution * bj.material.restitution;
+            }
+        }
+
+		// c.setSpookParams(
+  //           cm.contactEquationStiffness,
+  //           cm.contactEquationRelaxation,
+  //           dt
+  //       );
+
+		solver.addEquation(c);
+
+		// // Add friction constraint equation
+		// if(mu > 0){
+
+		// 	// Create 2 tangent equations
+		// 	var mug = mu * gnorm;
+		// 	var reducedMass = (bi.invMass + bj.invMass);
+		// 	if(reducedMass > 0){
+		// 		reducedMass = 1/reducedMass;
+		// 	}
+		// 	var pool = frictionEquationPool;
+		// 	var c1 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);
+		// 	var c2 = pool.length ? pool.pop() : new FrictionEquation(bi,bj,mug*reducedMass);
+		// 	this.frictionEquations.push(c1, c2);
+
+		// 	c1.bi = c2.bi = bi;
+		// 	c1.bj = c2.bj = bj;
+		// 	c1.minForce = c2.minForce = -mug*reducedMass;
+		// 	c1.maxForce = c2.maxForce = mug*reducedMass;
+
+		// 	// Copy over the relative vectors
+		// 	c1.ri.copy(c.ri);
+		// 	c1.rj.copy(c.rj);
+		// 	c2.ri.copy(c.ri);
+		// 	c2.rj.copy(c.rj);
+
+		// 	// Construct tangents
+		// 	c.ni.tangents(c1.t, c2.t);
+
+  //           // Set spook params
+  //           c1.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);
+  //           c2.setSpookParams(cm.frictionEquationStiffness, cm.frictionEquationRelaxation, dt);
+
+  //           c1.enabled = c2.enabled = c.enabled;
+
+		// 	// Add equations to solver
+		// 	solver.addEquation(c1);
+		// 	solver.addEquation(c2);
+		// }
+
+        if( bi.allowSleep &&
+            bi.type === Body.DYNAMIC &&
+            bi.sleepState  === Body.SLEEPING &&
+            bj.sleepState  === Body.AWAKE &&
+            bj.type !== Body.STATIC
+        ){
+            var speedSquaredB = bj.velocity.norm2() + bj.angularVelocity.norm2();
+            var speedLimitSquaredB = Math.pow(bj.sleepSpeedLimit,2);
+            if(speedSquaredB >= speedLimitSquaredB*2){
+                bi._wakeUpAfterNarrowphase = true;
+            }
+        }
+
+        if( bj.allowSleep &&
+            bj.type === Body.DYNAMIC &&
+            bj.sleepState  === Body.SLEEPING &&
+            bi.sleepState  === Body.AWAKE &&
+            bi.type !== Body.STATIC
+        ){
+            var speedSquaredA = bi.velocity.norm2() + bi.angularVelocity.norm2();
+            var speedLimitSquaredA = Math.pow(bi.sleepSpeedLimit,2);
+            if(speedSquaredA >= speedLimitSquaredA*2){
+                bj._wakeUpAfterNarrowphase = true;
+            }
+        }
+
+        // Now we know that i and j are in contact. Set collision matrix state
+		this.collisionMatrix.set(bi, bj, true);
+
+        if (!this.collisionMatrixPrevious.get(bi, bj)) {
+            // First contact!
+            // We reuse the collideEvent object, otherwise we will end up creating new objects for each new contact, even if there's no event listener attached.
+            World_step_collideEvent.body = bj;
+            World_step_collideEvent.contact = c;
+            bi.dispatchEvent(World_step_collideEvent);
+
+            World_step_collideEvent.body = bi;
+            bj.dispatchEvent(World_step_collideEvent);
+        }
+
+        this.bodyOverlapKeeper.set(bi.id, bj.id);
+        this.shapeOverlapKeeper.set(si.id, sj.id);
+    }
+
+    this.emitContactEvents();
+
+    if(doProfiling){
+        profile.makeContactConstraints = performance.now() - profilingStart;
+        profilingStart = performance.now();
+    }
+
+    // Wake up bodies
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi._wakeUpAfterNarrowphase){
+            bi.wakeUp();
+            bi._wakeUpAfterNarrowphase = false;
+        }
+    }
+
+    // Add user-added constraints
+    var Nconstraints = constraints.length;
+    for(i=0; i!==Nconstraints; i++){
+        var c = constraints[i];
+        c.update();
+        for(var j=0, Neq=c.equations.length; j!==Neq; j++){
+            var eq = c.equations[j];
+            solver.addEquation(eq);
+        }
+    }
+
+    // Solve the constrained system
+    solver.solve(dt,this);
+
+    if(doProfiling){
+        profile.solve = performance.now() - profilingStart;
+    }
+
+    // Remove all contacts from solver
+    solver.removeAllEquations();
+
+    // Apply damping, see http://code.google.com/p/bullet/issues/detail?id=74 for details
+    var pow = Math.pow;
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.type & DYNAMIC){ // Only for dynamic bodies
+            var ld = pow(1.0 - bi.linearDamping,dt);
+            var v = bi.velocity;
+            v.mult(ld,v);
+            var av = bi.angularVelocity;
+            if(av){
+                var ad = pow(1.0 - bi.angularDamping,dt);
+                av.mult(ad,av);
+            }
+        }
+    }
+
+    this.dispatchEvent(World_step_preStepEvent);
+
+    // Invoke pre-step callbacks
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        if(bi.preStep){
+            bi.preStep.call(bi);
+        }
+    }
+
+    // Leap frog
+    // vnew = v + h*f/m
+    // xnew = x + h*vnew
+    if(doProfiling){
+        profilingStart = performance.now();
+    }
+    var stepnumber = this.stepnumber;
+    var quatNormalize = stepnumber % (this.quatNormalizeSkip + 1) === 0;
+    var quatNormalizeFast = this.quatNormalizeFast;
+
+    for(i=0; i!==N; i++){
+        bodies[i].integrate(dt, quatNormalize, quatNormalizeFast);
+    }
+    this.clearForces();
+
+    this.broadphase.dirty = true;
+
+    if(doProfiling){
+        profile.integrate = performance.now() - profilingStart;
+    }
+
+    // Update world time
+    this.time += dt;
+    this.stepnumber += 1;
+
+    this.dispatchEvent(World_step_postStepEvent);
+
+    // Invoke post-step callbacks
+    for(i=0; i!==N; i++){
+        var bi = bodies[i];
+        var postStep = bi.postStep;
+        if(postStep){
+            postStep.call(bi);
+        }
+    }
+
+    // Sleeping update
+    if(this.allowSleep){
+        for(i=0; i!==N; i++){
+            bodies[i].sleepTick(this.time);
+        }
+    }
+};
+
+World.prototype.emitContactEvents = (function(){
+    var additions = [];
+    var removals = [];
+    var beginContactEvent = {
+        type: 'beginContact',
+        bodyA: null,
+        bodyB: null
+    };
+    var endContactEvent = {
+        type: 'endContact',
+        bodyA: null,
+        bodyB: null
+    };
+    var beginShapeContactEvent = {
+        type: 'beginShapeContact',
+        bodyA: null,
+        bodyB: null,
+        shapeA: null,
+        shapeB: null
+    };
+    var endShapeContactEvent = {
+        type: 'endShapeContact',
+        bodyA: null,
+        bodyB: null,
+        shapeA: null,
+        shapeB: null
+    };
+    return function(){
+        var hasBeginContact = this.hasAnyEventListener('beginContact');
+        var hasEndContact = this.hasAnyEventListener('endContact');
+
+        if(hasBeginContact || hasEndContact){
+            this.bodyOverlapKeeper.getDiff(additions, removals);
+        }
+
+        if(hasBeginContact){
+            for (var i = 0, l = additions.length; i < l; i += 2) {
+                beginContactEvent.bodyA = this.getBodyById(additions[i]);
+                beginContactEvent.bodyB = this.getBodyById(additions[i+1]);
+                this.dispatchEvent(beginContactEvent);
+            }
+            beginContactEvent.bodyA = beginContactEvent.bodyB = null;
+        }
+
+        if(hasEndContact){
+            for (var i = 0, l = removals.length; i < l; i += 2) {
+                endContactEvent.bodyA = this.getBodyById(removals[i]);
+                endContactEvent.bodyB = this.getBodyById(removals[i+1]);
+                this.dispatchEvent(endContactEvent);
+            }
+            endContactEvent.bodyA = endContactEvent.bodyB = null;
+        }
+
+        additions.length = removals.length = 0;
+
+        var hasBeginShapeContact = this.hasAnyEventListener('beginShapeContact');
+        var hasEndShapeContact = this.hasAnyEventListener('endShapeContact');
+
+        if(hasBeginShapeContact || hasEndShapeContact){
+            this.shapeOverlapKeeper.getDiff(additions, removals);
+        }
+
+        if(hasBeginShapeContact){
+            for (var i = 0, l = additions.length; i < l; i += 2) {
+                var shapeA = this.getShapeById(additions[i]);
+                var shapeB = this.getShapeById(additions[i+1]);
+                beginShapeContactEvent.shapeA = shapeA;
+                beginShapeContactEvent.shapeB = shapeB;
+                beginShapeContactEvent.bodyA = shapeA.body;
+                beginShapeContactEvent.bodyB = shapeB.body;
+                this.dispatchEvent(beginShapeContactEvent);
+            }
+            beginShapeContactEvent.bodyA = beginShapeContactEvent.bodyB = beginShapeContactEvent.shapeA = beginShapeContactEvent.shapeB = null;
+        }
+
+        if(hasEndShapeContact){
+            for (var i = 0, l = removals.length; i < l; i += 2) {
+                var shapeA = this.getShapeById(removals[i]);
+                var shapeB = this.getShapeById(removals[i+1]);
+                endShapeContactEvent.shapeA = shapeA;
+                endShapeContactEvent.shapeB = shapeB;
+                endShapeContactEvent.bodyA = shapeA.body;
+                endShapeContactEvent.bodyB = shapeB.body;
+                this.dispatchEvent(endShapeContactEvent);
+            }
+            endShapeContactEvent.bodyA = endShapeContactEvent.bodyB = endShapeContactEvent.shapeA = endShapeContactEvent.shapeB = null;
+        }
+
+    };
+})();
+
+/**
+ * Sets all body forces in the world to zero.
+ * @method clearForces
+ */
+World.prototype.clearForces = function(){
+    var bodies = this.bodies;
+    var N = bodies.length;
+    for(var i=0; i !== N; i++){
+        var b = bodies[i],
+            force = b.force,
+            tau = b.torque;
+
+        b.force.set(0,0,0);
+        b.torque.set(0,0,0);
+    }
+};
+
+},{"../collision/AABB":15,"../collision/ArrayCollisionMatrix":16,"../collision/NaiveBroadphase":19,"../collision/OverlapKeeper":21,"../collision/Ray":22,"../collision/RaycastResult":23,"../equations/ContactEquation":32,"../equations/FrictionEquation":34,"../material/ContactMaterial":37,"../material/Material":38,"../math/Quaternion":41,"../math/Vec3":43,"../objects/Body":44,"../shapes/Shape":56,"../solver/GSSolver":59,"../utils/EventTarget":62,"../utils/TupleDictionary":65,"./Narrowphase":68}],70:[function(require,module,exports){
+var CANNON = require('cannon'),
+    quickhull = require('./lib/THREE.quickhull');
+
+var PI_2 = Math.PI / 2;
+
+var Type = {
+  BOX: 'Box',
+  CYLINDER: 'Cylinder',
+  SPHERE: 'Sphere',
+  HULL: 'ConvexPolyhedron',
+  MESH: 'Trimesh'
+};
+
+/**
+ * Given a THREE.Object3D instance, creates a corresponding CANNON shape.
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+module.exports = CANNON.mesh2shape = function (object, options) {
+  options = options || {};
+
+  var geometry;
+
+  if (options.type === Type.BOX) {
+    return createBoundingBoxShape(object);
+  } else if (options.type === Type.CYLINDER) {
+    return createBoundingCylinderShape(object, options);
+  } else if (options.type === Type.SPHERE) {
+    return createBoundingSphereShape(object, options);
+  } else if (options.type === Type.HULL) {
+    return createConvexPolyhedron(object);
+  } else if (options.type === Type.MESH) {
+    geometry = getGeometry(object);
+    return geometry ? createTrimeshShape(geometry) : null;
+  } else if (options.type) {
+    throw new Error('[CANNON.mesh2shape] Invalid type "%s".', options.type);
+  }
+
+  geometry = getGeometry(object);
+  if (!geometry) return null;
+
+  var type = geometry.metadata
+    ? geometry.metadata.type
+    : geometry.type;
+
+  switch (type) {
+    case 'BoxGeometry':
+    case 'BoxBufferGeometry':
+      return createBoxShape(geometry);
+    case 'CylinderGeometry':
+    case 'CylinderBufferGeometry':
+      return createCylinderShape(geometry);
+    case 'PlaneGeometry':
+    case 'PlaneBufferGeometry':
+      return createPlaneShape(geometry);
+    case 'SphereGeometry':
+    case 'SphereBufferGeometry':
+      return createSphereShape(geometry);
+    case 'TubeGeometry':
+    case 'Geometry':
+    case 'BufferGeometry':
+      return createBoundingBoxShape(object);
+    default:
+      console.warn('Unrecognized geometry: "%s". Using bounding box as shape.', geometry.type);
+      return createBoxShape(geometry);
+  }
+};
+
+CANNON.mesh2shape.Type = Type;
+
+/******************************************************************************
+ * Shape construction
+ */
+
+ /**
+  * @param  {THREE.Geometry} geometry
+  * @return {CANNON.Shape}
+  */
+ function createBoxShape (geometry) {
+   var vertices = getVertices(geometry);
+
+   if (!vertices.length) return null;
+
+   geometry.computeBoundingBox();
+   var box = geometry.boundingBox;
+   return new CANNON.Box(new CANNON.Vec3(
+     (box.max.x - box.min.x) / 2,
+     (box.max.y - box.min.y) / 2,
+     (box.max.z - box.min.z) / 2
+   ));
+ }
+
+/**
+ * Bounding box needs to be computed with the entire mesh, not just geometry.
+ * @param  {THREE.Object3D} mesh
+ * @return {CANNON.Shape}
+ */
+function createBoundingBoxShape (object) {
+  var shape, localPosition, worldPosition,
+      box = new THREE.Box3();
+
+  box.setFromObject(object);
+
+  if (!isFinite(box.min.lengthSq())) return null;
+
+  shape = new CANNON.Box(new CANNON.Vec3(
+    (box.max.x - box.min.x) / 2,
+    (box.max.y - box.min.y) / 2,
+    (box.max.z - box.min.z) / 2
+  ));
+
+  object.updateMatrixWorld();
+  worldPosition = new THREE.Vector3();
+  worldPosition.setFromMatrixPosition(object.matrixWorld);
+  localPosition = box.translate(worldPosition.negate()).getCenter();
+  if (localPosition.lengthSq()) {
+    shape.offset = localPosition;
+  }
+
+  return shape;
+}
+
+/**
+ * Computes 3D convex hull as a CANNON.ConvexPolyhedron.
+ * @param  {THREE.Object3D} mesh
+ * @return {CANNON.Shape}
+ */
+function createConvexPolyhedron (object) {
+  var i, vertices, faces, hull,
+      eps = 1e-4,
+      geometry = getGeometry(object);
+
+  if (!geometry || !geometry.vertices.length) return null;
+
+  // Perturb.
+  for (i = 0; i < geometry.vertices.length; i++) {
+    geometry.vertices[i].x += (Math.random() - 0.5) * eps;
+    geometry.vertices[i].y += (Math.random() - 0.5) * eps;
+    geometry.vertices[i].z += (Math.random() - 0.5) * eps;
+  }
+
+  // Compute the 3D convex hull.
+  hull = quickhull(geometry);
+
+  // Convert from THREE.Vector3 to CANNON.Vec3.
+  vertices = new Array(hull.vertices.length);
+  for (i = 0; i < hull.vertices.length; i++) {
+    vertices[i] = new CANNON.Vec3(hull.vertices[i].x, hull.vertices[i].y, hull.vertices[i].z);
+  }
+
+  // Convert from THREE.Face to Array<number>.
+  faces = new Array(hull.faces.length);
+  for (i = 0; i < hull.faces.length; i++) {
+    faces[i] = [hull.faces[i].a, hull.faces[i].b, hull.faces[i].c];
+  }
+
+  return new CANNON.ConvexPolyhedron(vertices, faces);
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createCylinderShape (geometry) {
+  var shape,
+      params = geometry.metadata
+        ? geometry.metadata.parameters
+        : geometry.parameters;
+  shape = new CANNON.Cylinder(
+    params.radiusTop,
+    params.radiusBottom,
+    params.height,
+    params.radialSegments
+  );
+
+  // Include metadata for serialization.
+  shape._type = CANNON.Shape.types.CYLINDER; // Patch schteppe/cannon.js#329.
+  shape.radiusTop = params.radiusTop;
+  shape.radiusBottom = params.radiusBottom;
+  shape.height = params.height;
+  shape.numSegments = params.radialSegments;
+
+  shape.orientation = new CANNON.Quaternion();
+  shape.orientation.setFromEuler(THREE.Math.degToRad(-90), 0, 0, 'XYZ').normalize();
+  return shape;
+}
+
+/**
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+function createBoundingCylinderShape (object, options) {
+  var shape, height, radius,
+      box = new THREE.Box3(),
+      axes = ['x', 'y', 'z'],
+      majorAxis = options.cylinderAxis || 'y',
+      minorAxes = axes.splice(axes.indexOf(majorAxis), 1) && axes;
+
+  box.setFromObject(object);
+
+  if (!isFinite(box.min.lengthSq())) return null;
+
+  // Compute cylinder dimensions.
+  height = box.max[majorAxis] - box.min[majorAxis];
+  radius = 0.5 * Math.max(
+    box.max[minorAxes[0]] - box.min[minorAxes[0]],
+    box.max[minorAxes[1]] - box.min[minorAxes[1]]
+  );
+
+  // Create shape.
+  shape = new CANNON.Cylinder(radius, radius, height, 12);
+
+  // Include metadata for serialization.
+  shape._type = CANNON.Shape.types.CYLINDER; // Patch schteppe/cannon.js#329.
+  shape.radiusTop = radius;
+  shape.radiusBottom = radius;
+  shape.height = height;
+  shape.numSegments = 12;
+
+  shape.orientation = new CANNON.Quaternion();
+  shape.orientation.setFromEuler(
+    majorAxis === 'y' ? PI_2 : 0,
+    majorAxis === 'z' ? PI_2 : 0,
+    0,
+    'XYZ'
+  ).normalize();
+  return shape;
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createPlaneShape (geometry) {
+  geometry.computeBoundingBox();
+  var box = geometry.boundingBox;
+  return new CANNON.Box(new CANNON.Vec3(
+    (box.max.x - box.min.x) / 2 || 0.1,
+    (box.max.y - box.min.y) / 2 || 0.1,
+    (box.max.z - box.min.z) / 2 || 0.1
+  ));
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createSphereShape (geometry) {
+  var params = geometry.metadata
+    ? geometry.metadata.parameters
+    : geometry.parameters;
+  return new CANNON.Sphere(params.radius);
+}
+
+/**
+ * @param  {THREE.Object3D} object
+ * @return {CANNON.Shape}
+ */
+function createBoundingSphereShape (object, options) {
+  if (options.sphereRadius) {
+    return new CANNON.Sphere(options.sphereRadius);
+  }
+  var geometry = getGeometry(object);
+  if (!geometry) return null;
+  geometry.computeBoundingSphere();
+  return new CANNON.Sphere(geometry.boundingSphere.radius);
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {CANNON.Shape}
+ */
+function createTrimeshShape (geometry) {
+  var indices,
+      vertices = getVertices(geometry);
+
+  if (!vertices.length) return null;
+
+  indices = Object.keys(vertices).map(Number);
+  return new CANNON.Trimesh(vertices, indices);
+}
+
+/******************************************************************************
+ * Utils
+ */
+
+/**
+ * Returns a single geometry for the given object. If the object is compound,
+ * its geometries are automatically merged.
+ * @param {THREE.Object3D} object
+ * @return {THREE.Geometry}
+ */
+function getGeometry (object) {
+  var matrix, mesh,
+      meshes = getMeshes(object),
+      tmp = new THREE.Geometry(),
+      combined = new THREE.Geometry();
+
+  if (meshes.length === 0) return null;
+
+  // Apply scale  – it can't easily be applied to a CANNON.Shape later.
+  if (meshes.length === 1) {
+    var position = new THREE.Vector3(),
+        quaternion = new THREE.Quaternion(),
+        scale = new THREE.Vector3();
+    if (meshes[0].geometry instanceof THREE.BufferGeometry) {
+      if (meshes[0].geometry.attributes.position) {
+        tmp.fromBufferGeometry(meshes[0].geometry);
+      }
+    } else {
+      tmp = meshes[0].geometry.clone();
+    }
+    tmp.metadata = meshes[0].geometry.metadata;
+    meshes[0].updateMatrixWorld();
+    meshes[0].matrixWorld.decompose(position, quaternion, scale);
+    return tmp.scale(scale.x, scale.y, scale.z);
+  }
+
+  // Recursively merge geometry, preserving local transforms.
+  while ((mesh = meshes.pop())) {
+    mesh.updateMatrixWorld();
+    if (mesh.geometry instanceof THREE.BufferGeometry) {
+      tmp.fromBufferGeometry(mesh.geometry);
+      combined.merge(tmp, mesh.matrixWorld);
+    } else {
+      combined.merge(mesh.geometry, mesh.matrixWorld);
+    }
+  }
+
+  matrix = new THREE.Matrix4();
+  matrix.scale(object.scale);
+  combined.applyMatrix(matrix);
+  return combined;
+}
+
+/**
+ * @param  {THREE.Geometry} geometry
+ * @return {Array<number>}
+ */
+function getVertices (geometry) {
+  if (!geometry.attributes) {
+    geometry = new THREE.BufferGeometry().fromGeometry(geometry);
+  }
+  return (geometry.attributes.position || {}).array || [];
+}
+
+/**
+ * Returns a flat array of THREE.Mesh instances from the given object. If
+ * nested transformations are found, they are applied to child meshes
+ * as mesh.userData.matrix, so that each mesh has its position/rotation/scale
+ * independently of all of its parents except the top-level object.
+ * @param  {THREE.Object3D} object
+ * @return {Array<THREE.Mesh>}
+ */
+function getMeshes (object) {
+  var meshes = [];
+  object.traverse(function (o) {
+    if (o.type === 'Mesh') {
+      meshes.push(o);
+    }
+  });
+  return meshes;
+}
+
+},{"./lib/THREE.quickhull":71,"cannon":14}],71:[function(require,module,exports){
+/**
+
+  QuickHull
+  ---------
+
+  The MIT License
+
+  Copyright &copy; 2010-2014 three.js authors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in
+  all copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+
+  THE SOFTWARE.
+
+
+    @author mark lundin / http://mark-lundin.com
+
+    This is a 3D implementation of the Quick Hull algorithm.
+    It is a fast way of computing a convex hull with average complexity
+    of O(n log(n)).
+    It uses depends on three.js and is supposed to create THREE.Geometry.
+
+    It's also very messy
+
+ */
+
+module.exports = (function(){
+
+
+  var faces     = [],
+    faceStack   = [],
+    i, NUM_POINTS, extremes,
+    max     = 0,
+    dcur, current, j, v0, v1, v2, v3,
+    N, D;
+
+  var ab, ac, ax,
+    suba, subb, normal,
+    diff, subaA, subaB, subC;
+
+  function reset(){
+
+    ab    = new THREE.Vector3(),
+    ac    = new THREE.Vector3(),
+    ax    = new THREE.Vector3(),
+    suba  = new THREE.Vector3(),
+    subb  = new THREE.Vector3(),
+    normal  = new THREE.Vector3(),
+    diff  = new THREE.Vector3(),
+    subaA = new THREE.Vector3(),
+    subaB = new THREE.Vector3(),
+    subC  = new THREE.Vector3();
+
+  }
+
+  //temporary vectors
+
+  function process( points ){
+
+    // Iterate through all the faces and remove
+    while( faceStack.length > 0  ){
+      cull( faceStack.shift(), points );
+    }
+  }
+
+
+  var norm = function(){
+
+    var ca = new THREE.Vector3(),
+      ba = new THREE.Vector3(),
+      N = new THREE.Vector3();
+
+    return function( a, b, c ){
+
+      ca.subVectors( c, a );
+      ba.subVectors( b, a );
+
+      N.crossVectors( ca, ba );
+
+      return N.normalize();
+    }
+
+  }();
+
+
+  function getNormal( face, points ){
+
+    if( face.normal !== undefined ) return face.normal;
+
+    var p0 = points[face[0]],
+      p1 = points[face[1]],
+      p2 = points[face[2]];
+
+    ab.subVectors( p1, p0 );
+    ac.subVectors( p2, p0 );
+    normal.crossVectors( ac, ab );
+    normal.normalize();
+
+    return face.normal = normal.clone();
+
+  }
+
+
+  function assignPoints( face, pointset, points ){
+
+    // ASSIGNING POINTS TO FACE
+    var p0 = points[face[0]],
+      dots = [], apex,
+      norm = getNormal( face, points );
+
+
+    // Sory all the points by there distance from the plane
+    pointset.sort( function( aItem, bItem ){
+
+
+      dots[aItem.x/3] = dots[aItem.x/3] !== undefined ? dots[aItem.x/3] : norm.dot( suba.subVectors( aItem, p0 ));
+      dots[bItem.x/3] = dots[bItem.x/3] !== undefined ? dots[bItem.x/3] : norm.dot( subb.subVectors( bItem, p0 ));
+
+      return dots[aItem.x/3] - dots[bItem.x/3] ;
+    });
+
+    //TODO :: Must be a faster way of finding and index in this array
+    var index = pointset.length;
+
+    if( index === 1 ) dots[pointset[0].x/3] = norm.dot( suba.subVectors( pointset[0], p0 ));
+    while( index-- > 0 && dots[pointset[index].x/3] > 0 )
+
+    var point;
+    if( index + 1 < pointset.length && dots[pointset[index+1].x/3] > 0 ){
+
+      face.visiblePoints  = pointset.splice( index + 1 );
+    }
+  }
+
+
+
+
+  function cull( face, points ){
+
+    var i = faces.length,
+      dot, visibleFace, currentFace,
+      visibleFaces = [face];
+
+    var apex = points.indexOf( face.visiblePoints.pop() );
+
+    // Iterate through all other faces...
+    while( i-- > 0 ){
+      currentFace = faces[i];
+      if( currentFace !== face ){
+        // ...and check if they're pointing in the same direction
+        dot = getNormal( currentFace, points ).dot( diff.subVectors( points[apex], points[currentFace[0]] ));
+        if( dot > 0 ){
+          visibleFaces.push( currentFace );
+        }
+      }
+    }
+
+    var index, neighbouringIndex, vertex;
+
+    // Determine Perimeter - Creates a bounded horizon
+
+    // 1. Pick an edge A out of all possible edges
+    // 2. Check if A is shared by any other face. a->b === b->a
+      // 2.1 for each edge in each triangle, isShared = ( f1.a == f2.a && f1.b == f2.b ) || ( f1.a == f2.b && f1.b == f2.a )
+    // 3. If not shared, then add to convex horizon set,
+        //pick an end point (N) of the current edge A and choose a new edge NA connected to A.
+        //Restart from 1.
+    // 4. If A is shared, it is not an horizon edge, therefore flag both faces that share this edge as candidates for culling
+    // 5. If candidate geometry is a degenrate triangle (ie. the tangent space normal cannot be computed) then remove that triangle from all further processing
+
+
+    var j = i = visibleFaces.length;
+    var isDistinct = false,
+      hasOneVisibleFace = i === 1,
+      cull = [],
+      perimeter = [],
+      edgeIndex = 0, compareFace, nextIndex,
+      a, b;
+
+    var allPoints = [];
+    var originFace = [visibleFaces[0][0], visibleFaces[0][1], visibleFaces[0][1], visibleFaces[0][2], visibleFaces[0][2], visibleFaces[0][0]];
+
+
+    if( visibleFaces.length === 1 ){
+      currentFace = visibleFaces[0];
+
+      perimeter = [currentFace[0], currentFace[1], currentFace[1], currentFace[2], currentFace[2], currentFace[0]];
+      // remove visible face from list of faces
+      if( faceStack.indexOf( currentFace ) > -1 ){
+        faceStack.splice( faceStack.indexOf( currentFace ), 1 );
+      }
+
+
+      if( currentFace.visiblePoints ) allPoints = allPoints.concat( currentFace.visiblePoints );
+      faces.splice( faces.indexOf( currentFace ), 1 );
+
+    }else{
+
+      while( i-- > 0  ){  // for each visible face
+
+        currentFace = visibleFaces[i];
+
+        // remove visible face from list of faces
+        if( faceStack.indexOf( currentFace ) > -1 ){
+          faceStack.splice( faceStack.indexOf( currentFace ), 1 );
+        }
+
+        if( currentFace.visiblePoints ) allPoints = allPoints.concat( currentFace.visiblePoints );
+        faces.splice( faces.indexOf( currentFace ), 1 );
+
+
+        var isSharedEdge;
+        cEdgeIndex = 0;
+
+        while( cEdgeIndex < 3 ){ // Iterate through it's edges
+
+          isSharedEdge = false;
+          j = visibleFaces.length;
+          a = currentFace[cEdgeIndex]
+          b = currentFace[(cEdgeIndex+1)%3];
+
+
+          while( j-- > 0 && !isSharedEdge ){ // find another visible faces
+
+            compareFace = visibleFaces[j];
+            edgeIndex = 0;
+
+            // isSharedEdge = compareFace == currentFace;
+            if( compareFace !== currentFace ){
+
+              while( edgeIndex < 3 && !isSharedEdge ){ //Check all it's indices
+
+                nextIndex = ( edgeIndex + 1 );
+                isSharedEdge = ( compareFace[edgeIndex] === a && compareFace[nextIndex%3] === b ) ||
+                         ( compareFace[edgeIndex] === b && compareFace[nextIndex%3] === a );
+
+                edgeIndex++;
+              }
+            }
+          }
+
+          if( !isSharedEdge || hasOneVisibleFace ){
+            perimeter.push( a );
+            perimeter.push( b );
+          }
+
+          cEdgeIndex++;
+        }
+      }
+    }
+
+    // create new face for all pairs around edge
+    i = 0;
+    var l = perimeter.length/2;
+    var f;
+
+    while( i < l ){
+      f = [ perimeter[i*2+1], apex, perimeter[i*2] ];
+      assignPoints( f, allPoints, points );
+      faces.push( f )
+      if( f.visiblePoints !== undefined  )faceStack.push( f );
+      i++;
+    }
+
+  }
+
+  var distSqPointSegment = function(){
+
+    var ab = new THREE.Vector3(),
+      ac = new THREE.Vector3(),
+      bc = new THREE.Vector3();
+
+    return function( a, b, c ){
+
+        ab.subVectors( b, a );
+        ac.subVectors( c, a );
+        bc.subVectors( c, b );
+
+        var e = ac.dot(ab);
+        if (e < 0.0) return ac.dot( ac );
+        var f = ab.dot( ab );
+        if (e >= f) return bc.dot(  bc );
+        return ac.dot( ac ) - e * e / f;
+
+      }
+
+  }();
+
+
+
+
+
+  return function( geometry ){
+
+    reset();
+
+
+    points    = geometry.vertices;
+    faces     = [],
+    faceStack   = [],
+    i       = NUM_POINTS = points.length,
+    extremes  = points.slice( 0, 6 ),
+    max     = 0;
+
+
+
+    /*
+     *  FIND EXTREMETIES
+     */
+    while( i-- > 0 ){
+      if( points[i].x < extremes[0].x ) extremes[0] = points[i];
+      if( points[i].x > extremes[1].x ) extremes[1] = points[i];
+
+      if( points[i].y < extremes[2].y ) extremes[2] = points[i];
+      if( points[i].y < extremes[3].y ) extremes[3] = points[i];
+
+      if( points[i].z < extremes[4].z ) extremes[4] = points[i];
+      if( points[i].z < extremes[5].z ) extremes[5] = points[i];
+    }
+
+
+    /*
+     *  Find the longest line between the extremeties
+     */
+
+    j = i = 6;
+    while( i-- > 0 ){
+      j = i - 1;
+      while( j-- > 0 ){
+          if( max < (dcur = extremes[i].distanceToSquared( extremes[j] )) ){
+        max = dcur;
+        v0 = extremes[ i ];
+        v1 = extremes[ j ];
+
+          }
+        }
+      }
+
+
+      // 3. Find the most distant point to the line segment, this creates a plane
+      i = 6;
+      max = 0;
+    while( i-- > 0 ){
+      dcur = distSqPointSegment( v0, v1, extremes[i]);
+      if( max < dcur ){
+        max = dcur;
+            v2 = extremes[ i ];
+          }
+    }
+
+
+      // 4. Find the most distant point to the plane.
+
+      N = norm(v0, v1, v2);
+      D = N.dot( v0 );
+
+
+      max = 0;
+      i = NUM_POINTS;
+      while( i-- > 0 ){
+        dcur = Math.abs( points[i].dot( N ) - D );
+          if( max < dcur ){
+            max = dcur;
+            v3 = points[i];
+      }
+      }
+
+
+
+      var v0Index = points.indexOf( v0 ),
+      v1Index = points.indexOf( v1 ),
+      v2Index = points.indexOf( v2 ),
+      v3Index = points.indexOf( v3 );
+
+
+    //  We now have a tetrahedron as the base geometry.
+    //  Now we must subdivide the
+
+      var tetrahedron =[
+        [ v2Index, v1Index, v0Index ],
+        [ v1Index, v3Index, v0Index ],
+        [ v2Index, v3Index, v1Index ],
+        [ v0Index, v3Index, v2Index ],
+    ];
+
+
+
+    subaA.subVectors( v1, v0 ).normalize();
+    subaB.subVectors( v2, v0 ).normalize();
+    subC.subVectors ( v3, v0 ).normalize();
+    var sign  = subC.dot( new THREE.Vector3().crossVectors( subaB, subaA ));
+
+
+    // Reverse the winding if negative sign
+    if( sign < 0 ){
+      tetrahedron[0].reverse();
+      tetrahedron[1].reverse();
+      tetrahedron[2].reverse();
+      tetrahedron[3].reverse();
+    }
+
+
+    //One for each face of the pyramid
+    var pointsCloned = points.slice();
+    pointsCloned.splice( pointsCloned.indexOf( v0 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v1 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v2 ), 1 );
+    pointsCloned.splice( pointsCloned.indexOf( v3 ), 1 );
+
+
+    var i = tetrahedron.length;
+    while( i-- > 0 ){
+      assignPoints( tetrahedron[i], pointsCloned, points );
+      if( tetrahedron[i].visiblePoints !== undefined ){
+        faceStack.push( tetrahedron[i] );
+      }
+      faces.push( tetrahedron[i] );
+    }
+
+    process( points );
+
+
+    //  Assign to our geometry object
+
+    var ll = faces.length;
+    while( ll-- > 0 ){
+      geometry.faces[ll] = new THREE.Face3( faces[ll][2], faces[ll][1], faces[ll][0], faces[ll].normal )
+    }
+
+    geometry.normalsNeedUpdate = true;
+
+    return geometry;
+
+  }
+
+}())
+
+},{}],72:[function(require,module,exports){
+module.exports = {
+  schema: {
+    offset: {default: {x: 0, y: 0, z: 0}, type: 'vec3'}
+  },
+
+  init: function () {
+    this.active = false;
+    this.targetEl = null;
+    this.fire = this.fire.bind(this);
+    this.offset = new THREE.Vector3();
+  },
+
+  update: function () {
+    this.offset.copy(this.data.offset);
+  },
+
+  play: function () { this.el.addEventListener('click', this.fire); },
+  pause: function () { this.el.removeEventListener('click', this.fire); },
+  remove: function () { this.pause(); },
+
+  fire: function () {
+    var targetEl = this.el.sceneEl.querySelector('[checkpoint-controls]');
+    if (!targetEl) {
+      throw new Error('No `checkpoint-controls` component found.');
+    }
+    targetEl.components['checkpoint-controls'].setCheckpoint(this.el);
+  },
+
+  getOffset: function () {
+    return this.offset.copy(this.data.offset);
+  }
+};
+
+},{}],73:[function(require,module,exports){
+/**
+ * Specifies an envMap on an entity, without replacing any existing material
+ * properties.
+ */
+module.exports = {
+  schema: {
+    path: {default: ''},
+    extension: {default: 'jpg'},
+    format: {default: 'RGBFormat'},
+    enableBackground: {default: false}
+  },
+
+  init: function () {
+    var data = this.data;
+
+    this.texture = new THREE.CubeTextureLoader().load([
+      data.path + 'posx.' + data.extension, data.path + 'negx.' + data.extension,
+      data.path + 'posy.' + data.extension, data.path + 'negy.' + data.extension,
+      data.path + 'posz.' + data.extension, data.path + 'negz.' + data.extension
+    ]);
+    this.texture.format = THREE[data.format];
+
+    if (data.enableBackground) {
+      this.el.sceneEl.object3D.background = this.texture;
+    }
+
+    this.applyEnvMap();
+    this.el.addEventListener('object3dset', this.applyEnvMap.bind(this));
+  },
+
+  applyEnvMap: function () {
+    var mesh = this.el.getObject3D('mesh');
+    var envMap = this.texture;
+
+    if (!mesh) return;
+
+    mesh.traverse(function (node) {
+      if (node.material && 'envMap' in node.material) {
+        node.material.envMap = envMap;
+        node.material.needsUpdate = true;
+      }
+    });
+  }
+};
+
+},{}],74:[function(require,module,exports){
+/**
+ * Based on aframe/examples/showcase/tracked-controls.
+ *
+ * Handles events coming from the hand-controls.
+ * Determines if the entity is grabbed or released.
+ * Updates its position to move along the controller.
+ */
+module.exports = {
+  init: function () {
+    this.GRABBED_STATE = 'grabbed';
+
+    this.grabbing = false;
+    this.hitEl =      /** @type {AFRAME.Element}    */ null;
+    this.physics =    /** @type {AFRAME.System}     */ this.el.sceneEl.systems.physics;
+    this.constraint = /** @type {CANNON.Constraint} */ null;
+
+    // Bind event handlers
+    this.onHit = this.onHit.bind(this);
+    this.onGripOpen = this.onGripOpen.bind(this);
+    this.onGripClose = this.onGripClose.bind(this);
+  },
+
+  play: function () {
+    var el = this.el;
+    el.addEventListener('hit', this.onHit);
+    el.addEventListener('gripdown', this.onGripClose);
+    el.addEventListener('gripup', this.onGripOpen);
+    el.addEventListener('trackpaddown', this.onGripClose);
+    el.addEventListener('trackpadup', this.onGripOpen);
+    el.addEventListener('triggerdown', this.onGripClose);
+    el.addEventListener('triggerup', this.onGripOpen);
+  },
+
+  pause: function () {
+    var el = this.el;
+    el.removeEventListener('hit', this.onHit);
+    el.removeEventListener('gripdown', this.onGripClose);
+    el.removeEventListener('gripup', this.onGripOpen);
+    el.removeEventListener('trackpaddown', this.onGripClose);
+    el.removeEventListener('trackpadup', this.onGripOpen);
+    el.removeEventListener('triggerdown', this.onGripClose);
+    el.removeEventListener('triggerup', this.onGripOpen);
+  },
+
+  onGripClose: function (evt) {
+    this.grabbing = true;
+  },
+
+  onGripOpen: function (evt) {
+    var hitEl = this.hitEl;
+    this.grabbing = false;
+    if (!hitEl) { return; }
+    hitEl.removeState(this.GRABBED_STATE);
+    this.hitEl = undefined;
+    this.physics.world.removeConstraint(this.constraint);
+    this.constraint = null;
+  },
+
+  onHit: function (evt) {
+    var hitEl = evt.detail.el;
+    // If the element is already grabbed (it could be grabbed by another controller).
+    // If the hand is not grabbing the element does not stick.
+    // If we're already grabbing something you can't grab again.
+    if (!hitEl || hitEl.is(this.GRABBED_STATE) || !this.grabbing || this.hitEl) { return; }
+    hitEl.addState(this.GRABBED_STATE);
+    this.hitEl = hitEl;
+    this.constraint = new CANNON.LockConstraint(this.el.body, hitEl.body);
+    this.physics.world.addConstraint(this.constraint);
+  }
+};
+
+},{}],75:[function(require,module,exports){
+var physics = require('aframe-physics-system');
+
+module.exports = {
+  'checkpoint':      require('./checkpoint'),
+  'cube-env-map':    require('./cube-env-map'),
+  'grab':            require('./grab'),
+  'jump-ability':    require('./jump-ability'),
+  'kinematic-body':  require('./kinematic-body'),
+  'mesh-smooth':     require('./mesh-smooth'),
+  'sphere-collider': require('./sphere-collider'),
+  'toggle-velocity': require('./toggle-velocity'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    physics.registerAll();
+    if (!AFRAME.components['checkpoint'])      AFRAME.registerComponent('checkpoint',      this['checkpoint']);
+    if (!AFRAME.components['cube-env-map'])    AFRAME.registerComponent('cube-env-map',    this['cube-env-map']);
+    if (!AFRAME.components['grab'])            AFRAME.registerComponent('grab',            this['grab']);
+    if (!AFRAME.components['jump-ability'])    AFRAME.registerComponent('jump-ability',    this['jump-ability']);
+    if (!AFRAME.components['kinematic-body'])  AFRAME.registerComponent('kinematic-body',  this['kinematic-body']);
+    if (!AFRAME.components['mesh-smooth'])     AFRAME.registerComponent('mesh-smooth',     this['mesh-smooth']);
+    if (!AFRAME.components['sphere-collider']) AFRAME.registerComponent('sphere-collider', this['sphere-collider']);
+    if (!AFRAME.components['toggle-velocity']) AFRAME.registerComponent('toggle-velocity', this['toggle-velocity']);
+
+    this._registered = true;
+  }
+};
+
+},{"./checkpoint":72,"./cube-env-map":73,"./grab":74,"./jump-ability":76,"./kinematic-body":77,"./mesh-smooth":78,"./sphere-collider":79,"./toggle-velocity":80,"aframe-physics-system":2}],76:[function(require,module,exports){
+var ACCEL_G = -9.8, // m/s^2
+    EASING = -15; // m/s^2
+
+/**
+ * Jump ability.
+ */
+module.exports = {
+  dependencies: ['velocity'],
+
+  /* Schema
+  ——————————————————————————————————————————————*/
+
+  schema: {
+    on: { default: 'keydown:Space gamepadbuttondown:0' },
+    playerHeight: { default: 1.764 },
+    maxJumps: { default: 1 },
+    distance: { default: 5 },
+    soundJump: { default: '' },
+    soundLand: { default: '' },
+    debug: { default: false }
+  },
+
+  init: function () {
+    this.velocity = 0;
+    this.numJumps = 0;
+
+    var beginJump = this.beginJump.bind(this),
+        events = this.data.on.split(' ');
+    this.bindings = {};
+    for (var i = 0; i <  events.length; i++) {
+      this.bindings[events[i]] = beginJump;
+      this.el.addEventListener(events[i], beginJump);
+    }
+    this.bindings.collide = this.onCollide.bind(this);
+    this.el.addEventListener('collide', this.bindings.collide);
+  },
+
+  remove: function () {
+    for (var event in this.bindings) {
+      if (this.bindings.hasOwnProperty(event)) {
+        this.el.removeEventListener(event, this.bindings[event]);
+        delete this.bindings[event];
+      }
+    }
+    this.el.removeEventListener('collide', this.bindings.collide);
+    delete this.bindings.collide;
+  },
+
+  beginJump: function () {
+    if (this.numJumps < this.data.maxJumps) {
+      var data = this.data,
+          initialVelocity = Math.sqrt(-2 * data.distance * (ACCEL_G + EASING)),
+          v = this.el.getAttribute('velocity');
+      this.el.setAttribute('velocity', {x: v.x, y: initialVelocity, z: v.z});
+      this.numJumps++;
+    }
+  },
+
+  onCollide: function () {
+    this.numJumps = 0;
+  }
+};
+
+},{}],77:[function(require,module,exports){
+/**
+ * Kinematic body.
+ *
+ * Managed dynamic body, which moves but is not affected (directly) by the
+ * physics engine. This is not a true kinematic body, in the sense that we are
+ * letting the physics engine _compute_ collisions against it and selectively
+ * applying those collisions to the object. The physics engine does not decide
+ * the position/velocity/rotation of the element.
+ *
+ * Used for the camera object, because full physics simulation would create
+ * movement that feels unnatural to the player. Bipedal movement does not
+ * translate nicely to rigid body physics.
+ *
+ * See: http://www.learn-cocos2d.com/2013/08/physics-engine-platformer-terrible-idea/
+ * And: http://oxleygamedev.blogspot.com/2011/04/player-physics-part-2.html
+ */
+var CANNON = window.CANNON;
+var EPS = 0.000001;
+
+module.exports = {
+  dependencies: ['velocity'],
+
+  /*******************************************************************
+   * Schema
+   */
+
+  schema: {
+    mass:           { default: 5 },
+    radius:         { default: 1.3 },
+    height:         { default: 1.764 },
+    linearDamping:  { default: 0.05 },
+    enableSlopes:   { default: true }
+  },
+
+  /*******************************************************************
+   * Lifecycle
+   */
+
+  init: function () {
+    this.system = this.el.sceneEl.systems.physics;
+    this.system.addBehavior(this, this.system.Phase.SIMULATE);
+
+    var el = this.el,
+        data = this.data,
+        position = (new CANNON.Vec3()).copy(el.getAttribute('position'));
+
+    this.body = new CANNON.Body({
+      material: this.system.material,
+      position: position,
+      mass: data.mass,
+      linearDamping: data.linearDamping,
+      fixedRotation: true
+    });
+    this.body.addShape(
+      new CANNON.Sphere(data.radius),
+      new CANNON.Vec3(0, data.radius - data.height, 0)
+    );
+
+    this.body.el = this.el;
+    this.el.body = this.body;
+    this.system.addBody(this.body);
+  },
+
+  remove: function () {
+    this.system.removeBody(this.body);
+    this.system.removeBehavior(this, this.system.Phase.SIMULATE);
+    delete this.el.body;
+  },
+
+  /*******************************************************************
+   * Tick
+   */
+
+  /**
+   * Checks CANNON.World for collisions and attempts to apply them to the
+   * element automatically, in a player-friendly way.
+   *
+   * There's extra logic for horizontal surfaces here. The basic requirements:
+   * (1) Only apply gravity when not in contact with _any_ horizontal surface.
+   * (2) When moving, project the velocity against exactly one ground surface.
+   *     If in contact with two ground surfaces (e.g. ground + ramp), choose
+   *     the one that collides with current velocity, if any.
+   */
+  step: (function () {
+    var velocity = new THREE.Vector3(),
+        normalizedVelocity = new THREE.Vector3(),
+        currentSurfaceNormal = new THREE.Vector3(),
+        groundNormal = new THREE.Vector3();
+
+    return function (t, dt) {
+      if (!dt) return;
+
+      var body = this.body,
+          data = this.data,
+          didCollide = false,
+          height, groundHeight = -Infinity,
+          groundBody;
+
+      dt = Math.min(dt, this.system.data.maxInterval * 1000);
+
+      groundNormal.set(0, 0, 0);
+      velocity.copy(this.el.getAttribute('velocity'));
+      body.velocity.copy(velocity);
+      body.position.copy(this.el.getAttribute('position'));
+
+      for (var i = 0, contact; (contact = this.system.world.contacts[i]); i++) {
+        // 1. Find any collisions involving this element. Get the contact
+        // normal, and make sure it's oriented _out_ of the other object.
+        if (body.id === contact.bi.id) {
+          contact.ni.negate(currentSurfaceNormal);
+        } else if (body.id === contact.bj.id) {
+          currentSurfaceNormal.copy(contact.ni);
+        } else {
+          continue;
+        }
+
+        didCollide = body.velocity.dot(currentSurfaceNormal) < -EPS;
+        if (didCollide && currentSurfaceNormal.y <= 0.5) {
+          // 2. If current trajectory attempts to move _through_ another
+          // object, project the velocity against the collision plane to
+          // prevent passing through.
+          velocity = velocity.projectOnPlane(currentSurfaceNormal);
+        } else if (currentSurfaceNormal.y > 0.5) {
+          // 3. If in contact with something roughly horizontal (+/- 45º) then
+          // consider that the current ground. Only the highest qualifying
+          // ground is retained.
+          height = body.id === contact.bi.id
+            ? Math.abs(contact.rj.y + contact.bj.position.y)
+            : Math.abs(contact.ri.y + contact.bi.position.y);
+          if (height > groundHeight) {
+            groundHeight = height;
+            groundNormal.copy(currentSurfaceNormal);
+            groundBody = body.id === contact.bi.id ? contact.bj : contact.bi;
+          }
+        }
+      }
+
+      normalizedVelocity.copy(velocity).normalize();
+      if (groundBody && normalizedVelocity.y < 0.5) {
+        if (!data.enableSlopes) {
+          groundNormal.set(0, 1, 0);
+        } else if (groundNormal.y < 1 - EPS) {
+          groundNormal.copy(this.raycastToGround(groundBody, groundNormal));
+        }
+
+        // 4. Project trajectory onto the top-most ground object, unless
+        // trajectory is > 45º.
+        velocity = velocity.projectOnPlane(groundNormal);
+      } else {
+        // 5. If not in contact with anything horizontal, apply world gravity.
+        // TODO - Why is the 4x scalar necessary.
+        velocity.add(this.system.world.gravity.scale(dt * 4.0 / 1000));
+      }
+
+      // 6. If the ground surface has a velocity, apply it directly to current
+      // position, not velocity, to preserve relative velocity.
+      if (groundBody && groundBody.el && groundBody.el.components.velocity) {
+        var groundVelocity = groundBody.el.getAttribute('velocity');
+        body.position.copy({
+          x: body.position.x + groundVelocity.x * dt / 1000,
+          y: body.position.y + groundVelocity.y * dt / 1000,
+          z: body.position.z + groundVelocity.z * dt / 1000
+        });
+        this.el.setAttribute('position', body.position);
+      }
+
+      body.velocity.copy(velocity);
+      this.el.setAttribute('velocity', velocity);
+    };
+  }()),
+
+  /**
+   * When walking on complex surfaces (trimeshes, borders between two shapes),
+   * the collision normals returned for the player sphere can be very
+   * inconsistent. To address this, raycast straight down, find the collision
+   * normal, and return whichever normal is more vertical.
+   * @param  {CANNON.Body} groundBody
+   * @param  {CANNON.Vec3} groundNormal
+   * @return {CANNON.Vec3}
+   */
+  raycastToGround: function (groundBody, groundNormal) {
+    var ray,
+        hitNormal,
+        vFrom = this.body.position,
+        vTo = this.body.position.clone();
+
+    vTo.y -= this.data.height;
+    ray = new CANNON.Ray(vFrom, vTo);
+    ray._updateDirection(); // TODO - Report bug.
+    ray.intersectBody(groundBody);
+
+    if (!ray.hasHit) return groundNormal;
+
+    // Compare ABS, in case we're projecting against the inside of the face.
+    hitNormal = ray.result.hitNormalWorld;
+    return Math.abs(hitNormal.y) > Math.abs(groundNormal.y) ? hitNormal : groundNormal;
+  }
+};
+
+},{}],78:[function(require,module,exports){
+/**
+ * Apply this component to models that looks "blocky", to have Three.js compute
+ * vertex normals on the fly for a "smoother" look.
+ */
+module.exports = {
+  init: function () {
+    this.el.addEventListener('model-loaded', function (e) {
+      e.detail.model.traverse(function (node) {
+        if (node.isMesh) node.geometry.computeVertexNormals();
+      });
+    })
+  }
+}
+
+},{}],79:[function(require,module,exports){
+/**
+ * Based on aframe/examples/showcase/tracked-controls.
+ *
+ * Implement bounding sphere collision detection for entities with a mesh.
+ * Sets the specified state on the intersected entities.
+ *
+ * @property {string} objects - Selector of the entities to test for collision.
+ * @property {string} state - State to set on collided entities.
+ *
+ */
+module.exports = {
+  schema: {
+    objects: {default: ''},
+    state: {default: 'collided'},
+    radius: {default: 0.05},
+    watch: {default: true}
+  },
+
+  init: function () {
+    /** @type {MutationObserver} */
+    this.observer = null;
+    /** @type {Array<Element>} Elements to watch for collisions. */
+    this.els = [];
+    /** @type {Array<Element>} Elements currently in collision state. */
+    this.collisions = [];
+
+    this.handleHit = this.handleHit.bind(this);
+  },
+
+  remove: function () {
+    this.pause();
+  },
+
+  play: function () {
+    var sceneEl = this.el.sceneEl;
+
+    if (this.data.watch) {
+      this.observer = new MutationObserver(this.update.bind(this, null));
+      this.observer.observe(sceneEl, {childList: true, subtree: true});
+    }
+  },
+
+  pause: function () {
+    if (this.observer) {
+      this.observer.disconnect();
+      this.observer = null;
+    }
+  },
+
+  /**
+   * Update list of entities to test for collision.
+   */
+  update: function () {
+    var data = this.data;
+    var objectEls;
+
+    // Push entities into list of els to intersect.
+    if (data.objects) {
+      objectEls = this.el.sceneEl.querySelectorAll(data.objects);
+    } else {
+      // If objects not defined, intersect with everything.
+      objectEls = this.el.sceneEl.children;
+    }
+    // Convert from NodeList to Array
+    this.els = Array.prototype.slice.call(objectEls);
+  },
+
+  tick: (function () {
+    var position = new THREE.Vector3(),
+        meshPosition = new THREE.Vector3(),
+        meshScale = new THREE.Vector3(),
+        colliderScale = new THREE.Vector3(),
+        distanceMap = new Map();
+    return function () {
+      var el = this.el,
+          data = this.data,
+          mesh = el.getObject3D('mesh'),
+          colliderRadius,
+          collisions = [];
+
+      if (!mesh) { return; }
+
+      distanceMap.clear();
+      position.copy(el.object3D.getWorldPosition());
+      el.object3D.getWorldScale(colliderScale);
+      colliderRadius = data.radius * scaleFactor(colliderScale);
+      // Update collision list.
+      this.els.forEach(intersect);
+
+      // Emit events and add collision states, in order of distance.
+      collisions
+        .sort(function (a, b) {
+          return distanceMap.get(a) > distanceMap.get(b) ? 1 : -1;
+        })
+        .forEach(this.handleHit);
+
+      // Remove collision state from current element.
+      if (collisions.length === 0) { el.emit('hit', {el: null}); }
+
+      // Remove collision state from other elements.
+      this.collisions.filter(function (el) {
+        return !distanceMap.has(el);
+      }).forEach(function removeState (el) {
+        el.removeState(data.state);
+      });
+
+      // Store new collisions
+      this.collisions = collisions;
+
+      // Bounding sphere collision detection
+      function intersect (el) {
+        var radius, mesh, distance, box, extent, size;
+
+        if (!el.isEntity) { return; }
+
+        mesh = el.getObject3D('mesh');
+
+        if (!mesh) { return; }
+
+        box = new THREE.Box3().setFromObject(mesh);
+        size = box.getSize();
+        extent = Math.max(size.x, size.y, size.z) / 2;
+        radius = Math.sqrt(2 * extent * extent);
+        box.getCenter(meshPosition);
+
+        if (!radius) { return; }
+
+        distance = position.distanceTo(meshPosition);
+        if (distance < radius + colliderRadius) {
+          collisions.push(el);
+          distanceMap.set(el, distance);
+        }
+      }
+      // use max of scale factors to maintain bounding sphere collision
+      function scaleFactor (scaleVec) {
+        return Math.max.apply(null, scaleVec.toArray());
+      }
+    };
+  })(),
+
+  handleHit: function (targetEl) {
+    targetEl.emit('hit');
+    targetEl.addState(this.data.state);
+    this.el.emit('hit', {el: targetEl});
+  }
+};
+
+},{}],80:[function(require,module,exports){
+/**
+ * Toggle velocity.
+ *
+ * Moves an object back and forth along an axis, within a min/max extent.
+ */
+module.exports = {
+  dependencies: ['velocity'],
+  schema: {
+    axis: { default: 'x', oneOf: ['x', 'y', 'z'] },
+    min: { default: 0 },
+    max: { default: 0 },
+    speed: { default: 1 }
+  },
+  init: function () {
+    var velocity = {x: 0, y: 0, z: 0};
+    velocity[this.data.axis] = this.data.speed;
+    this.el.setAttribute('velocity', velocity);
+
+    if (this.el.sceneEl.addBehavior) this.el.sceneEl.addBehavior(this);
+  },
+  remove: function () {},
+  update: function () { this.tick(); },
+  tick: function () {
+    var data = this.data,
+        velocity = this.el.getAttribute('velocity'),
+        position = this.el.getAttribute('position');
+    if (velocity[data.axis] > 0 && position[data.axis] > data.max) {
+      velocity[data.axis] = -data.speed;
+      this.el.setAttribute('velocity', velocity);
+    } else if (velocity[data.axis] < 0 && position[data.axis] < data.min) {
+      velocity[data.axis] = data.speed;
+      this.el.setAttribute('velocity', velocity);
+    }
+  },
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.misc.min.js


+ 1215 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.pathfinding.js

@@ -0,0 +1,1215 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+require('./src/pathfinding').registerAll();
+},{"./src/pathfinding":2}],2:[function(require,module,exports){
+module.exports = {
+  'nav-mesh':    require('./nav-mesh'),
+  'nav-controller':     require('./nav-controller'),
+  'system':      require('./system'),
+
+  registerAll: function (AFRAME) {
+    if (this._registered) return;
+
+    AFRAME = AFRAME || window.AFRAME;
+
+    if (!AFRAME.components['nav-mesh']) {
+      AFRAME.registerComponent('nav-mesh', this['nav-mesh']);
+    }
+
+    if (!AFRAME.components['nav-controller']) {
+      AFRAME.registerComponent('nav-controller',  this['nav-controller']);
+    }
+
+    if (!AFRAME.systems.nav) {
+      AFRAME.registerSystem('nav', this.system);
+    }
+
+    this._registered = true;
+  }
+};
+
+},{"./nav-controller":3,"./nav-mesh":4,"./system":5}],3:[function(require,module,exports){
+module.exports = {
+  schema: {
+    destination: {type: 'vec3'},
+    active: {default: false},
+    speed: {default: 2}
+  },
+  init: function () {
+    this.system = this.el.sceneEl.systems.nav;
+    this.system.addController(this);
+    this.path = [];
+    this.raycaster = new THREE.Raycaster();
+  },
+  remove: function () {
+    this.system.removeController(this);
+  },
+  update: function () {
+    this.path.length = 0;
+  },
+  tick: (function () {
+    var vDest = new THREE.Vector3();
+    var vDelta = new THREE.Vector3();
+    var vNext = new THREE.Vector3();
+
+    return function (t, dt) {
+      var el = this.el;
+      var data = this.data;
+      var raycaster = this.raycaster;
+      var speed = data.speed * dt / 1000;
+
+      if (!data.active) return;
+
+      // Use PatrolJS pathfinding system to get shortest path to target.
+      if (!this.path.length) {
+        this.path = this.system.getPath(this.el.object3D, vDest.copy(data.destination));
+        this.path = this.path || [];
+        el.emit('nav-start');
+      }
+
+      // If no path is found, exit.
+      if (!this.path.length) {
+        console.warn('[nav] Unable to find path to %o.', data.destination);
+        this.el.setAttribute('nav-controller', {active: false});
+        el.emit('nav-end');
+        return;
+      }
+
+      // Current segment is a vector from current position to next waypoint.
+      var vCurrent = el.object3D.position;
+      var vWaypoint = this.path[0];
+      vDelta.subVectors(vWaypoint, vCurrent);
+
+      var distance = vDelta.length();
+      var gazeTarget;
+
+      if (distance < speed) {
+        // If <1 step from current waypoint, discard it and move toward next.
+        this.path.shift();
+
+        // After discarding the last waypoint, exit pathfinding.
+        if (!this.path.length) {
+          this.el.setAttribute('nav-controller', {active: false});
+          el.emit('nav-end');
+          return;
+        } else {
+          gazeTarget = this.path[0];
+        }
+      } else {
+        // If still far away from next waypoint, find next position for
+        // the current frame.
+        vNext.copy(vDelta.setLength(speed)).add(vCurrent);
+        gazeTarget = vWaypoint;
+      }
+
+      // Look at the next waypoint.
+      gazeTarget.y = vCurrent.y;
+      el.object3D.lookAt(gazeTarget);
+
+      // Raycast against the nav mesh, to keep the controller moving along the
+      // ground, not traveling in a straight line from higher to lower waypoints.
+      raycaster.ray.origin.copy(vNext);
+      raycaster.ray.origin.y += 1.5;
+      raycaster.ray.direction.y = -1;
+      var intersections = raycaster.intersectObject(this.system.getNavMesh());
+
+      if (!intersections.length) {
+        // Raycasting failed. Step toward the waypoint and hope for the best.
+        vCurrent.copy(vNext);
+      } else {
+        // Re-project next position onto nav mesh.
+        vDelta.subVectors(intersections[0].point, vCurrent);
+        vCurrent.add(vDelta.setLength(speed));
+      }
+
+    };
+  }())
+};
+
+},{}],4:[function(require,module,exports){
+/**
+ * nav-mesh
+ *
+ * Waits for a mesh to be loaded on the current entity, then sets it as the
+ * nav mesh in the pathfinding system.
+ */
+module.exports = {
+  init: function () {
+    this.system = this.el.sceneEl.systems.nav;
+    this.loadNavMesh();
+    this.el.addEventListener('model-loaded', this.loadNavMesh.bind(this));
+  },
+
+  loadNavMesh: function () {
+    var object = this.el.getObject3D('mesh');
+
+    if (!object) return;
+
+    var navMesh;
+    object.traverse(function (node) {
+      if (node.isMesh) navMesh = node;
+    });
+
+    if (!navMesh) return;
+
+    this.system.setNavMesh(navMesh);
+  }
+};
+
+},{}],5:[function(require,module,exports){
+var Path = require('three-pathfinding');
+
+/**
+ * nav
+ *
+ * Pathfinding system, using PatrolJS.
+ */
+module.exports = {
+  init: function () {
+    this.navMesh = null;
+    this.nodes = null;
+    this.controllers = new Set();
+  },
+
+  /**
+   * @param {THREE.Mesh} mesh
+   */
+  setNavMesh: function (mesh) {
+    var geometry = mesh.geometry.isBufferGeometry
+      ? new THREE.Geometry().fromBufferGeometry(mesh.geometry)
+      : mesh.geometry;
+    this.navMesh = new THREE.Mesh(geometry);
+    this.nodes = Path.buildNodes(this.navMesh.geometry);
+    Path.setZoneData('level', this.nodes);
+  },
+
+  /**
+   * @return {THREE.Mesh}
+   */
+  getNavMesh: function () {
+    return this.navMesh;
+  },
+
+  /**
+   * @param {NavController} ctrl
+   */
+  addController: function (ctrl) {
+    this.controllers.add(ctrl);
+  },
+
+  /**
+   * @param {NavController} ctrl
+   */
+  removeController: function (ctrl) {
+    this.controllers.remove(ctrl);
+  },
+
+  /**
+   * @param  {NavController} ctrl
+   * @param  {THREE.Vector3} target
+   * @return {Array<THREE.Vector3>}
+   */
+  getPath: function (ctrl, target) {
+    var start = ctrl.el.object3D.position;
+    // TODO(donmccurdy): Current group should be cached.
+    var group = Path.getGroup('level', start);
+    return Path.findPath(start, target, 'level', group);
+  }
+};
+
+},{"three-pathfinding":9}],6:[function(require,module,exports){
+const BinaryHeap = require('./BinaryHeap');
+const utils = require('./utils.js');
+
+class AStar {
+  static init (graph) {
+    for (let x = 0; x < graph.length; x++) {
+      //for(var x in graph) {
+      const node = graph[x];
+      node.f = 0;
+      node.g = 0;
+      node.h = 0;
+      node.cost = 1.0;
+      node.visited = false;
+      node.closed = false;
+      node.parent = null;
+    }
+  }
+
+  static cleanUp (graph) {
+    for (let x = 0; x < graph.length; x++) {
+      const node = graph[x];
+      delete node.f;
+      delete node.g;
+      delete node.h;
+      delete node.cost;
+      delete node.visited;
+      delete node.closed;
+      delete node.parent;
+    }
+  }
+
+  static heap () {
+    return new BinaryHeap(function (node) {
+      return node.f;
+    });
+  }
+
+  static search (graph, start, end) {
+    this.init(graph);
+    //heuristic = heuristic || astar.manhattan;
+
+
+    const openHeap = this.heap();
+
+    openHeap.push(start);
+
+    while (openHeap.size() > 0) {
+
+      // Grab the lowest f(x) to process next.  Heap keeps this sorted for us.
+      const currentNode = openHeap.pop();
+
+      // End case -- result has been found, return the traced path.
+      if (currentNode === end) {
+        let curr = currentNode;
+        const ret = [];
+        while (curr.parent) {
+          ret.push(curr);
+          curr = curr.parent;
+        }
+        this.cleanUp(ret);
+        return ret.reverse();
+      }
+
+      // Normal case -- move currentNode from open to closed, process each of its neighbours.
+      currentNode.closed = true;
+
+      // Find all neighbours for the current node. Optionally find diagonal neighbours as well (false by default).
+      const neighbours = this.neighbours(graph, currentNode);
+
+      for (let i = 0, il = neighbours.length; i < il; i++) {
+        const neighbour = neighbours[i];
+
+        if (neighbour.closed) {
+          // Not a valid node to process, skip to next neighbour.
+          continue;
+        }
+
+        // The g score is the shortest distance from start to current node.
+        // We need to check if the path we have arrived at this neighbour is the shortest one we have seen yet.
+        const gScore = currentNode.g + neighbour.cost;
+        const beenVisited = neighbour.visited;
+
+        if (!beenVisited || gScore < neighbour.g) {
+
+          // Found an optimal (so far) path to this node.  Take score for node to see how good it is.
+          neighbour.visited = true;
+          neighbour.parent = currentNode;
+          if (!neighbour.centroid || !end.centroid) throw new Error('Unexpected state');
+          neighbour.h = neighbour.h || this.heuristic(neighbour.centroid, end.centroid);
+          neighbour.g = gScore;
+          neighbour.f = neighbour.g + neighbour.h;
+
+          if (!beenVisited) {
+            // Pushing to heap will put it in proper place based on the 'f' value.
+            openHeap.push(neighbour);
+          } else {
+            // Already seen the node, but since it has been rescored we need to reorder it in the heap
+            openHeap.rescoreElement(neighbour);
+          }
+        }
+      }
+    }
+
+    // No result was found - empty array signifies failure to find path.
+    return [];
+  }
+
+  static heuristic (pos1, pos2) {
+    return utils.distanceToSquared(pos1, pos2);
+  }
+
+  static neighbours (graph, node) {
+    const ret = [];
+
+    for (let e = 0; e < node.neighbours.length; e++) {
+      ret.push(graph[node.neighbours[e]]);
+    }
+
+    return ret;
+  }
+}
+
+module.exports = AStar;
+
+},{"./BinaryHeap":7,"./utils.js":10}],7:[function(require,module,exports){
+// javascript-astar
+// http://github.com/bgrins/javascript-astar
+// Freely distributable under the MIT License.
+// Implements the astar search algorithm in javascript using a binary heap.
+
+class BinaryHeap {
+  constructor (scoreFunction) {
+    this.content = [];
+    this.scoreFunction = scoreFunction;
+  }
+
+  push (element) {
+    // Add the new element to the end of the array.
+    this.content.push(element);
+
+    // Allow it to sink down.
+    this.sinkDown(this.content.length - 1);
+  }
+
+  pop () {
+    // Store the first element so we can return it later.
+    const result = this.content[0];
+    // Get the element at the end of the array.
+    const end = this.content.pop();
+    // If there are any elements left, put the end element at the
+    // start, and let it bubble up.
+    if (this.content.length > 0) {
+      this.content[0] = end;
+      this.bubbleUp(0);
+    }
+    return result;
+  }
+
+  remove (node) {
+    const i = this.content.indexOf(node);
+
+    // When it is found, the process seen in 'pop' is repeated
+    // to fill up the hole.
+    const end = this.content.pop();
+
+    if (i !== this.content.length - 1) {
+      this.content[i] = end;
+
+      if (this.scoreFunction(end) < this.scoreFunction(node)) {
+        this.sinkDown(i);
+      } else {
+        this.bubbleUp(i);
+      }
+    }
+  }
+
+  size () {
+    return this.content.length;
+  }
+
+  rescoreElement (node) {
+    this.sinkDown(this.content.indexOf(node));
+  }
+
+  sinkDown (n) {
+    // Fetch the element that has to be sunk.
+    const element = this.content[n];
+
+    // When at 0, an element can not sink any further.
+    while (n > 0) {
+      // Compute the parent element's index, and fetch it.
+      const parentN = ((n + 1) >> 1) - 1;
+      const parent = this.content[parentN];
+
+      if (this.scoreFunction(element) < this.scoreFunction(parent)) {
+        // Swap the elements if the parent is greater.
+        this.content[parentN] = element;
+        this.content[n] = parent;
+        // Update 'n' to continue at the new position.
+        n = parentN;
+      } else {
+        // Found a parent that is less, no need to sink any further.
+        break;
+      }
+    }
+  }
+
+  bubbleUp (n) {
+    // Look up the target element and its score.
+    const length = this.content.length,
+      element = this.content[n],
+      elemScore = this.scoreFunction(element);
+
+    while (true) {
+      // Compute the indices of the child elements.
+      const child2N = (n + 1) << 1,
+        child1N = child2N - 1;
+      // This is used to store the new position of the element,
+      // if any.
+      let swap = null;
+      let child1Score;
+      // If the first child exists (is inside the array)...
+      if (child1N < length) {
+        // Look it up and compute its score.
+        const child1 = this.content[child1N];
+        child1Score = this.scoreFunction(child1);
+
+        // If the score is less than our element's, we need to swap.
+        if (child1Score < elemScore) {
+          swap = child1N;
+        }
+      }
+
+      // Do the same checks for the other child.
+      if (child2N < length) {
+        const child2 = this.content[child2N],
+          child2Score = this.scoreFunction(child2);
+        if (child2Score < (swap === null ? elemScore : child1Score)) {
+          swap = child2N;
+        }
+      }
+
+      // If the element needs to be moved, swap it, and continue.
+      if (swap !== null) {
+        this.content[n] = this.content[swap];
+        this.content[swap] = element;
+        n = swap;
+      }
+
+      // Otherwise, we are done.
+      else {
+        break;
+      }
+    }
+  }
+
+}
+
+module.exports = BinaryHeap;
+
+},{}],8:[function(require,module,exports){
+const utils = require('./utils');
+
+class Channel {
+  constructor () {
+    this.portals = [];
+  }
+
+  push (p1, p2) {
+    if (p2 === undefined) p2 = p1;
+    this.portals.push({
+      left: p1,
+      right: p2
+    });
+  }
+
+  stringPull () {
+    const portals = this.portals;
+    const pts = [];
+    // Init scan state
+    let portalApex, portalLeft, portalRight;
+    let apexIndex = 0,
+      leftIndex = 0,
+      rightIndex = 0;
+
+    portalApex = portals[0].left;
+    portalLeft = portals[0].left;
+    portalRight = portals[0].right;
+
+    // Add start point.
+    pts.push(portalApex);
+
+    for (let i = 1; i < portals.length; i++) {
+      const left = portals[i].left;
+      const right = portals[i].right;
+
+      // Update right vertex.
+      if (utils.triarea2(portalApex, portalRight, right) <= 0.0) {
+        if (utils.vequal(portalApex, portalRight) || utils.triarea2(portalApex, portalLeft, right) > 0.0) {
+          // Tighten the funnel.
+          portalRight = right;
+          rightIndex = i;
+        } else {
+          // Right over left, insert left to path and restart scan from portal left point.
+          pts.push(portalLeft);
+          // Make current left the new apex.
+          portalApex = portalLeft;
+          apexIndex = leftIndex;
+          // Reset portal
+          portalLeft = portalApex;
+          portalRight = portalApex;
+          leftIndex = apexIndex;
+          rightIndex = apexIndex;
+          // Restart scan
+          i = apexIndex;
+          continue;
+        }
+      }
+
+      // Update left vertex.
+      if (utils.triarea2(portalApex, portalLeft, left) >= 0.0) {
+        if (utils.vequal(portalApex, portalLeft) || utils.triarea2(portalApex, portalRight, left) < 0.0) {
+          // Tighten the funnel.
+          portalLeft = left;
+          leftIndex = i;
+        } else {
+          // Left over right, insert right to path and restart scan from portal right point.
+          pts.push(portalRight);
+          // Make current right the new apex.
+          portalApex = portalRight;
+          apexIndex = rightIndex;
+          // Reset portal
+          portalLeft = portalApex;
+          portalRight = portalApex;
+          leftIndex = apexIndex;
+          rightIndex = apexIndex;
+          // Restart scan
+          i = apexIndex;
+          continue;
+        }
+      }
+    }
+
+    if ((pts.length === 0) || (!utils.vequal(pts[pts.length - 1], portals[portals.length - 1].left))) {
+      // Append last point to path.
+      pts.push(portals[portals.length - 1].left);
+    }
+
+    this.path = pts;
+    return pts;
+  }
+}
+
+module.exports = Channel;
+
+},{"./utils":10}],9:[function(require,module,exports){
+const utils = require('./utils');
+const AStar = require('./AStar');
+const Channel = require('./Channel');
+
+var polygonId = 1;
+
+var buildPolygonGroups = function (navigationMesh) {
+
+	var polygons = navigationMesh.polygons;
+
+	var polygonGroups = [];
+	var groupCount = 0;
+
+	var spreadGroupId = function (polygon) {
+		polygon.neighbours.forEach((neighbour) => {
+			if (neighbour.group === undefined) {
+				neighbour.group = polygon.group;
+				spreadGroupId(neighbour);
+			}
+		});
+	};
+
+	polygons.forEach((polygon) => {
+
+		if (polygon.group === undefined) {
+			polygon.group = groupCount++;
+			// Spread it
+			spreadGroupId(polygon);
+		}
+
+		if (!polygonGroups[polygon.group]) polygonGroups[polygon.group] = [];
+
+		polygonGroups[polygon.group].push(polygon);
+	});
+
+	console.log('Groups built: ', polygonGroups.length);
+
+	return polygonGroups;
+};
+
+var buildPolygonNeighbours = function (polygon, navigationMesh) {
+	polygon.neighbours = [];
+
+	// All other nodes that contain at least two of our vertices are our neighbours
+	for (var i = 0, len = navigationMesh.polygons.length; i < len; i++) {
+		if (polygon === navigationMesh.polygons[i]) continue;
+
+		// Don't check polygons that are too far, since the intersection tests take a long time
+		if (polygon.centroid.distanceToSquared(navigationMesh.polygons[i].centroid) > 100 * 100) continue;
+
+		var matches = utils.array_intersect(polygon.vertexIds, navigationMesh.polygons[i].vertexIds);
+
+		if (matches.length >= 2) {
+			polygon.neighbours.push(navigationMesh.polygons[i]);
+		}
+	}
+};
+
+var buildPolygonsFromGeometry = function (geometry) {
+
+	console.log('Vertices:', geometry.vertices.length, 'polygons:', geometry.faces.length);
+
+	var polygons = [];
+	var vertices = geometry.vertices;
+	var faceVertexUvs = geometry.faceVertexUvs;
+
+	// Convert the faces into a custom format that supports more than 3 vertices
+	geometry.faces.forEach((face) => {
+		polygons.push({
+			id: polygonId++,
+			vertexIds: [face.a, face.b, face.c],
+			centroid: face.centroid,
+			normal: face.normal,
+			neighbours: []
+		});
+	});
+
+	var navigationMesh = {
+		polygons: polygons,
+		vertices: vertices,
+		faceVertexUvs: faceVertexUvs
+	};
+
+	// Build a list of adjacent polygons
+	polygons.forEach((polygon) => {
+		buildPolygonNeighbours(polygon, navigationMesh);
+	});
+
+	return navigationMesh;
+};
+
+var buildNavigationMesh = function (geometry) {
+	// Prepare geometry
+	utils.computeCentroids(geometry);
+	geometry.mergeVertices();
+	return buildPolygonsFromGeometry(geometry);
+};
+
+var getSharedVerticesInOrder = function (a, b) {
+
+	var aList = a.vertexIds;
+	var bList = b.vertexIds;
+
+	var sharedVertices = [];
+
+	aList.forEach((vId) => {
+		if (bList.includes(vId)) {
+			sharedVertices.push(vId);
+		}
+	});
+
+	if (sharedVertices.length < 2) return [];
+
+	// console.log("TRYING aList:", aList, ", bList:", bList, ", sharedVertices:", sharedVertices);
+
+	if (sharedVertices.includes(aList[0]) && sharedVertices.includes(aList[aList.length - 1])) {
+		// Vertices on both edges are bad, so shift them once to the left
+		aList.push(aList.shift());
+	}
+
+	if (sharedVertices.includes(bList[0]) && sharedVertices.includes(bList[bList.length - 1])) {
+		// Vertices on both edges are bad, so shift them once to the left
+		bList.push(bList.shift());
+	}
+
+	// Again!
+	sharedVertices = [];
+
+	aList.forEach((vId) => {
+		if (bList.includes(vId)) {
+			sharedVertices.push(vId);
+		}
+	});
+
+	return sharedVertices;
+};
+
+var groupNavMesh = function (navigationMesh) {
+
+	var saveObj = {};
+
+	navigationMesh.vertices.forEach((v) => {
+		v.x = utils.roundNumber(v.x, 2);
+		v.y = utils.roundNumber(v.y, 2);
+		v.z = utils.roundNumber(v.z, 2);
+	});
+
+	saveObj.vertices = navigationMesh.vertices;
+
+	var groups = buildPolygonGroups(navigationMesh);
+
+	saveObj.groups = [];
+
+	var findPolygonIndex = function (group, p) {
+		for (var i = 0; i < group.length; i++) {
+			if (p === group[i]) return i;
+		}
+	};
+
+	groups.forEach((group) => {
+
+		var newGroup = [];
+
+		group.forEach((p) => {
+
+			var neighbours = [];
+
+			p.neighbours.forEach((n) => {
+				neighbours.push(findPolygonIndex(group, n));
+			});
+
+
+			// Build a portal list to each neighbour
+			var portals = [];
+			p.neighbours.forEach((n) => {
+				portals.push(getSharedVerticesInOrder(p, n));
+			});
+
+
+			p.centroid.x = utils.roundNumber(p.centroid.x, 2);
+			p.centroid.y = utils.roundNumber(p.centroid.y, 2);
+			p.centroid.z = utils.roundNumber(p.centroid.z, 2);
+
+			newGroup.push({
+				id: findPolygonIndex(group, p),
+				neighbours: neighbours,
+				vertexIds: p.vertexIds,
+				centroid: p.centroid,
+				portals: portals
+			});
+
+		});
+
+		saveObj.groups.push(newGroup);
+	});
+
+	return saveObj;
+};
+
+var zoneNodes = {};
+
+module.exports = {
+	buildNodes: function (geometry) {
+		var navigationMesh = buildNavigationMesh(geometry);
+
+		var zoneNodes = groupNavMesh(navigationMesh);
+
+		return zoneNodes;
+	},
+	setZoneData: function (zone, data) {
+		zoneNodes[zone] = data;
+	},
+	getGroup: function (zone, position) {
+
+		if (!zoneNodes[zone]) return null;
+
+		var closestNodeGroup = null;
+
+		var distance = Math.pow(50, 2);
+
+		zoneNodes[zone].groups.forEach((group, index) => {
+			group.forEach((node) => {
+				var measuredDistance = utils.distanceToSquared(node.centroid, position);
+				if (measuredDistance < distance) {
+					closestNodeGroup = index;
+					distance = measuredDistance;
+				}
+			});
+		});
+
+		return closestNodeGroup;
+	},
+	getRandomNode: function (zone, group, nearPosition, nearRange) {
+
+		if (!zoneNodes[zone]) return new THREE.Vector3();
+
+		nearPosition = nearPosition || null;
+		nearRange = nearRange || 0;
+
+		var candidates = [];
+
+		var polygons = zoneNodes[zone].groups[group];
+
+		polygons.forEach((p) => {
+			if (nearPosition && nearRange) {
+				if (utils.distanceToSquared(nearPosition, p.centroid) < nearRange * nearRange) {
+					candidates.push(p.centroid);
+				}
+			} else {
+				candidates.push(p.centroid);
+			}
+		});
+
+		return utils.sample(candidates) || new THREE.Vector3();
+	},
+	getClosestNode: function (position, zone, group, checkPolygon = false) {
+		const nodes = zoneNodes[zone].groups[group];
+		const vertices = zoneNodes[zone].vertices;
+		let closestNode = null;
+		let closestDistance = Infinity;
+
+		nodes.forEach((node) => {
+			const distance = utils.distanceToSquared(node.centroid, position);
+			if (distance < closestDistance
+					&& (!checkPolygon || utils.isVectorInPolygon(position, node, vertices))) {
+				closestNode = node;
+				closestDistance = distance;
+			}
+		});
+
+		return closestNode;
+	},
+	findPath: function (startPosition, targetPosition, zone, group) {
+		const nodes = zoneNodes[zone].groups[group];
+		const vertices = zoneNodes[zone].vertices;
+
+		const closestNode = this.getClosestNode(startPosition, zone, group);
+		const farthestNode = this.getClosestNode(targetPosition, zone, group, true);
+
+		// If we can't find any node, just go straight to the target
+		if (!closestNode || !farthestNode) {
+			return null;
+		}
+
+		const paths = AStar.search(nodes, closestNode, farthestNode);
+
+		const getPortalFromTo = function (a, b) {
+			for (var i = 0; i < a.neighbours.length; i++) {
+				if (a.neighbours[i] === b.id) {
+					return a.portals[i];
+				}
+			}
+		};
+
+		// We have the corridor, now pull the rope.
+		const channel = new Channel();
+		channel.push(startPosition);
+		for (let i = 0; i < paths.length; i++) {
+			const polygon = paths[i];
+			const nextPolygon = paths[i + 1];
+
+			if (nextPolygon) {
+				const portals = getPortalFromTo(polygon, nextPolygon);
+				channel.push(
+					vertices[portals[0]],
+					vertices[portals[1]]
+				);
+			}
+		}
+		channel.push(targetPosition);
+		channel.stringPull();
+
+		// Return the path, omitting first position (which is already known).
+		const path = channel.path.map((c) => new THREE.Vector3(c.x, c.y, c.z));
+		path.shift();
+		return path;
+	}
+};
+
+},{"./AStar":6,"./Channel":8,"./utils":10}],10:[function(require,module,exports){
+class Utils {
+
+  static computeCentroids (geometry) {
+    var f, fl, face;
+
+    for ( f = 0, fl = geometry.faces.length; f < fl; f ++ ) {
+
+      face = geometry.faces[ f ];
+      face.centroid = new THREE.Vector3( 0, 0, 0 );
+
+      face.centroid.add( geometry.vertices[ face.a ] );
+      face.centroid.add( geometry.vertices[ face.b ] );
+      face.centroid.add( geometry.vertices[ face.c ] );
+      face.centroid.divideScalar( 3 );
+
+    }
+  }
+
+  static roundNumber (number, decimals) {
+    var newnumber = Number(number + '').toFixed(parseInt(decimals));
+    return parseFloat(newnumber);
+  }
+
+  static sample (list) {
+    return list[Math.floor(Math.random() * list.length)];
+  }
+
+  static mergeVertexIds (aList, bList) {
+
+    var sharedVertices = [];
+
+    aList.forEach((vID) => {
+      if (bList.indexOf(vID) >= 0) {
+        sharedVertices.push(vID);
+      }
+    });
+
+    if (sharedVertices.length < 2) return [];
+
+    if (sharedVertices.includes(aList[0]) && sharedVertices.includes(aList[aList.length - 1])) {
+      // Vertices on both edges are bad, so shift them once to the left
+      aList.push(aList.shift());
+    }
+
+    if (sharedVertices.includes(bList[0]) && sharedVertices.includes(bList[bList.length - 1])) {
+      // Vertices on both edges are bad, so shift them once to the left
+      bList.push(bList.shift());
+    }
+
+    // Again!
+    sharedVertices = [];
+
+    aList.forEach((vId) => {
+      if (bList.includes(vId)) {
+        sharedVertices.push(vId);
+      }
+    });
+
+    var clockwiseMostSharedVertex = sharedVertices[1];
+    var counterClockwiseMostSharedVertex = sharedVertices[0];
+
+
+    var cList = aList.slice();
+    while (cList[0] !== clockwiseMostSharedVertex) {
+      cList.push(cList.shift());
+    }
+
+    var c = 0;
+
+    var temp = bList.slice();
+    while (temp[0] !== counterClockwiseMostSharedVertex) {
+      temp.push(temp.shift());
+
+      if (c++ > 10) throw new Error('Unexpected state');
+    }
+
+    // Shave
+    temp.shift();
+    temp.pop();
+
+    cList = cList.concat(temp);
+
+    return cList;
+  }
+
+  static setPolygonCentroid (polygon, navigationMesh) {
+    var sum = new THREE.Vector3();
+
+    var vertices = navigationMesh.vertices;
+
+    polygon.vertexIds.forEach((vId) => {
+      sum.add(vertices[vId]);
+    });
+
+    sum.divideScalar(polygon.vertexIds.length);
+
+    polygon.centroid.copy(sum);
+  }
+
+  static cleanPolygon (polygon, navigationMesh) {
+
+    var newVertexIds = [];
+
+    var vertices = navigationMesh.vertices;
+
+    for (var i = 0; i < polygon.vertexIds.length; i++) {
+
+      var vertex = vertices[polygon.vertexIds[i]];
+
+      var nextVertexId, previousVertexId;
+      var nextVertex, previousVertex;
+
+      // console.log("nextVertex: ", nextVertex);
+
+      if (i === 0) {
+        nextVertexId = polygon.vertexIds[1];
+        previousVertexId = polygon.vertexIds[polygon.vertexIds.length - 1];
+      } else if (i === polygon.vertexIds.length - 1) {
+        nextVertexId = polygon.vertexIds[0];
+        previousVertexId = polygon.vertexIds[polygon.vertexIds.length - 2];
+      } else {
+        nextVertexId = polygon.vertexIds[i + 1];
+        previousVertexId = polygon.vertexIds[i - 1];
+      }
+
+      nextVertex = vertices[nextVertexId];
+      previousVertex = vertices[previousVertexId];
+
+      var a = nextVertex.clone().sub(vertex);
+      var b = previousVertex.clone().sub(vertex);
+
+      var angle = a.angleTo(b);
+
+      // console.log(angle);
+
+      if (angle > Math.PI - 0.01 && angle < Math.PI + 0.01) {
+        // Unneccesary vertex
+        // console.log("Unneccesary vertex: ", polygon.vertexIds[i]);
+        // console.log("Angle between "+previousVertexId+", "+polygon.vertexIds[i]+" "+nextVertexId+" was: ", angle);
+
+
+        // Remove the neighbours who had this vertex
+        var goodNeighbours = [];
+        polygon.neighbours.forEach((neighbour) => {
+          if (!neighbour.vertexIds.includes(polygon.vertexIds[i])) {
+            goodNeighbours.push(neighbour);
+          }
+        });
+        polygon.neighbours = goodNeighbours;
+
+
+        // TODO cleanup the list of vertices and rebuild vertexIds for all polygons
+      } else {
+        newVertexIds.push(polygon.vertexIds[i]);
+      }
+
+    }
+
+    // console.log("New vertexIds: ", newVertexIds);
+
+    polygon.vertexIds = newVertexIds;
+
+    setPolygonCentroid(polygon, navigationMesh);
+
+  }
+
+  static isConvex (polygon, navigationMesh) {
+
+    var vertices = navigationMesh.vertices;
+
+    if (polygon.vertexIds.length < 3) return false;
+
+    var convex = true;
+
+    var total = 0;
+
+    var results = [];
+
+    for (var i = 0; i < polygon.vertexIds.length; i++) {
+
+      var vertex = vertices[polygon.vertexIds[i]];
+
+      var nextVertex, previousVertex;
+
+      if (i === 0) {
+        nextVertex = vertices[polygon.vertexIds[1]];
+        previousVertex = vertices[polygon.vertexIds[polygon.vertexIds.length - 1]];
+      } else if (i === polygon.vertexIds.length - 1) {
+        nextVertex = vertices[polygon.vertexIds[0]];
+        previousVertex = vertices[polygon.vertexIds[polygon.vertexIds.length - 2]];
+      } else {
+        nextVertex = vertices[polygon.vertexIds[i + 1]];
+        previousVertex = vertices[polygon.vertexIds[i - 1]];
+      }
+
+      var a = nextVertex.clone().sub(vertex);
+      var b = previousVertex.clone().sub(vertex);
+
+      var angle = a.angleTo(b);
+      total += angle;
+
+      if (angle === Math.PI || angle === 0) return false;
+
+      var r = a.cross(b).y;
+      results.push(r);
+    }
+
+    // if ( total > (polygon.vertexIds.length-2)*Math.PI ) return false;
+
+    results.forEach((r) => {
+      if (r === 0) convex = false;
+    });
+
+    if (results[0] > 0) {
+      results.forEach((r) => {
+        if (r < 0) convex = false;
+      });
+    } else {
+      results.forEach((r) => {
+        if (r > 0) convex = false;
+      });
+    }
+
+    return convex;
+  }
+
+  static distanceToSquared (a, b) {
+
+    var dx = a.x - b.x;
+    var dy = a.y - b.y;
+    var dz = a.z - b.z;
+
+    return dx * dx + dy * dy + dz * dz;
+
+  }
+
+  //+ Jonas Raoni Soares Silva
+  //@ http://jsfromhell.com/math/is-point-in-poly [rev. #0]
+  static isPointInPoly (poly, pt) {
+    for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
+      ((poly[i].z <= pt.z && pt.z < poly[j].z) || (poly[j].z <= pt.z && pt.z < poly[i].z)) && (pt.x < (poly[j].x - poly[i].x) * (pt.z - poly[i].z) / (poly[j].z - poly[i].z) + poly[i].x) && (c = !c);
+    return c;
+  }
+
+  static isVectorInPolygon (vector, polygon, vertices) {
+
+    // reference point will be the centroid of the polygon
+    // We need to rotate the vector as well as all the points which the polygon uses
+
+    var lowestPoint = 100000;
+    var highestPoint = -100000;
+
+    var polygonVertices = [];
+
+    polygon.vertexIds.forEach((vId) => {
+      lowestPoint = Math.min(vertices[vId].y, lowestPoint);
+      highestPoint = Math.max(vertices[vId].y, highestPoint);
+      polygonVertices.push(vertices[vId]);
+    });
+
+    if (vector.y < highestPoint + 0.5 && vector.y > lowestPoint - 0.5 &&
+      this.isPointInPoly(polygonVertices, vector)) {
+      return true;
+    }
+    return false;
+  }
+
+  static triarea2 (a, b, c) {
+    var ax = b.x - a.x;
+    var az = b.z - a.z;
+    var bx = c.x - a.x;
+    var bz = c.z - a.z;
+    return bx * az - ax * bz;
+  }
+
+  static vequal (a, b) {
+    return this.distanceToSquared(a, b) < 0.00001;
+  }
+
+  static array_intersect () {
+    let i, shortest, nShortest, n, len, ret = [],
+      obj = {},
+      nOthers;
+    nOthers = arguments.length - 1;
+    nShortest = arguments[0].length;
+    shortest = 0;
+    for (i = 0; i <= nOthers; i++) {
+      n = arguments[i].length;
+      if (n < nShortest) {
+        shortest = i;
+        nShortest = n;
+      }
+    }
+
+    for (i = 0; i <= nOthers; i++) {
+      n = (i === shortest) ? 0 : (i || shortest); //Read the shortest array first. Read the first array instead of the shortest
+      len = arguments[n].length;
+      for (var j = 0; j < len; j++) {
+        var elem = arguments[n][j];
+        if (obj[elem] === i - 1) {
+          if (i === nOthers) {
+            ret.push(elem);
+            obj[elem] = 0;
+          } else {
+            obj[elem] = i;
+          }
+        } else if (i === 0) {
+          obj[elem] = 0;
+        }
+      }
+    }
+    return ret;
+  }
+}
+
+
+
+module.exports = Utils;
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.pathfinding.min.js


File diff suppressed because it is too large
+ 75 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.primitives.js


File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/aframe-extras.primitives.min.js


+ 75 - 0
support/client/lib/vwf/model/aframe/extras/components/grab.js

@@ -0,0 +1,75 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+AFRAME.registerComponent('grab', require('./src/misc/grab'));
+},{"./src/misc/grab":2}],2:[function(require,module,exports){
+/**
+ * Based on aframe/examples/showcase/tracked-controls.
+ *
+ * Handles events coming from the hand-controls.
+ * Determines if the entity is grabbed or released.
+ * Updates its position to move along the controller.
+ */
+module.exports = {
+  init: function () {
+    this.GRABBED_STATE = 'grabbed';
+
+    this.grabbing = false;
+    this.hitEl =      /** @type {AFRAME.Element}    */ null;
+    this.physics =    /** @type {AFRAME.System}     */ this.el.sceneEl.systems.physics;
+    this.constraint = /** @type {CANNON.Constraint} */ null;
+
+    // Bind event handlers
+    this.onHit = this.onHit.bind(this);
+    this.onGripOpen = this.onGripOpen.bind(this);
+    this.onGripClose = this.onGripClose.bind(this);
+  },
+
+  play: function () {
+    var el = this.el;
+    el.addEventListener('hit', this.onHit);
+    el.addEventListener('gripdown', this.onGripClose);
+    el.addEventListener('gripup', this.onGripOpen);
+    el.addEventListener('trackpaddown', this.onGripClose);
+    el.addEventListener('trackpadup', this.onGripOpen);
+    el.addEventListener('triggerdown', this.onGripClose);
+    el.addEventListener('triggerup', this.onGripOpen);
+  },
+
+  pause: function () {
+    var el = this.el;
+    el.removeEventListener('hit', this.onHit);
+    el.removeEventListener('gripdown', this.onGripClose);
+    el.removeEventListener('gripup', this.onGripOpen);
+    el.removeEventListener('trackpaddown', this.onGripClose);
+    el.removeEventListener('trackpadup', this.onGripOpen);
+    el.removeEventListener('triggerdown', this.onGripClose);
+    el.removeEventListener('triggerup', this.onGripOpen);
+  },
+
+  onGripClose: function (evt) {
+    this.grabbing = true;
+  },
+
+  onGripOpen: function (evt) {
+    var hitEl = this.hitEl;
+    this.grabbing = false;
+    if (!hitEl) { return; }
+    hitEl.removeState(this.GRABBED_STATE);
+    this.hitEl = undefined;
+    this.physics.world.removeConstraint(this.constraint);
+    this.constraint = null;
+  },
+
+  onHit: function (evt) {
+    var hitEl = evt.detail.el;
+    // If the element is already grabbed (it could be grabbed by another controller).
+    // If the hand is not grabbing the element does not stick.
+    // If we're already grabbing something you can't grab again.
+    if (!hitEl || hitEl.is(this.GRABBED_STATE) || !this.grabbing || this.hitEl) { return; }
+    hitEl.addState(this.GRABBED_STATE);
+    this.hitEl = hitEl;
+    this.constraint = new CANNON.LockConstraint(this.el.body, hitEl.body);
+    this.physics.world.addConstraint(this.constraint);
+  }
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/components/grab.min.js


+ 151 - 0
support/client/lib/vwf/model/aframe/extras/components/sphere-collider.js

@@ -0,0 +1,151 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+AFRAME.registerComponent('sphere-collider', require('./src/misc/sphere-collider'));
+},{"./src/misc/sphere-collider":2}],2:[function(require,module,exports){
+/**
+ * Based on aframe/examples/showcase/tracked-controls.
+ *
+ * Implement bounding sphere collision detection for entities with a mesh.
+ * Sets the specified state on the intersected entities.
+ *
+ * @property {string} objects - Selector of the entities to test for collision.
+ * @property {string} state - State to set on collided entities.
+ *
+ */
+module.exports = {
+  schema: {
+    objects: {default: ''},
+    state: {default: 'collided'},
+    radius: {default: 0.05},
+    watch: {default: true}
+  },
+
+  init: function () {
+    /** @type {MutationObserver} */
+    this.observer = null;
+    /** @type {Array<Element>} Elements to watch for collisions. */
+    this.els = [];
+    /** @type {Array<Element>} Elements currently in collision state. */
+    this.collisions = [];
+
+    this.handleHit = this.handleHit.bind(this);
+  },
+
+  remove: function () {
+    this.pause();
+  },
+
+  play: function () {
+    var sceneEl = this.el.sceneEl;
+
+    if (this.data.watch) {
+      this.observer = new MutationObserver(this.update.bind(this, null));
+      this.observer.observe(sceneEl, {childList: true, subtree: true});
+    }
+  },
+
+  pause: function () {
+    if (this.observer) {
+      this.observer.disconnect();
+      this.observer = null;
+    }
+  },
+
+  /**
+   * Update list of entities to test for collision.
+   */
+  update: function () {
+    var data = this.data;
+    var objectEls;
+
+    // Push entities into list of els to intersect.
+    if (data.objects) {
+      objectEls = this.el.sceneEl.querySelectorAll(data.objects);
+    } else {
+      // If objects not defined, intersect with everything.
+      objectEls = this.el.sceneEl.children;
+    }
+    // Convert from NodeList to Array
+    this.els = Array.prototype.slice.call(objectEls);
+  },
+
+  tick: (function () {
+    var position = new THREE.Vector3(),
+        meshPosition = new THREE.Vector3(),
+        meshScale = new THREE.Vector3(),
+        colliderScale = new THREE.Vector3(),
+        distanceMap = new Map();
+    return function () {
+      var el = this.el,
+          data = this.data,
+          mesh = el.getObject3D('mesh'),
+          colliderRadius,
+          collisions = [];
+
+      if (!mesh) { return; }
+
+      distanceMap.clear();
+      position.copy(el.object3D.getWorldPosition());
+      el.object3D.getWorldScale(colliderScale);
+      colliderRadius = data.radius * scaleFactor(colliderScale);
+      // Update collision list.
+      this.els.forEach(intersect);
+
+      // Emit events and add collision states, in order of distance.
+      collisions
+        .sort(function (a, b) {
+          return distanceMap.get(a) > distanceMap.get(b) ? 1 : -1;
+        })
+        .forEach(this.handleHit);
+
+      // Remove collision state from current element.
+      if (collisions.length === 0) { el.emit('hit', {el: null}); }
+
+      // Remove collision state from other elements.
+      this.collisions.filter(function (el) {
+        return !distanceMap.has(el);
+      }).forEach(function removeState (el) {
+        el.removeState(data.state);
+      });
+
+      // Store new collisions
+      this.collisions = collisions;
+
+      // Bounding sphere collision detection
+      function intersect (el) {
+        var radius, mesh, distance, box, extent, size;
+
+        if (!el.isEntity) { return; }
+
+        mesh = el.getObject3D('mesh');
+
+        if (!mesh) { return; }
+
+        box = new THREE.Box3().setFromObject(mesh);
+        size = box.getSize();
+        extent = Math.max(size.x, size.y, size.z) / 2;
+        radius = Math.sqrt(2 * extent * extent);
+        box.getCenter(meshPosition);
+
+        if (!radius) { return; }
+
+        distance = position.distanceTo(meshPosition);
+        if (distance < radius + colliderRadius) {
+          collisions.push(el);
+          distanceMap.set(el, distance);
+        }
+      }
+      // use max of scale factors to maintain bounding sphere collision
+      function scaleFactor (scaleVec) {
+        return Math.max.apply(null, scaleVec.toArray());
+      }
+    };
+  })(),
+
+  handleHit: function (targetEl) {
+    targetEl.emit('hit');
+    targetEl.addState(this.data.state);
+    this.el.emit('hit', {el: targetEl});
+  }
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/components/sphere-collider.min.js


+ 150 - 0
support/client/lib/vwf/model/aframe/extras/components/three-model.js

@@ -0,0 +1,150 @@
+(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
+AFRAME.registerComponent('three-model', require('./src/loaders/three-model'));
+},{"./src/loaders/three-model":2}],2:[function(require,module,exports){
+var DEFAULT_ANIMATION = '__auto__';
+
+/**
+ * three-model
+ *
+ * Loader for THREE.js JSON format. Somewhat confusingly, there are two
+ * different THREE.js formats, both having the .json extension. This loader
+ * supports both, but requires you to specify the mode as "object" or "json".
+ *
+ * Typically, you will use "json" for a single mesh, and "object" for a scene
+ * or multiple meshes. Check the console for errors, if in doubt.
+ *
+ * See: https://clara.io/learn/user-guide/data_exchange/threejs_export
+ */
+module.exports = {
+  deprecated: true,
+
+  schema: {
+    src:               { type: 'asset' },
+    loader:            { default: 'object', oneOf: ['object', 'json'] },
+    enableAnimation:   { default: true },
+    animation:         { default: DEFAULT_ANIMATION },
+    animationDuration: { default: 0 },
+    crossorigin:       { default: '' }
+  },
+
+  init: function () {
+    this.model = null;
+    this.mixer = null;
+    console.warn('[three-model] Component is deprecated. Use json-model or object-model instead.');
+  },
+
+  update: function (previousData) {
+    previousData = previousData || {};
+
+    var loader,
+        data = this.data;
+
+    if (!data.src) {
+      this.remove();
+      return;
+    }
+
+    // First load.
+    if (!Object.keys(previousData).length) {
+      this.remove();
+      if (data.loader === 'object') {
+        loader = new THREE.ObjectLoader();
+        if (data.crossorigin) loader.setCrossOrigin(data.crossorigin);
+        loader.load(data.src, function(loaded) {
+          loaded.traverse( function(object) {
+            if (object instanceof THREE.SkinnedMesh)
+              loaded = object;
+          });
+          if(loaded.material)
+            loaded.material.skinning = !!((loaded.geometry && loaded.geometry.bones) || []).length;
+          this.load(loaded);
+        }.bind(this));
+      } else if (data.loader === 'json') {
+        loader = new THREE.JSONLoader();
+        if (data.crossorigin) loader.crossOrigin = data.crossorigin;
+        loader.load(data.src, function (geometry, materials) {
+
+          // Attempt to automatically detect common material options.
+          materials.forEach(function (mat) {
+            mat.vertexColors = (geometry.faces[0] || {}).color ? THREE.FaceColors : THREE.NoColors;
+            mat.skinning = !!(geometry.bones || []).length;
+            mat.morphTargets = !!(geometry.morphTargets || []).length;
+            mat.morphNormals = !!(geometry.morphNormals || []).length;
+          });
+
+          var mesh = (geometry.bones || []).length
+            ? new THREE.SkinnedMesh(geometry, new THREE.MultiMaterial(materials))
+            : new THREE.Mesh(geometry, new THREE.MultiMaterial(materials));
+
+          this.load(mesh);
+        }.bind(this));
+      } else {
+        throw new Error('[three-model] Invalid mode "%s".', data.mode);
+      }
+      return;
+    }
+
+    var activeAction = this.model && this.model.activeAction;
+
+    if (data.animation !== previousData.animation) {
+      if (activeAction) activeAction.stop();
+      this.playAnimation();
+      return;
+    }
+
+    if (activeAction && data.enableAnimation !== activeAction.isRunning()) {
+      data.enableAnimation ? this.playAnimation() : activeAction.stop();
+    }
+
+    if (activeAction && data.animationDuration) {
+        activeAction.setDuration(data.animationDuration);
+    }
+  },
+
+  load: function (model) {
+    this.model = model;
+    this.mixer = new THREE.AnimationMixer(this.model);
+    this.el.setObject3D('mesh', model);
+    this.el.emit('model-loaded', {format: 'three', model: model});
+
+    if (this.data.enableAnimation) this.playAnimation();
+  },
+
+  playAnimation: function () {
+    var clip,
+        data = this.data,
+        animations = this.model.animations || this.model.geometry.animations || [];
+
+    if (!data.enableAnimation || !data.animation || !animations.length) {
+      return;
+    }
+
+    clip = data.animation === DEFAULT_ANIMATION
+      ? animations[0]
+      : THREE.AnimationClip.findByName(animations, data.animation);
+
+    if (!clip) {
+      console.error('[three-model] Animation "%s" not found.', data.animation);
+      return;
+    }
+
+    this.model.activeAction = this.mixer.clipAction(clip, this.model);
+    if (data.animationDuration) {
+      this.model.activeAction.setDuration(data.animationDuration);
+    }
+    this.model.activeAction.play();
+  },
+
+  remove: function () {
+    if (this.mixer) this.mixer.stopAllAction();
+    if (this.model) this.el.removeObject3D('mesh');
+  },
+
+  tick: function (t, dt) {
+    if (this.mixer && !isNaN(dt)) {
+      this.mixer.update(dt / 1000);
+    }
+  }
+};
+
+},{}]},{},[1]);

File diff suppressed because it is too large
+ 0 - 0
support/client/lib/vwf/model/aframe/extras/components/three-model.min.js


+ 89 - 0
support/client/lib/vwf/model/aframeComponent.js

@@ -270,6 +270,45 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                 }
 
 
+                if (value === undefined && aframeObject.el.getAttribute(aframeObject.compName)) {
+                    
+                                        value = propertyValue;
+                    
+
+                                        let parentNodeAF = aframeObject.el;
+
+                    switch (propertyName) {
+
+                        case "clip":
+                        parentNodeAF.setAttribute(aframeObject.compName, 'clip', propertyValue);
+                            break;
+
+                        case "duration":
+                        parentNodeAF.setAttribute(aframeObject.compName, 'duration', propertyValue);
+                            break;
+
+                        case "crossFadeDuration":
+                        parentNodeAF.setAttribute(aframeObject.compName, 'crossFadeDuration', propertyValue);
+                            break;
+
+                        case "loop":
+                        parentNodeAF.setAttribute(aframeObject.compName, 'loop', propertyValue);
+                            break;
+
+                            case "repetitions":
+                            parentNodeAF.setAttribute(aframeObject.compName, 'repetitions', propertyValue);
+                                break;
+
+                        default:
+                            value = undefined;
+                            break;
+
+
+                    }
+
+                }
+
+
                 if (value === undefined && aframeObject.el.getAttribute(aframeObject.compName)) {
                     
                                         value = propertyValue;
@@ -426,6 +465,38 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
                 }
 
 
+                if (value === undefined && isAAnimMixerDefinition(node.prototypes)) {
+                    value = propertyValue;
+
+                    // let parentNodeAF = self.state.nodes[node.parentID].aframeObj;
+                    let parentNodeAF = aframeObject.el;
+
+                    switch (propertyName) {
+
+                        case "clip":
+                            value = parentNodeAF.getAttribute(aframeObject.compName).clip;
+                            break;
+
+                        case "duration":
+                            value = parentNodeAF.getAttribute(aframeObject.compName).duration;
+                            break;
+
+                        case "crossFadeDuration":
+                            value = parentNodeAF.getAttribute(aframeObject.compName).crossFadeDuration;
+                            break;
+
+                        case "loop":
+                            value = parentNodeAF.getAttribute(aframeObject.compName).loop;
+                            break;
+
+                            case "repetitions":
+                            value = parentNodeAF.getAttribute(aframeObject.compName).repetitions;
+                            break;
+
+                    }
+
+                }
+
 
                 if (value === undefined && isAInterpolationDefinition(node.prototypes)) {
                     value = propertyValue;
@@ -525,6 +596,15 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
 
 
 
+    function isAAnimMixerDefinition(prototypes) {
+        var found = false;
+        if (prototypes) {
+            for (var i = 0; i < prototypes.length && !found; i++) {
+                found = (prototypes[i] == "http://vwf.example.com/aframe/anim-mixer-component.vwf");
+            }
+        }
+        return found;
+    }
 
     function isAInterpolationDefinition(prototypes) {
         var found = false;
@@ -610,6 +690,15 @@ define(["module", "vwf/model", "vwf/utility"], function (module, model, utility)
 
         }
 
+        if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/anim-mixer-component.vwf")) {
+            
+ 
+                // aframeObj.el.setAttribute(node.type, {});
+             aframeObj.compName = "animation-mixer";
+             aframeObj.el.setAttribute(aframeObj.compName, {});
+ 
+         }
+
         if (self.state.isComponentClass(protos, "http://vwf.example.com/aframe/app-envmap-component.vwf")) {
             
  

+ 9 - 3
support/client/lib/vwf/view/aframe.js

@@ -145,7 +145,8 @@ define(["module", "vwf/view"], function (module, view) {
                 if (!self.state.nodes[avatarName]) {
 
                 vwf_view.kernel.createChild(nodeID, avatarName, newNode);
-                vwf_view.kernel.callMethod(avatarName, "createAvatarBody");
+                vwf_view.kernel.callMethod(avatarName, "createAvatarBody", []);
+                //"/../assets/avatars/male/avatar1.gltf"
                 }
 
             }
@@ -180,8 +181,11 @@ define(["module", "vwf/view"], function (module, view) {
 
             if ( postion && rotation) {
                 //[postion.x, postion.y, postion.z] //[rotation.x, rotation.y, rotation.z]
-            vwf_view.kernel.setProperty(avatarName, "position", AFRAME.utils.coordinates.stringify(postion));
-            vwf_view.kernel.setProperty(avatarName, "rotation", AFRAME.utils.coordinates.stringify(rotation));
+
+                vwf_view.kernel.callMethod(avatarName, "followAvatarControl", [postion, rotation]);
+
+            // vwf_view.kernel.setProperty(avatarName, "position", AFRAME.utils.coordinates.stringify(postion));
+            // vwf_view.kernel.setProperty(avatarName, "rotation", AFRAME.utils.coordinates.stringify(rotation));
             }
         }
     }
@@ -197,6 +201,8 @@ define(["module", "vwf/view"], function (module, view) {
         controlEl.setAttribute('look-controls', {});
         controlEl.setAttribute('gamepad-controls', {});
         controlEl.setAttribute('camera', 'active', true);
+        controlEl.setAttribute('camera', 'near', 0.51);
+
         aScene.appendChild(controlEl);
 
         let cursorEl = document.createElement('a-cursor');

+ 158 - 2
support/client/lib/vwf/view/editor-new.js

@@ -161,6 +161,50 @@ define([
             );
 
 
+            function avatarCardDef(src, desc, onclickfunc) {
+
+                return {
+                    $cell: true,
+                    $type: "div",
+                    class: "mdc-card avatar-card",
+                    $init: function () {
+                        this.style.backgroundImage = 'linear-gradient(0deg, rgba(0, 0, 0, 0.0), rgba(0, 0, 0, 0.0) ), url(' + src + ')'
+
+                    },
+                    onclick: onclickfunc,
+                    $components: [
+                        {
+                            $type: "section",
+                            class: "mdc-card__primary",
+                            $components: [
+                                {
+                                    $type: "h1",
+                                    class: "mdc-card__title mdc-card__title--large",
+                                    $text: desc.subtitle
+                                },
+                                {
+                                    $type: "h2",
+                                    class: "mdc-card__subtitle",
+                                    $text: desc.title
+                                }
+                            ]
+                        },
+                        {
+                            $type: "section",
+                            class: "mdc-card__actions",
+                            $components: [
+                                {
+                                    $type: "button",
+                                    class: "mdc-button mdc-button--compact mdc-card__action",
+                                    //$text: "Use it",
+                                    onclick: onclickfunc
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+
             let avatarSettings =
                 {
                     $cell: true,
@@ -196,17 +240,128 @@ define([
                                             $text: "Hide cursor",
                                             onclick: function (e) {
                                                 //document.querySelector('#' + 'viewSettings').style.visibility = 'hidden';
-                                                let cursorID = 'myCursor-avatar-' + self.kernel.moniker();
+                                                let avatarID = 'avatar-' + self.kernel.moniker();
+                                                let cursorID = 'myCursor-' + avatarID;
                                                 let controlEl = document.querySelector("[id='" + cursorID + "']");
                                                 let vis = controlEl.getAttribute('visible');
                                                 this.$text = vis ? 'Show cursor' : 'Hide cursor';
-                                                controlEl.setAttribute('visible', !vis);
+
+                                                vwf_view.kernel.callMethod(avatarID, "showHideCursor", [!vis]);
+                                                //controlEl.setAttribute('visible', !vis);
                                             }
 
                                         }
 
+                                    ]
+                                },
+                                {
+                                    $cell: true,
+                                    $type: "div",
+                                    class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",
+                                    $components: [
+
+                                        {
+                                            $type: "div",
+                                            class: "mdc-layout-grid",
+                                            $components: [
+                                                {
+                                                    $type: "div",
+                                                    class: "mdc-layout-grid__inner",
+                                                    $components: [
+
+                                                        {
+                                                            $cell: true,
+                                                            $type: "div",
+                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",
+                                                            $components: [
+
+                                                                avatarCardDef("/../assets/avatars/ico/simple.jpg", { title: "Simple", subtitle: "Cube" },
+                                                                    function (e) {
+                                                                        let avatarID = 'avatar-' + self.kernel.moniker();
+                                                                        vwf_view.kernel.callMethod(avatarID, "createSimpleAvatar");
+
+                                                                    }
+                                                                )
+                                                            ]
+                                                        },
+                                                        {
+                                                            $cell: true,
+                                                            $type: "div",
+                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",
+                                                            $components: [
+                                                                avatarCardDef("/../assets/avatars/ico/female.jpg", { title: "Human", subtitle: "Female" },
+                                                                    function (e) {
+                                                                        let avatarID = 'avatar-' + self.kernel.moniker();
+                                                                        vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/female/avatar1.gltf"]);
+                                                                    }
+                                                                )]
+                                                        },
+                                                        {
+                                                            $cell: true,
+                                                            $type: "div",
+                                                            class: "mdc-layout-grid__cell mdc-layout-grid__cell--span-12",
+                                                            $components: [
+                                                                avatarCardDef("/../assets/avatars/ico/male.jpg", { title: "Human", subtitle: "Male" },
+                                                                    function (e) {
+                                                                        let avatarID = 'avatar-' + self.kernel.moniker();
+                                                                        vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/male/avatar1.gltf"]);
+                                                                    }
+                                                                )]
+                                                        }
+
+                                                    ]
+                                                }
+                                            ]
+
+                                        },
+
+                                        // {
+                                        //     $cell: true,
+                                        //     $type: "button",
+                                        //     class: "mdc-button mdc-button--raised",
+                                        //     $text: "Simple Avatar",
+                                        //     onclick: function (e) {
+                                        //         let avatarID = 'avatar-' + self.kernel.moniker();
+                                        //         vwf_view.kernel.callMethod(avatarID, "createSimpleAvatar");
+
+                                        //     }
+
+                                        // },
+                                        // {
+                                        //     $cell: true,
+                                        //     $type: "button",
+                                        //     class: "mdc-button mdc-button--raised",
+                                        //     $text: "Male Avatar",
+                                        //     onclick: function (e) {
+
+                                        //         let avatarID = 'avatar-' + self.kernel.moniker();
+                                        //         vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/male/avatar1.gltf"]);
+
+
+
+                                        //     }
+
+                                        // },
+                                        // {
+                                        //     $cell: true,
+                                        //     $type: "button",
+                                        //     class: "mdc-button mdc-button--raised",
+                                        //     $text: "Female Avatar",
+                                        //     onclick: function (e) {
+
+                                        //         let avatarID = 'avatar-' + self.kernel.moniker();
+                                        //         vwf_view.kernel.callMethod(avatarID, "createAvatarFromGLTF", ["/../assets/avatars/female/avatar1.gltf"]);
+
+
+
+                                        //     }
+
+                                        // },
+
+
                                     ]
                                 }
+
                             ]
                         }
                     ]
@@ -1558,6 +1713,7 @@ define([
                             class: "mdc-toolbar__title catalog-title",
                             $text: "LiveCoding.space"
                         }
+                        
                     ]
                 }]
 

+ 16 - 1
support/client/lib/vwf/view/lib/editorLive.css

@@ -131,4 +131,19 @@
 
       .userList {
         padding-left: 16px;
-      }
+      }
+
+      .avatar-card {
+        cursor:pointer;
+        background-repeat: no-repeat;
+        height: 200px;
+        background-position: center top;
+        background-size: 100%;
+      }
+
+  /*    .avatar-card .mdc-card__primary,
+      .avatar-card .mdc-card__actions {
+        background: rgba(0, 0, 0, .4);
+      }
+
+      */

+ 0 - 21
support/client/lib/vwf/view/lib/mdc/dist/material-components-web.css

@@ -12900,13 +12900,6 @@ fieldset:disabled .mdc-radio__native-control + .mdc-radio__background,
       -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
       transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
       opacity: 1; }
-    .mdc-textfield__input::-moz-placeholder {
-      /* @alternate */
-      color: rgba(0, 0, 0, 0.38);
-      color: var(--mdc-theme-text-hint-on-light, rgba(0, 0, 0, 0.38));
-      -webkit-transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
-      transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);
-      opacity: 1; }
     .mdc-textfield__input:-ms-input-placeholder {
       /* @alternate */
       color: rgba(0, 0, 0, 0.38);
@@ -12927,10 +12920,6 @@ fieldset:disabled .mdc-radio__native-control + .mdc-radio__background,
         /* @alternate */
         color: rgba(0, 0, 0, 0.54);
         color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
-      .mdc-textfield__input:focus::-moz-placeholder {
-        /* @alternate */
-        color: rgba(0, 0, 0, 0.54);
-        color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54)); }
       .mdc-textfield__input:focus:-ms-input-placeholder {
         /* @alternate */
         color: rgba(0, 0, 0, 0.54);
@@ -12952,11 +12941,6 @@ fieldset:disabled .mdc-radio__native-control + .mdc-radio__background,
         /* @alternate */
         color: rgba(255, 255, 255, 0.5);
         color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
-      .mdc-textfield__input--theme-dark::-moz-placeholder,
-      .mdc-theme--dark .mdc-textfield__input::-moz-placeholder {
-        /* @alternate */
-        color: rgba(255, 255, 255, 0.5);
-        color: var(--mdc-theme-text-hint-on-dark, rgba(255, 255, 255, 0.5)); }
       .mdc-textfield__input--theme-dark:-ms-input-placeholder,
       .mdc-theme--dark .mdc-textfield__input:-ms-input-placeholder {
         /* @alternate */
@@ -12972,11 +12956,6 @@ fieldset:disabled .mdc-radio__native-control + .mdc-radio__background,
         /* @alternate */
         color: rgba(255, 255, 255, 0.7);
         color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
-      .mdc-textfield__input--theme-dark:focus::-moz-placeholder,
-      .mdc-theme--dark .mdc-textfield__input:focus::-moz-placeholder {
-        /* @alternate */
-        color: rgba(255, 255, 255, 0.7);
-        color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
       .mdc-textfield__input--theme-dark:focus:-ms-input-placeholder,
       .mdc-theme--dark .mdc-textfield__input:focus:-ms-input-placeholder {
         /* @alternate */

+ 0 - 81
support/client/lib/vwf/view/lib/mdc/dist/material-components-web.css-entry

@@ -1,81 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 0);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-/******/ ]);

File diff suppressed because it is too large
+ 568 - 394
support/client/lib/vwf/view/lib/mdc/dist/material-components-web.js


File diff suppressed because it is too large
+ 5 - 0
support/client/lib/vwf/view/lib/mdc/dist/material-components-web.min.css


File diff suppressed because it is too large
+ 5 - 0
support/client/lib/vwf/view/lib/mdc/dist/material-components-web.min.js


+ 0 - 20
support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.css

@@ -1,20 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-.mdc-animation-deceleration-curve {
-  -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-          animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-
-.mdc-animation-standard-curve {
-  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-          animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-
-.mdc-animation-acceleration-curve {
-  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
-          animation-timing-function: cubic-bezier(0.4, 0, 1, 1); }
-
-.mdc-animation-sharp-curve {
-  -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1);
-          animation-timing-function: cubic-bezier(0.4, 0, 0.6, 1); }

+ 0 - 82
support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.css-entry

@@ -1,82 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 1);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */,
-/* 1 */
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-/******/ ]);

+ 0 - 243
support/client/lib/vwf/view/lib/mdc/dist/mdc.animation.js

@@ -1,243 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["animation"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["animation"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 81);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 81:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(9);
-
-
-/***/ }),
-
-/***/ 9:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformStyleProperties", function() { return transformStyleProperties; });
-/* harmony export (immutable) */ __webpack_exports__["getCorrectEventName"] = getCorrectEventName;
-/* harmony export (immutable) */ __webpack_exports__["getCorrectPropertyName"] = getCorrectPropertyName;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {{
- *   noPrefix: string,
- *   webkitPrefix: string
- * }}
- */
-var VendorPropertyMapType = void 0;
-
-/** @const {Object<string, !VendorPropertyMapType>} */
-var eventTypeMap = {
-  'animationstart': {
-    noPrefix: 'animationstart',
-    webkitPrefix: 'webkitAnimationStart',
-    styleProperty: 'animation'
-  },
-  'animationend': {
-    noPrefix: 'animationend',
-    webkitPrefix: 'webkitAnimationEnd',
-    styleProperty: 'animation'
-  },
-  'animationiteration': {
-    noPrefix: 'animationiteration',
-    webkitPrefix: 'webkitAnimationIteration',
-    styleProperty: 'animation'
-  },
-  'transitionend': {
-    noPrefix: 'transitionend',
-    webkitPrefix: 'webkitTransitionEnd',
-    styleProperty: 'transition'
-  }
-};
-
-/** @const {Object<string, !VendorPropertyMapType>} */
-var cssPropertyMap = {
-  'animation': {
-    noPrefix: 'animation',
-    webkitPrefix: '-webkit-animation'
-  },
-  'transform': {
-    noPrefix: 'transform',
-    webkitPrefix: '-webkit-transform'
-  },
-  'transition': {
-    noPrefix: 'transition',
-    webkitPrefix: '-webkit-transition'
-  }
-};
-
-/**
- * @param {!Object} windowObj
- * @return {boolean}
- */
-function hasProperShape(windowObj) {
-  return windowObj['document'] !== undefined && typeof windowObj['document']['createElement'] === 'function';
-}
-
-/**
- * @param {string} eventType
- * @return {boolean}
- */
-function eventFoundInMaps(eventType) {
-  return eventType in eventTypeMap || eventType in cssPropertyMap;
-}
-
-/**
- * @param {string} eventType
- * @param {!Object<string, !VendorPropertyMapType>} map
- * @param {!Element} el
- * @return {string}
- */
-function getJavaScriptEventName(eventType, map, el) {
-  return map[eventType].styleProperty in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
-}
-
-/**
- * Helper function to determine browser prefix for CSS3 animation events
- * and property names.
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getAnimationName(windowObj, eventType) {
-  if (!hasProperShape(windowObj) || !eventFoundInMaps(eventType)) {
-    return eventType;
-  }
-
-  var map = /** @type {!Object<string, !VendorPropertyMapType>} */eventType in eventTypeMap ? eventTypeMap : cssPropertyMap;
-  var el = windowObj['document']['createElement']('div');
-  var eventName = '';
-
-  if (map === eventTypeMap) {
-    eventName = getJavaScriptEventName(eventType, map, el);
-  } else {
-    eventName = map[eventType].noPrefix in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
-  }
-
-  return eventName;
-}
-
-// Public functions to access getAnimationName() for JavaScript events or CSS
-// property names.
-
-var transformStyleProperties = ['transform', 'WebkitTransform', 'MozTransform', 'OTransform', 'MSTransform'];
-
-/**
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getCorrectEventName(windowObj, eventType) {
-  return getAnimationName(windowObj, eventType);
-}
-
-/**
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getCorrectPropertyName(windowObj, eventType) {
-  return getAnimationName(windowObj, eventType);
-}
-
-/***/ })
-
-/******/ });
-});

+ 0 - 178
support/client/lib/vwf/view/lib/mdc/dist/mdc.autoInit.js

@@ -1,178 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["autoInit"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["autoInit"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 82);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 23:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (immutable) */ __webpack_exports__["default"] = mdcAutoInit;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var registry = Object.create(null);
-
-var CONSOLE_WARN = console.warn.bind(console);
-
-/**
- * Auto-initializes all mdc components on a page.
- */
-function mdcAutoInit() {
-  var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
-  var warn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CONSOLE_WARN;
-
-  var nodes = root.querySelectorAll('[data-mdc-auto-init]');
-  for (var i = 0, node; node = nodes[i]; i++) {
-    var ctorName = node.dataset.mdcAutoInit;
-    if (!ctorName) {
-      throw new Error('(mdc-auto-init) Constructor name must be given.');
-    }
-
-    var Ctor = registry[ctorName];
-    if (typeof Ctor !== 'function') {
-      throw new Error('(mdc-auto-init) Could not find constructor in registry for ' + ctorName);
-    }
-
-    if (node[ctorName]) {
-      warn('(mdc-auto-init) Component already initialized for ' + node + '. Skipping...');
-      continue;
-    }
-
-    // TODO: Should we make an eslint rule for an attachTo() static method?
-    var component = Ctor.attachTo(node);
-    Object.defineProperty(node, ctorName, {
-      value: component,
-      writable: false,
-      enumerable: false,
-      configurable: true
-    });
-  }
-}
-
-mdcAutoInit.register = function (componentName, Ctor) {
-  var warn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : CONSOLE_WARN;
-
-  if (typeof Ctor !== 'function') {
-    throw new Error('(mdc-auto-init) Invalid Ctor value ' + Ctor + '. Expected function');
-  }
-  if (registry[componentName]) {
-    warn('(mdc-auto-init) Overriding registration for ' + componentName + ' with ' + Ctor + '. ' + ('Was: ' + registry[componentName]));
-  }
-  registry[componentName] = Ctor;
-};
-
-mdcAutoInit.deregister = function (componentName) {
-  delete registry[componentName];
-};
-
-mdcAutoInit.deregisterAll = function () {
-  Object.keys(registry).forEach(this.deregister, this);
-};
-
-/***/ }),
-
-/***/ 82:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(23);
-
-
-/***/ })
-
-/******/ });
-});

+ 0 - 438
support/client/lib/vwf/view/lib/mdc/dist/mdc.base.js

@@ -1,438 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["base"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["base"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 83);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 0:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @template A
- */
-var MDCFoundation = function () {
-  _createClass(MDCFoundation, null, [{
-    key: "cssClasses",
-
-    /** @return enum{cssClasses} */
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports every
-      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
-      return {};
-    }
-
-    /** @return enum{strings} */
-
-  }, {
-    key: "strings",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
-      return {};
-    }
-
-    /** @return enum{numbers} */
-
-  }, {
-    key: "numbers",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
-      return {};
-    }
-
-    /** @return {!Object} */
-
-  }, {
-    key: "defaultAdapter",
-    get: function get() {
-      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
-      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
-      // validation.
-      return {};
-    }
-
-    /**
-     * @param {A=} adapter
-     */
-
-  }]);
-
-  function MDCFoundation() {
-    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, MDCFoundation);
-
-    /** @protected {!A} */
-    this.adapter_ = adapter;
-  }
-
-  _createClass(MDCFoundation, [{
-    key: "init",
-    value: function init() {
-      // Subclasses should override this method to perform initialization routines (registering events, etc.)
-    }
-  }, {
-    key: "destroy",
-    value: function destroy() {
-      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
-    }
-  }]);
-
-  return MDCFoundation;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
-
-/***/ }),
-
-/***/ 1:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/**
- * @template F
- */
-
-var MDCComponent = function () {
-  _createClass(MDCComponent, null, [{
-    key: 'attachTo',
-
-    /**
-     * @param {!Element} root
-     * @return {!MDCComponent}
-     */
-    value: function attachTo(root) {
-      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
-      // returns an instantiated component with its root set to that element. Also note that in the cases of
-      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
-      // from getDefaultFoundation().
-      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
-    }
-
-    /**
-     * @param {!Element} root
-     * @param {F=} foundation
-     * @param {...?} args
-     */
-
-  }]);
-
-  function MDCComponent(root) {
-    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-    _classCallCheck(this, MDCComponent);
-
-    /** @protected {!Element} */
-    this.root_ = root;
-
-    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
-
-    this.initialize.apply(this, args);
-    // Note that we initialize foundation here and not within the constructor's default param so that
-    // this.root_ is defined and can be used within the foundation class.
-    /** @protected {!F} */
-    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
-    this.foundation_.init();
-    this.initialSyncWithDOM();
-  }
-
-  _createClass(MDCComponent, [{
-    key: 'initialize',
-    value: function initialize() /* ...args */{}
-    // Subclasses can override this to do any additional setup work that would be considered part of a
-    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
-    // initialized. Any additional arguments besides root and foundation will be passed in here.
-
-
-    /**
-     * @return {!F} foundation
-     */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      // Subclasses must override this method to return a properly configured foundation class for the
-      // component.
-      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
-      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
-      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
-      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      // Subclasses may implement this method to release any resources / deregister any listeners they have
-      // attached. An example of this might be deregistering a resize event from the window object.
-      this.foundation_.destroy();
-    }
-
-    /**
-     * Wrapper method to add an event listener to the component's root element. This is most useful when
-     * listening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'listen',
-    value: function listen(evtType, handler) {
-      this.root_.addEventListener(evtType, handler);
-    }
-
-    /**
-     * Wrapper method to remove an event listener to the component's root element. This is most useful when
-     * unlistening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'unlisten',
-    value: function unlisten(evtType, handler) {
-      this.root_.removeEventListener(evtType, handler);
-    }
-
-    /**
-     * Fires a cross-browser-compatible custom event from the component root of the given type,
-     * with the given data.
-     * @param {string} evtType
-     * @param {!Object} evtData
-     * @param {boolean=} shouldBubble
-     */
-
-  }, {
-    key: 'emit',
-    value: function emit(evtType, evtData) {
-      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-      var evt = void 0;
-      if (typeof CustomEvent === 'function') {
-        evt = new CustomEvent(evtType, {
-          detail: evtData,
-          bubbles: shouldBubble
-        });
-      } else {
-        evt = document.createEvent('CustomEvent');
-        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
-      }
-
-      this.root_.dispatchEvent(evt);
-    }
-  }]);
-
-  return MDCComponent;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
-
-/***/ }),
-
-/***/ 2:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__selection_control__ = __webpack_require__(3);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__foundation__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCComponent", function() { return __WEBPACK_IMPORTED_MODULE_1__component__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionControlState", function() { return __WEBPACK_IMPORTED_MODULE_2__selection_control__["a"]; });
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {!{
- *   checked: boolean,
- *   indeterminate: boolean,
- *   disabled: boolean,
- *   value: ?string
- * }}
- */
-var SelectionControlState = void 0;
-
-/***/ }),
-
-/***/ 83:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(2);
-
-
-/***/ })
-
-/******/ });
-});

+ 0 - 1059
support/client/lib/vwf/view/lib/mdc/dist/mdc.button.css

@@ -1,1059 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
-@-webkit-keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-@keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-@keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-.mdc-button {
-  --mdc-ripple-surface-width: 0;
-  --mdc-ripple-surface-height: 0;
-  --mdc-ripple-fg-size: 0;
-  --mdc-ripple-left: 0;
-  --mdc-ripple-top: 0;
-  --mdc-ripple-fg-scale: 1;
-  --mdc-ripple-fg-translate-end: 0;
-  --mdc-ripple-fg-translate-start: 0;
-  will-change: transform, opacity;
-  -webkit-tap-highlight-color: transparent;
-  /* @alternate */
-  color: rgba(0, 0, 0, 0.87);
-  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
-  font-family: Roboto, sans-serif;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-font-smoothing: antialiased;
-  display: inline-block;
-  position: relative;
-  min-width: 64px;
-  height: 36px;
-  padding: 0 16px;
-  border: none;
-  border-radius: 2px;
-  outline: none;
-  background: transparent;
-  font-size: 14px;
-  font-weight: 500;
-  letter-spacing: .04em;
-  line-height: 36px;
-  text-align: center;
-  text-decoration: none;
-  text-transform: uppercase;
-  overflow: hidden;
-  vertical-align: middle;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  -webkit-appearance: none; }
-  .mdc-button:not(.mdc-ripple-upgraded):hover::before, .mdc-button:not(.mdc-ripple-upgraded):focus::before, .mdc-button:not(.mdc-ripple-upgraded):active::after {
-    -webkit-transition-duration: 85ms;
-            transition-duration: 85ms;
-    opacity: .6; }
-  .mdc-button::before {
-    background-color: rgba(0, 0, 0, 0.06);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-  .mdc-button.mdc-ripple-upgraded::before {
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-button.mdc-ripple-upgraded--background-focused::before {
-    opacity: .99999; }
-  .mdc-button.mdc-ripple-upgraded--background-active-fill::before {
-    -webkit-transition-duration: 120ms;
-            transition-duration: 120ms;
-    opacity: 1; }
-  .mdc-button.mdc-ripple-upgraded--unbounded::before {
-    /* @alternate */
-    top: calc(50% - 50%);
-    top: var(--mdc-ripple-top, calc(50% - 50%));
-    /* @alternate */
-    left: calc(50% - 50%);
-    left: var(--mdc-ripple-left, calc(50% - 50%));
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-button::after {
-    background-color: rgba(0, 0, 0, 0.06);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-  .mdc-button.mdc-ripple-upgraded::after {
-    top: 0;
-    left: 0;
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center;
-    opacity: 0; }
-  .mdc-button:not(.mdc-ripple-upgraded--unbounded)::after {
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-button.mdc-ripple-upgraded--unbounded::after {
-    /* @alternate */
-    top: 0;
-    top: var(--mdc-ripple-top, 0);
-    /* @alternate */
-    left: 0;
-    left: var(--mdc-ripple-left, 0);
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-button.mdc-ripple-upgraded--foreground-activation::after {
-    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-  .mdc-button.mdc-ripple-upgraded--foreground-deactivation::after {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-            animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-button:not(.mdc-ripple-upgraded) {
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0.18); }
-  .mdc-button--theme-dark,
-  .mdc-theme--dark .mdc-button {
-    --mdc-ripple-surface-width: 0;
-    --mdc-ripple-surface-height: 0;
-    --mdc-ripple-fg-size: 0;
-    --mdc-ripple-left: 0;
-    --mdc-ripple-top: 0;
-    --mdc-ripple-fg-scale: 1;
-    --mdc-ripple-fg-translate-end: 0;
-    --mdc-ripple-fg-translate-start: 0;
-    will-change: transform, opacity;
-    -webkit-tap-highlight-color: transparent;
-    /* @alternate */
-    color: white;
-    color: var(--mdc-theme-text-primary-on-dark, white); }
-    .mdc-button--theme-dark:not(.mdc-ripple-upgraded):hover::before, .mdc-button--theme-dark:not(.mdc-ripple-upgraded):focus::before, .mdc-button--theme-dark:not(.mdc-ripple-upgraded):active::after,
-    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):hover::before,
-    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):focus::before,
-    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded):active::after {
-      -webkit-transition-duration: 85ms;
-              transition-duration: 85ms;
-      opacity: .6; }
-    .mdc-button--theme-dark::before,
-    .mdc-theme--dark .mdc-button::before {
-      background-color: rgba(255, 255, 255, 0.14);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded::before,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded::before {
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--background-focused::before,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--background-focused::before {
-      opacity: .99999; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--background-active-fill::before,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--background-active-fill::before {
-      -webkit-transition-duration: 120ms;
-              transition-duration: 120ms;
-      opacity: 1; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--unbounded::before,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--unbounded::before {
-      /* @alternate */
-      top: calc(50% - 50%);
-      top: var(--mdc-ripple-top, calc(50% - 50%));
-      /* @alternate */
-      left: calc(50% - 50%);
-      left: var(--mdc-ripple-left, calc(50% - 50%));
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button--theme-dark::after,
-    .mdc-theme--dark .mdc-button::after {
-      background-color: rgba(255, 255, 255, 0.14);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded::after,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded::after {
-      top: 0;
-      left: 0;
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center;
-      opacity: 0; }
-    .mdc-button--theme-dark:not(.mdc-ripple-upgraded--unbounded)::after,
-    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded--unbounded)::after {
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--unbounded::after,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--unbounded::after {
-      /* @alternate */
-      top: 0;
-      top: var(--mdc-ripple-top, 0);
-      /* @alternate */
-      left: 0;
-      left: var(--mdc-ripple-left, 0);
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--foreground-activation::after,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--foreground-activation::after {
-      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-    .mdc-button--theme-dark.mdc-ripple-upgraded--foreground-deactivation::after,
-    .mdc-theme--dark .mdc-button.mdc-ripple-upgraded--foreground-deactivation::after {
-      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-              animation: 83ms mdc-ripple-fg-opacity-out; }
-    .mdc-button--theme-dark:not(.mdc-ripple-upgraded),
-    .mdc-theme--dark .mdc-button:not(.mdc-ripple-upgraded) {
-      -webkit-tap-highlight-color: rgba(255, 255, 255, 0.18); }
-  .mdc-button.mdc-button--primary {
-    --mdc-ripple-surface-width: 0;
-    --mdc-ripple-surface-height: 0;
-    --mdc-ripple-fg-size: 0;
-    --mdc-ripple-left: 0;
-    --mdc-ripple-top: 0;
-    --mdc-ripple-fg-scale: 1;
-    --mdc-ripple-fg-translate-end: 0;
-    --mdc-ripple-fg-translate-start: 0;
-    will-change: transform, opacity;
-    -webkit-tap-highlight-color: transparent; }
-    .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):hover::before, .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):focus::before, .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded):active::after {
-      -webkit-transition-duration: 85ms;
-              transition-duration: 85ms;
-      opacity: .6; }
-    .mdc-button.mdc-button--primary::before {
-      /* @alternate */
-      background-color: rgba(63, 81, 181, 0.12);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-      @supports (background-color: color(green a(10%))) {
-        .mdc-button.mdc-button--primary::before {
-          background-color: color(var(--mdc-theme-primary, #3f51b5) a(12%)); } }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded::before {
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--background-focused::before {
-      opacity: .99999; }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--background-active-fill::before {
-      -webkit-transition-duration: 120ms;
-              transition-duration: 120ms;
-      opacity: 1; }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--unbounded::before {
-      /* @alternate */
-      top: calc(50% - 50%);
-      top: var(--mdc-ripple-top, calc(50% - 50%));
-      /* @alternate */
-      left: calc(50% - 50%);
-      left: var(--mdc-ripple-left, calc(50% - 50%));
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button.mdc-button--primary::after {
-      /* @alternate */
-      background-color: rgba(63, 81, 181, 0.12);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-      @supports (background-color: color(green a(10%))) {
-        .mdc-button.mdc-button--primary::after {
-          background-color: color(var(--mdc-theme-primary, #3f51b5) a(12%)); } }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded::after {
-      top: 0;
-      left: 0;
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center;
-      opacity: 0; }
-    .mdc-button.mdc-button--primary:not(.mdc-ripple-upgraded--unbounded)::after {
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--unbounded::after {
-      /* @alternate */
-      top: 0;
-      top: var(--mdc-ripple-top, 0);
-      /* @alternate */
-      left: 0;
-      left: var(--mdc-ripple-left, 0);
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--foreground-activation::after {
-      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-    .mdc-button.mdc-button--primary.mdc-ripple-upgraded--foreground-deactivation::after {
-      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-              animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-button.mdc-button--accent {
-    --mdc-ripple-surface-width: 0;
-    --mdc-ripple-surface-height: 0;
-    --mdc-ripple-fg-size: 0;
-    --mdc-ripple-left: 0;
-    --mdc-ripple-top: 0;
-    --mdc-ripple-fg-scale: 1;
-    --mdc-ripple-fg-translate-end: 0;
-    --mdc-ripple-fg-translate-start: 0;
-    will-change: transform, opacity;
-    -webkit-tap-highlight-color: transparent; }
-    .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):hover::before, .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):focus::before, .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded):active::after {
-      -webkit-transition-duration: 85ms;
-              transition-duration: 85ms;
-      opacity: .6; }
-    .mdc-button.mdc-button--accent::before {
-      /* @alternate */
-      background-color: rgba(255, 64, 129, 0.12);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-      @supports (background-color: color(green a(10%))) {
-        .mdc-button.mdc-button--accent::before {
-          background-color: color(var(--mdc-theme-accent, #ff4081) a(12%)); } }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded::before {
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--background-focused::before {
-      opacity: .99999; }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--background-active-fill::before {
-      -webkit-transition-duration: 120ms;
-              transition-duration: 120ms;
-      opacity: 1; }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--unbounded::before {
-      /* @alternate */
-      top: calc(50% - 50%);
-      top: var(--mdc-ripple-top, calc(50% - 50%));
-      /* @alternate */
-      left: calc(50% - 50%);
-      left: var(--mdc-ripple-left, calc(50% - 50%));
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-button.mdc-button--accent::after {
-      /* @alternate */
-      background-color: rgba(255, 64, 129, 0.12);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-      @supports (background-color: color(green a(10%))) {
-        .mdc-button.mdc-button--accent::after {
-          background-color: color(var(--mdc-theme-accent, #ff4081) a(12%)); } }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded::after {
-      top: 0;
-      left: 0;
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center;
-      opacity: 0; }
-    .mdc-button.mdc-button--accent:not(.mdc-ripple-upgraded--unbounded)::after {
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--unbounded::after {
-      /* @alternate */
-      top: 0;
-      top: var(--mdc-ripple-top, 0);
-      /* @alternate */
-      left: 0;
-      left: var(--mdc-ripple-left, 0);
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--foreground-activation::after {
-      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-    .mdc-button.mdc-button--accent.mdc-ripple-upgraded--foreground-deactivation::after {
-      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-              animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-button:active {
-    outline: none; }
-  .mdc-button:hover {
-    cursor: pointer; }
-  .mdc-button::-moz-focus-inner {
-    padding: 0;
-    border: 0; }
-  .mdc-button--dense {
-    height: 32px;
-    font-size: .8125rem;
-    line-height: 32px; }
-  .mdc-button--raised {
-    -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-    -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-    transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-    transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-    transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-    will-change: box-shadow;
-    min-width: 88px; }
-    .mdc-button--raised:active {
-      -webkit-box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
-              box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }
-    .mdc-button--raised.mdc-button--primary {
-      --mdc-ripple-surface-width: 0;
-      --mdc-ripple-surface-height: 0;
-      --mdc-ripple-fg-size: 0;
-      --mdc-ripple-left: 0;
-      --mdc-ripple-top: 0;
-      --mdc-ripple-fg-scale: 1;
-      --mdc-ripple-fg-translate-end: 0;
-      --mdc-ripple-fg-translate-start: 0;
-      will-change: transform, opacity;
-      -webkit-tap-highlight-color: transparent; }
-      .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):hover::before, .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):focus::before, .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded):active::after {
-        -webkit-transition-duration: 85ms;
-                transition-duration: 85ms;
-        opacity: .6; }
-      .mdc-button--raised.mdc-button--primary::before {
-        background-color: rgba(255, 255, 255, 0.14);
-        position: absolute;
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        -webkit-transition: opacity 250ms linear;
-        transition: opacity 250ms linear;
-        border-radius: 50%;
-        opacity: 0;
-        pointer-events: none;
-        content: ""; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded::before {
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        /* @alternate */
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--background-focused::before {
-        opacity: .99999; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--background-active-fill::before {
-        -webkit-transition-duration: 120ms;
-                transition-duration: 120ms;
-        opacity: 1; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--unbounded::before {
-        /* @alternate */
-        top: calc(50% - 50%);
-        top: var(--mdc-ripple-top, calc(50% - 50%));
-        /* @alternate */
-        left: calc(50% - 50%);
-        left: var(--mdc-ripple-left, calc(50% - 50%));
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-      .mdc-button--raised.mdc-button--primary::after {
-        background-color: rgba(255, 255, 255, 0.14);
-        position: absolute;
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        -webkit-transition: opacity 250ms linear;
-        transition: opacity 250ms linear;
-        border-radius: 50%;
-        opacity: 0;
-        pointer-events: none;
-        content: ""; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded::after {
-        top: 0;
-        left: 0;
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform-origin: center center;
-                transform-origin: center center;
-        opacity: 0; }
-      .mdc-button--raised.mdc-button--primary:not(.mdc-ripple-upgraded--unbounded)::after {
-        -webkit-transform-origin: center center;
-                transform-origin: center center; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--unbounded::after {
-        /* @alternate */
-        top: 0;
-        top: var(--mdc-ripple-top, 0);
-        /* @alternate */
-        left: 0;
-        left: var(--mdc-ripple-left, 0);
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform-origin: center center;
-                transform-origin: center center; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--foreground-activation::after {
-        -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-                animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-      .mdc-button--raised.mdc-button--primary.mdc-ripple-upgraded--foreground-deactivation::after {
-        -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-                transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-        -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-                animation: 83ms mdc-ripple-fg-opacity-out; }
-    .mdc-button--raised.mdc-button--accent {
-      --mdc-ripple-surface-width: 0;
-      --mdc-ripple-surface-height: 0;
-      --mdc-ripple-fg-size: 0;
-      --mdc-ripple-left: 0;
-      --mdc-ripple-top: 0;
-      --mdc-ripple-fg-scale: 1;
-      --mdc-ripple-fg-translate-end: 0;
-      --mdc-ripple-fg-translate-start: 0;
-      will-change: transform, opacity;
-      -webkit-tap-highlight-color: transparent; }
-      .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):hover::before, .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):focus::before, .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded):active::after {
-        -webkit-transition-duration: 85ms;
-                transition-duration: 85ms;
-        opacity: .6; }
-      .mdc-button--raised.mdc-button--accent::before {
-        background-color: rgba(255, 255, 255, 0.14);
-        position: absolute;
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        -webkit-transition: opacity 250ms linear;
-        transition: opacity 250ms linear;
-        border-radius: 50%;
-        opacity: 0;
-        pointer-events: none;
-        content: ""; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded::before {
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        /* @alternate */
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--background-focused::before {
-        opacity: .99999; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--background-active-fill::before {
-        -webkit-transition-duration: 120ms;
-                transition-duration: 120ms;
-        opacity: 1; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--unbounded::before {
-        /* @alternate */
-        top: calc(50% - 50%);
-        top: var(--mdc-ripple-top, calc(50% - 50%));
-        /* @alternate */
-        left: calc(50% - 50%);
-        left: var(--mdc-ripple-left, calc(50% - 50%));
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-                transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-      .mdc-button--raised.mdc-button--accent::after {
-        background-color: rgba(255, 255, 255, 0.14);
-        position: absolute;
-        top: calc(50% - 100%);
-        left: calc(50% - 100%);
-        width: 200%;
-        height: 200%;
-        -webkit-transition: opacity 250ms linear;
-        transition: opacity 250ms linear;
-        border-radius: 50%;
-        opacity: 0;
-        pointer-events: none;
-        content: ""; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded::after {
-        top: 0;
-        left: 0;
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform-origin: center center;
-                transform-origin: center center;
-        opacity: 0; }
-      .mdc-button--raised.mdc-button--accent:not(.mdc-ripple-upgraded--unbounded)::after {
-        -webkit-transform-origin: center center;
-                transform-origin: center center; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--unbounded::after {
-        /* @alternate */
-        top: 0;
-        top: var(--mdc-ripple-top, 0);
-        /* @alternate */
-        left: 0;
-        left: var(--mdc-ripple-left, 0);
-        /* @alternate */
-        width: 100%;
-        width: var(--mdc-ripple-fg-size, 100%);
-        /* @alternate */
-        height: 100%;
-        height: var(--mdc-ripple-fg-size, 100%);
-        -webkit-transform: scale(0);
-                transform: scale(0);
-        -webkit-transform-origin: center center;
-                transform-origin: center center; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--foreground-activation::after {
-        -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-                animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-      .mdc-button--raised.mdc-button--accent.mdc-ripple-upgraded--foreground-deactivation::after {
-        -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-                transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-        -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-                animation: 83ms mdc-ripple-fg-opacity-out; }
-    .mdc-button--theme-dark .mdc-button--raised,
-    .mdc-theme--dark .mdc-button--raised {
-      /* @alternate */
-      background-color: #3f51b5;
-      background-color: var(--mdc-theme-primary, #3f51b5);
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-primary, white); }
-      .mdc-button--theme-dark .mdc-button--raised::before,
-      .mdc-theme--dark .mdc-button--raised::before {
-        color: black; }
-  .mdc-button--primary {
-    /* @alternate */
-    color: #3f51b5;
-    color: var(--mdc-theme-primary, #3f51b5); }
-    .mdc-button--theme-dark .mdc-button--primary,
-    .mdc-theme--dark .mdc-button--primary {
-      /* @alternate */
-      color: #3f51b5;
-      color: var(--mdc-theme-primary, #3f51b5); }
-    .mdc-button--primary.mdc-button--raised {
-      /* @alternate */
-      background-color: #3f51b5;
-      background-color: var(--mdc-theme-primary, #3f51b5);
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-primary, white); }
-      .mdc-button--primary.mdc-button--raised::before {
-        color: black; }
-  .mdc-button--accent {
-    /* @alternate */
-    color: #ff4081;
-    color: var(--mdc-theme-accent, #ff4081); }
-    .mdc-button--theme-dark .mdc-button--accent,
-    .mdc-theme--dark .mdc-button--accent {
-      /* @alternate */
-      color: #ff4081;
-      color: var(--mdc-theme-accent, #ff4081); }
-    .mdc-button--accent.mdc-button--raised {
-      /* @alternate */
-      background-color: #ff4081;
-      background-color: var(--mdc-theme-accent, #ff4081);
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-accent, white); }
-      .mdc-button--accent.mdc-button--raised::before {
-        color: black; }
-  .mdc-button--compact {
-    padding: 0 8px; }
-  fieldset:disabled .mdc-button, .mdc-button:disabled {
-    color: rgba(0, 0, 0, 0.26);
-    cursor: default;
-    pointer-events: none; }
-    .mdc-button--theme-dark fieldset:disabled .mdc-button,
-    .mdc-theme--dark fieldset:disabled .mdc-button, .mdc-button--theme-dark .mdc-button:disabled,
-    .mdc-theme--dark .mdc-button:disabled {
-      color: rgba(255, 255, 255, 0.3); }
-  fieldset:disabled .mdc-button--raised, .mdc-button--raised:disabled {
-    -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
-    background-color: rgba(0, 0, 0, 0.12);
-    pointer-events: none; }
-    .mdc-button--theme-dark fieldset:disabled .mdc-button--raised,
-    .mdc-theme--dark fieldset:disabled .mdc-button--raised, .mdc-button--theme-dark .mdc-button--raised:disabled,
-    .mdc-theme--dark .mdc-button--raised:disabled {
-      background-color: rgba(255, 255, 255, 0.12); }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.button.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 2);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 2:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 457
support/client/lib/vwf/view/lib/mdc/dist/mdc.card.css

@@ -1,457 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-.mdc-card {
-  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-box-pack: end;
-      -ms-flex-pack: end;
-          justify-content: flex-end;
-  padding: 0;
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  border-radius: 2px;
-  overflow: hidden; }
-  .mdc-card__primary {
-    padding: 16px; }
-    .mdc-card__primary .mdc-card__title--large {
-      padding-top: 8px; }
-    .mdc-card__primary:last-child {
-      padding-bottom: 24px; }
-  .mdc-card__supporting-text {
-    padding: 8px 16px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 400;
-    letter-spacing: 0.04em;
-    line-height: 1.25rem;
-    text-decoration: inherit;
-    text-transform: inherit;
-    /* @alternate */
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
-    .mdc-card--theme-dark .mdc-card__supporting-text,
-    .mdc-theme--dark .mdc-card__supporting-text {
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-    .mdc-card__primary + .mdc-card__supporting-text {
-      margin-top: -8px;
-      padding-top: 0; }
-    .mdc-card__supporting-text:last-child {
-      padding-bottom: 24px; }
-  .mdc-card__actions {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    padding: 8px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-    .mdc-card--theme-dark .mdc-card__actions,
-    .mdc-theme--dark .mdc-card__actions {
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-    .mdc-card__actions .mdc-card__action {
-      margin: 0 8px 0 0; }
-      [dir="rtl"] .mdc-card__actions .mdc-card__action, .mdc-card__actions .mdc-card__action[dir="rtl"] {
-        margin: 0 0 0 8px; }
-    .mdc-card__actions .mdc-card__action:last-child {
-      margin-left: 0;
-      margin-right: 0; }
-      [dir="rtl"] .mdc-card__actions .mdc-card__action:last-child, .mdc-card__actions .mdc-card__action:last-child[dir="rtl"] {
-        margin-left: 0;
-        margin-right: 0; }
-    .mdc-card__actions--vertical {
-      -webkit-box-orient: vertical;
-      -webkit-box-direction: normal;
-          -ms-flex-flow: column;
-              flex-flow: column;
-      -webkit-box-align: start;
-          -ms-flex-align: start;
-              align-items: flex-start; }
-      .mdc-card__actions--vertical .mdc-card__action {
-        margin: 0 0 4px; }
-      .mdc-card__actions--vertical .mdc-card__action:last-child {
-        margin-bottom: 0; }
-  .mdc-card__media {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column;
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end;
-    padding: 16px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-  .mdc-card__media-item {
-    display: inline-block;
-    width: auto;
-    height: 80px;
-    margin: 16px 0 0;
-    padding: 0; }
-    .mdc-card__media-item--1dot5x {
-      width: auto;
-      height: 120px; }
-    .mdc-card__media-item--2x {
-      width: auto;
-      height: 160px; }
-    .mdc-card__media-item--3x {
-      width: auto;
-      height: 240px; }
-  .mdc-card__title {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 500;
-    letter-spacing: 0.04em;
-    line-height: 1.5rem;
-    text-decoration: inherit;
-    text-transform: inherit;
-    /* @alternate */
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
-    margin: -.063rem 0; }
-    .mdc-card--theme-dark .mdc-card__title,
-    .mdc-theme--dark .mdc-card__title {
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-  .mdc-card__title--large {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 1.5rem;
-    font-weight: 400;
-    letter-spacing: normal;
-    line-height: 2rem;
-    text-decoration: inherit;
-    text-transform: inherit;
-    margin: 0; }
-  .mdc-card__subtitle {
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 400;
-    letter-spacing: 0.04em;
-    line-height: 1.25rem;
-    text-decoration: inherit;
-    text-transform: inherit;
-    /* @alternate */
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
-    margin: -.063rem 0; }
-    .mdc-card--theme-dark .mdc-card__subtitle,
-    .mdc-theme--dark .mdc-card__subtitle {
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-  .mdc-card__horizontal-block {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -webkit-box-align: start;
-        -ms-flex-align: start;
-            align-items: flex-start;
-    -webkit-box-pack: justify;
-        -ms-flex-pack: justify;
-            justify-content: space-between;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    padding: 0;
-    padding-left: 0;
-    padding-right: 16px; }
-    [dir="rtl"] .mdc-card__horizontal-block, .mdc-card__horizontal-block[dir="rtl"] {
-      padding-left: 16px;
-      padding-right: 0; }
-    .mdc-card__horizontal-block .mdc-card__actions--vertical {
-      margin: 16px; }
-    .mdc-card__horizontal-block .mdc-card__media-item {
-      margin-left: 16px;
-      margin-right: 0; }
-      [dir="rtl"] .mdc-card__horizontal-block .mdc-card__media-item, .mdc-card__horizontal-block .mdc-card__media-item[dir="rtl"] {
-        margin-left: 0;
-        margin-right: 16px; }
-    .mdc-card__horizontal-block .mdc-card__media-item--3x {
-      margin-bottom: 16px; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.card.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 3);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 3:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 1015
support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.css

@@ -1,1015 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
-@-webkit-keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-@keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-@keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/* Manual calculation done on SVG */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* Manual calculation done on SVG */
-@-webkit-keyframes mdc-checkbox-fade-in-background {
-  0% {
-    border-color: rgba(0, 0, 0, 0.54);
-    background-color: transparent; }
-  50% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); } }
-@keyframes mdc-checkbox-fade-in-background {
-  0% {
-    border-color: rgba(0, 0, 0, 0.54);
-    background-color: transparent; }
-  50% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); } }
-
-@-webkit-keyframes mdc-checkbox-fade-out-background {
-  0%,
-  80% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); }
-  100% {
-    border-color: rgba(0, 0, 0, 0.54);
-    background-color: transparent; } }
-
-@keyframes mdc-checkbox-fade-out-background {
-  0%,
-  80% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); }
-  100% {
-    border-color: rgba(0, 0, 0, 0.54);
-    background-color: transparent; } }
-
-@-webkit-keyframes mdc-checkbox-fade-in-background-dark {
-  0% {
-    border-color: white;
-    background-color: transparent; }
-  50% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); } }
-
-@keyframes mdc-checkbox-fade-in-background-dark {
-  0% {
-    border-color: white;
-    background-color: transparent; }
-  50% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); } }
-
-@-webkit-keyframes mdc-checkbox-fade-out-background-dark {
-  0%,
-  80% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); }
-  100% {
-    border-color: white;
-    background-color: transparent; } }
-
-@keyframes mdc-checkbox-fade-out-background-dark {
-  0%,
-  80% {
-    /* @alternate */
-    border-color: #3f51b5;
-    border-color: var(--mdc-theme-primary, #3f51b5);
-    /* @alternate */
-    background-color: #3f51b5;
-    background-color: var(--mdc-theme-primary, #3f51b5); }
-  100% {
-    border-color: white;
-    background-color: transparent; } }
-
-@-webkit-keyframes mdc-checkbox-unchecked-checked-checkmark-path {
-  0%,
-  50% {
-    stroke-dashoffset: 29.78334; }
-  50% {
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  100% {
-    stroke-dashoffset: 0; } }
-
-@keyframes mdc-checkbox-unchecked-checked-checkmark-path {
-  0%,
-  50% {
-    stroke-dashoffset: 29.78334; }
-  50% {
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  100% {
-    stroke-dashoffset: 0; } }
-
-@-webkit-keyframes mdc-checkbox-unchecked-indeterminate-mixedmark {
-  0%,
-  68.2% {
-    -webkit-transform: scaleX(0);
-            transform: scaleX(0); }
-  68.2% {
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0, 1); }
-  100% {
-    -webkit-transform: scaleX(1);
-            transform: scaleX(1); } }
-
-@keyframes mdc-checkbox-unchecked-indeterminate-mixedmark {
-  0%,
-  68.2% {
-    -webkit-transform: scaleX(0);
-            transform: scaleX(0); }
-  68.2% {
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0, 1); }
-  100% {
-    -webkit-transform: scaleX(1);
-            transform: scaleX(1); } }
-
-@-webkit-keyframes mdc-checkbox-checked-unchecked-checkmark-path {
-  from {
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
-    opacity: 1;
-    stroke-dashoffset: 0; }
-  to {
-    opacity: 0;
-    stroke-dashoffset: -29.78334; } }
-
-@keyframes mdc-checkbox-checked-unchecked-checkmark-path {
-  from {
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 1, 1);
-    opacity: 1;
-    stroke-dashoffset: 0; }
-  to {
-    opacity: 0;
-    stroke-dashoffset: -29.78334; } }
-
-@-webkit-keyframes mdc-checkbox-checked-indeterminate-checkmark {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1;
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  to {
-    -webkit-transform: rotate(45deg);
-            transform: rotate(45deg);
-    opacity: 0; } }
-
-@keyframes mdc-checkbox-checked-indeterminate-checkmark {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1;
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  to {
-    -webkit-transform: rotate(45deg);
-            transform: rotate(45deg);
-    opacity: 0; } }
-
-@-webkit-keyframes mdc-checkbox-indeterminate-checked-checkmark {
-  from {
-    -webkit-transform: rotate(45deg);
-            transform: rotate(45deg);
-    opacity: 0;
-    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
-  to {
-    -webkit-transform: rotate(360deg);
-            transform: rotate(360deg);
-    opacity: 1; } }
-
-@keyframes mdc-checkbox-indeterminate-checked-checkmark {
-  from {
-    -webkit-transform: rotate(45deg);
-            transform: rotate(45deg);
-    opacity: 0;
-    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
-  to {
-    -webkit-transform: rotate(360deg);
-            transform: rotate(360deg);
-    opacity: 1; } }
-
-@-webkit-keyframes mdc-checkbox-checked-indeterminate-mixedmark {
-  from {
-    -webkit-transform: rotate(-45deg);
-            transform: rotate(-45deg);
-    opacity: 0;
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  to {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1; } }
-
-@keyframes mdc-checkbox-checked-indeterminate-mixedmark {
-  from {
-    -webkit-transform: rotate(-45deg);
-            transform: rotate(-45deg);
-    opacity: 0;
-    -webkit-animation-timing-function: cubic-bezier(0, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0, 0, 0.2, 1); }
-  to {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1; } }
-
-@-webkit-keyframes mdc-checkbox-indeterminate-checked-mixedmark {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1;
-    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
-  to {
-    -webkit-transform: rotate(315deg);
-            transform: rotate(315deg);
-    opacity: 0; } }
-
-@keyframes mdc-checkbox-indeterminate-checked-mixedmark {
-  from {
-    -webkit-transform: rotate(0deg);
-            transform: rotate(0deg);
-    opacity: 1;
-    -webkit-animation-timing-function: cubic-bezier(0.14, 0, 0, 1);
-            animation-timing-function: cubic-bezier(0.14, 0, 0, 1); }
-  to {
-    -webkit-transform: rotate(315deg);
-            transform: rotate(315deg);
-    opacity: 0; } }
-
-@-webkit-keyframes mdc-checkbox-indeterminate-unchecked-mixedmark {
-  0% {
-    -webkit-transform: scaleX(1);
-            transform: scaleX(1);
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  32.8%,
-  100% {
-    -webkit-transform: scaleX(0);
-            transform: scaleX(0);
-    opacity: 0; } }
-
-@keyframes mdc-checkbox-indeterminate-unchecked-mixedmark {
-  0% {
-    -webkit-transform: scaleX(1);
-            transform: scaleX(1);
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  32.8%,
-  100% {
-    -webkit-transform: scaleX(0);
-            transform: scaleX(0);
-    opacity: 0; } }
-
-.mdc-checkbox {
-  --mdc-ripple-surface-width: 0;
-  --mdc-ripple-surface-height: 0;
-  --mdc-ripple-fg-size: 0;
-  --mdc-ripple-left: 0;
-  --mdc-ripple-top: 0;
-  --mdc-ripple-fg-scale: 1;
-  --mdc-ripple-fg-translate-end: 0;
-  --mdc-ripple-fg-translate-start: 0;
-  will-change: transform, opacity;
-  -webkit-tap-highlight-color: transparent;
-  display: inline-block;
-  position: relative;
-  -webkit-box-sizing: content-box;
-          box-sizing: content-box;
-  -webkit-box-flex: 0;
-      -ms-flex: 0 0 18px;
-          flex: 0 0 18px;
-  width: 18px;
-  height: 18px;
-  padding: 11px;
-  line-height: 0;
-  white-space: nowrap;
-  cursor: pointer;
-  vertical-align: bottom; }
-  .mdc-checkbox:not(.mdc-ripple-upgraded):hover::before, .mdc-checkbox:not(.mdc-ripple-upgraded):focus::before, .mdc-checkbox:not(.mdc-ripple-upgraded):active::after {
-    -webkit-transition-duration: 85ms;
-            transition-duration: 85ms;
-    opacity: .6; }
-  .mdc-checkbox::before {
-    /* @alternate */
-    background-color: rgba(63, 81, 181, 0.14);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-    @supports (background-color: color(green a(10%))) {
-      .mdc-checkbox::before {
-        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
-  .mdc-checkbox.mdc-ripple-upgraded::before {
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-checkbox.mdc-ripple-upgraded--background-focused::before {
-    opacity: .99999; }
-  .mdc-checkbox.mdc-ripple-upgraded--background-active-fill::before {
-    -webkit-transition-duration: 120ms;
-            transition-duration: 120ms;
-    opacity: 1; }
-  .mdc-checkbox.mdc-ripple-upgraded--unbounded::before {
-    /* @alternate */
-    top: calc(50% - 50%);
-    top: var(--mdc-ripple-top, calc(50% - 50%));
-    /* @alternate */
-    left: calc(50% - 50%);
-    left: var(--mdc-ripple-left, calc(50% - 50%));
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-checkbox::after {
-    /* @alternate */
-    background-color: rgba(63, 81, 181, 0.14);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-    @supports (background-color: color(green a(10%))) {
-      .mdc-checkbox::after {
-        background-color: color(var(--mdc-theme-primary, #3f51b5) a(14%)); } }
-  .mdc-checkbox.mdc-ripple-upgraded::after {
-    top: 0;
-    left: 0;
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center;
-    opacity: 0; }
-  .mdc-checkbox:not(.mdc-ripple-upgraded--unbounded)::after {
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-checkbox.mdc-ripple-upgraded--unbounded::after {
-    /* @alternate */
-    top: 0;
-    top: var(--mdc-ripple-top, 0);
-    /* @alternate */
-    left: 0;
-    left: var(--mdc-ripple-left, 0);
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-checkbox.mdc-ripple-upgraded--foreground-activation::after {
-    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-  .mdc-checkbox.mdc-ripple-upgraded--foreground-deactivation::after {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-            animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-checkbox::before, .mdc-checkbox::after {
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%; }
-  .mdc-checkbox.mdc-ripple-upgraded--unbounded .mdc-checkbox__background::before {
-    content: none; }
-  .mdc-checkbox__background {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    left: 11px;
-    right: initial;
-    display: -webkit-inline-box;
-    display: -ms-inline-flexbox;
-    display: inline-flex;
-    top: 11px;
-    -webkit-box-align: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    pointer-events: none;
-    width: 45%;
-    height: 45%;
-    -webkit-transition: background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: background-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), border-color 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    border: 2px solid rgba(0, 0, 0, 0.54);
-    border-radius: 2px;
-    background-color: transparent;
-    will-change: background-color, border-color; }
-    [dir="rtl"] .mdc-checkbox .mdc-checkbox__background,
-    .mdc-checkbox[dir="rtl"] .mdc-checkbox__background {
-      left: initial;
-      right: 11px; }
-    .mdc-checkbox--theme-dark .mdc-checkbox__background,
-    .mdc-theme--dark .mdc-checkbox__background {
-      border-color: white; }
-    .mdc-checkbox__background::before {
-      position: absolute;
-      top: 0;
-      right: 0;
-      bottom: 0;
-      left: 0;
-      width: 100%;
-      height: 100%;
-      -webkit-transform: scale(0, 0);
-              transform: scale(0, 0);
-      -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      border-radius: 50%;
-      content: "";
-      opacity: 0;
-      pointer-events: none;
-      will-change: opacity, transform;
-      /* @alternate */
-      background: #3f51b5;
-      background: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-checkbox__native-control {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    margin: 0;
-    padding: 0;
-    cursor: inherit;
-    opacity: 0; }
-  .mdc-checkbox__checkmark {
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    width: 100%;
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    opacity: 0;
-    fill: white; }
-    .mdc-checkbox__checkmark__path {
-      -webkit-transition: stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      transition: stroke-dashoffset 180ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-      stroke: white !important;
-      stroke-width: 3.12px;
-      stroke-dashoffset: 29.78334;
-      stroke-dasharray: 29.78334; }
-  .mdc-checkbox__mixedmark {
-    width: 100%;
-    height: 2px;
-    -webkit-transform: scaleX(0) rotate(0deg);
-            transform: scaleX(0) rotate(0deg);
-    -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    background-color: white;
-    opacity: 0; }
-
-.mdc-checkbox__native-control:focus ~ .mdc-checkbox__background::before {
-  -webkit-transform: scale(2.75, 2.75);
-          transform: scale(2.75, 2.75);
-  -webkit-transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  transition: opacity 80ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 80ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  opacity: .26; }
-
-.mdc-checkbox__native-control:checked ~ .mdc-checkbox__background {
-  -webkit-transition: border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  transition: border-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1), background-color 90ms 0ms cubic-bezier(0, 0, 0.2, 1);
-  /* @alternate */
-  border-color: #3f51b5;
-  border-color: var(--mdc-theme-primary, #3f51b5);
-  /* @alternate */
-  background-color: #3f51b5;
-  background-color: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark {
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: 1; }
-    .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__checkmark__path {
-      stroke-dashoffset: 0; }
-  .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background .mdc-checkbox__mixedmark {
-    -webkit-transform: scaleX(1) rotate(-45deg);
-            transform: scaleX(1) rotate(-45deg); }
-
-.mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
-  /* @alternate */
-  border-color: #3f51b5;
-  border-color: var(--mdc-theme-primary, #3f51b5);
-  /* @alternate */
-  background-color: #3f51b5;
-  background-color: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark {
-    -webkit-transform: rotate(45deg);
-            transform: rotate(45deg);
-    -webkit-transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 90ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    opacity: 0; }
-    .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__checkmark__path {
-      stroke-dashoffset: 0; }
-  .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background .mdc-checkbox__mixedmark {
-    -webkit-transform: scaleX(1) rotate(0deg);
-            transform: scaleX(1) rotate(0deg);
-    opacity: 1; }
-
-.mdc-checkbox__native-control:disabled,
-fieldset:disabled .mdc-checkbox__native-control,
-[aria-disabled="true"] .mdc-checkbox__native-control {
-  cursor: default; }
-  .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background,
-  fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background,
-  [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background {
-    border-color: rgba(0, 0, 0, 0.26); }
-    .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background,
-    .mdc-theme--dark .mdc-checkbox__native-control:disabled ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    fieldset:disabled .mdc-checkbox__native-control ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    [aria-disabled="true"] .mdc-checkbox__native-control ~ .mdc-checkbox__background {
-      border-color: rgba(255, 255, 255, 0.3); }
-  .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background, .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background,
-  fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
-  fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
-  [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
-  [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
-    border-color: transparent;
-    background-color: rgba(0, 0, 0, 0.26); }
-    .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background,
-    .mdc-theme--dark .mdc-checkbox__native-control:disabled:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background,
-    .mdc-theme--dark .mdc-checkbox__native-control:disabled:indeterminate ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    fieldset:disabled .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    fieldset:disabled .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    [aria-disabled="true"] .mdc-checkbox__native-control:checked ~ .mdc-checkbox__background, .mdc-checkbox--theme-dark
-    [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background,
-    .mdc-theme--dark
-    [aria-disabled="true"] .mdc-checkbox__native-control:indeterminate ~ .mdc-checkbox__background {
-      background-color: rgba(255, 255, 255, 0.3); }
-
-.mdc-checkbox--disabled {
-  cursor: default;
-  pointer-events: none; }
-
-.mdc-checkbox--upgraded .mdc-checkbox__background,
-.mdc-checkbox--upgraded .mdc-checkbox__checkmark,
-.mdc-checkbox--upgraded .mdc-checkbox__checkmark__path,
-.mdc-checkbox--upgraded .mdc-checkbox__mixedmark {
-  -webkit-transition: none !important;
-  transition: none !important; }
-
-.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background, .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background {
-  -webkit-animation: mdc-checkbox-fade-in-background 180ms linear;
-          animation: mdc-checkbox-fade-in-background 180ms linear; }
-  .mdc-checkbox--theme-dark .mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background,
-  .mdc-theme--dark .mdc-checkbox--anim-unchecked-checked .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background,
-  .mdc-theme--dark .mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__background {
-    -webkit-animation-name: mdc-checkbox-fade-in-background-dark;
-            animation-name: mdc-checkbox-fade-in-background-dark; }
-
-.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background, .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background {
-  -webkit-animation: mdc-checkbox-fade-out-background 180ms linear;
-          animation: mdc-checkbox-fade-out-background 180ms linear; }
-  .mdc-checkbox--theme-dark .mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background,
-  .mdc-theme--dark .mdc-checkbox--anim-checked-unchecked .mdc-checkbox__background, .mdc-checkbox--theme-dark .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background,
-  .mdc-theme--dark .mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__background {
-    -webkit-animation-name: mdc-checkbox-fade-out-background-dark;
-            animation-name: mdc-checkbox-fade-out-background-dark; }
-
-.mdc-checkbox--anim-unchecked-checked .mdc-checkbox__checkmark__path {
-  -webkit-animation: 180ms linear 0s mdc-checkbox-unchecked-checked-checkmark-path;
-          animation: 180ms linear 0s mdc-checkbox-unchecked-checked-checkmark-path;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-unchecked-indeterminate .mdc-checkbox__mixedmark {
-  -webkit-animation: 90ms linear 0s mdc-checkbox-unchecked-indeterminate-mixedmark;
-          animation: 90ms linear 0s mdc-checkbox-unchecked-indeterminate-mixedmark;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-checked-unchecked .mdc-checkbox__checkmark__path {
-  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-unchecked-checkmark-path;
-          animation: 90ms linear 0s mdc-checkbox-checked-unchecked-checkmark-path;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__checkmark {
-  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-checkmark;
-          animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-checkmark;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-checked-indeterminate .mdc-checkbox__mixedmark {
-  -webkit-animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-mixedmark;
-          animation: 90ms linear 0s mdc-checkbox-checked-indeterminate-mixedmark;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__checkmark {
-  -webkit-animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-checkmark;
-          animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-checkmark;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-indeterminate-checked .mdc-checkbox__mixedmark {
-  -webkit-animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-mixedmark;
-          animation: 500ms linear 0s mdc-checkbox-indeterminate-checked-mixedmark;
-  -webkit-transition: none;
-  transition: none; }
-
-.mdc-checkbox--anim-indeterminate-unchecked .mdc-checkbox__mixedmark {
-  -webkit-animation: 300ms linear 0s mdc-checkbox-indeterminate-unchecked-mixedmark;
-          animation: 300ms linear 0s mdc-checkbox-indeterminate-unchecked-mixedmark;
-  -webkit-transition: none;
-  transition: none; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 4);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 4:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 2585
support/client/lib/vwf/view/lib/mdc/dist/mdc.checkbox.js

@@ -1,2585 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["checkbox"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["checkbox"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 84);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 0:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @template A
- */
-var MDCFoundation = function () {
-  _createClass(MDCFoundation, null, [{
-    key: "cssClasses",
-
-    /** @return enum{cssClasses} */
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports every
-      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
-      return {};
-    }
-
-    /** @return enum{strings} */
-
-  }, {
-    key: "strings",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
-      return {};
-    }
-
-    /** @return enum{numbers} */
-
-  }, {
-    key: "numbers",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
-      return {};
-    }
-
-    /** @return {!Object} */
-
-  }, {
-    key: "defaultAdapter",
-    get: function get() {
-      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
-      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
-      // validation.
-      return {};
-    }
-
-    /**
-     * @param {A=} adapter
-     */
-
-  }]);
-
-  function MDCFoundation() {
-    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, MDCFoundation);
-
-    /** @protected {!A} */
-    this.adapter_ = adapter;
-  }
-
-  _createClass(MDCFoundation, [{
-    key: "init",
-    value: function init() {
-      // Subclasses should override this method to perform initialization routines (registering events, etc.)
-    }
-  }, {
-    key: "destroy",
-    value: function destroy() {
-      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
-    }
-  }]);
-
-  return MDCFoundation;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
-
-/***/ }),
-
-/***/ 1:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/**
- * @template F
- */
-
-var MDCComponent = function () {
-  _createClass(MDCComponent, null, [{
-    key: 'attachTo',
-
-    /**
-     * @param {!Element} root
-     * @return {!MDCComponent}
-     */
-    value: function attachTo(root) {
-      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
-      // returns an instantiated component with its root set to that element. Also note that in the cases of
-      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
-      // from getDefaultFoundation().
-      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
-    }
-
-    /**
-     * @param {!Element} root
-     * @param {F=} foundation
-     * @param {...?} args
-     */
-
-  }]);
-
-  function MDCComponent(root) {
-    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-    _classCallCheck(this, MDCComponent);
-
-    /** @protected {!Element} */
-    this.root_ = root;
-
-    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
-
-    this.initialize.apply(this, args);
-    // Note that we initialize foundation here and not within the constructor's default param so that
-    // this.root_ is defined and can be used within the foundation class.
-    /** @protected {!F} */
-    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
-    this.foundation_.init();
-    this.initialSyncWithDOM();
-  }
-
-  _createClass(MDCComponent, [{
-    key: 'initialize',
-    value: function initialize() /* ...args */{}
-    // Subclasses can override this to do any additional setup work that would be considered part of a
-    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
-    // initialized. Any additional arguments besides root and foundation will be passed in here.
-
-
-    /**
-     * @return {!F} foundation
-     */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      // Subclasses must override this method to return a properly configured foundation class for the
-      // component.
-      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
-      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
-      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
-      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      // Subclasses may implement this method to release any resources / deregister any listeners they have
-      // attached. An example of this might be deregistering a resize event from the window object.
-      this.foundation_.destroy();
-    }
-
-    /**
-     * Wrapper method to add an event listener to the component's root element. This is most useful when
-     * listening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'listen',
-    value: function listen(evtType, handler) {
-      this.root_.addEventListener(evtType, handler);
-    }
-
-    /**
-     * Wrapper method to remove an event listener to the component's root element. This is most useful when
-     * unlistening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'unlisten',
-    value: function unlisten(evtType, handler) {
-      this.root_.removeEventListener(evtType, handler);
-    }
-
-    /**
-     * Fires a cross-browser-compatible custom event from the component root of the given type,
-     * with the given data.
-     * @param {string} evtType
-     * @param {!Object} evtData
-     * @param {boolean=} shouldBubble
-     */
-
-  }, {
-    key: 'emit',
-    value: function emit(evtType, evtData) {
-      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-      var evt = void 0;
-      if (typeof CustomEvent === 'function') {
-        evt = new CustomEvent(evtType, {
-          detail: evtData,
-          bubbles: shouldBubble
-        });
-      } else {
-        evt = document.createEvent('CustomEvent');
-        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
-      }
-
-      this.root_.dispatchEvent(evt);
-    }
-  }]);
-
-  return MDCComponent;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
-
-/***/ }),
-
-/***/ 24:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCCheckbox", function() { return MDCCheckbox; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_animation__ = __webpack_require__(9);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__material_base_selection_control__ = __webpack_require__(3);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__foundation__ = __webpack_require__(40);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__material_ripple__ = __webpack_require__(6);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__material_ripple_util__ = __webpack_require__(5);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCCheckboxFoundation", function() { return __WEBPACK_IMPORTED_MODULE_3__foundation__["a"]; });
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/* eslint-disable no-unused-vars */
-
-/* eslint-enable no-unused-vars */
-
-
-
-
-
-
-/**
- * @extends MDCComponent<!MDCCheckboxFoundation>
- */
-var MDCCheckbox = function (_MDCComponent) {
-  _inherits(MDCCheckbox, _MDCComponent);
-
-  _createClass(MDCCheckbox, [{
-    key: 'nativeCb_',
-
-
-    /**
-     * Returns the state of the native control element, or null if the native control element is not present.
-     * @return {?SelectionControlState}
-     * @private
-     */
-    get: function get() {
-      var NATIVE_CONTROL_SELECTOR = __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */].strings.NATIVE_CONTROL_SELECTOR;
-
-      var cbEl = /** @type {?SelectionControlState} */this.root_.querySelector(NATIVE_CONTROL_SELECTOR);
-      return cbEl;
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      return new MDCCheckbox(root);
-    }
-  }]);
-
-  function MDCCheckbox() {
-    var _ref;
-
-    _classCallCheck(this, MDCCheckbox);
-
-    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-
-    /** @private {!MDCRipple} */
-    var _this = _possibleConstructorReturn(this, (_ref = MDCCheckbox.__proto__ || Object.getPrototypeOf(MDCCheckbox)).call.apply(_ref, [this].concat(args)));
-
-    _this.ripple_ = _this.initRipple_();
-    return _this;
-  }
-
-  /**
-   * @return {!MDCRipple}
-   * @private
-   */
-
-
-  _createClass(MDCCheckbox, [{
-    key: 'initRipple_',
-    value: function initRipple_() {
-      var _this2 = this;
-
-      var MATCHES = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__material_ripple_util__["getMatchesProperty"])(HTMLElement.prototype);
-      var adapter = _extends(__WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRipple"].createAdapter(this), {
-        isUnbounded: function isUnbounded() {
-          return true;
-        },
-        isSurfaceActive: function isSurfaceActive() {
-          return _this2.nativeCb_[MATCHES](':active');
-        },
-        registerInteractionHandler: function registerInteractionHandler(type, handler) {
-          return _this2.nativeCb_.addEventListener(type, handler);
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
-          return _this2.nativeCb_.removeEventListener(type, handler);
-        },
-        computeBoundingRect: function computeBoundingRect() {
-          var _root_$getBoundingCli = _this2.root_.getBoundingClientRect(),
-              left = _root_$getBoundingCli.left,
-              top = _root_$getBoundingCli.top;
-
-          var DIM = 40;
-          return {
-            top: top,
-            left: left,
-            right: left + DIM,
-            bottom: top + DIM,
-            width: DIM,
-            height: DIM
-          };
-        }
-      });
-      var foundation = new __WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRippleFoundation"](adapter);
-      return new __WEBPACK_IMPORTED_MODULE_4__material_ripple__["MDCRipple"](this.root_, foundation);
-    }
-
-    /** @return {!MDCCheckboxFoundation} */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      var _this3 = this;
-
-      return new __WEBPACK_IMPORTED_MODULE_3__foundation__["a" /* default */]({
-        addClass: function addClass(className) {
-          return _this3.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return _this3.root_.classList.remove(className);
-        },
-        registerAnimationEndHandler: function registerAnimationEndHandler(handler) {
-          return _this3.root_.addEventListener(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__material_animation__["getCorrectEventName"])(window, 'animationend'), handler);
-        },
-        deregisterAnimationEndHandler: function deregisterAnimationEndHandler(handler) {
-          return _this3.root_.removeEventListener(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__material_animation__["getCorrectEventName"])(window, 'animationend'), handler);
-        },
-        registerChangeHandler: function registerChangeHandler(handler) {
-          return _this3.nativeCb_.addEventListener('change', handler);
-        },
-        deregisterChangeHandler: function deregisterChangeHandler(handler) {
-          return _this3.nativeCb_.removeEventListener('change', handler);
-        },
-        getNativeControl: function getNativeControl() {
-          return _this3.nativeCb_;
-        },
-        forceLayout: function forceLayout() {
-          return _this3.root_.offsetWidth;
-        },
-        isAttachedToDOM: function isAttachedToDOM() {
-          return Boolean(_this3.root_.parentNode);
-        }
-      });
-    }
-
-    /** @return {!MDCRipple} */
-
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      this.ripple_.destroy();
-      _get(MDCCheckbox.prototype.__proto__ || Object.getPrototypeOf(MDCCheckbox.prototype), 'destroy', this).call(this);
-    }
-  }, {
-    key: 'ripple',
-    get: function get() {
-      return this.ripple_;
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'checked',
-    get: function get() {
-      return this.foundation_.isChecked();
-    }
-
-    /** @param {boolean} checked */
-    ,
-    set: function set(checked) {
-      this.foundation_.setChecked(checked);
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'indeterminate',
-    get: function get() {
-      return this.foundation_.isIndeterminate();
-    }
-
-    /** @param {boolean} indeterminate */
-    ,
-    set: function set(indeterminate) {
-      this.foundation_.setIndeterminate(indeterminate);
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'disabled',
-    get: function get() {
-      return this.foundation_.isDisabled();
-    }
-
-    /** @param {boolean} disabled */
-    ,
-    set: function set(disabled) {
-      this.foundation_.setDisabled(disabled);
-    }
-
-    /** @return {?string} */
-
-  }, {
-    key: 'value',
-    get: function get() {
-      return this.foundation_.getValue();
-    }
-
-    /** @param {?string} value */
-    ,
-    set: function set(value) {
-      this.foundation_.setValue(value);
-    }
-  }]);
-
-  return MDCCheckbox;
-}(__WEBPACK_IMPORTED_MODULE_1__material_base_component__["a" /* default */]);
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {!{
- *   checked: boolean,
- *   indeterminate: boolean,
- *   disabled: boolean,
- *   value: ?string
- * }}
- */
-var SelectionControlState = void 0;
-
-/***/ }),
-
-/***/ 38:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_selection_control__ = __webpack_require__(3);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* eslint-disable no-unused-vars */
-
-
-/* eslint no-unused-vars: [2, {"args": "none"}] */
-
-/**
- * Adapter for MDC Checkbox. Provides an interface for managing
- * - classes
- * - dom
- * - event handlers
- *
- * Additionally, provides type information for the adapter to the Closure
- * compiler.
- *
- * Implement this adapter for your framework of choice to delegate updates to
- * the component in your framework of choice. See architecture documentation
- * for more details.
- * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
- *
- * @record
- */
-
-var MDCCheckboxAdapter = function () {
-  function MDCCheckboxAdapter() {
-    _classCallCheck(this, MDCCheckboxAdapter);
-  }
-
-  _createClass(MDCCheckboxAdapter, [{
-    key: 'addClass',
-
-    /** @param {string} className */
-    value: function addClass(className) {}
-
-    /** @param {string} className */
-
-  }, {
-    key: 'removeClass',
-    value: function removeClass(className) {}
-
-    /** @param {!EventListener} handler */
-
-  }, {
-    key: 'registerAnimationEndHandler',
-    value: function registerAnimationEndHandler(handler) {}
-
-    /** @param {!EventListener} handler */
-
-  }, {
-    key: 'deregisterAnimationEndHandler',
-    value: function deregisterAnimationEndHandler(handler) {}
-
-    /** @param {!EventListener} handler */
-
-  }, {
-    key: 'registerChangeHandler',
-    value: function registerChangeHandler(handler) {}
-
-    /** @param {!EventListener} handler */
-
-  }, {
-    key: 'deregisterChangeHandler',
-    value: function deregisterChangeHandler(handler) {}
-
-    /** @return {!SelectionControlState} */
-
-  }, {
-    key: 'getNativeControl',
-    value: function getNativeControl() {}
-  }, {
-    key: 'forceLayout',
-    value: function forceLayout() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'isAttachedToDOM',
-    value: function isAttachedToDOM() {}
-  }]);
-
-  return MDCCheckboxAdapter;
-}();
-
-/* unused harmony default export */ var _unused_webpack_default_export = (MDCCheckboxAdapter);
-
-/***/ }),
-
-/***/ 39:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return numbers; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/** @const {string} */
-var ROOT = 'mdc-checkbox';
-
-/** @enum {string} */
-var cssClasses = {
-  UPGRADED: 'mdc-checkbox--upgraded',
-  CHECKED: 'mdc-checkbox--checked',
-  INDETERMINATE: 'mdc-checkbox--indeterminate',
-  DISABLED: 'mdc-checkbox--disabled',
-  ANIM_UNCHECKED_CHECKED: 'mdc-checkbox--anim-unchecked-checked',
-  ANIM_UNCHECKED_INDETERMINATE: 'mdc-checkbox--anim-unchecked-indeterminate',
-  ANIM_CHECKED_UNCHECKED: 'mdc-checkbox--anim-checked-unchecked',
-  ANIM_CHECKED_INDETERMINATE: 'mdc-checkbox--anim-checked-indeterminate',
-  ANIM_INDETERMINATE_CHECKED: 'mdc-checkbox--anim-indeterminate-checked',
-  ANIM_INDETERMINATE_UNCHECKED: 'mdc-checkbox--anim-indeterminate-unchecked'
-};
-
-/** @enum {string} */
-var strings = {
-  NATIVE_CONTROL_SELECTOR: '.' + ROOT + '__native-control',
-  TRANSITION_STATE_INIT: 'init',
-  TRANSITION_STATE_CHECKED: 'checked',
-  TRANSITION_STATE_UNCHECKED: 'unchecked',
-  TRANSITION_STATE_INDETERMINATE: 'indeterminate'
-};
-
-/** @enum {number} */
-var numbers = {
-  ANIM_END_LATCH_MS: 100
-};
-
-/***/ }),
-
-/***/ 4:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* eslint no-unused-vars: [2, {"args": "none"}] */
-
-/**
- * Adapter for MDC Ripple. Provides an interface for managing
- * - classes
- * - dom
- * - CSS variables
- * - position
- * - dimensions
- * - scroll position
- * - event handlers
- * - unbounded, active and disabled states
- *
- * Additionally, provides type information for the adapter to the Closure
- * compiler.
- *
- * Implement this adapter for your framework of choice to delegate updates to
- * the component in your framework of choice. See architecture documentation
- * for more details.
- * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
- *
- * @record
- */
-var MDCRippleAdapter = function () {
-  function MDCRippleAdapter() {
-    _classCallCheck(this, MDCRippleAdapter);
-  }
-
-  _createClass(MDCRippleAdapter, [{
-    key: "browserSupportsCssVars",
-
-    /** @return {boolean} */
-    value: function browserSupportsCssVars() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isUnbounded",
-    value: function isUnbounded() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isSurfaceActive",
-    value: function isSurfaceActive() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isSurfaceDisabled",
-    value: function isSurfaceDisabled() {}
-
-    /** @param {string} className */
-
-  }, {
-    key: "addClass",
-    value: function addClass(className) {}
-
-    /** @param {string} className */
-
-  }, {
-    key: "removeClass",
-    value: function removeClass(className) {}
-
-    /**
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "registerInteractionHandler",
-    value: function registerInteractionHandler(evtType, handler) {}
-
-    /**
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "deregisterInteractionHandler",
-    value: function deregisterInteractionHandler(evtType, handler) {}
-
-    /**
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "registerResizeHandler",
-    value: function registerResizeHandler(handler) {}
-
-    /**
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "deregisterResizeHandler",
-    value: function deregisterResizeHandler(handler) {}
-
-    /**
-     * @param {string} varName
-     * @param {?number|string} value
-     */
-
-  }, {
-    key: "updateCssVariable",
-    value: function updateCssVariable(varName, value) {}
-
-    /** @return {!ClientRect} */
-
-  }, {
-    key: "computeBoundingRect",
-    value: function computeBoundingRect() {}
-
-    /** @return {{x: number, y: number}} */
-
-  }, {
-    key: "getWindowPageOffset",
-    value: function getWindowPageOffset() {}
-  }]);
-
-  return MDCRippleAdapter;
-}();
-
-/* unused harmony default export */ var _unused_webpack_default_export = (MDCRippleAdapter);
-
-/***/ }),
-
-/***/ 40:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_base_selection_control__ = __webpack_require__(3);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__adapter__ = __webpack_require__(38);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__constants__ = __webpack_require__(39);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-/* eslint-disable no-unused-vars */
-
-
-/* eslint-enable no-unused-vars */
-
-
-/** @const {!Array<string>} */
-var CB_PROTO_PROPS = ['checked', 'indeterminate'];
-
-/**
- * @extends {MDCFoundation<!MDCCheckboxAdapter>}
- */
-
-var MDCCheckboxFoundation = function (_MDCFoundation) {
-  _inherits(MDCCheckboxFoundation, _MDCFoundation);
-
-  _createClass(MDCCheckboxFoundation, null, [{
-    key: 'cssClasses',
-
-    /** @return enum {cssClasses} */
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */];
-    }
-
-    /** @return enum {strings} */
-
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */];
-    }
-
-    /** @return enum {numbers} */
-
-  }, {
-    key: 'numbers',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* numbers */];
-    }
-
-    /** @return {!MDCCheckboxAdapter} */
-
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return (/** @type {!MDCCheckboxAdapter} */{
-          addClass: function addClass() /* className: string */{},
-          removeClass: function removeClass() /* className: string */{},
-          registerAnimationEndHandler: function registerAnimationEndHandler() /* handler: EventListener */{},
-          deregisterAnimationEndHandler: function deregisterAnimationEndHandler() /* handler: EventListener */{},
-          registerChangeHandler: function registerChangeHandler() /* handler: EventListener */{},
-          deregisterChangeHandler: function deregisterChangeHandler() /* handler: EventListener */{},
-          getNativeControl: function getNativeControl() /* !SelectionControlState */{},
-          forceLayout: function forceLayout() {},
-          isAttachedToDOM: function isAttachedToDOM() /* boolean */{}
-        }
-      );
-    }
-  }]);
-
-  function MDCCheckboxFoundation(adapter) {
-    _classCallCheck(this, MDCCheckboxFoundation);
-
-    /** @private {string} */
-    var _this = _possibleConstructorReturn(this, (MDCCheckboxFoundation.__proto__ || Object.getPrototypeOf(MDCCheckboxFoundation)).call(this, _extends(MDCCheckboxFoundation.defaultAdapter, adapter)));
-
-    _this.currentCheckState_ = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_INIT;
-
-    /** @private {string} */
-    _this.currentAnimationClass_ = '';
-
-    /** @private {number} */
-    _this.animEndLatchTimer_ = 0;
-
-    _this.animEndHandler_ = /** @private {!EventListener} */function () {
-      clearTimeout(_this.animEndLatchTimer_);
-      _this.animEndLatchTimer_ = setTimeout(function () {
-        _this.adapter_.removeClass(_this.currentAnimationClass_);
-        _this.adapter_.deregisterAnimationEndHandler(_this.animEndHandler_);
-      }, __WEBPACK_IMPORTED_MODULE_3__constants__["c" /* numbers */].ANIM_END_LATCH_MS);
-    };
-
-    _this.changeHandler_ = /** @private {!EventListener} */function () {
-      return _this.transitionCheckState_();
-    };
-    return _this;
-  }
-
-  _createClass(MDCCheckboxFoundation, [{
-    key: 'init',
-    value: function init() {
-      this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].UPGRADED);
-      this.adapter_.registerChangeHandler(this.changeHandler_);
-      this.installPropertyChangeHooks_();
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      this.adapter_.deregisterChangeHandler(this.changeHandler_);
-      this.uninstallPropertyChangeHooks_();
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'isChecked',
-    value: function isChecked() {
-      return this.getNativeControl_().checked;
-    }
-
-    /** @param {boolean} checked */
-
-  }, {
-    key: 'setChecked',
-    value: function setChecked(checked) {
-      this.getNativeControl_().checked = checked;
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'isIndeterminate',
-    value: function isIndeterminate() {
-      return this.getNativeControl_().indeterminate;
-    }
-
-    /** @param {boolean} indeterminate */
-
-  }, {
-    key: 'setIndeterminate',
-    value: function setIndeterminate(indeterminate) {
-      this.getNativeControl_().indeterminate = indeterminate;
-    }
-
-    /** @return {boolean} */
-
-  }, {
-    key: 'isDisabled',
-    value: function isDisabled() {
-      return this.getNativeControl_().disabled;
-    }
-
-    /** @param {boolean} disabled */
-
-  }, {
-    key: 'setDisabled',
-    value: function setDisabled(disabled) {
-      this.getNativeControl_().disabled = disabled;
-      if (disabled) {
-        this.adapter_.addClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].DISABLED);
-      } else {
-        this.adapter_.removeClass(__WEBPACK_IMPORTED_MODULE_3__constants__["a" /* cssClasses */].DISABLED);
-      }
-    }
-
-    /** @return {?string} */
-
-  }, {
-    key: 'getValue',
-    value: function getValue() {
-      return this.getNativeControl_().value;
-    }
-
-    /** @param {?string} value */
-
-  }, {
-    key: 'setValue',
-    value: function setValue(value) {
-      this.getNativeControl_().value = value;
-    }
-
-    /** @private */
-
-  }, {
-    key: 'installPropertyChangeHooks_',
-    value: function installPropertyChangeHooks_() {
-      var _this2 = this;
-
-      var nativeCb = this.getNativeControl_();
-      var cbProto = Object.getPrototypeOf(nativeCb);
-
-      CB_PROTO_PROPS.forEach(function (controlState) {
-        var desc = Object.getOwnPropertyDescriptor(cbProto, controlState);
-        // We have to check for this descriptor, since some browsers (Safari) don't support its return.
-        // See: https://bugs.webkit.org/show_bug.cgi?id=49739
-        if (validDescriptor(desc)) {
-          var nativeCbDesc = /** @type {!ObjectPropertyDescriptor} */{
-            get: desc.get,
-            set: function set(state) {
-              desc.set.call(nativeCb, state);
-              _this2.transitionCheckState_();
-            },
-            configurable: desc.configurable,
-            enumerable: desc.enumerable
-          };
-          Object.defineProperty(nativeCb, controlState, nativeCbDesc);
-        }
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'uninstallPropertyChangeHooks_',
-    value: function uninstallPropertyChangeHooks_() {
-      var nativeCb = this.getNativeControl_();
-      var cbProto = Object.getPrototypeOf(nativeCb);
-
-      CB_PROTO_PROPS.forEach(function (controlState) {
-        var desc = /** @type {!ObjectPropertyDescriptor} */Object.getOwnPropertyDescriptor(cbProto, controlState);
-        if (validDescriptor(desc)) {
-          Object.defineProperty(nativeCb, controlState, desc);
-        }
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'transitionCheckState_',
-    value: function transitionCheckState_() {
-      var nativeCb = this.adapter_.getNativeControl();
-      if (!nativeCb) {
-        return;
-      }
-      var oldState = this.currentCheckState_;
-      var newState = this.determineCheckState_(nativeCb);
-      if (oldState === newState) {
-        return;
-      }
-
-      // Check to ensure that there isn't a previously existing animation class, in case for example
-      // the user interacted with the checkbox before the animation was finished.
-      if (this.currentAnimationClass_.length > 0) {
-        clearTimeout(this.animEndLatchTimer_);
-        this.adapter_.forceLayout();
-        this.adapter_.removeClass(this.currentAnimationClass_);
-      }
-
-      this.currentAnimationClass_ = this.getTransitionAnimationClass_(oldState, newState);
-      this.currentCheckState_ = newState;
-
-      // Check for parentNode so that animations are only run when the element is attached
-      // to the DOM.
-      if (this.adapter_.isAttachedToDOM() && this.currentAnimationClass_.length > 0) {
-        this.adapter_.addClass(this.currentAnimationClass_);
-        this.adapter_.registerAnimationEndHandler(this.animEndHandler_);
-      }
-    }
-
-    /**
-     * @param {!SelectionControlState} nativeCb
-     * @return {string}
-     * @private
-     */
-
-  }, {
-    key: 'determineCheckState_',
-    value: function determineCheckState_(nativeCb) {
-      var TRANSITION_STATE_INDETERMINATE = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_INDETERMINATE,
-          TRANSITION_STATE_CHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_CHECKED,
-          TRANSITION_STATE_UNCHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_UNCHECKED;
-
-
-      if (nativeCb.indeterminate) {
-        return TRANSITION_STATE_INDETERMINATE;
-      }
-      return nativeCb.checked ? TRANSITION_STATE_CHECKED : TRANSITION_STATE_UNCHECKED;
-    }
-
-    /**
-     * @param {string} oldState
-     * @param {string} newState
-     * @return {string}
-     */
-
-  }, {
-    key: 'getTransitionAnimationClass_',
-    value: function getTransitionAnimationClass_(oldState, newState) {
-      var TRANSITION_STATE_INIT = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_INIT,
-          TRANSITION_STATE_CHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_CHECKED,
-          TRANSITION_STATE_UNCHECKED = __WEBPACK_IMPORTED_MODULE_3__constants__["b" /* strings */].TRANSITION_STATE_UNCHECKED;
-      var _MDCCheckboxFoundatio = MDCCheckboxFoundation.cssClasses,
-          ANIM_UNCHECKED_CHECKED = _MDCCheckboxFoundatio.ANIM_UNCHECKED_CHECKED,
-          ANIM_UNCHECKED_INDETERMINATE = _MDCCheckboxFoundatio.ANIM_UNCHECKED_INDETERMINATE,
-          ANIM_CHECKED_UNCHECKED = _MDCCheckboxFoundatio.ANIM_CHECKED_UNCHECKED,
-          ANIM_CHECKED_INDETERMINATE = _MDCCheckboxFoundatio.ANIM_CHECKED_INDETERMINATE,
-          ANIM_INDETERMINATE_CHECKED = _MDCCheckboxFoundatio.ANIM_INDETERMINATE_CHECKED,
-          ANIM_INDETERMINATE_UNCHECKED = _MDCCheckboxFoundatio.ANIM_INDETERMINATE_UNCHECKED;
-
-
-      switch (oldState) {
-        case TRANSITION_STATE_INIT:
-          if (newState === TRANSITION_STATE_UNCHECKED) {
-            return '';
-          }
-        // fallthrough
-        case TRANSITION_STATE_UNCHECKED:
-          return newState === TRANSITION_STATE_CHECKED ? ANIM_UNCHECKED_CHECKED : ANIM_UNCHECKED_INDETERMINATE;
-        case TRANSITION_STATE_CHECKED:
-          return newState === TRANSITION_STATE_UNCHECKED ? ANIM_CHECKED_UNCHECKED : ANIM_CHECKED_INDETERMINATE;
-        // TRANSITION_STATE_INDETERMINATE
-        default:
-          return newState === TRANSITION_STATE_CHECKED ? ANIM_INDETERMINATE_CHECKED : ANIM_INDETERMINATE_UNCHECKED;
-      }
-    }
-
-    /**
-     * @return {!SelectionControlState}
-     * @private
-     */
-
-  }, {
-    key: 'getNativeControl_',
-    value: function getNativeControl_() {
-      return this.adapter_.getNativeControl() || {
-        checked: false,
-        indeterminate: false,
-        disabled: false,
-        value: null
-      };
-    }
-  }]);
-
-  return MDCCheckboxFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
-
-/**
- * @param {ObjectPropertyDescriptor|undefined} inputPropDesc
- * @return {boolean}
- */
-
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCCheckboxFoundation);
-function validDescriptor(inputPropDesc) {
-  return !!inputPropDesc && typeof inputPropDesc.set === 'function';
-}
-
-/***/ }),
-
-/***/ 5:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (immutable) */ __webpack_exports__["supportsCssVariables"] = supportsCssVariables;
-/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
-/* harmony export (immutable) */ __webpack_exports__["getMatchesProperty"] = getMatchesProperty;
-/* harmony export (immutable) */ __webpack_exports__["getNormalizedEventCoords"] = getNormalizedEventCoords;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Stores result from supportsCssVariables to avoid redundant processing to detect CSS custom variable support.
- * @private {boolean|undefined}
- */
-var supportsCssVariables_ = void 0;
-
-/**
- * Stores result from applyPassive to avoid redundant processing to detect passive event listener support.
- * @private {boolean|undefined}
- */
-var supportsPassive_ = void 0;
-
-/**
- * @param {!Window} windowObj
- * @return {boolean}
- */
-function detectEdgePseudoVarBug(windowObj) {
-  // Detect versions of Edge with buggy var() support
-  // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11495448/
-  var document = windowObj.document;
-  var className = 'test-edge-css-var';
-  var styleNode = document.createElement('style');
-  document.head.appendChild(styleNode);
-  var sheet = styleNode.sheet;
-  // Internet Explorer 11 requires indices to always be specified to insertRule
-  sheet.insertRule(':root { --' + className + ': 1px solid #000; }', 0);
-  sheet.insertRule('.' + className + ' { visibility: hidden; }', 1);
-  sheet.insertRule('.' + className + '::before { border: var(--' + className + '); }', 2);
-  var node = document.createElement('div');
-  node.className = className;
-  document.body.appendChild(node);
-  // Bug exists if ::before style ends up propagating to the parent element
-  var hasPseudoVarBug = windowObj.getComputedStyle(node).borderTopStyle === 'solid';
-  node.remove();
-  styleNode.remove();
-  return hasPseudoVarBug;
-}
-
-/**
- * @param {!Window} windowObj
- * @param {boolean=} forceRefresh
- * @return {boolean|undefined}
- */
-function supportsCssVariables(windowObj) {
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (typeof supportsCssVariables_ === 'boolean' && !forceRefresh) {
-    return supportsCssVariables_;
-  }
-
-  var supportsFunctionPresent = windowObj.CSS && typeof windowObj.CSS.supports === 'function';
-  if (!supportsFunctionPresent) {
-    return;
-  }
-
-  var explicitlySupportsCssVars = windowObj.CSS.supports('--css-vars', 'yes');
-  // See: https://bugs.webkit.org/show_bug.cgi?id=154669
-  // See: README section on Safari
-  var weAreFeatureDetectingSafari10plus = windowObj.CSS.supports('(--css-vars: yes)') && windowObj.CSS.supports('color', '#00000000');
-
-  if (explicitlySupportsCssVars || weAreFeatureDetectingSafari10plus) {
-    supportsCssVariables_ = !detectEdgePseudoVarBug(windowObj);
-  } else {
-    supportsCssVariables_ = false;
-  }
-  return supportsCssVariables_;
-}
-
-//
-/**
- * Determine whether the current browser supports passive event listeners, and if so, use them.
- * @param {!Window=} globalObj
- * @param {boolean=} forceRefresh
- * @return {boolean|{passive: boolean}}
- */
-function applyPassive() {
-  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (supportsPassive_ === undefined || forceRefresh) {
-    var isSupported = false;
-    try {
-      globalObj.document.addEventListener('test', null, { get passive() {
-          isSupported = true;
-        } });
-    } catch (e) {}
-
-    supportsPassive_ = isSupported;
-  }
-
-  return supportsPassive_ ? { passive: true } : false;
-}
-
-/**
- * @param {!Object} HTMLElementPrototype
- * @return {!Array<string>}
- */
-function getMatchesProperty(HTMLElementPrototype) {
-  return ['webkitMatchesSelector', 'msMatchesSelector', 'matches'].filter(function (p) {
-    return p in HTMLElementPrototype;
-  }).pop();
-}
-
-/**
- * @param {!Event} ev
- * @param {!{x: number, y: number}} pageOffset
- * @param {!ClientRect} clientRect
- * @return {!{x: number, y: number}}
- */
-function getNormalizedEventCoords(ev, pageOffset, clientRect) {
-  var x = pageOffset.x,
-      y = pageOffset.y;
-
-  var documentX = x + clientRect.left;
-  var documentY = y + clientRect.top;
-
-  var normalizedX = void 0;
-  var normalizedY = void 0;
-  // Determine touch point relative to the ripple container.
-  if (ev.type === 'touchstart') {
-    normalizedX = ev.changedTouches[0].pageX - documentX;
-    normalizedY = ev.changedTouches[0].pageY - documentY;
-  } else {
-    normalizedX = ev.pageX - documentX;
-    normalizedY = ev.pageY - documentY;
-  }
-
-  return { x: normalizedX, y: normalizedY };
-}
-
-/***/ }),
-
-/***/ 6:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRipple", function() { return MDCRipple; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(4);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(8);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(5);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRippleFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
-/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; });
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-
-
-/**
- * @extends MDCComponent<!MDCRippleFoundation>
- */
-var MDCRipple = function (_MDCComponent) {
-  _inherits(MDCRipple, _MDCComponent);
-
-  /** @param {...?} args */
-  function MDCRipple() {
-    var _ref;
-
-    _classCallCheck(this, MDCRipple);
-
-    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-
-    /** @type {boolean} */
-    var _this = _possibleConstructorReturn(this, (_ref = MDCRipple.__proto__ || Object.getPrototypeOf(MDCRipple)).call.apply(_ref, [this].concat(args)));
-
-    _this.disabled = false;
-
-    /** @private {boolean} */
-    _this.unbounded_;
-    return _this;
-  }
-
-  /**
-   * @param {!Element} root
-   * @param {{isUnbounded: (boolean|undefined)}=} options
-   * @return {!MDCRipple}
-   */
-
-
-  _createClass(MDCRipple, [{
-    key: 'activate',
-    value: function activate() {
-      this.foundation_.activate();
-    }
-  }, {
-    key: 'deactivate',
-    value: function deactivate() {
-      this.foundation_.deactivate();
-    }
-  }, {
-    key: 'layout',
-    value: function layout() {
-      this.foundation_.layout();
-    }
-
-    /** @return {!MDCRippleFoundation} */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */](MDCRipple.createAdapter(this));
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset;
-    }
-  }, {
-    key: 'unbounded',
-
-
-    /** @return {boolean} */
-    get: function get() {
-      return this.unbounded_;
-    }
-
-    /** @param {boolean} unbounded */
-    ,
-    set: function set(unbounded) {
-      var UNBOUNDED = __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].cssClasses.UNBOUNDED;
-
-      this.unbounded_ = Boolean(unbounded);
-      if (this.unbounded_) {
-        this.root_.classList.add(UNBOUNDED);
-      } else {
-        this.root_.classList.remove(UNBOUNDED);
-      }
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-          _ref2$isUnbounded = _ref2.isUnbounded,
-          isUnbounded = _ref2$isUnbounded === undefined ? undefined : _ref2$isUnbounded;
-
-      var ripple = new MDCRipple(root);
-      // Only override unbounded behavior if option is explicitly specified
-      if (isUnbounded !== undefined) {
-        ripple.unbounded = /** @type {boolean} */isUnbounded;
-      }
-      return ripple;
-    }
-
-    /**
-     * @param {!RippleCapableSurface} instance
-     * @return {!MDCRippleAdapter}
-     */
-
-  }, {
-    key: 'createAdapter',
-    value: function createAdapter(instance) {
-      var MATCHES = __WEBPACK_IMPORTED_MODULE_3__util__["getMatchesProperty"](HTMLElement.prototype);
-
-      return {
-        browserSupportsCssVars: function browserSupportsCssVars() {
-          return __WEBPACK_IMPORTED_MODULE_3__util__["supportsCssVariables"](window);
-        },
-        isUnbounded: function isUnbounded() {
-          return instance.unbounded;
-        },
-        isSurfaceActive: function isSurfaceActive() {
-          return instance.root_[MATCHES](':active');
-        },
-        isSurfaceDisabled: function isSurfaceDisabled() {
-          return instance.disabled;
-        },
-        addClass: function addClass(className) {
-          return instance.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return instance.root_.classList.remove(className);
-        },
-        registerInteractionHandler: function registerInteractionHandler(evtType, handler) {
-          return instance.root_.addEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(evtType, handler) {
-          return instance.root_.removeEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
-        },
-        registerResizeHandler: function registerResizeHandler(handler) {
-          return window.addEventListener('resize', handler);
-        },
-        deregisterResizeHandler: function deregisterResizeHandler(handler) {
-          return window.removeEventListener('resize', handler);
-        },
-        updateCssVariable: function updateCssVariable(varName, value) {
-          return instance.root_.style.setProperty(varName, value);
-        },
-        computeBoundingRect: function computeBoundingRect() {
-          return instance.root_.getBoundingClientRect();
-        },
-        getWindowPageOffset: function getWindowPageOffset() {
-          return { x: window.pageXOffset, y: window.pageYOffset };
-        }
-      };
-    }
-  }]);
-
-  return MDCRipple;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
-
-/**
- * See Material Design spec for more details on when to use ripples.
- * https://material.io/guidelines/motion/choreography.html#choreography-creation
- * @record
- */
-
-var RippleCapableSurface = function RippleCapableSurface() {
-  _classCallCheck(this, RippleCapableSurface);
-};
-
-/** @protected {!Element} */
-
-
-RippleCapableSurface.prototype.root_;
-
-/**
- * Whether or not the ripple bleeds out of the bounds of the element.
- * @type {boolean|undefined}
- */
-RippleCapableSurface.prototype.unbounded;
-
-/**
- * Whether or not the ripple is attached to a disabled component.
- * @type {boolean|undefined}
- */
-RippleCapableSurface.prototype.disabled;
-
-/***/ }),
-
-/***/ 7:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return numbers; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var cssClasses = {
-  // Ripple is a special case where the "root" component is really a "mixin" of sorts,
-  // given that it's an 'upgrade' to an existing component. That being said it is the root
-  // CSS class that all other CSS classes derive from.
-  ROOT: 'mdc-ripple-upgraded',
-  UNBOUNDED: 'mdc-ripple-upgraded--unbounded',
-  BG_FOCUSED: 'mdc-ripple-upgraded--background-focused',
-  BG_ACTIVE_FILL: 'mdc-ripple-upgraded--background-active-fill',
-  FG_ACTIVATION: 'mdc-ripple-upgraded--foreground-activation',
-  FG_DEACTIVATION: 'mdc-ripple-upgraded--foreground-deactivation'
-};
-
-var strings = {
-  VAR_SURFACE_WIDTH: '--mdc-ripple-surface-width',
-  VAR_SURFACE_HEIGHT: '--mdc-ripple-surface-height',
-  VAR_FG_SIZE: '--mdc-ripple-fg-size',
-  VAR_LEFT: '--mdc-ripple-left',
-  VAR_TOP: '--mdc-ripple-top',
-  VAR_FG_SCALE: '--mdc-ripple-fg-scale',
-  VAR_FG_TRANSLATE_START: '--mdc-ripple-fg-translate-start',
-  VAR_FG_TRANSLATE_END: '--mdc-ripple-fg-translate-end'
-};
-
-var numbers = {
-  PADDING: 10,
-  INITIAL_ORIGIN_SCALE: 0.6,
-  DEACTIVATION_TIMEOUT_MS: 300,
-  FG_DEACTIVATION_MS: 83
-};
-
-/***/ }),
-
-/***/ 8:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(4);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(7);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(5);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-/**
- * @typedef {!{
- *   isActivated: (boolean|undefined),
- *   hasDeactivationUXRun: (boolean|undefined),
- *   wasActivatedByPointer: (boolean|undefined),
- *   wasElementMadeActive: (boolean|undefined),
- *   activationStartTime: (number|undefined),
- *   activationEvent: Event,
- *   isProgrammatic: (boolean|undefined)
- * }}
- */
-var ActivationStateType = void 0;
-
-/**
- * @typedef {!{
- *   activate: (string|undefined),
- *   deactivate: (string|undefined),
- *   focus: (string|undefined),
- *   blur: (string|undefined)
- * }}
- */
-var ListenerInfoType = void 0;
-
-/**
- * @typedef {!{
- *   activate: function(!Event),
- *   deactivate: function(!Event),
- *   focus: function(),
- *   blur: function()
- * }}
- */
-var ListenersType = void 0;
-
-/**
- * @typedef {!{
- *   x: number,
- *   y: number
- * }}
- */
-var PointType = void 0;
-
-/**
- * @enum {string}
- */
-var DEACTIVATION_ACTIVATION_PAIRS = {
-  mouseup: 'mousedown',
-  pointerup: 'pointerdown',
-  touchend: 'touchstart',
-  keyup: 'keydown',
-  blur: 'focus'
-};
-
-/**
- * @extends {MDCFoundation<!MDCRippleAdapter>}
- */
-
-var MDCRippleFoundation = function (_MDCFoundation) {
-  _inherits(MDCRippleFoundation, _MDCFoundation);
-
-  _createClass(MDCRippleFoundation, [{
-    key: 'isSupported_',
-
-
-    /**
-     * We compute this property so that we are not querying information about the client
-     * until the point in time where the foundation requests it. This prevents scenarios where
-     * client-side feature-detection may happen too early, such as when components are rendered on the server
-     * and then initialized at mount time on the client.
-     * @return {boolean}
-     */
-    get: function get() {
-      return this.adapter_.browserSupportsCssVars();
-    }
-  }], [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'numbers',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* numbers */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return {
-        browserSupportsCssVars: function browserSupportsCssVars() /* boolean - cached */{},
-        isUnbounded: function isUnbounded() /* boolean */{},
-        isSurfaceActive: function isSurfaceActive() /* boolean */{},
-        isSurfaceDisabled: function isSurfaceDisabled() /* boolean */{},
-        addClass: function addClass() /* className: string */{},
-        removeClass: function removeClass() /* className: string */{},
-        registerInteractionHandler: function registerInteractionHandler() /* evtType: string, handler: EventListener */{},
-        deregisterInteractionHandler: function deregisterInteractionHandler() /* evtType: string, handler: EventListener */{},
-        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
-        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
-        updateCssVariable: function updateCssVariable() /* varName: string, value: string */{},
-        computeBoundingRect: function computeBoundingRect() /* ClientRect */{},
-        getWindowPageOffset: function getWindowPageOffset() /* {x: number, y: number} */{}
-      };
-    }
-  }]);
-
-  function MDCRippleFoundation(adapter) {
-    _classCallCheck(this, MDCRippleFoundation);
-
-    /** @private {number} */
-    var _this = _possibleConstructorReturn(this, (MDCRippleFoundation.__proto__ || Object.getPrototypeOf(MDCRippleFoundation)).call(this, _extends(MDCRippleFoundation.defaultAdapter, adapter)));
-
-    _this.layoutFrame_ = 0;
-
-    /** @private {!ClientRect} */
-    _this.frame_ = /** @type {!ClientRect} */{ width: 0, height: 0 };
-
-    /** @private {!ActivationStateType} */
-    _this.activationState_ = _this.defaultActivationState_();
-
-    /** @private {number} */
-    _this.xfDuration_ = 0;
-
-    /** @private {number} */
-    _this.initialSize_ = 0;
-
-    /** @private {number} */
-    _this.maxRadius_ = 0;
-
-    /** @private {!Array<{ListenerInfoType}>} */
-    _this.listenerInfos_ = [{ activate: 'touchstart', deactivate: 'touchend' }, { activate: 'pointerdown', deactivate: 'pointerup' }, { activate: 'mousedown', deactivate: 'mouseup' }, { activate: 'keydown', deactivate: 'keyup' }, { focus: 'focus', blur: 'blur' }];
-
-    /** @private {!ListenersType} */
-    _this.listeners_ = {
-      activate: function activate(e) {
-        return _this.activate_(e);
-      },
-      deactivate: function deactivate(e) {
-        return _this.deactivate_(e);
-      },
-      focus: function focus() {
-        return requestAnimationFrame(function () {
-          return _this.adapter_.addClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
-        });
-      },
-      blur: function blur() {
-        return requestAnimationFrame(function () {
-          return _this.adapter_.removeClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
-        });
-      }
-    };
-
-    /** @private {!Function} */
-    _this.resizeHandler_ = function () {
-      return _this.layout();
-    };
-
-    /** @private {!{left: number, top:number}} */
-    _this.unboundedCoords_ = {
-      left: 0,
-      top: 0
-    };
-
-    /** @private {number} */
-    _this.fgScale_ = 0;
-
-    /** @private {number} */
-    _this.activationTimer_ = 0;
-
-    /** @private {number} */
-    _this.fgDeactivationRemovalTimer_ = 0;
-
-    /** @private {boolean} */
-    _this.activationAnimationHasEnded_ = false;
-
-    /** @private {!Function} */
-    _this.activationTimerCallback_ = function () {
-      _this.activationAnimationHasEnded_ = true;
-      _this.runDeactivationUXLogicIfReady_();
-    };
-    return _this;
-  }
-
-  /**
-   * @return {!ActivationStateType}
-   */
-
-
-  _createClass(MDCRippleFoundation, [{
-    key: 'defaultActivationState_',
-    value: function defaultActivationState_() {
-      return {
-        isActivated: false,
-        hasDeactivationUXRun: false,
-        wasActivatedByPointer: false,
-        wasElementMadeActive: false,
-        activationStartTime: 0,
-        activationEvent: null,
-        isProgrammatic: false
-      };
-    }
-  }, {
-    key: 'init',
-    value: function init() {
-      var _this2 = this;
-
-      if (!this.isSupported_) {
-        return;
-      }
-      this.addEventListeners_();
-
-      var _MDCRippleFoundation$ = MDCRippleFoundation.cssClasses,
-          ROOT = _MDCRippleFoundation$.ROOT,
-          UNBOUNDED = _MDCRippleFoundation$.UNBOUNDED;
-
-      requestAnimationFrame(function () {
-        _this2.adapter_.addClass(ROOT);
-        if (_this2.adapter_.isUnbounded()) {
-          _this2.adapter_.addClass(UNBOUNDED);
-        }
-        _this2.layoutInternal_();
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'addEventListeners_',
-    value: function addEventListeners_() {
-      var _this3 = this;
-
-      this.listenerInfos_.forEach(function (info) {
-        Object.keys(info).forEach(function (k) {
-          _this3.adapter_.registerInteractionHandler(info[k], _this3.listeners_[k]);
-        });
-      });
-      this.adapter_.registerResizeHandler(this.resizeHandler_);
-    }
-
-    /**
-     * @param {Event} e
-     * @private
-     */
-
-  }, {
-    key: 'activate_',
-    value: function activate_(e) {
-      var _this4 = this;
-
-      if (this.adapter_.isSurfaceDisabled()) {
-        return;
-      }
-
-      var activationState = this.activationState_;
-
-      if (activationState.isActivated) {
-        return;
-      }
-
-      activationState.isActivated = true;
-      activationState.isProgrammatic = e === null;
-      activationState.activationEvent = e;
-      activationState.wasActivatedByPointer = activationState.isProgrammatic ? false : e.type === 'mousedown' || e.type === 'touchstart' || e.type === 'pointerdown';
-      activationState.activationStartTime = Date.now();
-
-      requestAnimationFrame(function () {
-        // This needs to be wrapped in an rAF call b/c web browsers
-        // report active states inconsistently when they're called within
-        // event handling code:
-        // - https://bugs.chromium.org/p/chromium/issues/detail?id=635971
-        // - https://bugzilla.mozilla.org/show_bug.cgi?id=1293741
-        activationState.wasElementMadeActive = e && e.type === 'keydown' ? _this4.adapter_.isSurfaceActive() : true;
-        if (activationState.wasElementMadeActive) {
-          _this4.animateActivation_();
-        } else {
-          // Reset activation state immediately if element was not made active.
-          _this4.activationState_ = _this4.defaultActivationState_();
-        }
-      });
-    }
-  }, {
-    key: 'activate',
-    value: function activate() {
-      this.activate_(null);
-    }
-
-    /** @private */
-
-  }, {
-    key: 'animateActivation_',
-    value: function animateActivation_() {
-      var _this5 = this;
-
-      var _MDCRippleFoundation$2 = MDCRippleFoundation.strings,
-          VAR_FG_TRANSLATE_START = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_START,
-          VAR_FG_TRANSLATE_END = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_END;
-      var _MDCRippleFoundation$3 = MDCRippleFoundation.cssClasses,
-          BG_ACTIVE_FILL = _MDCRippleFoundation$3.BG_ACTIVE_FILL,
-          FG_DEACTIVATION = _MDCRippleFoundation$3.FG_DEACTIVATION,
-          FG_ACTIVATION = _MDCRippleFoundation$3.FG_ACTIVATION;
-      var DEACTIVATION_TIMEOUT_MS = MDCRippleFoundation.numbers.DEACTIVATION_TIMEOUT_MS;
-
-
-      var translateStart = '';
-      var translateEnd = '';
-
-      if (!this.adapter_.isUnbounded()) {
-        var _getFgTranslationCoor = this.getFgTranslationCoordinates_(),
-            startPoint = _getFgTranslationCoor.startPoint,
-            endPoint = _getFgTranslationCoor.endPoint;
-
-        translateStart = startPoint.x + 'px, ' + startPoint.y + 'px';
-        translateEnd = endPoint.x + 'px, ' + endPoint.y + 'px';
-      }
-
-      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_START, translateStart);
-      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_END, translateEnd);
-      // Cancel any ongoing activation/deactivation animations
-      clearTimeout(this.activationTimer_);
-      clearTimeout(this.fgDeactivationRemovalTimer_);
-      this.rmBoundedActivationClasses_();
-      this.adapter_.removeClass(FG_DEACTIVATION);
-
-      // Force layout in order to re-trigger the animation.
-      this.adapter_.computeBoundingRect();
-      this.adapter_.addClass(BG_ACTIVE_FILL);
-      this.adapter_.addClass(FG_ACTIVATION);
-      this.activationTimer_ = setTimeout(function () {
-        return _this5.activationTimerCallback_();
-      }, DEACTIVATION_TIMEOUT_MS);
-    }
-
-    /**
-     * @private
-     * @return {{startPoint: PointType, endPoint: PointType}}
-     */
-
-  }, {
-    key: 'getFgTranslationCoordinates_',
-    value: function getFgTranslationCoordinates_() {
-      var activationState = this.activationState_;
-      var activationEvent = activationState.activationEvent,
-          wasActivatedByPointer = activationState.wasActivatedByPointer;
-
-
-      var startPoint = void 0;
-      if (wasActivatedByPointer) {
-        startPoint = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util__["getNormalizedEventCoords"])(
-        /** @type {!Event} */activationEvent, this.adapter_.getWindowPageOffset(), this.adapter_.computeBoundingRect());
-      } else {
-        startPoint = {
-          x: this.frame_.width / 2,
-          y: this.frame_.height / 2
-        };
-      }
-      // Center the element around the start point.
-      startPoint = {
-        x: startPoint.x - this.initialSize_ / 2,
-        y: startPoint.y - this.initialSize_ / 2
-      };
-
-      var endPoint = {
-        x: this.frame_.width / 2 - this.initialSize_ / 2,
-        y: this.frame_.height / 2 - this.initialSize_ / 2
-      };
-
-      return { startPoint: startPoint, endPoint: endPoint };
-    }
-
-    /** @private */
-
-  }, {
-    key: 'runDeactivationUXLogicIfReady_',
-    value: function runDeactivationUXLogicIfReady_() {
-      var _this6 = this;
-
-      var FG_DEACTIVATION = MDCRippleFoundation.cssClasses.FG_DEACTIVATION;
-      var _activationState_ = this.activationState_,
-          hasDeactivationUXRun = _activationState_.hasDeactivationUXRun,
-          isActivated = _activationState_.isActivated;
-
-      var activationHasEnded = hasDeactivationUXRun || !isActivated;
-      if (activationHasEnded && this.activationAnimationHasEnded_) {
-        this.rmBoundedActivationClasses_();
-        this.adapter_.addClass(FG_DEACTIVATION);
-        this.fgDeactivationRemovalTimer_ = setTimeout(function () {
-          _this6.adapter_.removeClass(FG_DEACTIVATION);
-        }, __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* numbers */].FG_DEACTIVATION_MS);
-      }
-    }
-
-    /** @private */
-
-  }, {
-    key: 'rmBoundedActivationClasses_',
-    value: function rmBoundedActivationClasses_() {
-      var _MDCRippleFoundation$4 = MDCRippleFoundation.cssClasses,
-          BG_ACTIVE_FILL = _MDCRippleFoundation$4.BG_ACTIVE_FILL,
-          FG_ACTIVATION = _MDCRippleFoundation$4.FG_ACTIVATION;
-
-      this.adapter_.removeClass(BG_ACTIVE_FILL);
-      this.adapter_.removeClass(FG_ACTIVATION);
-      this.activationAnimationHasEnded_ = false;
-      this.adapter_.computeBoundingRect();
-    }
-
-    /**
-     * @param {Event} e
-     * @private
-     */
-
-  }, {
-    key: 'deactivate_',
-    value: function deactivate_(e) {
-      var _this7 = this;
-
-      var activationState = this.activationState_;
-      // This can happen in scenarios such as when you have a keyup event that blurs the element.
-
-      if (!activationState.isActivated) {
-        return;
-      }
-      // Programmatic deactivation.
-      if (activationState.isProgrammatic) {
-        var evtObject = null;
-        var _state = /** @type {!ActivationStateType} */_extends({}, activationState);
-        requestAnimationFrame(function () {
-          return _this7.animateDeactivation_(evtObject, _state);
-        });
-        this.activationState_ = this.defaultActivationState_();
-        return;
-      }
-
-      var actualActivationType = DEACTIVATION_ACTIVATION_PAIRS[e.type];
-      var expectedActivationType = activationState.activationEvent.type;
-      // NOTE: Pointer events are tricky - https://patrickhlauke.github.io/touch/tests/results/
-      // Essentially, what we need to do here is decouple the deactivation UX from the actual
-      // deactivation state itself. This way, touch/pointer events in sequence do not trample one
-      // another.
-      var needsDeactivationUX = actualActivationType === expectedActivationType;
-      var needsActualDeactivation = needsDeactivationUX;
-      if (activationState.wasActivatedByPointer) {
-        needsActualDeactivation = e.type === 'mouseup';
-      }
-
-      var state = /** @type {!ActivationStateType} */_extends({}, activationState);
-      requestAnimationFrame(function () {
-        if (needsDeactivationUX) {
-          _this7.activationState_.hasDeactivationUXRun = true;
-          _this7.animateDeactivation_(e, state);
-        }
-
-        if (needsActualDeactivation) {
-          _this7.activationState_ = _this7.defaultActivationState_();
-        }
-      });
-    }
-  }, {
-    key: 'deactivate',
-    value: function deactivate() {
-      this.deactivate_(null);
-    }
-
-    /**
-     * @param {Event} e
-     * @param {!ActivationStateType} options
-     * @private
-     */
-
-  }, {
-    key: 'animateDeactivation_',
-    value: function animateDeactivation_(e, _ref) {
-      var wasActivatedByPointer = _ref.wasActivatedByPointer,
-          wasElementMadeActive = _ref.wasElementMadeActive;
-      var BG_FOCUSED = MDCRippleFoundation.cssClasses.BG_FOCUSED;
-
-      if (wasActivatedByPointer || wasElementMadeActive) {
-        // Remove class left over by element being focused
-        this.adapter_.removeClass(BG_FOCUSED);
-        this.runDeactivationUXLogicIfReady_();
-      }
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      var _this8 = this;
-
-      if (!this.isSupported_) {
-        return;
-      }
-      this.removeEventListeners_();
-
-      var _MDCRippleFoundation$5 = MDCRippleFoundation.cssClasses,
-          ROOT = _MDCRippleFoundation$5.ROOT,
-          UNBOUNDED = _MDCRippleFoundation$5.UNBOUNDED;
-
-      requestAnimationFrame(function () {
-        _this8.adapter_.removeClass(ROOT);
-        _this8.adapter_.removeClass(UNBOUNDED);
-        _this8.removeCssVars_();
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'removeEventListeners_',
-    value: function removeEventListeners_() {
-      var _this9 = this;
-
-      this.listenerInfos_.forEach(function (info) {
-        Object.keys(info).forEach(function (k) {
-          _this9.adapter_.deregisterInteractionHandler(info[k], _this9.listeners_[k]);
-        });
-      });
-      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
-    }
-
-    /** @private */
-
-  }, {
-    key: 'removeCssVars_',
-    value: function removeCssVars_() {
-      var _this10 = this;
-
-      var strings = MDCRippleFoundation.strings;
-
-      Object.keys(strings).forEach(function (k) {
-        if (k.indexOf('VAR_') === 0) {
-          _this10.adapter_.updateCssVariable(strings[k], null);
-        }
-      });
-    }
-  }, {
-    key: 'layout',
-    value: function layout() {
-      var _this11 = this;
-
-      if (this.layoutFrame_) {
-        cancelAnimationFrame(this.layoutFrame_);
-      }
-      this.layoutFrame_ = requestAnimationFrame(function () {
-        _this11.layoutInternal_();
-        _this11.layoutFrame_ = 0;
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'layoutInternal_',
-    value: function layoutInternal_() {
-      this.frame_ = this.adapter_.computeBoundingRect();
-
-      var maxDim = Math.max(this.frame_.height, this.frame_.width);
-      var surfaceDiameter = Math.sqrt(Math.pow(this.frame_.width, 2) + Math.pow(this.frame_.height, 2));
-
-      // 60% of the largest dimension of the surface
-      this.initialSize_ = maxDim * MDCRippleFoundation.numbers.INITIAL_ORIGIN_SCALE;
-
-      // Diameter of the surface + 10px
-      this.maxRadius_ = surfaceDiameter + MDCRippleFoundation.numbers.PADDING;
-      this.fgScale_ = this.maxRadius_ / this.initialSize_;
-      this.xfDuration_ = 1000 * Math.sqrt(this.maxRadius_ / 1024);
-      this.updateLayoutCssVars_();
-    }
-
-    /** @private */
-
-  }, {
-    key: 'updateLayoutCssVars_',
-    value: function updateLayoutCssVars_() {
-      var _MDCRippleFoundation$6 = MDCRippleFoundation.strings,
-          VAR_SURFACE_WIDTH = _MDCRippleFoundation$6.VAR_SURFACE_WIDTH,
-          VAR_SURFACE_HEIGHT = _MDCRippleFoundation$6.VAR_SURFACE_HEIGHT,
-          VAR_FG_SIZE = _MDCRippleFoundation$6.VAR_FG_SIZE,
-          VAR_LEFT = _MDCRippleFoundation$6.VAR_LEFT,
-          VAR_TOP = _MDCRippleFoundation$6.VAR_TOP,
-          VAR_FG_SCALE = _MDCRippleFoundation$6.VAR_FG_SCALE;
-
-
-      this.adapter_.updateCssVariable(VAR_SURFACE_WIDTH, this.frame_.width + 'px');
-      this.adapter_.updateCssVariable(VAR_SURFACE_HEIGHT, this.frame_.height + 'px');
-      this.adapter_.updateCssVariable(VAR_FG_SIZE, this.initialSize_ + 'px');
-      this.adapter_.updateCssVariable(VAR_FG_SCALE, this.fgScale_);
-
-      if (this.adapter_.isUnbounded()) {
-        this.unboundedCoords_ = {
-          left: Math.round(this.frame_.width / 2 - this.initialSize_ / 2),
-          top: Math.round(this.frame_.height / 2 - this.initialSize_ / 2)
-        };
-
-        this.adapter_.updateCssVariable(VAR_LEFT, this.unboundedCoords_.left + 'px');
-        this.adapter_.updateCssVariable(VAR_TOP, this.unboundedCoords_.top + 'px');
-      }
-    }
-  }]);
-
-  return MDCRippleFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCRippleFoundation);
-
-/***/ }),
-
-/***/ 84:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(24);
-
-
-/***/ }),
-
-/***/ 9:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformStyleProperties", function() { return transformStyleProperties; });
-/* harmony export (immutable) */ __webpack_exports__["getCorrectEventName"] = getCorrectEventName;
-/* harmony export (immutable) */ __webpack_exports__["getCorrectPropertyName"] = getCorrectPropertyName;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {{
- *   noPrefix: string,
- *   webkitPrefix: string
- * }}
- */
-var VendorPropertyMapType = void 0;
-
-/** @const {Object<string, !VendorPropertyMapType>} */
-var eventTypeMap = {
-  'animationstart': {
-    noPrefix: 'animationstart',
-    webkitPrefix: 'webkitAnimationStart',
-    styleProperty: 'animation'
-  },
-  'animationend': {
-    noPrefix: 'animationend',
-    webkitPrefix: 'webkitAnimationEnd',
-    styleProperty: 'animation'
-  },
-  'animationiteration': {
-    noPrefix: 'animationiteration',
-    webkitPrefix: 'webkitAnimationIteration',
-    styleProperty: 'animation'
-  },
-  'transitionend': {
-    noPrefix: 'transitionend',
-    webkitPrefix: 'webkitTransitionEnd',
-    styleProperty: 'transition'
-  }
-};
-
-/** @const {Object<string, !VendorPropertyMapType>} */
-var cssPropertyMap = {
-  'animation': {
-    noPrefix: 'animation',
-    webkitPrefix: '-webkit-animation'
-  },
-  'transform': {
-    noPrefix: 'transform',
-    webkitPrefix: '-webkit-transform'
-  },
-  'transition': {
-    noPrefix: 'transition',
-    webkitPrefix: '-webkit-transition'
-  }
-};
-
-/**
- * @param {!Object} windowObj
- * @return {boolean}
- */
-function hasProperShape(windowObj) {
-  return windowObj['document'] !== undefined && typeof windowObj['document']['createElement'] === 'function';
-}
-
-/**
- * @param {string} eventType
- * @return {boolean}
- */
-function eventFoundInMaps(eventType) {
-  return eventType in eventTypeMap || eventType in cssPropertyMap;
-}
-
-/**
- * @param {string} eventType
- * @param {!Object<string, !VendorPropertyMapType>} map
- * @param {!Element} el
- * @return {string}
- */
-function getJavaScriptEventName(eventType, map, el) {
-  return map[eventType].styleProperty in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
-}
-
-/**
- * Helper function to determine browser prefix for CSS3 animation events
- * and property names.
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getAnimationName(windowObj, eventType) {
-  if (!hasProperShape(windowObj) || !eventFoundInMaps(eventType)) {
-    return eventType;
-  }
-
-  var map = /** @type {!Object<string, !VendorPropertyMapType>} */eventType in eventTypeMap ? eventTypeMap : cssPropertyMap;
-  var el = windowObj['document']['createElement']('div');
-  var eventName = '';
-
-  if (map === eventTypeMap) {
-    eventName = getJavaScriptEventName(eventType, map, el);
-  } else {
-    eventName = map[eventType].noPrefix in el.style ? map[eventType].noPrefix : map[eventType].webkitPrefix;
-  }
-
-  return eventName;
-}
-
-// Public functions to access getAnimationName() for JavaScript events or CSS
-// property names.
-
-var transformStyleProperties = ['transform', 'WebkitTransform', 'MozTransform', 'OTransform', 'MSTransform'];
-
-/**
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getCorrectEventName(windowObj, eventType) {
-  return getAnimationName(windowObj, eventType);
-}
-
-/**
- * @param {!Object} windowObj
- * @param {string} eventType
- * @return {string}
- */
-function getCorrectPropertyName(windowObj, eventType) {
-  return getAnimationName(windowObj, eventType);
-}
-
-/***/ })
-
-/******/ });
-});

+ 0 - 449
support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.css

@@ -1,449 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-:root {
-  --mdc-dialog-dark-theme-bg-color: #303030; }
-
-.mdc-dialog {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  position: fixed;
-  top: 0;
-  left: 0;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  width: 100%;
-  height: 100%;
-  visibility: hidden;
-  z-index: 2; }
-  .mdc-dialog__backdrop {
-    position: fixed;
-    top: 0;
-    left: 0;
-    -webkit-box-align: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: center;
-        -ms-flex-pack: center;
-            justify-content: center;
-    width: 100%;
-    height: 100%;
-    /* @alternate */
-    background-color: rgba(0, 0, 0, 0.87);
-    background-color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
-    opacity: 0;
-    z-index: -1; }
-  .mdc-dialog__surface {
-    display: -webkit-inline-box;
-    display: -ms-inline-flexbox;
-    display: inline-flex;
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column;
-    -webkit-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
-    width: calc(100% - 30px);
-    min-width: 640px;
-    max-width: 865px;
-    -webkit-transform: translateY(150px) scale(0.8);
-            transform: translateY(150px) scale(0.8);
-    border-radius: 2px;
-    /* @alternate */
-    background-color: #fff;
-    background-color: var(--mdc-theme-background, #fff);
-    opacity: 0; }
-    .mdc-dialog--theme-dark .mdc-dialog__surface,
-    .mdc-theme--dark .mdc-dialog__surface {
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white);
-      background-color: #303030;
-      background-color: var(--mdc-dialog-dark-theme-bg-color, #303030); }
-    [dir="rtl"] .mdc-dialog .mdc-dialog__surface,
-    .mdc-dialog[dir="rtl"] .mdc-dialog__surface {
-      text-align: right; }
-  .mdc-dialog__header {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -webkit-box-align: center;
-        -ms-flex-align: center;
-            align-items: center;
-    padding: 24px 24px 0; }
-    .mdc-dialog__header__empty {
-      padding: 0; }
-    [dir="rtl"] .mdc-dialog .mdc-dialog__header,
-    .mdc-dialog[dir="rtl"] .mdc-dialog__header {
-      text-align: right; }
-    .mdc-dialog__header__title {
-      -webkit-box-flex: 1;
-          -ms-flex: 1;
-              flex: 1;
-      margin: 0;
-      font-family: Roboto, sans-serif;
-      -moz-osx-font-smoothing: grayscale;
-      -webkit-font-smoothing: antialiased;
-      font-size: 1.25rem;
-      font-weight: 500;
-      letter-spacing: 0.02em;
-      line-height: 2rem;
-      text-decoration: inherit;
-      text-transform: inherit; }
-  .mdc-dialog__body {
-    margin-top: 20px;
-    padding: 0 24px 24px;
-    /* @alternate */
-    color: rgba(0, 0, 0, 0.54);
-    color: var(--mdc-theme-text-secondary-on-light, rgba(0, 0, 0, 0.54));
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 400;
-    letter-spacing: 0.04em;
-    line-height: 1.25rem;
-    text-decoration: inherit;
-    text-transform: inherit; }
-    .mdc-dialog--theme-dark.mdc-dialog__body,
-    .mdc-theme--dark .mdc-dialog__body {
-      /* @alternate */
-      color: rgba(255, 255, 255, 0.7);
-      color: var(--mdc-theme-text-secondary-on-dark, rgba(255, 255, 255, 0.7)); }
-    .mdc-dialog__body--scrollable {
-      max-height: 195px;
-      border-top: 1px solid rgba(0, 0, 0, 0.1);
-      border-bottom: 1px solid rgba(0, 0, 0, 0.1);
-      overflow-y: scroll;
-      overflow-x: auto;
-      -webkit-overflow-scrolling: touch; }
-  .mdc-dialog__footer {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    -ms-flex-wrap: wrap;
-        flex-wrap: wrap;
-    -webkit-box-align: center;
-        -ms-flex-align: center;
-            align-items: center;
-    -webkit-box-pack: end;
-        -ms-flex-pack: end;
-            justify-content: flex-end;
-    padding: 8px; }
-    .mdc-dialog__footer__button {
-      margin-left: 0;
-      margin-right: 8px; }
-      [dir="rtl"] .mdc-dialog__footer__button, .mdc-dialog__footer__button[dir="rtl"] {
-        margin-left: 8px;
-        margin-right: 0; }
-      .mdc-dialog__footer__button:last-child {
-        margin-left: 0;
-        margin-right: 0; }
-        [dir="rtl"] .mdc-dialog__footer__button:last-child, .mdc-dialog__footer__button:last-child[dir="rtl"] {
-          margin-left: 0;
-          margin-right: 0; }
-    .mdc-dialog__footer__action {
-      /* @alternate */
-      color: #ff4081;
-      color: var(--mdc-theme-accent, #ff4081); }
-  @media (max-width: 640px) {
-    .mdc-dialog {
-      min-width: 280px; }
-      .mdc-dialog__surface {
-        min-width: 280px; }
-      .mdc-dialog__body {
-        line-height: 24px; } }
-  .mdc-dialog--animating {
-    visibility: visible; }
-    .mdc-dialog--animating .mdc-dialog__backdrop {
-      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
-    .mdc-dialog--animating .mdc-dialog--open .mdc-dialog__surface {
-      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
-    .mdc-dialog--animating .mdc-dialog__surface {
-      -webkit-transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1);
-      transition: opacity 120ms 0ms cubic-bezier(0, 0, 0.2, 1), transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 120ms 0ms cubic-bezier(0, 0, 0.2, 1); }
-  .mdc-dialog--open {
-    visibility: visible; }
-    .mdc-dialog--open .mdc-dialog__backdrop {
-      opacity: .3; }
-    .mdc-dialog--open .mdc-dialog__surface {
-      -webkit-transform: translateY(0) scale(1);
-              transform: translateY(0) scale(1);
-      opacity: 1; }
-
-.mdc-dialog-scroll-lock {
-  height: 100vh;
-  overflow: hidden; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 5);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 5:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 2486
support/client/lib/vwf/view/lib/mdc/dist/mdc.dialog.js

@@ -1,2486 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["dialog"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["dialog"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 85);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 0:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @template A
- */
-var MDCFoundation = function () {
-  _createClass(MDCFoundation, null, [{
-    key: "cssClasses",
-
-    /** @return enum{cssClasses} */
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports every
-      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
-      return {};
-    }
-
-    /** @return enum{strings} */
-
-  }, {
-    key: "strings",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
-      return {};
-    }
-
-    /** @return enum{numbers} */
-
-  }, {
-    key: "numbers",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
-      return {};
-    }
-
-    /** @return {!Object} */
-
-  }, {
-    key: "defaultAdapter",
-    get: function get() {
-      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
-      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
-      // validation.
-      return {};
-    }
-
-    /**
-     * @param {A=} adapter
-     */
-
-  }]);
-
-  function MDCFoundation() {
-    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, MDCFoundation);
-
-    /** @protected {!A} */
-    this.adapter_ = adapter;
-  }
-
-  _createClass(MDCFoundation, [{
-    key: "init",
-    value: function init() {
-      // Subclasses should override this method to perform initialization routines (registering events, etc.)
-    }
-  }, {
-    key: "destroy",
-    value: function destroy() {
-      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
-    }
-  }]);
-
-  return MDCFoundation;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
-
-/***/ }),
-
-/***/ 1:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/**
- * @template F
- */
-
-var MDCComponent = function () {
-  _createClass(MDCComponent, null, [{
-    key: 'attachTo',
-
-    /**
-     * @param {!Element} root
-     * @return {!MDCComponent}
-     */
-    value: function attachTo(root) {
-      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
-      // returns an instantiated component with its root set to that element. Also note that in the cases of
-      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
-      // from getDefaultFoundation().
-      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
-    }
-
-    /**
-     * @param {!Element} root
-     * @param {F=} foundation
-     * @param {...?} args
-     */
-
-  }]);
-
-  function MDCComponent(root) {
-    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-    _classCallCheck(this, MDCComponent);
-
-    /** @protected {!Element} */
-    this.root_ = root;
-
-    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
-
-    this.initialize.apply(this, args);
-    // Note that we initialize foundation here and not within the constructor's default param so that
-    // this.root_ is defined and can be used within the foundation class.
-    /** @protected {!F} */
-    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
-    this.foundation_.init();
-    this.initialSyncWithDOM();
-  }
-
-  _createClass(MDCComponent, [{
-    key: 'initialize',
-    value: function initialize() /* ...args */{}
-    // Subclasses can override this to do any additional setup work that would be considered part of a
-    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
-    // initialized. Any additional arguments besides root and foundation will be passed in here.
-
-
-    /**
-     * @return {!F} foundation
-     */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      // Subclasses must override this method to return a properly configured foundation class for the
-      // component.
-      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
-      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
-      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
-      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      // Subclasses may implement this method to release any resources / deregister any listeners they have
-      // attached. An example of this might be deregistering a resize event from the window object.
-      this.foundation_.destroy();
-    }
-
-    /**
-     * Wrapper method to add an event listener to the component's root element. This is most useful when
-     * listening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'listen',
-    value: function listen(evtType, handler) {
-      this.root_.addEventListener(evtType, handler);
-    }
-
-    /**
-     * Wrapper method to remove an event listener to the component's root element. This is most useful when
-     * unlistening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'unlisten',
-    value: function unlisten(evtType, handler) {
-      this.root_.removeEventListener(evtType, handler);
-    }
-
-    /**
-     * Fires a cross-browser-compatible custom event from the component root of the given type,
-     * with the given data.
-     * @param {string} evtType
-     * @param {!Object} evtData
-     * @param {boolean=} shouldBubble
-     */
-
-  }, {
-    key: 'emit',
-    value: function emit(evtType, evtData) {
-      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-      var evt = void 0;
-      if (typeof CustomEvent === 'function') {
-        evt = new CustomEvent(evtType, {
-          detail: evtData,
-          bubbles: shouldBubble
-        });
-      } else {
-        evt = document.createEvent('CustomEvent');
-        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
-      }
-
-      this.root_.dispatchEvent(evt);
-    }
-  }]);
-
-  return MDCComponent;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
-
-/***/ }),
-
-/***/ 2:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__selection_control__ = __webpack_require__(3);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__foundation__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCComponent", function() { return __WEBPACK_IMPORTED_MODULE_1__component__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionControlState", function() { return __WEBPACK_IMPORTED_MODULE_2__selection_control__["a"]; });
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-/***/ }),
-
-/***/ 25:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCDialog", function() { return MDCDialog; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__material_ripple__ = __webpack_require__(6);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(42);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(43);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCDialogFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
-/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; });
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-
-
-
-var MDCDialog = function (_MDCComponent) {
-  _inherits(MDCDialog, _MDCComponent);
-
-  function MDCDialog() {
-    _classCallCheck(this, MDCDialog);
-
-    return _possibleConstructorReturn(this, (MDCDialog.__proto__ || Object.getPrototypeOf(MDCDialog)).apply(this, arguments));
-  }
-
-  _createClass(MDCDialog, [{
-    key: 'initialize',
-    value: function initialize() {
-      this.focusTrap_ = __WEBPACK_IMPORTED_MODULE_3__util__["createFocusTrapInstance"](this.dialogSurface_, this.acceptButton_);
-      this.footerBtnRipples_ = [];
-
-      var footerBtns = this.root_.querySelectorAll('.mdc-dialog__footer__button');
-      for (var i = 0, footerBtn; footerBtn = footerBtns[i]; i++) {
-        this.footerBtnRipples_.push(new __WEBPACK_IMPORTED_MODULE_1__material_ripple__["MDCRipple"](footerBtn));
-      }
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      this.footerBtnRipples_.forEach(function (ripple) {
-        return ripple.destroy();
-      });
-      _get(MDCDialog.prototype.__proto__ || Object.getPrototypeOf(MDCDialog.prototype), 'destroy', this).call(this);
-    }
-  }, {
-    key: 'show',
-    value: function show() {
-      this.foundation_.open();
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      this.foundation_.close();
-    }
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      var _this2 = this;
-
-      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */]({
-        addClass: function addClass(className) {
-          return _this2.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return _this2.root_.classList.remove(className);
-        },
-        addBodyClass: function addBodyClass(className) {
-          return document.body.classList.add(className);
-        },
-        removeBodyClass: function removeBodyClass(className) {
-          return document.body.classList.remove(className);
-        },
-        eventTargetHasClass: function eventTargetHasClass(target, className) {
-          return target.classList.contains(className);
-        },
-        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
-          return _this2.root_.addEventListener(evt, handler);
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
-          return _this2.root_.removeEventListener(evt, handler);
-        },
-        registerSurfaceInteractionHandler: function registerSurfaceInteractionHandler(evt, handler) {
-          return _this2.dialogSurface_.addEventListener(evt, handler);
-        },
-        deregisterSurfaceInteractionHandler: function deregisterSurfaceInteractionHandler(evt, handler) {
-          return _this2.dialogSurface_.removeEventListener(evt, handler);
-        },
-        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
-          return document.addEventListener('keydown', handler);
-        },
-        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
-          return document.removeEventListener('keydown', handler);
-        },
-        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
-          return _this2.dialogSurface_.addEventListener('transitionend', handler);
-        },
-        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
-          return _this2.dialogSurface_.removeEventListener('transitionend', handler);
-        },
-        notifyAccept: function notifyAccept() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.ACCEPT_EVENT);
-        },
-        notifyCancel: function notifyCancel() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.CANCEL_EVENT);
-        },
-        trapFocusOnSurface: function trapFocusOnSurface() {
-          return _this2.focusTrap_.activate();
-        },
-        untrapFocusOnSurface: function untrapFocusOnSurface() {
-          return _this2.focusTrap_.deactivate();
-        },
-        isDialog: function isDialog(el) {
-          return el === _this2.dialogSurface_;
-        }
-      });
-    }
-  }, {
-    key: 'open',
-    get: function get() {
-      return this.foundation_.isOpen();
-    }
-  }, {
-    key: 'acceptButton_',
-    get: function get() {
-      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.ACCEPT_SELECTOR);
-    }
-  }, {
-    key: 'dialogSurface_',
-    get: function get() {
-      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].strings.DIALOG_SURFACE_SELECTOR);
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      return new MDCDialog(root);
-    }
-  }]);
-
-  return MDCDialog;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {!{
- *   checked: boolean,
- *   indeterminate: boolean,
- *   disabled: boolean,
- *   value: ?string
- * }}
- */
-var SelectionControlState = void 0;
-
-/***/ }),
-
-/***/ 4:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* eslint no-unused-vars: [2, {"args": "none"}] */
-
-/**
- * Adapter for MDC Ripple. Provides an interface for managing
- * - classes
- * - dom
- * - CSS variables
- * - position
- * - dimensions
- * - scroll position
- * - event handlers
- * - unbounded, active and disabled states
- *
- * Additionally, provides type information for the adapter to the Closure
- * compiler.
- *
- * Implement this adapter for your framework of choice to delegate updates to
- * the component in your framework of choice. See architecture documentation
- * for more details.
- * https://github.com/material-components/material-components-web/blob/master/docs/architecture.md
- *
- * @record
- */
-var MDCRippleAdapter = function () {
-  function MDCRippleAdapter() {
-    _classCallCheck(this, MDCRippleAdapter);
-  }
-
-  _createClass(MDCRippleAdapter, [{
-    key: "browserSupportsCssVars",
-
-    /** @return {boolean} */
-    value: function browserSupportsCssVars() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isUnbounded",
-    value: function isUnbounded() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isSurfaceActive",
-    value: function isSurfaceActive() {}
-
-    /** @return {boolean} */
-
-  }, {
-    key: "isSurfaceDisabled",
-    value: function isSurfaceDisabled() {}
-
-    /** @param {string} className */
-
-  }, {
-    key: "addClass",
-    value: function addClass(className) {}
-
-    /** @param {string} className */
-
-  }, {
-    key: "removeClass",
-    value: function removeClass(className) {}
-
-    /**
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "registerInteractionHandler",
-    value: function registerInteractionHandler(evtType, handler) {}
-
-    /**
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "deregisterInteractionHandler",
-    value: function deregisterInteractionHandler(evtType, handler) {}
-
-    /**
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "registerResizeHandler",
-    value: function registerResizeHandler(handler) {}
-
-    /**
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: "deregisterResizeHandler",
-    value: function deregisterResizeHandler(handler) {}
-
-    /**
-     * @param {string} varName
-     * @param {?number|string} value
-     */
-
-  }, {
-    key: "updateCssVariable",
-    value: function updateCssVariable(varName, value) {}
-
-    /** @return {!ClientRect} */
-
-  }, {
-    key: "computeBoundingRect",
-    value: function computeBoundingRect() {}
-
-    /** @return {{x: number, y: number}} */
-
-  }, {
-    key: "getWindowPageOffset",
-    value: function getWindowPageOffset() {}
-  }]);
-
-  return MDCRippleAdapter;
-}();
-
-/* unused harmony default export */ var _unused_webpack_default_export = (MDCRippleAdapter);
-
-/***/ }),
-
-/***/ 41:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var cssClasses = {
-  ROOT: 'mdc-dialog',
-  OPEN: 'mdc-dialog--open',
-  ANIMATING: 'mdc-dialog--animating',
-  BACKDROP: 'mdc-dialog__backdrop',
-  SCROLL_LOCK: 'mdc-dialog-scroll-lock',
-  ACCEPT_BTN: 'mdc-dialog__footer__button--accept',
-  CANCEL_BTN: 'mdc-dialog__footer__button--cancel'
-};
-
-var strings = {
-  OPEN_DIALOG_SELECTOR: '.mdc-dialog--open',
-  DIALOG_SURFACE_SELECTOR: '.mdc-dialog__surface',
-  ACCEPT_SELECTOR: '.mdc-dialog__footer__button--accept',
-  ACCEPT_EVENT: 'MDCDialog:accept',
-  CANCEL_EVENT: 'MDCDialog:cancel'
-};
-
-/***/ }),
-
-/***/ 42:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(41);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-var MDCDialogFoundation = function (_MDCFoundation) {
-  _inherits(MDCDialogFoundation, _MDCFoundation);
-
-  _createClass(MDCDialogFoundation, null, [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return {
-        addClass: function addClass() /* className: string */{},
-        removeClass: function removeClass() /* className: string */{},
-        addBodyClass: function addBodyClass() /* className: string */{},
-        removeBodyClass: function removeBodyClass() /* className: string */{},
-        eventTargetHasClass: function eventTargetHasClass() {
-          return (/* target: EventTarget, className: string */ /* boolean */false
-          );
-        },
-        registerInteractionHandler: function registerInteractionHandler() /* evt: string, handler: EventListener */{},
-        deregisterInteractionHandler: function deregisterInteractionHandler() /* evt: string, handler: EventListener */{},
-        registerSurfaceInteractionHandler: function registerSurfaceInteractionHandler() /* evt: string, handler: EventListener */{},
-        deregisterSurfaceInteractionHandler: function deregisterSurfaceInteractionHandler() /* evt: string, handler: EventListener */{},
-        registerDocumentKeydownHandler: function registerDocumentKeydownHandler() /* handler: EventListener */{},
-        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler() /* handler: EventListener */{},
-        registerTransitionEndHandler: function registerTransitionEndHandler() /* handler: EventListener */{},
-        deregisterTransitionEndHandler: function deregisterTransitionEndHandler() /* handler: EventListener */{},
-        notifyAccept: function notifyAccept() {},
-        notifyCancel: function notifyCancel() {},
-        trapFocusOnSurface: function trapFocusOnSurface() {},
-        untrapFocusOnSurface: function untrapFocusOnSurface() {},
-        isDialog: function isDialog() {
-          return (/* el: Element */ /* boolean */false
-          );
-        }
-      };
-    }
-  }]);
-
-  function MDCDialogFoundation(adapter) {
-    _classCallCheck(this, MDCDialogFoundation);
-
-    var _this = _possibleConstructorReturn(this, (MDCDialogFoundation.__proto__ || Object.getPrototypeOf(MDCDialogFoundation)).call(this, _extends(MDCDialogFoundation.defaultAdapter, adapter)));
-
-    _this.isOpen_ = false;
-    _this.componentClickHandler_ = function (evt) {
-      if (_this.adapter_.eventTargetHasClass(evt.target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].BACKDROP)) {
-        _this.cancel(true);
-      }
-    };
-    _this.dialogClickHandler_ = function (evt) {
-      return _this.handleDialogClick_(evt);
-    };
-    _this.documentKeydownHandler_ = function (evt) {
-      if (evt.key && evt.key === 'Escape' || evt.keyCode === 27) {
-        _this.cancel(true);
-      }
-    };
-    _this.transitionEndHandler_ = function (evt) {
-      return _this.handleTransitionEnd_(evt);
-    };
-    return _this;
-  }
-
-  _createClass(MDCDialogFoundation, [{
-    key: 'destroy',
-    value: function destroy() {
-      // Ensure that dialog is cleaned up when destroyed
-      if (this.isOpen_) {
-        this.adapter_.deregisterSurfaceInteractionHandler('click', this.dialogClickHandler_);
-        this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
-        this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
-        this.adapter_.untrapFocusOnSurface();
-        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
-        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING);
-        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN);
-        this.enableScroll_();
-      }
-    }
-  }, {
-    key: 'open',
-    value: function open() {
-      this.isOpen_ = true;
-      this.disableScroll_();
-      this.adapter_.registerDocumentKeydownHandler(this.documentKeydownHandler_);
-      this.adapter_.registerSurfaceInteractionHandler('click', this.dialogClickHandler_);
-      this.adapter_.registerInteractionHandler('click', this.componentClickHandler_);
-      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
-      this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING);
-      this.adapter_.addClass(MDCDialogFoundation.cssClasses.OPEN);
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      this.isOpen_ = false;
-      this.adapter_.deregisterSurfaceInteractionHandler('click', this.dialogClickHandler_);
-      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
-      this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
-      this.adapter_.untrapFocusOnSurface();
-      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
-      this.adapter_.addClass(MDCDialogFoundation.cssClasses.ANIMATING);
-      this.adapter_.removeClass(MDCDialogFoundation.cssClasses.OPEN);
-    }
-  }, {
-    key: 'isOpen',
-    value: function isOpen() {
-      return this.isOpen_;
-    }
-  }, {
-    key: 'accept',
-    value: function accept(shouldNotify) {
-      if (shouldNotify) {
-        this.adapter_.notifyAccept();
-      }
-
-      this.close();
-    }
-  }, {
-    key: 'cancel',
-    value: function cancel(shouldNotify) {
-      if (shouldNotify) {
-        this.adapter_.notifyCancel();
-      }
-
-      this.close();
-    }
-  }, {
-    key: 'handleDialogClick_',
-    value: function handleDialogClick_(evt) {
-      var target = evt.target;
-
-      if (this.adapter_.eventTargetHasClass(target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].ACCEPT_BTN)) {
-        this.accept(true);
-      } else if (this.adapter_.eventTargetHasClass(target, __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].CANCEL_BTN)) {
-        this.cancel(true);
-      }
-    }
-  }, {
-    key: 'handleTransitionEnd_',
-    value: function handleTransitionEnd_(evt) {
-      if (this.adapter_.isDialog(evt.target)) {
-        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
-        this.adapter_.removeClass(MDCDialogFoundation.cssClasses.ANIMATING);
-        if (this.isOpen_) {
-          this.adapter_.trapFocusOnSurface();
-        } else {
-          this.enableScroll_();
-        };
-      };
-    }
-  }, {
-    key: 'disableScroll_',
-    value: function disableScroll_() {
-      this.adapter_.addBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
-    }
-  }, {
-    key: 'enableScroll_',
-    value: function enableScroll_() {
-      this.adapter_.removeBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
-    }
-  }]);
-
-  return MDCDialogFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCDialogFoundation);
-
-/***/ }),
-
-/***/ 43:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (immutable) */ __webpack_exports__["createFocusTrapInstance"] = createFocusTrapInstance;
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_focus_trap__ = __webpack_require__(79);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_focus_trap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_focus_trap__);
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-function createFocusTrapInstance(surfaceEl, acceptButtonEl) {
-  var focusTrapFactory = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : __WEBPACK_IMPORTED_MODULE_0_focus_trap___default.a;
-
-  return focusTrapFactory(surfaceEl, {
-    initialFocus: acceptButtonEl,
-    clickOutsideDeactivates: true
-  });
-}
-
-/***/ }),
-
-/***/ 5:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (immutable) */ __webpack_exports__["supportsCssVariables"] = supportsCssVariables;
-/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
-/* harmony export (immutable) */ __webpack_exports__["getMatchesProperty"] = getMatchesProperty;
-/* harmony export (immutable) */ __webpack_exports__["getNormalizedEventCoords"] = getNormalizedEventCoords;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Stores result from supportsCssVariables to avoid redundant processing to detect CSS custom variable support.
- * @private {boolean|undefined}
- */
-var supportsCssVariables_ = void 0;
-
-/**
- * Stores result from applyPassive to avoid redundant processing to detect passive event listener support.
- * @private {boolean|undefined}
- */
-var supportsPassive_ = void 0;
-
-/**
- * @param {!Window} windowObj
- * @return {boolean}
- */
-function detectEdgePseudoVarBug(windowObj) {
-  // Detect versions of Edge with buggy var() support
-  // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11495448/
-  var document = windowObj.document;
-  var className = 'test-edge-css-var';
-  var styleNode = document.createElement('style');
-  document.head.appendChild(styleNode);
-  var sheet = styleNode.sheet;
-  // Internet Explorer 11 requires indices to always be specified to insertRule
-  sheet.insertRule(':root { --' + className + ': 1px solid #000; }', 0);
-  sheet.insertRule('.' + className + ' { visibility: hidden; }', 1);
-  sheet.insertRule('.' + className + '::before { border: var(--' + className + '); }', 2);
-  var node = document.createElement('div');
-  node.className = className;
-  document.body.appendChild(node);
-  // Bug exists if ::before style ends up propagating to the parent element
-  var hasPseudoVarBug = windowObj.getComputedStyle(node).borderTopStyle === 'solid';
-  node.remove();
-  styleNode.remove();
-  return hasPseudoVarBug;
-}
-
-/**
- * @param {!Window} windowObj
- * @param {boolean=} forceRefresh
- * @return {boolean|undefined}
- */
-function supportsCssVariables(windowObj) {
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (typeof supportsCssVariables_ === 'boolean' && !forceRefresh) {
-    return supportsCssVariables_;
-  }
-
-  var supportsFunctionPresent = windowObj.CSS && typeof windowObj.CSS.supports === 'function';
-  if (!supportsFunctionPresent) {
-    return;
-  }
-
-  var explicitlySupportsCssVars = windowObj.CSS.supports('--css-vars', 'yes');
-  // See: https://bugs.webkit.org/show_bug.cgi?id=154669
-  // See: README section on Safari
-  var weAreFeatureDetectingSafari10plus = windowObj.CSS.supports('(--css-vars: yes)') && windowObj.CSS.supports('color', '#00000000');
-
-  if (explicitlySupportsCssVars || weAreFeatureDetectingSafari10plus) {
-    supportsCssVariables_ = !detectEdgePseudoVarBug(windowObj);
-  } else {
-    supportsCssVariables_ = false;
-  }
-  return supportsCssVariables_;
-}
-
-//
-/**
- * Determine whether the current browser supports passive event listeners, and if so, use them.
- * @param {!Window=} globalObj
- * @param {boolean=} forceRefresh
- * @return {boolean|{passive: boolean}}
- */
-function applyPassive() {
-  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (supportsPassive_ === undefined || forceRefresh) {
-    var isSupported = false;
-    try {
-      globalObj.document.addEventListener('test', null, { get passive() {
-          isSupported = true;
-        } });
-    } catch (e) {}
-
-    supportsPassive_ = isSupported;
-  }
-
-  return supportsPassive_ ? { passive: true } : false;
-}
-
-/**
- * @param {!Object} HTMLElementPrototype
- * @return {!Array<string>}
- */
-function getMatchesProperty(HTMLElementPrototype) {
-  return ['webkitMatchesSelector', 'msMatchesSelector', 'matches'].filter(function (p) {
-    return p in HTMLElementPrototype;
-  }).pop();
-}
-
-/**
- * @param {!Event} ev
- * @param {!{x: number, y: number}} pageOffset
- * @param {!ClientRect} clientRect
- * @return {!{x: number, y: number}}
- */
-function getNormalizedEventCoords(ev, pageOffset, clientRect) {
-  var x = pageOffset.x,
-      y = pageOffset.y;
-
-  var documentX = x + clientRect.left;
-  var documentY = y + clientRect.top;
-
-  var normalizedX = void 0;
-  var normalizedY = void 0;
-  // Determine touch point relative to the ripple container.
-  if (ev.type === 'touchstart') {
-    normalizedX = ev.changedTouches[0].pageX - documentX;
-    normalizedY = ev.changedTouches[0].pageY - documentY;
-  } else {
-    normalizedX = ev.pageX - documentX;
-    normalizedY = ev.pageY - documentY;
-  }
-
-  return { x: normalizedX, y: normalizedY };
-}
-
-/***/ }),
-
-/***/ 6:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRipple", function() { return MDCRipple; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(4);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(8);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(5);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRippleFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; });
-/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; });
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-
-
-/**
- * @extends MDCComponent<!MDCRippleFoundation>
- */
-var MDCRipple = function (_MDCComponent) {
-  _inherits(MDCRipple, _MDCComponent);
-
-  /** @param {...?} args */
-  function MDCRipple() {
-    var _ref;
-
-    _classCallCheck(this, MDCRipple);
-
-    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
-      args[_key] = arguments[_key];
-    }
-
-    /** @type {boolean} */
-    var _this = _possibleConstructorReturn(this, (_ref = MDCRipple.__proto__ || Object.getPrototypeOf(MDCRipple)).call.apply(_ref, [this].concat(args)));
-
-    _this.disabled = false;
-
-    /** @private {boolean} */
-    _this.unbounded_;
-    return _this;
-  }
-
-  /**
-   * @param {!Element} root
-   * @param {{isUnbounded: (boolean|undefined)}=} options
-   * @return {!MDCRipple}
-   */
-
-
-  _createClass(MDCRipple, [{
-    key: 'activate',
-    value: function activate() {
-      this.foundation_.activate();
-    }
-  }, {
-    key: 'deactivate',
-    value: function deactivate() {
-      this.foundation_.deactivate();
-    }
-  }, {
-    key: 'layout',
-    value: function layout() {
-      this.foundation_.layout();
-    }
-
-    /** @return {!MDCRippleFoundation} */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */](MDCRipple.createAdapter(this));
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset;
-    }
-  }, {
-    key: 'unbounded',
-
-
-    /** @return {boolean} */
-    get: function get() {
-      return this.unbounded_;
-    }
-
-    /** @param {boolean} unbounded */
-    ,
-    set: function set(unbounded) {
-      var UNBOUNDED = __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */].cssClasses.UNBOUNDED;
-
-      this.unbounded_ = Boolean(unbounded);
-      if (this.unbounded_) {
-        this.root_.classList.add(UNBOUNDED);
-      } else {
-        this.root_.classList.remove(UNBOUNDED);
-      }
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
-          _ref2$isUnbounded = _ref2.isUnbounded,
-          isUnbounded = _ref2$isUnbounded === undefined ? undefined : _ref2$isUnbounded;
-
-      var ripple = new MDCRipple(root);
-      // Only override unbounded behavior if option is explicitly specified
-      if (isUnbounded !== undefined) {
-        ripple.unbounded = /** @type {boolean} */isUnbounded;
-      }
-      return ripple;
-    }
-
-    /**
-     * @param {!RippleCapableSurface} instance
-     * @return {!MDCRippleAdapter}
-     */
-
-  }, {
-    key: 'createAdapter',
-    value: function createAdapter(instance) {
-      var MATCHES = __WEBPACK_IMPORTED_MODULE_3__util__["getMatchesProperty"](HTMLElement.prototype);
-
-      return {
-        browserSupportsCssVars: function browserSupportsCssVars() {
-          return __WEBPACK_IMPORTED_MODULE_3__util__["supportsCssVariables"](window);
-        },
-        isUnbounded: function isUnbounded() {
-          return instance.unbounded;
-        },
-        isSurfaceActive: function isSurfaceActive() {
-          return instance.root_[MATCHES](':active');
-        },
-        isSurfaceDisabled: function isSurfaceDisabled() {
-          return instance.disabled;
-        },
-        addClass: function addClass(className) {
-          return instance.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return instance.root_.classList.remove(className);
-        },
-        registerInteractionHandler: function registerInteractionHandler(evtType, handler) {
-          return instance.root_.addEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(evtType, handler) {
-          return instance.root_.removeEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]());
-        },
-        registerResizeHandler: function registerResizeHandler(handler) {
-          return window.addEventListener('resize', handler);
-        },
-        deregisterResizeHandler: function deregisterResizeHandler(handler) {
-          return window.removeEventListener('resize', handler);
-        },
-        updateCssVariable: function updateCssVariable(varName, value) {
-          return instance.root_.style.setProperty(varName, value);
-        },
-        computeBoundingRect: function computeBoundingRect() {
-          return instance.root_.getBoundingClientRect();
-        },
-        getWindowPageOffset: function getWindowPageOffset() {
-          return { x: window.pageXOffset, y: window.pageYOffset };
-        }
-      };
-    }
-  }]);
-
-  return MDCRipple;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]);
-
-/**
- * See Material Design spec for more details on when to use ripples.
- * https://material.io/guidelines/motion/choreography.html#choreography-creation
- * @record
- */
-
-var RippleCapableSurface = function RippleCapableSurface() {
-  _classCallCheck(this, RippleCapableSurface);
-};
-
-/** @protected {!Element} */
-
-
-RippleCapableSurface.prototype.root_;
-
-/**
- * Whether or not the ripple bleeds out of the bounds of the element.
- * @type {boolean|undefined}
- */
-RippleCapableSurface.prototype.unbounded;
-
-/**
- * Whether or not the ripple is attached to a disabled component.
- * @type {boolean|undefined}
- */
-RippleCapableSurface.prototype.disabled;
-
-/***/ }),
-
-/***/ 7:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "c", function() { return numbers; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var cssClasses = {
-  // Ripple is a special case where the "root" component is really a "mixin" of sorts,
-  // given that it's an 'upgrade' to an existing component. That being said it is the root
-  // CSS class that all other CSS classes derive from.
-  ROOT: 'mdc-ripple-upgraded',
-  UNBOUNDED: 'mdc-ripple-upgraded--unbounded',
-  BG_FOCUSED: 'mdc-ripple-upgraded--background-focused',
-  BG_ACTIVE_FILL: 'mdc-ripple-upgraded--background-active-fill',
-  FG_ACTIVATION: 'mdc-ripple-upgraded--foreground-activation',
-  FG_DEACTIVATION: 'mdc-ripple-upgraded--foreground-deactivation'
-};
-
-var strings = {
-  VAR_SURFACE_WIDTH: '--mdc-ripple-surface-width',
-  VAR_SURFACE_HEIGHT: '--mdc-ripple-surface-height',
-  VAR_FG_SIZE: '--mdc-ripple-fg-size',
-  VAR_LEFT: '--mdc-ripple-left',
-  VAR_TOP: '--mdc-ripple-top',
-  VAR_FG_SCALE: '--mdc-ripple-fg-scale',
-  VAR_FG_TRANSLATE_START: '--mdc-ripple-fg-translate-start',
-  VAR_FG_TRANSLATE_END: '--mdc-ripple-fg-translate-end'
-};
-
-var numbers = {
-  PADDING: 10,
-  INITIAL_ORIGIN_SCALE: 0.6,
-  DEACTIVATION_TIMEOUT_MS: 300,
-  FG_DEACTIVATION_MS: 83
-};
-
-/***/ }),
-
-/***/ 79:
-/***/ (function(module, exports, __webpack_require__) {
-
-var tabbable = __webpack_require__(80);
-
-var listeningFocusTrap = null;
-
-function focusTrap(element, userOptions) {
-  var tabbableNodes = [];
-  var nodeFocusedBeforeActivation = null;
-  var active = false;
-  var paused = false;
-
-  var container = (typeof element === 'string')
-    ? document.querySelector(element)
-    : element;
-
-  var config = userOptions || {};
-  config.returnFocusOnDeactivate = (userOptions && userOptions.returnFocusOnDeactivate !== undefined)
-    ? userOptions.returnFocusOnDeactivate
-    : true;
-  config.escapeDeactivates = (userOptions && userOptions.escapeDeactivates !== undefined)
-    ? userOptions.escapeDeactivates
-    : true;
-
-  var trap = {
-    activate: activate,
-    deactivate: deactivate,
-    pause: pause,
-    unpause: unpause,
-  };
-
-  return trap;
-
-  function activate(activateOptions) {
-    if (active) return;
-
-    var defaultedActivateOptions = {
-      onActivate: (activateOptions && activateOptions.onActivate !== undefined)
-        ? activateOptions.onActivate
-        : config.onActivate,
-    };
-
-    active = true;
-    paused = false;
-    nodeFocusedBeforeActivation = document.activeElement;
-
-    if (defaultedActivateOptions.onActivate) {
-      defaultedActivateOptions.onActivate();
-    }
-
-    addListeners();
-    return trap;
-  }
-
-  function deactivate(deactivateOptions) {
-    if (!active) return;
-
-    var defaultedDeactivateOptions = {
-      returnFocus: (deactivateOptions && deactivateOptions.returnFocus !== undefined)
-        ? deactivateOptions.returnFocus
-        : config.returnFocusOnDeactivate,
-      onDeactivate: (deactivateOptions && deactivateOptions.onDeactivate !== undefined)
-        ? deactivateOptions.onDeactivate
-        : config.onDeactivate,
-    };
-
-    removeListeners();
-
-    if (defaultedDeactivateOptions.onDeactivate) {
-      defaultedDeactivateOptions.onDeactivate();
-    }
-
-    if (defaultedDeactivateOptions.returnFocus) {
-      setTimeout(function () {
-        tryFocus(nodeFocusedBeforeActivation);
-      }, 0);
-    }
-
-    active = false;
-    paused = false;
-    return this;
-  }
-
-  function pause() {
-    if (paused || !active) return;
-    paused = true;
-    removeListeners();
-  }
-
-  function unpause() {
-    if (!paused || !active) return;
-    paused = false;
-    addListeners();
-  }
-
-  function addListeners() {
-    if (!active) return;
-
-    // There can be only one listening focus trap at a time
-    if (listeningFocusTrap) {
-      listeningFocusTrap.pause();
-    }
-    listeningFocusTrap = trap;
-
-    updateTabbableNodes();
-    tryFocus(firstFocusNode());
-    document.addEventListener('focus', checkFocus, true);
-    document.addEventListener('click', checkClick, true);
-    document.addEventListener('mousedown', checkPointerDown, true);
-    document.addEventListener('touchstart', checkPointerDown, true);
-    document.addEventListener('keydown', checkKey, true);
-
-    return trap;
-  }
-
-  function removeListeners() {
-    if (!active || listeningFocusTrap !== trap) return;
-
-    document.removeEventListener('focus', checkFocus, true);
-    document.removeEventListener('click', checkClick, true);
-    document.removeEventListener('mousedown', checkPointerDown, true);
-    document.removeEventListener('touchstart', checkPointerDown, true);
-    document.removeEventListener('keydown', checkKey, true);
-
-    listeningFocusTrap = null;
-
-    return trap;
-  }
-
-  function getNodeForOption(optionName) {
-    var optionValue = config[optionName];
-    var node = optionValue;
-    if (!optionValue) {
-      return null;
-    }
-    if (typeof optionValue === 'string') {
-      node = document.querySelector(optionValue);
-      if (!node) {
-        throw new Error('`' + optionName + '` refers to no known node');
-      }
-    }
-    if (typeof optionValue === 'function') {
-      node = optionValue();
-      if (!node) {
-        throw new Error('`' + optionName + '` did not return a node');
-      }
-    }
-    return node;
-  }
-
-  function firstFocusNode() {
-    var node;
-    if (getNodeForOption('initialFocus') !== null) {
-      node = getNodeForOption('initialFocus');
-    } else if (container.contains(document.activeElement)) {
-      node = document.activeElement;
-    } else {
-      node = tabbableNodes[0] || getNodeForOption('fallbackFocus');
-    }
-
-    if (!node) {
-      throw new Error('You can\'t have a focus-trap without at least one focusable element');
-    }
-
-    return node;
-  }
-
-  // This needs to be done on mousedown and touchstart instead of click
-  // so that it precedes the focus event
-  function checkPointerDown(e) {
-    if (config.clickOutsideDeactivates && !container.contains(e.target)) {
-      deactivate({ returnFocus: false });
-    }
-  }
-
-  function checkClick(e) {
-    if (config.clickOutsideDeactivates) return;
-    if (container.contains(e.target)) return;
-    e.preventDefault();
-    e.stopImmediatePropagation();
-  }
-
-  function checkFocus(e) {
-    if (container.contains(e.target)) return;
-    e.preventDefault();
-    e.stopImmediatePropagation();
-    // Checking for a blur method here resolves a Firefox issue (#15)
-    if (typeof e.target.blur === 'function') e.target.blur();
-  }
-
-  function checkKey(e) {
-    if (e.key === 'Tab' || e.keyCode === 9) {
-      handleTab(e);
-    }
-
-    if (config.escapeDeactivates !== false && isEscapeEvent(e)) {
-      deactivate();
-    }
-  }
-
-  function handleTab(e) {
-    e.preventDefault();
-    updateTabbableNodes();
-    var currentFocusIndex = tabbableNodes.indexOf(e.target);
-    var lastTabbableNode = tabbableNodes[tabbableNodes.length - 1];
-    var firstTabbableNode = tabbableNodes[0];
-
-    if (e.shiftKey) {
-      if (e.target === firstTabbableNode || tabbableNodes.indexOf(e.target) === -1) {
-        return tryFocus(lastTabbableNode);
-      }
-      return tryFocus(tabbableNodes[currentFocusIndex - 1]);
-    }
-
-    if (e.target === lastTabbableNode) return tryFocus(firstTabbableNode);
-
-    tryFocus(tabbableNodes[currentFocusIndex + 1]);
-  }
-
-  function updateTabbableNodes() {
-    tabbableNodes = tabbable(container);
-  }
-}
-
-function isEscapeEvent(e) {
-  return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;
-}
-
-function tryFocus(node) {
-  if (!node || !node.focus) return;
-  node.focus();
-  if (node.tagName.toLowerCase() === 'input') {
-    node.select();
-  }
-}
-
-module.exports = focusTrap;
-
-
-/***/ }),
-
-/***/ 8:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(4);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(7);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(5);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-/**
- * @typedef {!{
- *   isActivated: (boolean|undefined),
- *   hasDeactivationUXRun: (boolean|undefined),
- *   wasActivatedByPointer: (boolean|undefined),
- *   wasElementMadeActive: (boolean|undefined),
- *   activationStartTime: (number|undefined),
- *   activationEvent: Event,
- *   isProgrammatic: (boolean|undefined)
- * }}
- */
-var ActivationStateType = void 0;
-
-/**
- * @typedef {!{
- *   activate: (string|undefined),
- *   deactivate: (string|undefined),
- *   focus: (string|undefined),
- *   blur: (string|undefined)
- * }}
- */
-var ListenerInfoType = void 0;
-
-/**
- * @typedef {!{
- *   activate: function(!Event),
- *   deactivate: function(!Event),
- *   focus: function(),
- *   blur: function()
- * }}
- */
-var ListenersType = void 0;
-
-/**
- * @typedef {!{
- *   x: number,
- *   y: number
- * }}
- */
-var PointType = void 0;
-
-/**
- * @enum {string}
- */
-var DEACTIVATION_ACTIVATION_PAIRS = {
-  mouseup: 'mousedown',
-  pointerup: 'pointerdown',
-  touchend: 'touchstart',
-  keyup: 'keydown',
-  blur: 'focus'
-};
-
-/**
- * @extends {MDCFoundation<!MDCRippleAdapter>}
- */
-
-var MDCRippleFoundation = function (_MDCFoundation) {
-  _inherits(MDCRippleFoundation, _MDCFoundation);
-
-  _createClass(MDCRippleFoundation, [{
-    key: 'isSupported_',
-
-
-    /**
-     * We compute this property so that we are not querying information about the client
-     * until the point in time where the foundation requests it. This prevents scenarios where
-     * client-side feature-detection may happen too early, such as when components are rendered on the server
-     * and then initialized at mount time on the client.
-     * @return {boolean}
-     */
-    get: function get() {
-      return this.adapter_.browserSupportsCssVars();
-    }
-  }], [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'numbers',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* numbers */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return {
-        browserSupportsCssVars: function browserSupportsCssVars() /* boolean - cached */{},
-        isUnbounded: function isUnbounded() /* boolean */{},
-        isSurfaceActive: function isSurfaceActive() /* boolean */{},
-        isSurfaceDisabled: function isSurfaceDisabled() /* boolean */{},
-        addClass: function addClass() /* className: string */{},
-        removeClass: function removeClass() /* className: string */{},
-        registerInteractionHandler: function registerInteractionHandler() /* evtType: string, handler: EventListener */{},
-        deregisterInteractionHandler: function deregisterInteractionHandler() /* evtType: string, handler: EventListener */{},
-        registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{},
-        deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{},
-        updateCssVariable: function updateCssVariable() /* varName: string, value: string */{},
-        computeBoundingRect: function computeBoundingRect() /* ClientRect */{},
-        getWindowPageOffset: function getWindowPageOffset() /* {x: number, y: number} */{}
-      };
-    }
-  }]);
-
-  function MDCRippleFoundation(adapter) {
-    _classCallCheck(this, MDCRippleFoundation);
-
-    /** @private {number} */
-    var _this = _possibleConstructorReturn(this, (MDCRippleFoundation.__proto__ || Object.getPrototypeOf(MDCRippleFoundation)).call(this, _extends(MDCRippleFoundation.defaultAdapter, adapter)));
-
-    _this.layoutFrame_ = 0;
-
-    /** @private {!ClientRect} */
-    _this.frame_ = /** @type {!ClientRect} */{ width: 0, height: 0 };
-
-    /** @private {!ActivationStateType} */
-    _this.activationState_ = _this.defaultActivationState_();
-
-    /** @private {number} */
-    _this.xfDuration_ = 0;
-
-    /** @private {number} */
-    _this.initialSize_ = 0;
-
-    /** @private {number} */
-    _this.maxRadius_ = 0;
-
-    /** @private {!Array<{ListenerInfoType}>} */
-    _this.listenerInfos_ = [{ activate: 'touchstart', deactivate: 'touchend' }, { activate: 'pointerdown', deactivate: 'pointerup' }, { activate: 'mousedown', deactivate: 'mouseup' }, { activate: 'keydown', deactivate: 'keyup' }, { focus: 'focus', blur: 'blur' }];
-
-    /** @private {!ListenersType} */
-    _this.listeners_ = {
-      activate: function activate(e) {
-        return _this.activate_(e);
-      },
-      deactivate: function deactivate(e) {
-        return _this.deactivate_(e);
-      },
-      focus: function focus() {
-        return requestAnimationFrame(function () {
-          return _this.adapter_.addClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
-        });
-      },
-      blur: function blur() {
-        return requestAnimationFrame(function () {
-          return _this.adapter_.removeClass(MDCRippleFoundation.cssClasses.BG_FOCUSED);
-        });
-      }
-    };
-
-    /** @private {!Function} */
-    _this.resizeHandler_ = function () {
-      return _this.layout();
-    };
-
-    /** @private {!{left: number, top:number}} */
-    _this.unboundedCoords_ = {
-      left: 0,
-      top: 0
-    };
-
-    /** @private {number} */
-    _this.fgScale_ = 0;
-
-    /** @private {number} */
-    _this.activationTimer_ = 0;
-
-    /** @private {number} */
-    _this.fgDeactivationRemovalTimer_ = 0;
-
-    /** @private {boolean} */
-    _this.activationAnimationHasEnded_ = false;
-
-    /** @private {!Function} */
-    _this.activationTimerCallback_ = function () {
-      _this.activationAnimationHasEnded_ = true;
-      _this.runDeactivationUXLogicIfReady_();
-    };
-    return _this;
-  }
-
-  /**
-   * @return {!ActivationStateType}
-   */
-
-
-  _createClass(MDCRippleFoundation, [{
-    key: 'defaultActivationState_',
-    value: function defaultActivationState_() {
-      return {
-        isActivated: false,
-        hasDeactivationUXRun: false,
-        wasActivatedByPointer: false,
-        wasElementMadeActive: false,
-        activationStartTime: 0,
-        activationEvent: null,
-        isProgrammatic: false
-      };
-    }
-  }, {
-    key: 'init',
-    value: function init() {
-      var _this2 = this;
-
-      if (!this.isSupported_) {
-        return;
-      }
-      this.addEventListeners_();
-
-      var _MDCRippleFoundation$ = MDCRippleFoundation.cssClasses,
-          ROOT = _MDCRippleFoundation$.ROOT,
-          UNBOUNDED = _MDCRippleFoundation$.UNBOUNDED;
-
-      requestAnimationFrame(function () {
-        _this2.adapter_.addClass(ROOT);
-        if (_this2.adapter_.isUnbounded()) {
-          _this2.adapter_.addClass(UNBOUNDED);
-        }
-        _this2.layoutInternal_();
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'addEventListeners_',
-    value: function addEventListeners_() {
-      var _this3 = this;
-
-      this.listenerInfos_.forEach(function (info) {
-        Object.keys(info).forEach(function (k) {
-          _this3.adapter_.registerInteractionHandler(info[k], _this3.listeners_[k]);
-        });
-      });
-      this.adapter_.registerResizeHandler(this.resizeHandler_);
-    }
-
-    /**
-     * @param {Event} e
-     * @private
-     */
-
-  }, {
-    key: 'activate_',
-    value: function activate_(e) {
-      var _this4 = this;
-
-      if (this.adapter_.isSurfaceDisabled()) {
-        return;
-      }
-
-      var activationState = this.activationState_;
-
-      if (activationState.isActivated) {
-        return;
-      }
-
-      activationState.isActivated = true;
-      activationState.isProgrammatic = e === null;
-      activationState.activationEvent = e;
-      activationState.wasActivatedByPointer = activationState.isProgrammatic ? false : e.type === 'mousedown' || e.type === 'touchstart' || e.type === 'pointerdown';
-      activationState.activationStartTime = Date.now();
-
-      requestAnimationFrame(function () {
-        // This needs to be wrapped in an rAF call b/c web browsers
-        // report active states inconsistently when they're called within
-        // event handling code:
-        // - https://bugs.chromium.org/p/chromium/issues/detail?id=635971
-        // - https://bugzilla.mozilla.org/show_bug.cgi?id=1293741
-        activationState.wasElementMadeActive = e && e.type === 'keydown' ? _this4.adapter_.isSurfaceActive() : true;
-        if (activationState.wasElementMadeActive) {
-          _this4.animateActivation_();
-        } else {
-          // Reset activation state immediately if element was not made active.
-          _this4.activationState_ = _this4.defaultActivationState_();
-        }
-      });
-    }
-  }, {
-    key: 'activate',
-    value: function activate() {
-      this.activate_(null);
-    }
-
-    /** @private */
-
-  }, {
-    key: 'animateActivation_',
-    value: function animateActivation_() {
-      var _this5 = this;
-
-      var _MDCRippleFoundation$2 = MDCRippleFoundation.strings,
-          VAR_FG_TRANSLATE_START = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_START,
-          VAR_FG_TRANSLATE_END = _MDCRippleFoundation$2.VAR_FG_TRANSLATE_END;
-      var _MDCRippleFoundation$3 = MDCRippleFoundation.cssClasses,
-          BG_ACTIVE_FILL = _MDCRippleFoundation$3.BG_ACTIVE_FILL,
-          FG_DEACTIVATION = _MDCRippleFoundation$3.FG_DEACTIVATION,
-          FG_ACTIVATION = _MDCRippleFoundation$3.FG_ACTIVATION;
-      var DEACTIVATION_TIMEOUT_MS = MDCRippleFoundation.numbers.DEACTIVATION_TIMEOUT_MS;
-
-
-      var translateStart = '';
-      var translateEnd = '';
-
-      if (!this.adapter_.isUnbounded()) {
-        var _getFgTranslationCoor = this.getFgTranslationCoordinates_(),
-            startPoint = _getFgTranslationCoor.startPoint,
-            endPoint = _getFgTranslationCoor.endPoint;
-
-        translateStart = startPoint.x + 'px, ' + startPoint.y + 'px';
-        translateEnd = endPoint.x + 'px, ' + endPoint.y + 'px';
-      }
-
-      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_START, translateStart);
-      this.adapter_.updateCssVariable(VAR_FG_TRANSLATE_END, translateEnd);
-      // Cancel any ongoing activation/deactivation animations
-      clearTimeout(this.activationTimer_);
-      clearTimeout(this.fgDeactivationRemovalTimer_);
-      this.rmBoundedActivationClasses_();
-      this.adapter_.removeClass(FG_DEACTIVATION);
-
-      // Force layout in order to re-trigger the animation.
-      this.adapter_.computeBoundingRect();
-      this.adapter_.addClass(BG_ACTIVE_FILL);
-      this.adapter_.addClass(FG_ACTIVATION);
-      this.activationTimer_ = setTimeout(function () {
-        return _this5.activationTimerCallback_();
-      }, DEACTIVATION_TIMEOUT_MS);
-    }
-
-    /**
-     * @private
-     * @return {{startPoint: PointType, endPoint: PointType}}
-     */
-
-  }, {
-    key: 'getFgTranslationCoordinates_',
-    value: function getFgTranslationCoordinates_() {
-      var activationState = this.activationState_;
-      var activationEvent = activationState.activationEvent,
-          wasActivatedByPointer = activationState.wasActivatedByPointer;
-
-
-      var startPoint = void 0;
-      if (wasActivatedByPointer) {
-        startPoint = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util__["getNormalizedEventCoords"])(
-        /** @type {!Event} */activationEvent, this.adapter_.getWindowPageOffset(), this.adapter_.computeBoundingRect());
-      } else {
-        startPoint = {
-          x: this.frame_.width / 2,
-          y: this.frame_.height / 2
-        };
-      }
-      // Center the element around the start point.
-      startPoint = {
-        x: startPoint.x - this.initialSize_ / 2,
-        y: startPoint.y - this.initialSize_ / 2
-      };
-
-      var endPoint = {
-        x: this.frame_.width / 2 - this.initialSize_ / 2,
-        y: this.frame_.height / 2 - this.initialSize_ / 2
-      };
-
-      return { startPoint: startPoint, endPoint: endPoint };
-    }
-
-    /** @private */
-
-  }, {
-    key: 'runDeactivationUXLogicIfReady_',
-    value: function runDeactivationUXLogicIfReady_() {
-      var _this6 = this;
-
-      var FG_DEACTIVATION = MDCRippleFoundation.cssClasses.FG_DEACTIVATION;
-      var _activationState_ = this.activationState_,
-          hasDeactivationUXRun = _activationState_.hasDeactivationUXRun,
-          isActivated = _activationState_.isActivated;
-
-      var activationHasEnded = hasDeactivationUXRun || !isActivated;
-      if (activationHasEnded && this.activationAnimationHasEnded_) {
-        this.rmBoundedActivationClasses_();
-        this.adapter_.addClass(FG_DEACTIVATION);
-        this.fgDeactivationRemovalTimer_ = setTimeout(function () {
-          _this6.adapter_.removeClass(FG_DEACTIVATION);
-        }, __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* numbers */].FG_DEACTIVATION_MS);
-      }
-    }
-
-    /** @private */
-
-  }, {
-    key: 'rmBoundedActivationClasses_',
-    value: function rmBoundedActivationClasses_() {
-      var _MDCRippleFoundation$4 = MDCRippleFoundation.cssClasses,
-          BG_ACTIVE_FILL = _MDCRippleFoundation$4.BG_ACTIVE_FILL,
-          FG_ACTIVATION = _MDCRippleFoundation$4.FG_ACTIVATION;
-
-      this.adapter_.removeClass(BG_ACTIVE_FILL);
-      this.adapter_.removeClass(FG_ACTIVATION);
-      this.activationAnimationHasEnded_ = false;
-      this.adapter_.computeBoundingRect();
-    }
-
-    /**
-     * @param {Event} e
-     * @private
-     */
-
-  }, {
-    key: 'deactivate_',
-    value: function deactivate_(e) {
-      var _this7 = this;
-
-      var activationState = this.activationState_;
-      // This can happen in scenarios such as when you have a keyup event that blurs the element.
-
-      if (!activationState.isActivated) {
-        return;
-      }
-      // Programmatic deactivation.
-      if (activationState.isProgrammatic) {
-        var evtObject = null;
-        var _state = /** @type {!ActivationStateType} */_extends({}, activationState);
-        requestAnimationFrame(function () {
-          return _this7.animateDeactivation_(evtObject, _state);
-        });
-        this.activationState_ = this.defaultActivationState_();
-        return;
-      }
-
-      var actualActivationType = DEACTIVATION_ACTIVATION_PAIRS[e.type];
-      var expectedActivationType = activationState.activationEvent.type;
-      // NOTE: Pointer events are tricky - https://patrickhlauke.github.io/touch/tests/results/
-      // Essentially, what we need to do here is decouple the deactivation UX from the actual
-      // deactivation state itself. This way, touch/pointer events in sequence do not trample one
-      // another.
-      var needsDeactivationUX = actualActivationType === expectedActivationType;
-      var needsActualDeactivation = needsDeactivationUX;
-      if (activationState.wasActivatedByPointer) {
-        needsActualDeactivation = e.type === 'mouseup';
-      }
-
-      var state = /** @type {!ActivationStateType} */_extends({}, activationState);
-      requestAnimationFrame(function () {
-        if (needsDeactivationUX) {
-          _this7.activationState_.hasDeactivationUXRun = true;
-          _this7.animateDeactivation_(e, state);
-        }
-
-        if (needsActualDeactivation) {
-          _this7.activationState_ = _this7.defaultActivationState_();
-        }
-      });
-    }
-  }, {
-    key: 'deactivate',
-    value: function deactivate() {
-      this.deactivate_(null);
-    }
-
-    /**
-     * @param {Event} e
-     * @param {!ActivationStateType} options
-     * @private
-     */
-
-  }, {
-    key: 'animateDeactivation_',
-    value: function animateDeactivation_(e, _ref) {
-      var wasActivatedByPointer = _ref.wasActivatedByPointer,
-          wasElementMadeActive = _ref.wasElementMadeActive;
-      var BG_FOCUSED = MDCRippleFoundation.cssClasses.BG_FOCUSED;
-
-      if (wasActivatedByPointer || wasElementMadeActive) {
-        // Remove class left over by element being focused
-        this.adapter_.removeClass(BG_FOCUSED);
-        this.runDeactivationUXLogicIfReady_();
-      }
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      var _this8 = this;
-
-      if (!this.isSupported_) {
-        return;
-      }
-      this.removeEventListeners_();
-
-      var _MDCRippleFoundation$5 = MDCRippleFoundation.cssClasses,
-          ROOT = _MDCRippleFoundation$5.ROOT,
-          UNBOUNDED = _MDCRippleFoundation$5.UNBOUNDED;
-
-      requestAnimationFrame(function () {
-        _this8.adapter_.removeClass(ROOT);
-        _this8.adapter_.removeClass(UNBOUNDED);
-        _this8.removeCssVars_();
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'removeEventListeners_',
-    value: function removeEventListeners_() {
-      var _this9 = this;
-
-      this.listenerInfos_.forEach(function (info) {
-        Object.keys(info).forEach(function (k) {
-          _this9.adapter_.deregisterInteractionHandler(info[k], _this9.listeners_[k]);
-        });
-      });
-      this.adapter_.deregisterResizeHandler(this.resizeHandler_);
-    }
-
-    /** @private */
-
-  }, {
-    key: 'removeCssVars_',
-    value: function removeCssVars_() {
-      var _this10 = this;
-
-      var strings = MDCRippleFoundation.strings;
-
-      Object.keys(strings).forEach(function (k) {
-        if (k.indexOf('VAR_') === 0) {
-          _this10.adapter_.updateCssVariable(strings[k], null);
-        }
-      });
-    }
-  }, {
-    key: 'layout',
-    value: function layout() {
-      var _this11 = this;
-
-      if (this.layoutFrame_) {
-        cancelAnimationFrame(this.layoutFrame_);
-      }
-      this.layoutFrame_ = requestAnimationFrame(function () {
-        _this11.layoutInternal_();
-        _this11.layoutFrame_ = 0;
-      });
-    }
-
-    /** @private */
-
-  }, {
-    key: 'layoutInternal_',
-    value: function layoutInternal_() {
-      this.frame_ = this.adapter_.computeBoundingRect();
-
-      var maxDim = Math.max(this.frame_.height, this.frame_.width);
-      var surfaceDiameter = Math.sqrt(Math.pow(this.frame_.width, 2) + Math.pow(this.frame_.height, 2));
-
-      // 60% of the largest dimension of the surface
-      this.initialSize_ = maxDim * MDCRippleFoundation.numbers.INITIAL_ORIGIN_SCALE;
-
-      // Diameter of the surface + 10px
-      this.maxRadius_ = surfaceDiameter + MDCRippleFoundation.numbers.PADDING;
-      this.fgScale_ = this.maxRadius_ / this.initialSize_;
-      this.xfDuration_ = 1000 * Math.sqrt(this.maxRadius_ / 1024);
-      this.updateLayoutCssVars_();
-    }
-
-    /** @private */
-
-  }, {
-    key: 'updateLayoutCssVars_',
-    value: function updateLayoutCssVars_() {
-      var _MDCRippleFoundation$6 = MDCRippleFoundation.strings,
-          VAR_SURFACE_WIDTH = _MDCRippleFoundation$6.VAR_SURFACE_WIDTH,
-          VAR_SURFACE_HEIGHT = _MDCRippleFoundation$6.VAR_SURFACE_HEIGHT,
-          VAR_FG_SIZE = _MDCRippleFoundation$6.VAR_FG_SIZE,
-          VAR_LEFT = _MDCRippleFoundation$6.VAR_LEFT,
-          VAR_TOP = _MDCRippleFoundation$6.VAR_TOP,
-          VAR_FG_SCALE = _MDCRippleFoundation$6.VAR_FG_SCALE;
-
-
-      this.adapter_.updateCssVariable(VAR_SURFACE_WIDTH, this.frame_.width + 'px');
-      this.adapter_.updateCssVariable(VAR_SURFACE_HEIGHT, this.frame_.height + 'px');
-      this.adapter_.updateCssVariable(VAR_FG_SIZE, this.initialSize_ + 'px');
-      this.adapter_.updateCssVariable(VAR_FG_SCALE, this.fgScale_);
-
-      if (this.adapter_.isUnbounded()) {
-        this.unboundedCoords_ = {
-          left: Math.round(this.frame_.width / 2 - this.initialSize_ / 2),
-          top: Math.round(this.frame_.height / 2 - this.initialSize_ / 2)
-        };
-
-        this.adapter_.updateCssVariable(VAR_LEFT, this.unboundedCoords_.left + 'px');
-        this.adapter_.updateCssVariable(VAR_TOP, this.unboundedCoords_.top + 'px');
-      }
-    }
-  }]);
-
-  return MDCRippleFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base_foundation__["a" /* default */]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCRippleFoundation);
-
-/***/ }),
-
-/***/ 80:
-/***/ (function(module, exports) {
-
-module.exports = function(el) {
-  var basicTabbables = [];
-  var orderedTabbables = [];
-
-  // A node is "available" if
-  // - it's computed style
-  var isUnavailable = createIsUnavailable();
-
-  var candidateSelectors = [
-    'input',
-    'select',
-    'a[href]',
-    'textarea',
-    'button',
-    '[tabindex]',
-  ];
-
-  var candidates = el.querySelectorAll(candidateSelectors);
-
-  var candidate, candidateIndex;
-  for (var i = 0, l = candidates.length; i < l; i++) {
-    candidate = candidates[i];
-    candidateIndex = parseInt(candidate.getAttribute('tabindex'), 10) || candidate.tabIndex;
-
-    if (
-      candidateIndex < 0
-      || (candidate.tagName === 'INPUT' && candidate.type === 'hidden')
-      || candidate.disabled
-      || isUnavailable(candidate)
-    ) {
-      continue;
-    }
-
-    if (candidateIndex === 0) {
-      basicTabbables.push(candidate);
-    } else {
-      orderedTabbables.push({
-        tabIndex: candidateIndex,
-        node: candidate,
-      });
-    }
-  }
-
-  var tabbableNodes = orderedTabbables
-    .sort(function(a, b) {
-      return a.tabIndex - b.tabIndex;
-    })
-    .map(function(a) {
-      return a.node
-    });
-
-  Array.prototype.push.apply(tabbableNodes, basicTabbables);
-
-  return tabbableNodes;
-}
-
-function createIsUnavailable() {
-  // Node cache must be refreshed on every check, in case
-  // the content of the element has changed
-  var isOffCache = [];
-
-  // "off" means `display: none;`, as opposed to "hidden",
-  // which means `visibility: hidden;`. getComputedStyle
-  // accurately reflects visiblity in context but not
-  // "off" state, so we need to recursively check parents.
-
-  function isOff(node, nodeComputedStyle) {
-    if (node === document.documentElement) return false;
-
-    // Find the cached node (Array.prototype.find not available in IE9)
-    for (var i = 0, length = isOffCache.length; i < length; i++) {
-      if (isOffCache[i][0] === node) return isOffCache[i][1];
-    }
-
-    nodeComputedStyle = nodeComputedStyle || window.getComputedStyle(node);
-
-    var result = false;
-
-    if (nodeComputedStyle.display === 'none') {
-      result = true;
-    } else if (node.parentNode) {
-      result = isOff(node.parentNode);
-    }
-
-    isOffCache.push([node, result]);
-
-    return result;
-  }
-
-  return function isUnavailable(node) {
-    if (node === document.documentElement) return false;
-
-    var computedStyle = window.getComputedStyle(node);
-
-    if (isOff(node, computedStyle)) return true;
-
-    return computedStyle.visibility === 'hidden';
-  }
-}
-
-
-/***/ }),
-
-/***/ 85:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(25);
-
-
-/***/ })
-
-/******/ });
-});

+ 0 - 1888
support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.css

@@ -1,1888 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-:root {
-  --mdc-persistent-drawer-dark-theme-bg-color: #212121; }
-
-.mdc-persistent-drawer {
-  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
-  /* stylelint-disable selector-no-qualifying-type */
-  /* stylelint-enable selector-no-qualifying-type */
-  /* TODO(sgomes): Revisit when we have interactive lists. */
-  width: 0; }
-  .mdc-persistent-drawer__toolbar-spacer {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: relative;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -ms-flex-negative: 0;
-        flex-shrink: 0;
-    -webkit-box-align: flex-center;
-        -ms-flex-align: flex-center;
-            align-items: flex-center;
-    height: 56px;
-    padding: 16px;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    /* TODO(sgomes): replace with global breakpoints when we have them */ }
-    .mdc-persistent-drawer__toolbar-spacer--theme-dark .mdc-persistent-drawer__toolbar-spacer,
-    .mdc-theme--dark .mdc-persistent-drawer__toolbar-spacer {
-      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
-    @media (min-width: 600px) {
-      .mdc-persistent-drawer__toolbar-spacer {
-        height: 64px; } }
-  .mdc-persistent-drawer__header {
-    position: relative; }
-  .mdc-persistent-drawer__header::before {
-    display: block;
-    padding-top: 56.25%;
-    content: ""; }
-  .mdc-persistent-drawer__header-content {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    -webkit-box-align: end;
-        -ms-flex-align: end;
-            align-items: flex-end;
-    padding: 16px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-  .mdc-persistent-drawer .mdc-list-group,
-  .mdc-persistent-drawer .mdc-list {
-    padding-right: 0;
-    padding-left: 0; }
-  .mdc-persistent-drawer .mdc-list-item {
-    position: relative;
-    padding: 0 16px;
-    outline: none;
-    color: inherit;
-    text-decoration: none;
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 500;
-    letter-spacing: 0.04em;
-    line-height: 1.5rem;
-    text-decoration: inherit;
-    text-transform: inherit; }
-    .mdc-persistent-drawer .mdc-list-item.mdc-ripple-upgraded {
-      left: 0; }
-  .mdc-persistent-drawer .mdc-list-item__start-detail {
-    color: rgba(0, 0, 0, 0.54); }
-    .mdc-persistent-drawer .mdc-list-item__start-detail--theme-dark .mdc-persistent-drawer .mdc-list-item__start-detail,
-    .mdc-theme--dark .mdc-persistent-drawer .mdc-list-item__start-detail {
-      color: rgba(255, 255, 255, 0.54); }
-  .mdc-persistent-drawer--selected.mdc-list-item,
-  .mdc-persistent-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
-    /* @alternate */
-    color: #3f51b5;
-    color: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-persistent-drawer .mdc-list-item::before {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    border-radius: inherit;
-    background: currentColor;
-    content: "";
-    opacity: 0; }
-  .mdc-persistent-drawer .mdc-list-item:focus::before {
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .12; }
-  .mdc-persistent-drawer .mdc-list-item:active::before {
-    /*
-      Slightly darker value for visual distinction.
-      This allows a full base that has distinct modes.
-      Progressive enhancement with ripples will provide complete button spec alignment.
-    */
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .18; }
-  .mdc-persistent-drawer .mdc-list-item:active:focus::before {
-    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  .mdc-persistent-drawer__drawer {
-    /* @alternate */
-    background: #fff;
-    background: var(--mdc-theme-background, #fff);
-    border-left: 0;
-    border-right: 1px solid #e4e4e4;
-    left: 0;
-    right: initial;
-    height: 100%;
-    -webkit-transform: translateX(-107%);
-            transform: translateX(-107%);
-    -webkit-transform: translateX(calc(-100% - 20px));
-            transform: translateX(calc(-100% - 20px));
-    will-change: transform;
-    display: -webkit-inline-box;
-    display: -ms-inline-flexbox;
-    display: inline-flex;
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    width: 240px;
-    overflow: hidden;
-    -ms-touch-action: none;
-        touch-action: none; }
-    [dir="rtl"] .mdc-persistent-drawer__drawer, .mdc-persistent-drawer__drawer[dir="rtl"] {
-      border-left: 1px solid #e4e4e4;
-      border-right: 0; }
-    [dir="rtl"] .mdc-persistent-drawer__drawer, .mdc-persistent-drawer__drawer[dir="rtl"] {
-      left: initial;
-      right: 0; }
-    .mdc-persistent-drawer__drawer--theme-dark,
-    .mdc-theme--dark .mdc-persistent-drawer__drawer {
-      background-color: #212121;
-      background-color: var(--mdc-persistent-drawer-dark-theme-bg-color, #212121);
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white);
-      border-left: 0;
-      border-right: 1px solid rgba(255, 255, 255, 0.12); }
-      [dir="rtl"] .mdc-persistent-drawer__drawer--theme-dark, .mdc-persistent-drawer__drawer--theme-dark[dir="rtl"], [dir="rtl"]
-      .mdc-theme--dark .mdc-persistent-drawer__drawer,
-      .mdc-theme--dark .mdc-persistent-drawer__drawer[dir="rtl"] {
-        border-left: 1px solid rgba(255, 255, 255, 0.12);
-        border-right: 0; }
-    [dir="rtl"] .mdc-persistent-drawer .mdc-persistent-drawer__drawer,
-    .mdc-persistent-drawer[dir="rtl"] .mdc-persistent-drawer__drawer {
-      -webkit-transform: translateX(107%);
-              transform: translateX(107%);
-      -webkit-transform: translateX(calc(100% + 20px));
-              transform: translateX(calc(100% + 20px)); }
-  .mdc-persistent-drawer--animating .mdc-persistent-drawer__drawer {
-    -webkit-transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1); }
-  .mdc-persistent-drawer--animating.mdc-persistent-drawer--open .mdc-persistent-drawer__drawer {
-    -webkit-transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1); }
-  .mdc-persistent-drawer--open {
-    width: 240px;
-    pointer-events: auto; }
-    .mdc-persistent-drawer--open .mdc-persistent-drawer__drawer {
-      -webkit-transform: none;
-              transform: none; }
-    [dir="rtl"] .mdc-persistent-drawer--open .mdc-persistent-drawer__drawer, .mdc-persistent-drawer--open[dir="rtl"] .mdc-persistent-drawer__drawer {
-      -webkit-transform: none;
-              transform: none; }
-
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-:root {
-  --mdc-permanent-drawer-dark-theme-bg-color: #212121; }
-
-.mdc-permanent-drawer {
-  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
-  /* stylelint-disable selector-no-qualifying-type */
-  /* stylelint-enable selector-no-qualifying-type */
-  /* TODO(sgomes): Revisit when we have interactive lists. */
-  /* @alternate */
-  background: #fff;
-  background: var(--mdc-theme-background, #fff);
-  border-left: 0;
-  border-right: 1px solid #e4e4e4;
-  left: 0;
-  right: initial;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  -webkit-box-orient: vertical;
-  -webkit-box-direction: normal;
-      -ms-flex-direction: column;
-          flex-direction: column;
-  -webkit-box-flex: 0;
-      -ms-flex: 0 0 auto;
-          flex: 0 0 auto;
-  width: 240px;
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  overflow: hidden; }
-  .mdc-permanent-drawer__toolbar-spacer {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: relative;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -ms-flex-negative: 0;
-        flex-shrink: 0;
-    -webkit-box-align: flex-center;
-        -ms-flex-align: flex-center;
-            align-items: flex-center;
-    height: 56px;
-    padding: 16px;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    /* TODO(sgomes): replace with global breakpoints when we have them */ }
-    .mdc-permanent-drawer__toolbar-spacer--theme-dark .mdc-permanent-drawer__toolbar-spacer,
-    .mdc-theme--dark .mdc-permanent-drawer__toolbar-spacer {
-      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
-    @media (min-width: 600px) {
-      .mdc-permanent-drawer__toolbar-spacer {
-        height: 64px; } }
-  .mdc-permanent-drawer__header {
-    position: relative; }
-  .mdc-permanent-drawer__header::before {
-    display: block;
-    padding-top: 56.25%;
-    content: ""; }
-  .mdc-permanent-drawer__header-content {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    -webkit-box-align: end;
-        -ms-flex-align: end;
-            align-items: flex-end;
-    padding: 16px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-  .mdc-permanent-drawer .mdc-list-group,
-  .mdc-permanent-drawer .mdc-list {
-    padding-right: 0;
-    padding-left: 0; }
-  .mdc-permanent-drawer .mdc-list-item {
-    position: relative;
-    padding: 0 16px;
-    outline: none;
-    color: inherit;
-    text-decoration: none;
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 500;
-    letter-spacing: 0.04em;
-    line-height: 1.5rem;
-    text-decoration: inherit;
-    text-transform: inherit; }
-    .mdc-permanent-drawer .mdc-list-item.mdc-ripple-upgraded {
-      left: 0; }
-  .mdc-permanent-drawer .mdc-list-item__start-detail {
-    color: rgba(0, 0, 0, 0.54); }
-    .mdc-permanent-drawer .mdc-list-item__start-detail--theme-dark .mdc-permanent-drawer .mdc-list-item__start-detail,
-    .mdc-theme--dark .mdc-permanent-drawer .mdc-list-item__start-detail {
-      color: rgba(255, 255, 255, 0.54); }
-  .mdc-permanent-drawer--selected.mdc-list-item,
-  .mdc-permanent-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
-    /* @alternate */
-    color: #3f51b5;
-    color: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-permanent-drawer .mdc-list-item::before {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    border-radius: inherit;
-    background: currentColor;
-    content: "";
-    opacity: 0; }
-  .mdc-permanent-drawer .mdc-list-item:focus::before {
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .12; }
-  .mdc-permanent-drawer .mdc-list-item:active::before {
-    /*
-      Slightly darker value for visual distinction.
-      This allows a full base that has distinct modes.
-      Progressive enhancement with ripples will provide complete button spec alignment.
-    */
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .18; }
-  .mdc-permanent-drawer .mdc-list-item:active:focus::before {
-    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  [dir="rtl"] .mdc-permanent-drawer, .mdc-permanent-drawer[dir="rtl"] {
-    border-left: 1px solid #e4e4e4;
-    border-right: 0; }
-  [dir="rtl"] .mdc-permanent-drawer, .mdc-permanent-drawer[dir="rtl"] {
-    left: initial;
-    right: 0; }
-  .mdc-permanent-drawer--theme-dark,
-  .mdc-theme--dark .mdc-permanent-drawer {
-    background-color: #212121;
-    background-color: var(--mdc-permanent-drawer-dark-theme-bg-color, #212121);
-    /* @alternate */
-    color: white;
-    color: var(--mdc-theme-text-primary-on-dark, white);
-    border-left: 0;
-    border-right: 1px solid rgba(255, 255, 255, 0.12); }
-    [dir="rtl"] .mdc-permanent-drawer--theme-dark, .mdc-permanent-drawer--theme-dark[dir="rtl"], [dir="rtl"]
-    .mdc-theme--dark .mdc-permanent-drawer,
-    .mdc-theme--dark .mdc-permanent-drawer[dir="rtl"] {
-      border-left: 1px solid rgba(255, 255, 255, 0.12);
-      border-right: 0; }
-  .mdc-permanent-drawer--floating {
-    background: none;
-    border-left: 0;
-    border-right: none; }
-    [dir="rtl"] .mdc-permanent-drawer--floating, .mdc-permanent-drawer--floating[dir="rtl"] {
-      border-left: none;
-      border-right: 0; }
-    .mdc-permanent-drawer--floating--theme-dark,
-    .mdc-theme--dark .mdc-permanent-drawer--floating {
-      background: none;
-      border-left: 0;
-      border-right: none; }
-      [dir="rtl"] .mdc-permanent-drawer--floating--theme-dark, .mdc-permanent-drawer--floating--theme-dark[dir="rtl"], [dir="rtl"]
-      .mdc-theme--dark .mdc-permanent-drawer--floating,
-      .mdc-theme--dark .mdc-permanent-drawer--floating[dir="rtl"] {
-        border-left: none;
-        border-right: 0; }
-
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-.mdc-temporary-drawer {
-  /* Use aspect ratio trick to maintain 16:9 aspect ratio on the header */
-  /* stylelint-disable selector-no-qualifying-type */
-  /* stylelint-enable selector-no-qualifying-type */
-  /* TODO(sgomes): Revisit when we have interactive lists. */
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  overflow: hidden;
-  pointer-events: none;
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  contain: strict;
-  z-index: 5;
-  /* Shaded background */ }
-  .mdc-temporary-drawer__toolbar-spacer {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: relative;
-    -webkit-box-orient: horizontal;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: row;
-            flex-direction: row;
-    -ms-flex-negative: 0;
-        flex-shrink: 0;
-    -webkit-box-align: flex-center;
-        -ms-flex-align: flex-center;
-            align-items: flex-center;
-    height: 56px;
-    padding: 16px;
-    border-bottom: 1px solid rgba(0, 0, 0, 0.12);
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    /* TODO(sgomes): replace with global breakpoints when we have them */ }
-    .mdc-temporary-drawer__toolbar-spacer--theme-dark .mdc-temporary-drawer__toolbar-spacer,
-    .mdc-theme--dark .mdc-temporary-drawer__toolbar-spacer {
-      border-bottom: 1px solid rgba(255, 255, 255, 0.12); }
-    @media (min-width: 600px) {
-      .mdc-temporary-drawer__toolbar-spacer {
-        height: 64px; } }
-  .mdc-temporary-drawer__header {
-    position: relative; }
-  .mdc-temporary-drawer__header::before {
-    display: block;
-    padding-top: 56.25%;
-    content: ""; }
-  .mdc-temporary-drawer__header-content {
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: absolute;
-    top: 0;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    -webkit-box-align: end;
-        -ms-flex-align: end;
-            align-items: flex-end;
-    padding: 16px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-  .mdc-temporary-drawer .mdc-list-group,
-  .mdc-temporary-drawer .mdc-list {
-    padding-right: 0;
-    padding-left: 0; }
-  .mdc-temporary-drawer .mdc-list-item {
-    position: relative;
-    padding: 0 16px;
-    outline: none;
-    color: inherit;
-    text-decoration: none;
-    font-family: Roboto, sans-serif;
-    -moz-osx-font-smoothing: grayscale;
-    -webkit-font-smoothing: antialiased;
-    font-size: 0.875rem;
-    font-weight: 500;
-    letter-spacing: 0.04em;
-    line-height: 1.5rem;
-    text-decoration: inherit;
-    text-transform: inherit; }
-    .mdc-temporary-drawer .mdc-list-item.mdc-ripple-upgraded {
-      left: 0; }
-  .mdc-temporary-drawer .mdc-list-item__start-detail {
-    color: rgba(0, 0, 0, 0.54); }
-    .mdc-temporary-drawer .mdc-list-item__start-detail--theme-dark .mdc-temporary-drawer .mdc-list-item__start-detail,
-    .mdc-theme--dark .mdc-temporary-drawer .mdc-list-item__start-detail {
-      color: rgba(255, 255, 255, 0.54); }
-  .mdc-temporary-drawer--selected.mdc-list-item,
-  .mdc-temporary-drawer--selected.mdc-list-item .mdc-list-item__start-detail {
-    /* @alternate */
-    color: #3f51b5;
-    color: var(--mdc-theme-primary, #3f51b5); }
-  .mdc-temporary-drawer .mdc-list-item::before {
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    -webkit-transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: opacity 120ms 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    border-radius: inherit;
-    background: currentColor;
-    content: "";
-    opacity: 0; }
-  .mdc-temporary-drawer .mdc-list-item:focus::before {
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .12; }
-  .mdc-temporary-drawer .mdc-list-item:active::before {
-    /*
-      Slightly darker value for visual distinction.
-      This allows a full base that has distinct modes.
-      Progressive enhancement with ripples will provide complete button spec alignment.
-    */
-    -webkit-transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 180ms 0ms cubic-bezier(0, 0, 0.2, 1);
-    opacity: .18; }
-  .mdc-temporary-drawer .mdc-list-item:active:focus::before {
-    -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  .mdc-temporary-drawer::before {
-    display: block;
-    position: absolute;
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    background: rgba(0, 0, 0, 0.6);
-    content: "";
-    opacity: 0;
-    opacity: var(--mdc-temporary-drawer-opacity, 0);
-    will-change: opacity;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box; }
-  .mdc-temporary-drawer__drawer {
-    /* @alternate */
-    background: #fff;
-    background: var(--mdc-theme-background, #fff);
-    -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
-    left: 0;
-    right: initial;
-    height: 100%;
-    -webkit-transform: translateX(-107%);
-            transform: translateX(-107%);
-    -webkit-transform: translateX(calc(-100% - 20px));
-            transform: translateX(calc(-100% - 20px));
-    will-change: transform;
-    display: -webkit-box;
-    display: -ms-flexbox;
-    display: flex;
-    position: absolute;
-    -webkit-box-orient: vertical;
-    -webkit-box-direction: normal;
-        -ms-flex-direction: column;
-            flex-direction: column;
-    width: calc(100% - 56px);
-    max-width: 280px;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    overflow: hidden;
-    -ms-touch-action: none;
-        touch-action: none;
-    /* TODO(sgomes): replace with global breakpoints when we have them */ }
-    [dir="rtl"] .mdc-temporary-drawer__drawer, .mdc-temporary-drawer__drawer[dir="rtl"] {
-      left: initial;
-      right: 0; }
-    .mdc-temporary-drawer--theme-dark .mdc-temporary-drawer__drawer,
-    .mdc-theme--dark .mdc-temporary-drawer__drawer {
-      background: #303030;
-      /* @alternate */
-      color: white;
-      color: var(--mdc-theme-text-primary-on-dark, white); }
-    [dir="rtl"] .mdc-temporary-drawer .mdc-temporary-drawer__drawer,
-    .mdc-temporary-drawer[dir="rtl"] .mdc-temporary-drawer__drawer {
-      -webkit-transform: translateX(107%);
-              transform: translateX(107%);
-      -webkit-transform: translateX(calc(100% + 20px));
-              transform: translateX(calc(100% + 20px)); }
-    @media (min-width: 600px) {
-      .mdc-temporary-drawer__drawer {
-        width: calc(100% - 64px);
-        max-width: 320px; } }
-  .mdc-temporary-drawer__content {
-    -webkit-box-flex: 1;
-        -ms-flex-positive: 1;
-            flex-grow: 1;
-    margin: 0;
-    overflow-x: hidden;
-    overflow-y: auto;
-    -webkit-box-sizing: border-box;
-            box-sizing: border-box;
-    -webkit-overflow-scrolling: touch;
-    -ms-touch-action: pan-y;
-        touch-action: pan-y; }
-  .mdc-temporary-drawer__footer {
-    -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-    -ms-flex-negative: 0;
-        flex-shrink: 0; }
-  .mdc-temporary-drawer--animating::before {
-    -webkit-transition: opacity 0.3s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: opacity 0.3s 0ms cubic-bezier(0, 0, 0.2, 1); }
-  .mdc-temporary-drawer--animating.mdc-temporary-drawer--open .mdc-temporary-drawer__drawer {
-    -webkit-transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1);
-    transition: transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1), -webkit-transform 0.225s 0ms cubic-bezier(0, 0, 0.2, 1); }
-  .mdc-temporary-drawer--animating .mdc-temporary-drawer__drawer {
-    -webkit-transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1);
-    transition: transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1), -webkit-transform 0.195s 0ms cubic-bezier(0.4, 0, 0.6, 1); }
-  .mdc-temporary-drawer--open {
-    pointer-events: auto; }
-    .mdc-temporary-drawer--open::before {
-      opacity: 1;
-      opacity: var(--mdc-temporary-drawer-opacity, 1); }
-    .mdc-temporary-drawer--open .mdc-temporary-drawer__drawer {
-      -webkit-transform: none;
-              transform: none; }
-    [dir="rtl"] .mdc-temporary-drawer--open .mdc-temporary-drawer__drawer, .mdc-temporary-drawer--open[dir="rtl"] .mdc-temporary-drawer__drawer {
-      -webkit-transform: none;
-              transform: none; }
-
-.mdc-drawer-scroll-lock {
-  height: 100vh;
-  overflow: hidden; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 6);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 6:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 1609
support/client/lib/vwf/view/lib/mdc/dist/mdc.drawer.js

@@ -1,1609 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["drawer"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["drawer"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 86);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 0:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @template A
- */
-var MDCFoundation = function () {
-  _createClass(MDCFoundation, null, [{
-    key: "cssClasses",
-
-    /** @return enum{cssClasses} */
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports every
-      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
-      return {};
-    }
-
-    /** @return enum{strings} */
-
-  }, {
-    key: "strings",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
-      return {};
-    }
-
-    /** @return enum{numbers} */
-
-  }, {
-    key: "numbers",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
-      return {};
-    }
-
-    /** @return {!Object} */
-
-  }, {
-    key: "defaultAdapter",
-    get: function get() {
-      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
-      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
-      // validation.
-      return {};
-    }
-
-    /**
-     * @param {A=} adapter
-     */
-
-  }]);
-
-  function MDCFoundation() {
-    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, MDCFoundation);
-
-    /** @protected {!A} */
-    this.adapter_ = adapter;
-  }
-
-  _createClass(MDCFoundation, [{
-    key: "init",
-    value: function init() {
-      // Subclasses should override this method to perform initialization routines (registering events, etc.)
-    }
-  }, {
-    key: "destroy",
-    value: function destroy() {
-      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
-    }
-  }]);
-
-  return MDCFoundation;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
-
-/***/ }),
-
-/***/ 1:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/**
- * @template F
- */
-
-var MDCComponent = function () {
-  _createClass(MDCComponent, null, [{
-    key: 'attachTo',
-
-    /**
-     * @param {!Element} root
-     * @return {!MDCComponent}
-     */
-    value: function attachTo(root) {
-      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
-      // returns an instantiated component with its root set to that element. Also note that in the cases of
-      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
-      // from getDefaultFoundation().
-      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
-    }
-
-    /**
-     * @param {!Element} root
-     * @param {F=} foundation
-     * @param {...?} args
-     */
-
-  }]);
-
-  function MDCComponent(root) {
-    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-    _classCallCheck(this, MDCComponent);
-
-    /** @protected {!Element} */
-    this.root_ = root;
-
-    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
-
-    this.initialize.apply(this, args);
-    // Note that we initialize foundation here and not within the constructor's default param so that
-    // this.root_ is defined and can be used within the foundation class.
-    /** @protected {!F} */
-    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
-    this.foundation_.init();
-    this.initialSyncWithDOM();
-  }
-
-  _createClass(MDCComponent, [{
-    key: 'initialize',
-    value: function initialize() /* ...args */{}
-    // Subclasses can override this to do any additional setup work that would be considered part of a
-    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
-    // initialized. Any additional arguments besides root and foundation will be passed in here.
-
-
-    /**
-     * @return {!F} foundation
-     */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      // Subclasses must override this method to return a properly configured foundation class for the
-      // component.
-      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
-      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
-      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
-      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      // Subclasses may implement this method to release any resources / deregister any listeners they have
-      // attached. An example of this might be deregistering a resize event from the window object.
-      this.foundation_.destroy();
-    }
-
-    /**
-     * Wrapper method to add an event listener to the component's root element. This is most useful when
-     * listening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'listen',
-    value: function listen(evtType, handler) {
-      this.root_.addEventListener(evtType, handler);
-    }
-
-    /**
-     * Wrapper method to remove an event listener to the component's root element. This is most useful when
-     * unlistening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'unlisten',
-    value: function unlisten(evtType, handler) {
-      this.root_.removeEventListener(evtType, handler);
-    }
-
-    /**
-     * Fires a cross-browser-compatible custom event from the component root of the given type,
-     * with the given data.
-     * @param {string} evtType
-     * @param {!Object} evtData
-     * @param {boolean=} shouldBubble
-     */
-
-  }, {
-    key: 'emit',
-    value: function emit(evtType, evtData) {
-      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-      var evt = void 0;
-      if (typeof CustomEvent === 'function') {
-        evt = new CustomEvent(evtType, {
-          detail: evtData,
-          bubbles: shouldBubble
-        });
-      } else {
-        evt = document.createEvent('CustomEvent');
-        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
-      }
-
-      this.root_.dispatchEvent(evt);
-    }
-  }]);
-
-  return MDCComponent;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
-
-/***/ }),
-
-/***/ 12:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__constants__ = __webpack_require__(47);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_0__constants__["a"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(48);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-/***/ }),
-
-/***/ 13:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (immutable) */ __webpack_exports__["remapEvent"] = remapEvent;
-/* harmony export (immutable) */ __webpack_exports__["getTransformPropertyName"] = getTransformPropertyName;
-/* harmony export (immutable) */ __webpack_exports__["supportsCssCustomProperties"] = supportsCssCustomProperties;
-/* harmony export (immutable) */ __webpack_exports__["applyPassive"] = applyPassive;
-/* harmony export (immutable) */ __webpack_exports__["saveElementTabState"] = saveElementTabState;
-/* harmony export (immutable) */ __webpack_exports__["restoreElementTabState"] = restoreElementTabState;
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var TAB_DATA = 'data-mdc-tabindex';
-var TAB_DATA_HANDLED = 'data-mdc-tabindex-handled';
-
-var storedTransformPropertyName_ = void 0;
-var supportsPassive_ = void 0;
-
-// Remap touch events to pointer events, if the browser doesn't support touch events.
-function remapEvent(eventName) {
-  var globalObj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : window;
-
-  if (!('ontouchstart' in globalObj.document)) {
-    switch (eventName) {
-      case 'touchstart':
-        return 'pointerdown';
-      case 'touchmove':
-        return 'pointermove';
-      case 'touchend':
-        return 'pointerup';
-      default:
-        return eventName;
-    }
-  }
-
-  return eventName;
-}
-
-// Choose the correct transform property to use on the current browser.
-function getTransformPropertyName() {
-  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (storedTransformPropertyName_ === undefined || forceRefresh) {
-    var el = globalObj.document.createElement('div');
-    var transformPropertyName = 'transform' in el.style ? 'transform' : '-webkit-transform';
-    storedTransformPropertyName_ = transformPropertyName;
-  }
-
-  return storedTransformPropertyName_;
-}
-
-// Determine whether the current browser supports CSS properties.
-function supportsCssCustomProperties() {
-  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
-
-  if ('CSS' in globalObj) {
-    return globalObj.CSS.supports('(--color: red)');
-  }
-  return false;
-}
-
-// Determine whether the current browser supports passive event listeners, and if so, use them.
-function applyPassive() {
-  var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window;
-  var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-  if (supportsPassive_ === undefined || forceRefresh) {
-    var isSupported = false;
-    try {
-      globalObj.document.addEventListener('test', null, { get passive() {
-          isSupported = true;
-        } });
-    } catch (e) {}
-
-    supportsPassive_ = isSupported;
-  }
-
-  return supportsPassive_ ? { passive: true } : false;
-}
-
-// Save the tab state for an element.
-function saveElementTabState(el) {
-  if (el.hasAttribute('tabindex')) {
-    el.setAttribute(TAB_DATA, el.getAttribute('tabindex'));
-  }
-  el.setAttribute(TAB_DATA_HANDLED, true);
-}
-
-// Restore the tab state for an element, if it was saved.
-function restoreElementTabState(el) {
-  // Only modify elements we've already handled, in case anything was dynamically added since we saved state.
-  if (el.hasAttribute(TAB_DATA_HANDLED)) {
-    if (el.hasAttribute(TAB_DATA)) {
-      el.setAttribute('tabindex', el.getAttribute(TAB_DATA));
-      el.removeAttribute(TAB_DATA);
-    } else {
-      el.removeAttribute('tabindex');
-    }
-    el.removeAttribute(TAB_DATA_HANDLED);
-  }
-}
-
-/***/ }),
-
-/***/ 2:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__selection_control__ = __webpack_require__(3);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__foundation__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCComponent", function() { return __WEBPACK_IMPORTED_MODULE_1__component__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionControlState", function() { return __WEBPACK_IMPORTED_MODULE_2__selection_control__["a"]; });
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-/***/ }),
-
-/***/ 26:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util__ = __webpack_require__(13);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__temporary__ = __webpack_require__(51);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTemporaryDrawer", function() { return __WEBPACK_IMPORTED_MODULE_1__temporary__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCTemporaryDrawerFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__temporary__["b"]; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__persistent__ = __webpack_require__(46);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCPersistentDrawer", function() { return __WEBPACK_IMPORTED_MODULE_2__persistent__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCPersistentDrawerFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__persistent__["b"]; });
-/* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_0__util__; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {!{
- *   checked: boolean,
- *   indeterminate: boolean,
- *   disabled: boolean,
- *   value: ?string
- * }}
- */
-var SelectionControlState = void 0;
-
-/***/ }),
-
-/***/ 44:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(12);
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-var cssClasses = {
-  ROOT: 'mdc-persistent-drawer',
-  OPEN: 'mdc-persistent-drawer--open',
-  ANIMATING: 'mdc-persistent-drawer--animating'
-};
-
-var strings = {
-  DRAWER_SELECTOR: '.mdc-persistent-drawer__drawer',
-  FOCUSABLE_ELEMENTS: __WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* FOCUSABLE_ELEMENTS */],
-  OPEN_EVENT: 'MDCPersistentDrawer:open',
-  CLOSE_EVENT: 'MDCPersistentDrawer:close'
-};
-
-/***/ }),
-
-/***/ 45:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(12);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(44);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-var MDCPersistentDrawerFoundation = function (_MDCSlidableDrawerFou) {
-  _inherits(MDCPersistentDrawerFoundation, _MDCSlidableDrawerFou);
-
-  _createClass(MDCPersistentDrawerFoundation, null, [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return _extends(__WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* MDCSlidableDrawerFoundation */].defaultAdapter, {
-        isDrawer: function isDrawer() {
-          return false;
-        }
-      });
-    }
-  }]);
-
-  function MDCPersistentDrawerFoundation(adapter) {
-    _classCallCheck(this, MDCPersistentDrawerFoundation);
-
-    return _possibleConstructorReturn(this, (MDCPersistentDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCPersistentDrawerFoundation)).call(this, _extends(MDCPersistentDrawerFoundation.defaultAdapter, adapter), MDCPersistentDrawerFoundation.cssClasses.ROOT, MDCPersistentDrawerFoundation.cssClasses.ANIMATING, MDCPersistentDrawerFoundation.cssClasses.OPEN));
-  }
-
-  _createClass(MDCPersistentDrawerFoundation, [{
-    key: 'isRootTransitioningEventTarget_',
-    value: function isRootTransitioningEventTarget_(el) {
-      return this.adapter_.isDrawer(el);
-    }
-  }]);
-
-  return MDCPersistentDrawerFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* MDCSlidableDrawerFoundation */]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCPersistentDrawerFoundation);
-
-/***/ }),
-
-/***/ 46:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCPersistentDrawer; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(45);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(13);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
-/* unused harmony reexport util */
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-
-var MDCPersistentDrawer = function (_MDCComponent) {
-  _inherits(MDCPersistentDrawer, _MDCComponent);
-
-  function MDCPersistentDrawer() {
-    _classCallCheck(this, MDCPersistentDrawer);
-
-    return _possibleConstructorReturn(this, (MDCPersistentDrawer.__proto__ || Object.getPrototypeOf(MDCPersistentDrawer)).apply(this, arguments));
-  }
-
-  _createClass(MDCPersistentDrawer, [{
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      var _this2 = this;
-
-      var FOCUSABLE_ELEMENTS = __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.FOCUSABLE_ELEMENTS;
-
-
-      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
-        addClass: function addClass(className) {
-          return _this2.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return _this2.root_.classList.remove(className);
-        },
-        hasClass: function hasClass(className) {
-          return _this2.root_.classList.contains(className);
-        },
-        hasNecessaryDom: function hasNecessaryDom() {
-          return Boolean(_this2.drawer);
-        },
-        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
-          return _this2.root_.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
-          return _this2.root_.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
-        },
-        registerDrawerInteractionHandler: function registerDrawerInteractionHandler(evt, handler) {
-          return _this2.drawer.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
-        },
-        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler(evt, handler) {
-          return _this2.drawer.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
-        },
-        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
-          return _this2.root_.addEventListener('transitionend', handler);
-        },
-        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
-          return _this2.root_.removeEventListener('transitionend', handler);
-        },
-        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
-          return document.addEventListener('keydown', handler);
-        },
-        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
-          return document.removeEventListener('keydown', handler);
-        },
-        getDrawerWidth: function getDrawerWidth() {
-          return _this2.drawer.offsetWidth;
-        },
-        setTranslateX: function setTranslateX(value) {
-          return _this2.drawer.style.setProperty(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"](), value === null ? null : 'translateX(' + value + 'px)');
-        },
-        getFocusableElements: function getFocusableElements() {
-          return _this2.drawer.querySelectorAll(FOCUSABLE_ELEMENTS);
-        },
-        saveElementTabState: function saveElementTabState(el) {
-          return __WEBPACK_IMPORTED_MODULE_2__util__["saveElementTabState"](el);
-        },
-        restoreElementTabState: function restoreElementTabState(el) {
-          return __WEBPACK_IMPORTED_MODULE_2__util__["restoreElementTabState"](el);
-        },
-        makeElementUntabbable: function makeElementUntabbable(el) {
-          return el.setAttribute('tabindex', -1);
-        },
-        notifyOpen: function notifyOpen() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.OPEN_EVENT);
-        },
-        notifyClose: function notifyClose() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CLOSE_EVENT);
-        },
-        isRtl: function isRtl() {
-          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
-        },
-        isDrawer: function isDrawer(el) {
-          return el === _this2.drawer;
-        }
-      });
-    }
-  }, {
-    key: 'open',
-    get: function get() {
-      return this.foundation_.isOpen();
-    },
-    set: function set(value) {
-      if (value) {
-        this.foundation_.open();
-      } else {
-        this.foundation_.close();
-      }
-    }
-
-    // Return the drawer element inside the component.
-
-  }, {
-    key: 'drawer',
-    get: function get() {
-      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.DRAWER_SELECTOR);
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      return new MDCPersistentDrawer(root);
-    }
-  }]);
-
-  return MDCPersistentDrawer;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
-
-/***/ }),
-
-/***/ 47:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return FOCUSABLE_ELEMENTS; });
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var FOCUSABLE_ELEMENTS = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), ' + 'button:not([disabled]), iframe, object, embed, [tabindex], [contenteditable]';
-
-/***/ }),
-
-/***/ 48:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCSlidableDrawerFoundation; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-var MDCSlidableDrawerFoundation = function (_MDCFoundation) {
-  _inherits(MDCSlidableDrawerFoundation, _MDCFoundation);
-
-  _createClass(MDCSlidableDrawerFoundation, null, [{
-    key: 'defaultAdapter',
-    get: function get() {
-      return {
-        addClass: function addClass() /* className: string */{},
-        removeClass: function removeClass() /* className: string */{},
-        hasClass: function hasClass() /* className: string */{},
-        hasNecessaryDom: function hasNecessaryDom() {
-          return (/* boolean */false
-          );
-        },
-        registerInteractionHandler: function registerInteractionHandler() /* evt: string, handler: EventListener */{},
-        deregisterInteractionHandler: function deregisterInteractionHandler() /* evt: string, handler: EventListener */{},
-        registerDrawerInteractionHandler: function registerDrawerInteractionHandler() /* evt: string, handler: EventListener */{},
-        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler() /* evt: string, handler: EventListener */{},
-        registerTransitionEndHandler: function registerTransitionEndHandler() /* handler: EventListener */{},
-        deregisterTransitionEndHandler: function deregisterTransitionEndHandler() /* handler: EventListener */{},
-        registerDocumentKeydownHandler: function registerDocumentKeydownHandler() /* handler: EventListener */{},
-        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler() /* handler: EventListener */{},
-        setTranslateX: function setTranslateX() /* value: number | null */{},
-        getFocusableElements: function getFocusableElements() /* NodeList */{},
-        saveElementTabState: function saveElementTabState() /* el: Element */{},
-        restoreElementTabState: function restoreElementTabState() /* el: Element */{},
-        makeElementUntabbable: function makeElementUntabbable() /* el: Element */{},
-        notifyOpen: function notifyOpen() {},
-        notifyClose: function notifyClose() {},
-        isRtl: function isRtl() {
-          return (/* boolean */false
-          );
-        },
-        getDrawerWidth: function getDrawerWidth() {
-          return (/* number */0
-          );
-        }
-      };
-    }
-  }]);
-
-  function MDCSlidableDrawerFoundation(adapter, rootCssClass, animatingCssClass, openCssClass) {
-    _classCallCheck(this, MDCSlidableDrawerFoundation);
-
-    var _this = _possibleConstructorReturn(this, (MDCSlidableDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCSlidableDrawerFoundation)).call(this, _extends(MDCSlidableDrawerFoundation.defaultAdapter, adapter)));
-
-    _this.rootCssClass_ = rootCssClass;
-    _this.animatingCssClass_ = animatingCssClass;
-    _this.openCssClass_ = openCssClass;
-
-    _this.transitionEndHandler_ = function (evt) {
-      return _this.handleTransitionEnd_(evt);
-    };
-
-    _this.inert_ = false;
-
-    _this.drawerClickHandler_ = function (evt) {
-      return evt.stopPropagation();
-    };
-    _this.componentTouchStartHandler_ = function (evt) {
-      return _this.handleTouchStart_(evt);
-    };
-    _this.componentTouchMoveHandler_ = function (evt) {
-      return _this.handleTouchMove_(evt);
-    };
-    _this.componentTouchEndHandler_ = function (evt) {
-      return _this.handleTouchEnd_(evt);
-    };
-    _this.documentKeydownHandler_ = function (evt) {
-      if (evt.key && evt.key === 'Escape' || evt.keyCode === 27) {
-        _this.close();
-      }
-    };
-    return _this;
-  }
-
-  _createClass(MDCSlidableDrawerFoundation, [{
-    key: 'init',
-    value: function init() {
-      var ROOT = this.rootCssClass_;
-      var OPEN = this.openCssClass_;
-
-      if (!this.adapter_.hasClass(ROOT)) {
-        throw new Error(ROOT + ' class required in root element.');
-      }
-
-      if (!this.adapter_.hasNecessaryDom()) {
-        throw new Error('Required DOM nodes missing in ' + ROOT + ' component.');
-      }
-
-      if (this.adapter_.hasClass(OPEN)) {
-        this.isOpen_ = true;
-      } else {
-        this.detabinate_();
-        this.isOpen_ = false;
-      }
-
-      this.adapter_.registerDrawerInteractionHandler('click', this.drawerClickHandler_);
-      this.adapter_.registerDrawerInteractionHandler('touchstart', this.componentTouchStartHandler_);
-      this.adapter_.registerInteractionHandler('touchmove', this.componentTouchMoveHandler_);
-      this.adapter_.registerInteractionHandler('touchend', this.componentTouchEndHandler_);
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      this.adapter_.deregisterDrawerInteractionHandler('click', this.drawerClickHandler_);
-      this.adapter_.deregisterDrawerInteractionHandler('touchstart', this.componentTouchStartHandler_);
-      this.adapter_.deregisterInteractionHandler('touchmove', this.componentTouchMoveHandler_);
-      this.adapter_.deregisterInteractionHandler('touchend', this.componentTouchEndHandler_);
-      // Deregister the document keydown handler just in case the component is destroyed while the menu is open.
-      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
-    }
-  }, {
-    key: 'open',
-    value: function open() {
-      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
-      this.adapter_.registerDocumentKeydownHandler(this.documentKeydownHandler_);
-      this.adapter_.addClass(this.animatingCssClass_);
-      this.adapter_.addClass(this.openCssClass_);
-      this.retabinate_();
-      // Debounce multiple calls
-      if (!this.isOpen_) {
-        this.adapter_.notifyOpen();
-      }
-      this.isOpen_ = true;
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      this.adapter_.deregisterDocumentKeydownHandler(this.documentKeydownHandler_);
-      this.adapter_.registerTransitionEndHandler(this.transitionEndHandler_);
-      this.adapter_.addClass(this.animatingCssClass_);
-      this.adapter_.removeClass(this.openCssClass_);
-      this.detabinate_();
-      // Debounce multiple calls
-      if (this.isOpen_) {
-        this.adapter_.notifyClose();
-      }
-      this.isOpen_ = false;
-    }
-  }, {
-    key: 'isOpen',
-    value: function isOpen() {
-      return this.isOpen_;
-    }
-
-    /**
-     *  Render all children of the drawer inert when it's closed.
-     */
-
-  }, {
-    key: 'detabinate_',
-    value: function detabinate_() {
-      if (this.inert_) {
-        return;
-      }
-
-      var elements = this.adapter_.getFocusableElements();
-      if (elements) {
-        for (var i = 0; i < elements.length; i++) {
-          this.adapter_.saveElementTabState(elements[i]);
-          this.adapter_.makeElementUntabbable(elements[i]);
-        }
-      }
-
-      this.inert_ = true;
-    }
-
-    /**
-     *  Make all children of the drawer tabbable again when it's open.
-     */
-
-  }, {
-    key: 'retabinate_',
-    value: function retabinate_() {
-      if (!this.inert_) {
-        return;
-      }
-
-      var elements = this.adapter_.getFocusableElements();
-      if (elements) {
-        for (var i = 0; i < elements.length; i++) {
-          this.adapter_.restoreElementTabState(elements[i]);
-        }
-      }
-
-      this.inert_ = false;
-    }
-  }, {
-    key: 'handleTouchStart_',
-    value: function handleTouchStart_(evt) {
-      if (!this.adapter_.hasClass(this.openCssClass_)) {
-        return;
-      }
-      if (evt.pointerType && evt.pointerType !== 'touch') {
-        return;
-      }
-
-      this.direction_ = this.adapter_.isRtl() ? -1 : 1;
-      this.drawerWidth_ = this.adapter_.getDrawerWidth();
-      this.startX_ = evt.touches ? evt.touches[0].pageX : evt.pageX;
-      this.currentX_ = this.startX_;
-
-      this.updateRaf_ = requestAnimationFrame(this.updateDrawer_.bind(this));
-    }
-  }, {
-    key: 'handleTouchMove_',
-    value: function handleTouchMove_(evt) {
-      if (evt.pointerType && evt.pointerType !== 'touch') {
-        return;
-      }
-
-      this.currentX_ = evt.touches ? evt.touches[0].pageX : evt.pageX;
-    }
-  }, {
-    key: 'handleTouchEnd_',
-    value: function handleTouchEnd_(evt) {
-      if (evt.pointerType && evt.pointerType !== 'touch') {
-        return;
-      }
-
-      this.prepareForTouchEnd_();
-
-      // Did the user close the drawer by more than 50%?
-      if (Math.abs(this.newPosition_ / this.drawerWidth_) >= 0.5) {
-        this.close();
-      } else {
-        // Triggering an open here means we'll get a nice animation back to the fully open state.
-        this.open();
-      }
-    }
-  }, {
-    key: 'prepareForTouchEnd_',
-    value: function prepareForTouchEnd_() {
-      cancelAnimationFrame(this.updateRaf_);
-      this.adapter_.setTranslateX(null);
-    }
-  }, {
-    key: 'updateDrawer_',
-    value: function updateDrawer_() {
-      this.updateRaf_ = requestAnimationFrame(this.updateDrawer_.bind(this));
-      this.adapter_.setTranslateX(this.newPosition_);
-    }
-  }, {
-    key: 'isRootTransitioningEventTarget_',
-    value: function isRootTransitioningEventTarget_() {
-      // Classes extending MDCSlidableDrawerFoundation should implement this method to return true or false
-      // if the event target is the root event target currently transitioning.
-      return false;
-    }
-  }, {
-    key: 'handleTransitionEnd_',
-    value: function handleTransitionEnd_(evt) {
-      if (this.isRootTransitioningEventTarget_(evt.target)) {
-        this.adapter_.removeClass(this.animatingCssClass_);
-        this.adapter_.deregisterTransitionEndHandler(this.transitionEndHandler_);
-      }
-    }
-  }, {
-    key: 'newPosition_',
-    get: function get() {
-      var newPos = null;
-
-      if (this.direction_ === 1) {
-        newPos = Math.min(0, this.currentX_ - this.startX_);
-      } else {
-        newPos = Math.max(0, this.currentX_ - this.startX_);
-      }
-
-      return newPos;
-    }
-  }]);
-
-  return MDCSlidableDrawerFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
-
-/***/ }),
-
-/***/ 49:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(12);
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-var cssClasses = {
-  ROOT: 'mdc-temporary-drawer',
-  OPEN: 'mdc-temporary-drawer--open',
-  ANIMATING: 'mdc-temporary-drawer--animating',
-  SCROLL_LOCK: 'mdc-drawer-scroll-lock'
-};
-
-var strings = {
-  DRAWER_SELECTOR: '.mdc-temporary-drawer__drawer',
-  OPACITY_VAR_NAME: '--mdc-temporary-drawer-opacity',
-  FOCUSABLE_ELEMENTS: __WEBPACK_IMPORTED_MODULE_0__slidable__["b" /* FOCUSABLE_ELEMENTS */],
-  OPEN_EVENT: 'MDCTemporaryDrawer:open',
-  CLOSE_EVENT: 'MDCTemporaryDrawer:close'
-};
-
-/***/ }),
-
-/***/ 50:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__slidable__ = __webpack_require__(12);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(49);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-var MDCTemporaryDrawerFoundation = function (_MDCSlidableDrawerFou) {
-  _inherits(MDCTemporaryDrawerFoundation, _MDCSlidableDrawerFou);
-
-  _createClass(MDCTemporaryDrawerFoundation, null, [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return _extends(__WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* MDCSlidableDrawerFoundation */].defaultAdapter, {
-        addBodyClass: function addBodyClass() /* className: string */{},
-        removeBodyClass: function removeBodyClass() /* className: string */{},
-        isDrawer: function isDrawer() {
-          return false;
-        },
-        updateCssVariable: function updateCssVariable() /* value: string */{}
-      });
-    }
-  }]);
-
-  function MDCTemporaryDrawerFoundation(adapter) {
-    _classCallCheck(this, MDCTemporaryDrawerFoundation);
-
-    var _this = _possibleConstructorReturn(this, (MDCTemporaryDrawerFoundation.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation)).call(this, _extends(MDCTemporaryDrawerFoundation.defaultAdapter, adapter), MDCTemporaryDrawerFoundation.cssClasses.ROOT, MDCTemporaryDrawerFoundation.cssClasses.ANIMATING, MDCTemporaryDrawerFoundation.cssClasses.OPEN));
-
-    _this.componentClickHandler_ = function () {
-      return _this.close();
-    };
-    return _this;
-  }
-
-  _createClass(MDCTemporaryDrawerFoundation, [{
-    key: 'init',
-    value: function init() {
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'init', this).call(this);
-
-      // Make browser aware of custom property being used in this element.
-      // Workaround for certain types of hard-to-reproduce heisenbugs.
-      this.adapter_.updateCssVariable(0);
-      this.adapter_.registerInteractionHandler('click', this.componentClickHandler_);
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'destroy', this).call(this);
-
-      this.adapter_.deregisterInteractionHandler('click', this.componentClickHandler_);
-      this.enableScroll_();
-    }
-  }, {
-    key: 'open',
-    value: function open() {
-      this.disableScroll_();
-      // Make sure custom property values are cleared before starting.
-      this.adapter_.updateCssVariable('');
-
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'open', this).call(this);
-    }
-  }, {
-    key: 'close',
-    value: function close() {
-      // Make sure custom property values are cleared before making any changes.
-      this.adapter_.updateCssVariable('');
-
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'close', this).call(this);
-    }
-  }, {
-    key: 'prepareForTouchEnd_',
-    value: function prepareForTouchEnd_() {
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'prepareForTouchEnd_', this).call(this);
-
-      this.adapter_.updateCssVariable('');
-    }
-  }, {
-    key: 'updateDrawer_',
-    value: function updateDrawer_() {
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'updateDrawer_', this).call(this);
-
-      var newOpacity = Math.max(0, 1 + this.direction_ * (this.newPosition_ / this.drawerWidth_));
-      this.adapter_.updateCssVariable(newOpacity);
-    }
-  }, {
-    key: 'isRootTransitioningEventTarget_',
-    value: function isRootTransitioningEventTarget_(el) {
-      return this.adapter_.isDrawer(el);
-    }
-  }, {
-    key: 'handleTransitionEnd_',
-    value: function handleTransitionEnd_(evt) {
-      _get(MDCTemporaryDrawerFoundation.prototype.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawerFoundation.prototype), 'handleTransitionEnd_', this).call(this, evt);
-      if (!this.isOpen_) {
-        this.enableScroll_();
-      }
-    }
-  }, {
-    key: 'disableScroll_',
-    value: function disableScroll_() {
-      this.adapter_.addBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
-    }
-  }, {
-    key: 'enableScroll_',
-    value: function enableScroll_() {
-      this.adapter_.removeBodyClass(__WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */].SCROLL_LOCK);
-    }
-  }]);
-
-  return MDCTemporaryDrawerFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__slidable__["a" /* MDCSlidableDrawerFoundation */]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCTemporaryDrawerFoundation);
-
-/***/ }),
-
-/***/ 51:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MDCTemporaryDrawer; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(50);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util__ = __webpack_require__(13);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
-/* unused harmony reexport util */
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-
-var MDCTemporaryDrawer = function (_MDCComponent) {
-  _inherits(MDCTemporaryDrawer, _MDCComponent);
-
-  function MDCTemporaryDrawer() {
-    _classCallCheck(this, MDCTemporaryDrawer);
-
-    return _possibleConstructorReturn(this, (MDCTemporaryDrawer.__proto__ || Object.getPrototypeOf(MDCTemporaryDrawer)).apply(this, arguments));
-  }
-
-  _createClass(MDCTemporaryDrawer, [{
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      var _this2 = this;
-
-      var _MDCTemporaryDrawerFo = __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings,
-          FOCUSABLE_ELEMENTS = _MDCTemporaryDrawerFo.FOCUSABLE_ELEMENTS,
-          OPACITY_VAR_NAME = _MDCTemporaryDrawerFo.OPACITY_VAR_NAME;
-
-
-      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
-        addClass: function addClass(className) {
-          return _this2.root_.classList.add(className);
-        },
-        removeClass: function removeClass(className) {
-          return _this2.root_.classList.remove(className);
-        },
-        hasClass: function hasClass(className) {
-          return _this2.root_.classList.contains(className);
-        },
-        addBodyClass: function addBodyClass(className) {
-          return document.body.classList.add(className);
-        },
-        removeBodyClass: function removeBodyClass(className) {
-          return document.body.classList.remove(className);
-        },
-        hasNecessaryDom: function hasNecessaryDom() {
-          return Boolean(_this2.drawer);
-        },
-        registerInteractionHandler: function registerInteractionHandler(evt, handler) {
-          return _this2.root_.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(evt, handler) {
-          return _this2.root_.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler, __WEBPACK_IMPORTED_MODULE_2__util__["applyPassive"]());
-        },
-        registerDrawerInteractionHandler: function registerDrawerInteractionHandler(evt, handler) {
-          return _this2.drawer.addEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
-        },
-        deregisterDrawerInteractionHandler: function deregisterDrawerInteractionHandler(evt, handler) {
-          return _this2.drawer.removeEventListener(__WEBPACK_IMPORTED_MODULE_2__util__["remapEvent"](evt), handler);
-        },
-        registerTransitionEndHandler: function registerTransitionEndHandler(handler) {
-          return _this2.drawer.addEventListener('transitionend', handler);
-        },
-        deregisterTransitionEndHandler: function deregisterTransitionEndHandler(handler) {
-          return _this2.drawer.removeEventListener('transitionend', handler);
-        },
-        registerDocumentKeydownHandler: function registerDocumentKeydownHandler(handler) {
-          return document.addEventListener('keydown', handler);
-        },
-        deregisterDocumentKeydownHandler: function deregisterDocumentKeydownHandler(handler) {
-          return document.removeEventListener('keydown', handler);
-        },
-        getDrawerWidth: function getDrawerWidth() {
-          return _this2.drawer.offsetWidth;
-        },
-        setTranslateX: function setTranslateX(value) {
-          return _this2.drawer.style.setProperty(__WEBPACK_IMPORTED_MODULE_2__util__["getTransformPropertyName"](), value === null ? null : 'translateX(' + value + 'px)');
-        },
-        updateCssVariable: function updateCssVariable(value) {
-          if (__WEBPACK_IMPORTED_MODULE_2__util__["supportsCssCustomProperties"]()) {
-            _this2.root_.style.setProperty(OPACITY_VAR_NAME, value);
-          }
-        },
-        getFocusableElements: function getFocusableElements() {
-          return _this2.drawer.querySelectorAll(FOCUSABLE_ELEMENTS);
-        },
-        saveElementTabState: function saveElementTabState(el) {
-          return __WEBPACK_IMPORTED_MODULE_2__util__["saveElementTabState"](el);
-        },
-        restoreElementTabState: function restoreElementTabState(el) {
-          return __WEBPACK_IMPORTED_MODULE_2__util__["restoreElementTabState"](el);
-        },
-        makeElementUntabbable: function makeElementUntabbable(el) {
-          return el.setAttribute('tabindex', -1);
-        },
-        notifyOpen: function notifyOpen() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.OPEN_EVENT);
-        },
-        notifyClose: function notifyClose() {
-          return _this2.emit(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.CLOSE_EVENT);
-        },
-        isRtl: function isRtl() {
-          return getComputedStyle(_this2.root_).getPropertyValue('direction') === 'rtl';
-        },
-        isDrawer: function isDrawer(el) {
-          return el === _this2.drawer;
-        }
-      });
-    }
-  }, {
-    key: 'open',
-    get: function get() {
-      return this.foundation_.isOpen();
-    },
-    set: function set(value) {
-      if (value) {
-        this.foundation_.open();
-      } else {
-        this.foundation_.close();
-      }
-    }
-
-    /* Return the drawer element inside the component. */
-
-  }, {
-    key: 'drawer',
-    get: function get() {
-      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.DRAWER_SELECTOR);
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      return new MDCTemporaryDrawer(root);
-    }
-  }]);
-
-  return MDCTemporaryDrawer;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
-
-/***/ }),
-
-/***/ 86:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(26);
-
-
-/***/ })
-
-/******/ });
-});

+ 0 - 143
support/client/lib/vwf/view/lib/mdc/dist/mdc.elevation.css

@@ -1,143 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-.mdc-elevation--z0 {
-  -webkit-box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z1 {
-  -webkit-box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z2 {
-  -webkit-box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z3 {
-  -webkit-box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 3px -2px rgba(0, 0, 0, 0.2), 0px 3px 4px 0px rgba(0, 0, 0, 0.14), 0px 1px 8px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z4 {
-  -webkit-box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 2px 4px -1px rgba(0, 0, 0, 0.2), 0px 4px 5px 0px rgba(0, 0, 0, 0.14), 0px 1px 10px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z5 {
-  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 5px 8px 0px rgba(0, 0, 0, 0.14), 0px 1px 14px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z6 {
-  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z7 {
-  -webkit-box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 4px 5px -2px rgba(0, 0, 0, 0.2), 0px 7px 10px 1px rgba(0, 0, 0, 0.14), 0px 2px 16px 1px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z8 {
-  -webkit-box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z9 {
-  -webkit-box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 5px 6px -3px rgba(0, 0, 0, 0.2), 0px 9px 12px 1px rgba(0, 0, 0, 0.14), 0px 3px 16px 2px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z10 {
-  -webkit-box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 6px 6px -3px rgba(0, 0, 0, 0.2), 0px 10px 14px 1px rgba(0, 0, 0, 0.14), 0px 4px 18px 3px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z11 {
-  -webkit-box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 6px 7px -4px rgba(0, 0, 0, 0.2), 0px 11px 15px 1px rgba(0, 0, 0, 0.14), 0px 4px 20px 3px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z12 {
-  -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z13 {
-  -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 13px 19px 2px rgba(0, 0, 0, 0.14), 0px 5px 24px 4px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z14 {
-  -webkit-box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 7px 9px -4px rgba(0, 0, 0, 0.2), 0px 14px 21px 2px rgba(0, 0, 0, 0.14), 0px 5px 26px 4px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z15 {
-  -webkit-box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 8px 9px -5px rgba(0, 0, 0, 0.2), 0px 15px 22px 2px rgba(0, 0, 0, 0.14), 0px 6px 28px 5px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z16 {
-  -webkit-box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 8px 10px -5px rgba(0, 0, 0, 0.2), 0px 16px 24px 2px rgba(0, 0, 0, 0.14), 0px 6px 30px 5px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z17 {
-  -webkit-box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 8px 11px -5px rgba(0, 0, 0, 0.2), 0px 17px 26px 2px rgba(0, 0, 0, 0.14), 0px 6px 32px 5px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z18 {
-  -webkit-box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 9px 11px -5px rgba(0, 0, 0, 0.2), 0px 18px 28px 2px rgba(0, 0, 0, 0.14), 0px 7px 34px 6px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z19 {
-  -webkit-box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 9px 12px -6px rgba(0, 0, 0, 0.2), 0px 19px 29px 2px rgba(0, 0, 0, 0.14), 0px 7px 36px 6px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z20 {
-  -webkit-box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 20px 31px 3px rgba(0, 0, 0, 0.14), 0px 8px 38px 7px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z21 {
-  -webkit-box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 10px 13px -6px rgba(0, 0, 0, 0.2), 0px 21px 33px 3px rgba(0, 0, 0, 0.14), 0px 8px 40px 7px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z22 {
-  -webkit-box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 10px 14px -6px rgba(0, 0, 0, 0.2), 0px 22px 35px 3px rgba(0, 0, 0, 0.14), 0px 8px 42px 7px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z23 {
-  -webkit-box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 11px 14px -7px rgba(0, 0, 0, 0.2), 0px 23px 36px 3px rgba(0, 0, 0, 0.14), 0px 9px 44px 8px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation--z24 {
-  -webkit-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2), 0px 24px 38px 3px rgba(0, 0, 0, 0.14), 0px 9px 46px 8px rgba(0, 0, 0, 0.12); }
-
-.mdc-elevation-transition {
-  -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  will-change: box-shadow; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.elevation.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 7);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 7:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 489
support/client/lib/vwf/view/lib/mdc/dist/mdc.fab.css

@@ -1,489 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * The css property used for elevation. In most cases this should not be changed. It is exposed
- * as a variable for abstraction / easy use when needing to reference the property directly, for
- * example in a `will-change` rule.
- */
-/**
- * The default duration value for elevation transitions.
- */
-/**
- * The default easing value for elevation transitions.
- */
-/**
- * Applies the correct css rules to an element to give it the elevation specified by $z-value.
- * The $z-value must be between 0 and 24.
- */
-/**
- * Returns a string that can be used as the value for a `transition` property for elevation.
- * Calling this function directly is useful in situations where a component needs to transition
- * more than one property.
- *
- * ```scss
- * .foo {
- *   transition: mdc-elevation-transition-rule(), opacity 100ms ease;
- *   will-change: $mdc-elevation-property, opacity;
- * }
- * ```
- */
-/**
- * Applies the correct css rules needed to have an element transition between elevations.
- * This mixin should be applied to elements whose elevation values will change depending on their
- * context (e.g. when active or disabled).
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/** MDC Ripple keyframes are split into their own file so that _mixins.scss can rely on them. */
-@-webkit-keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-@keyframes mdc-ripple-fg-radius-in {
-  from {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-            transform: translate(var(--mdc-ripple-fg-translate-start, 0)) scale(1);
-    -webkit-animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
-            animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); }
-  to {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1)); } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@keyframes mdc-ripple-fg-opacity-in {
-  from {
-    opacity: 0;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 1; } }
-
-@-webkit-keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-@keyframes mdc-ripple-fg-opacity-out {
-  from {
-    opacity: 1;
-    -webkit-animation-timing-function: linear;
-            animation-timing-function: linear; }
-  to {
-    opacity: 0; } }
-
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-.mdc-fab {
-  --mdc-ripple-surface-width: 0;
-  --mdc-ripple-surface-height: 0;
-  --mdc-ripple-fg-size: 0;
-  --mdc-ripple-left: 0;
-  --mdc-ripple-top: 0;
-  --mdc-ripple-fg-scale: 1;
-  --mdc-ripple-fg-translate-end: 0;
-  --mdc-ripple-fg-translate-start: 0;
-  will-change: transform, opacity;
-  -webkit-tap-highlight-color: transparent;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  position: relative;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  width: 56px;
-  height: 56px;
-  padding: 0;
-  -webkit-transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  transition: box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-box-shadow 280ms cubic-bezier(0.4, 0, 0.2, 1);
-  border: none;
-  border-radius: 50%;
-  cursor: pointer;
-  -webkit-user-select: none;
-     -moz-user-select: none;
-      -ms-user-select: none;
-          user-select: none;
-  -webkit-box-sizing: border-box;
-          box-sizing: border-box;
-  fill: currentColor;
-  -moz-appearance: none;
-  -webkit-appearance: none;
-  overflow: hidden;
-  /* @alternate */
-  background-color: #ff4081;
-  background-color: var(--mdc-theme-accent, #ff4081);
-  /* @alternate */
-  color: white;
-  color: var(--mdc-theme-text-primary-on-accent, white);
-  -webkit-box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12);
-          box-shadow: 0px 3px 5px -1px rgba(0, 0, 0, 0.2), 0px 6px 10px 0px rgba(0, 0, 0, 0.14), 0px 1px 18px 0px rgba(0, 0, 0, 0.12); }
-  .mdc-fab:not(.mdc-ripple-upgraded):hover::before, .mdc-fab:not(.mdc-ripple-upgraded):focus::before, .mdc-fab:not(.mdc-ripple-upgraded):active::after {
-    -webkit-transition-duration: 85ms;
-            transition-duration: 85ms;
-    opacity: .6; }
-  .mdc-fab::before {
-    background-color: rgba(255, 255, 255, 0.16);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-  .mdc-fab.mdc-ripple-upgraded::before {
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-fab.mdc-ripple-upgraded--background-focused::before {
-    opacity: .99999; }
-  .mdc-fab.mdc-ripple-upgraded--background-active-fill::before {
-    -webkit-transition-duration: 120ms;
-            transition-duration: 120ms;
-    opacity: 1; }
-  .mdc-fab.mdc-ripple-upgraded--unbounded::before {
-    /* @alternate */
-    top: calc(50% - 50%);
-    top: var(--mdc-ripple-top, calc(50% - 50%));
-    /* @alternate */
-    left: calc(50% - 50%);
-    left: var(--mdc-ripple-left, calc(50% - 50%));
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-            transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-  .mdc-fab::after {
-    background-color: rgba(255, 255, 255, 0.16);
-    position: absolute;
-    top: calc(50% - 100%);
-    left: calc(50% - 100%);
-    width: 200%;
-    height: 200%;
-    -webkit-transition: opacity 250ms linear;
-    transition: opacity 250ms linear;
-    border-radius: 50%;
-    opacity: 0;
-    pointer-events: none;
-    content: ""; }
-  .mdc-fab.mdc-ripple-upgraded::after {
-    top: 0;
-    left: 0;
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center;
-    opacity: 0; }
-  .mdc-fab:not(.mdc-ripple-upgraded--unbounded)::after {
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-fab.mdc-ripple-upgraded--unbounded::after {
-    /* @alternate */
-    top: 0;
-    top: var(--mdc-ripple-top, 0);
-    /* @alternate */
-    left: 0;
-    left: var(--mdc-ripple-left, 0);
-    /* @alternate */
-    width: 100%;
-    width: var(--mdc-ripple-fg-size, 100%);
-    /* @alternate */
-    height: 100%;
-    height: var(--mdc-ripple-fg-size, 100%);
-    -webkit-transform: scale(0);
-            transform: scale(0);
-    -webkit-transform-origin: center center;
-            transform-origin: center center; }
-  .mdc-fab.mdc-ripple-upgraded--foreground-activation::after {
-    -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-            animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-  .mdc-fab.mdc-ripple-upgraded--foreground-deactivation::after {
-    -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-            transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-    -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-            animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-fab:not(.mdc-ripple-upgraded) {
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0.18); }
-  .mdc-fab--mini {
-    width: 40px;
-    height: 40px; }
-  .mdc-fab--plain {
-    background-color: white;
-    /* @alternate */
-    color: rgba(0, 0, 0, 0.87);
-    color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87)); }
-    .mdc-fab--plain::before {
-      background-color: rgba(0, 0, 0, 0.06);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-    .mdc-fab--plain.mdc-ripple-upgraded::before {
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-fab--plain.mdc-ripple-upgraded--background-focused::before {
-      opacity: .99999; }
-    .mdc-fab--plain.mdc-ripple-upgraded--background-active-fill::before {
-      -webkit-transition-duration: 120ms;
-              transition-duration: 120ms;
-      opacity: 1; }
-    .mdc-fab--plain.mdc-ripple-upgraded--unbounded::before {
-      /* @alternate */
-      top: calc(50% - 50%);
-      top: var(--mdc-ripple-top, calc(50% - 50%));
-      /* @alternate */
-      left: calc(50% - 50%);
-      left: var(--mdc-ripple-left, calc(50% - 50%));
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform: scale(var(--mdc-ripple-fg-scale, 0));
-              transform: scale(var(--mdc-ripple-fg-scale, 0)); }
-    .mdc-fab--plain::after {
-      background-color: rgba(0, 0, 0, 0.06);
-      position: absolute;
-      top: calc(50% - 100%);
-      left: calc(50% - 100%);
-      width: 200%;
-      height: 200%;
-      -webkit-transition: opacity 250ms linear;
-      transition: opacity 250ms linear;
-      border-radius: 50%;
-      opacity: 0;
-      pointer-events: none;
-      content: ""; }
-    .mdc-fab--plain.mdc-ripple-upgraded::after {
-      top: 0;
-      left: 0;
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center;
-      opacity: 0; }
-    .mdc-fab--plain:not(.mdc-ripple-upgraded--unbounded)::after {
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-fab--plain.mdc-ripple-upgraded--unbounded::after {
-      /* @alternate */
-      top: 0;
-      top: var(--mdc-ripple-top, 0);
-      /* @alternate */
-      left: 0;
-      left: var(--mdc-ripple-left, 0);
-      /* @alternate */
-      width: 100%;
-      width: var(--mdc-ripple-fg-size, 100%);
-      /* @alternate */
-      height: 100%;
-      height: var(--mdc-ripple-fg-size, 100%);
-      -webkit-transform: scale(0);
-              transform: scale(0);
-      -webkit-transform-origin: center center;
-              transform-origin: center center; }
-    .mdc-fab--plain.mdc-ripple-upgraded--foreground-activation::after {
-      -webkit-animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards;
-              animation: 300ms mdc-ripple-fg-radius-in forwards, 83ms mdc-ripple-fg-opacity-in forwards; }
-    .mdc-fab--plain.mdc-ripple-upgraded--foreground-deactivation::after {
-      -webkit-transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-              transform: translate(var(--mdc-ripple-fg-translate-end, 0)) scale(var(--mdc-ripple-fg-scale, 1));
-      -webkit-animation: 83ms mdc-ripple-fg-opacity-out;
-              animation: 83ms mdc-ripple-fg-opacity-out; }
-  .mdc-fab:active, .mdc-fab:focus {
-    outline: none; }
-  .mdc-fab:active {
-    -webkit-box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12);
-            box-shadow: 0px 7px 8px -4px rgba(0, 0, 0, 0.2), 0px 12px 17px 2px rgba(0, 0, 0, 0.14), 0px 5px 22px 4px rgba(0, 0, 0, 0.12); }
-  .mdc-fab:hover {
-    cursor: pointer; }
-  .mdc-fab::-moz-focus-inner {
-    padding: 0;
-    border: 0; }
-  .mdc-fab > svg {
-    width: 100%; }
-  fieldset:disabled .mdc-fab, .mdc-fab:disabled {
-    background-color: rgba(0, 0, 0, 0.12);
-    color: rgba(0, 0, 0, 0.26);
-    cursor: default;
-    pointer-events: none; }
-
-.mdc-fab__icon {
-  display: -webkit-box;
-  display: -ms-flexbox;
-  display: flex;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  -webkit-box-pack: center;
-      -ms-flex-pack: center;
-          justify-content: center;
-  width: 100%; }

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.fab.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 8);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 8:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 279
support/client/lib/vwf/view/lib/mdc/dist/mdc.form-field.css

@@ -1,279 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/**
- * Creates a rule that will be applied when an MDC-Web component is within the context of an RTL layout.
- *
- * Usage Example:
- * ```scss
- * .mdc-foo {
- *   position: absolute;
- *   left: 0;
- *
- *   @include mdc-rtl {
- *     left: auto;
- *     right: 0;
- *   }
- *
- *   &__bar {
- *     margin-left: 4px;
- *     @include mdc-rtl(".mdc-foo") {
- *       margin-left: auto;
- *       margin-right: 4px;
- *     }
- *   }
- * }
- *
- * .mdc-foo--mod {
- *   padding-left: 4px;
- *
- *   @include mdc-rtl {
- *     padding-left: auto;
- *     padding-right: 4px;
- *   }
- * }
- * ```
- *
- * Note that this works by checking for [dir="rtl"] on an ancestor element. While this will work
- * in most cases, it will in some cases lead to false negatives, e.g.
- *
- * ```html
- * <html dir="rtl">
- *   <!-- ... -->
- *   <div dir="ltr">
- *     <div class="mdc-foo">Styled incorrectly as RTL!</div>
- *   </div>
- * </html>
- * ```
- *
- * In the future, selectors such as :dir (http://mdn.io/:dir) will help us mitigate this.
- */
-/**
- * Takes a base box-model property - e.g. margin / border / padding - along with a default
- * direction and value, and emits rules which apply the value to the
- * "<base-property>-<default-direction>" property by default, but flips the direction
- * when within an RTL context.
- *
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, left, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 8px;
- *     margin-left: 0;
- *   }
- * }
- * ```
- * whereas:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-box(margin, right, 8px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-right: 8px;
- *
- *   @include mdc-rtl {
- *     margin-right: 0;
- *     margin-left: 8px;
- *   }
- * }
- * ```
- *
- * You can also pass a 4th optional $root-selector argument which will be forwarded to `mdc-rtl`,
- * e.g. `@include mdc-rtl-reflexive-box(margin, left, 8px, ".mdc-component")`.
- *
- * Note that this function will always zero out the original value in an RTL context. If you're
- * trying to flip the values, use mdc-rtl-reflexive-property().
- */
-/**
- * Takes a base property and emits rules that assign <base-property>-left to <left-value> and
- * <base-property>-right to <right-value> in a LTR context, and vice versa in a RTL context.
- * For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-property(margin, auto, 12px);
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- * .mdc-foo {
- *   margin-left: auto;
- *   margin-right: 12px;
- *
- *   @include mdc-rtl {
- *     margin-left: 12px;
- *     margin-right: auto;
- *   }
- * }
- * ```
- *
- * A 4th optional $root-selector argument can be given, which will be passed to `mdc-rtl`.
- */
-/**
- * Takes an argument specifying a horizontal position property (either "left" or "right") as well
- * as a value, and applies that value to the specified position in a LTR context, and flips it in a
- * RTL context. For example:
- *
- * ```scss
- * .mdc-foo {
- *   @include mdc-rtl-reflexive-position(left, 0);
- *   position: absolute;
- * }
- * ```
- * is equivalent to:
- *
- * ```scss
- *  .mdc-foo {
- *    position: absolute;
- *    left: 0;
- *    right: initial;
- *
- *    @include mdc-rtl {
- *      right: 0;
- *      left: initial;
- *    }
- *  }
- * ```
- * An optional third $root-selector argument may also be given, which is passed to `mdc-rtl`.
- */
-/*
-  Precomputed linear color channel values, for use in contrast calculations.
-  See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
-
-  Algorithm, for c in 0 to 255:
-  f(c) {
-    c = c / 255;
-    return c < 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);
-  }
-
-  This lookup table is needed since there is no `pow` in SASS.
-*/
-/**
- * Calculate the luminance for a color.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Calculate the contrast ratio between two colors.
- * See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
- */
-/**
- * Determine whether to use dark or light text on top of given color.
- * Returns "dark" for dark text and "light" for light text.
- */
-/*
-  Main theme colors.
-  If you're a user customizing your color scheme in SASS, these are probably the only variables you need to change.
-*/
-/* Indigo 500 */
-/* Pink A200 */
-/* White */
-/* Which set of text colors to use for each main theme color (light or dark) */
-/* Text colors according to light vs dark and text type */
-/* Primary text colors for each of the theme colors */
-/**
- * Applies the correct theme color style to the specified property.
- * $property is typically color or background-color, but can be any CSS property that accepts color values.
- * $style should be one of the map keys in $mdc-theme-property-values (_variables.scss).
- */
-/**
- * Creates a rule to be used in MDC-Web components for dark theming, and applies the provided contents.
- * Should provide the $root-selector option if applied to anything other than the root selector.
- * When used with a modifier class, provide a second argument of `true` for the $compound parameter
- * to specify that this should be attached as a compound class.
- *
- * Usage example:
- *
- * ```scss
- * .mdc-foo {
- *   color: black;
- *
- *   @include mdc-theme-dark {
- *     color: white;
- *   }
- *
- *   &__bar {
- *     background: black;
- *
- *     @include mdc-theme-dark(".mdc-foo") {
- *       background: white;
- *     }
- *   }
- * }
- *
- * .mdc-foo--disabled {
- *   opacity: .38;
- *
- *   @include mdc-theme-dark(".mdc-foo", true) {
- *     opacity: .5;
- *   }
- * }
- * ```
- */
-/* TODO(sgomes): Figure out what to do about desktop font sizes. */
-/* TODO(sgomes): Figure out what to do about i18n and i18n font sizes. */
-/* stylelint-disable selector-max-type */
-.mdc-form-field {
-  font-family: Roboto, sans-serif;
-  -moz-osx-font-smoothing: grayscale;
-  -webkit-font-smoothing: antialiased;
-  font-size: 0.875rem;
-  font-weight: 400;
-  letter-spacing: 0.04em;
-  line-height: 1.25rem;
-  text-decoration: inherit;
-  text-transform: inherit;
-  /* @alternate */
-  color: rgba(0, 0, 0, 0.87);
-  color: var(--mdc-theme-text-primary-on-light, rgba(0, 0, 0, 0.87));
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  -webkit-box-align: center;
-      -ms-flex-align: center;
-          align-items: center;
-  vertical-align: middle; }
-  .mdc-form-field--theme-dark,
-  .mdc-theme--dark .mdc-form-field {
-    /* @alternate */
-    color: white;
-    color: var(--mdc-theme-text-primary-on-dark, white); }
-  .mdc-form-field > label {
-    -webkit-box-ordinal-group: 1;
-        -ms-flex-order: 0;
-            order: 0;
-    margin-right: auto;
-    padding-left: 4px; }
-  [dir="rtl"] .mdc-form-field > label, .mdc-form-field[dir="rtl"] > label {
-    margin-left: auto;
-    padding-right: 4px; }
-
-.mdc-form-field--align-end > label {
-  -webkit-box-ordinal-group: 0;
-      -ms-flex-order: -1;
-          order: -1;
-  margin-left: auto;
-  padding-right: 4px; }
-
-[dir="rtl"] .mdc-form-field--align-end > label, .mdc-form-field--align-end[dir="rtl"] > label {
-  margin-right: auto;
-  padding-left: 4px; }
-
-/* stylelint-enable selector-max-type */

+ 0 - 83
support/client/lib/vwf/view/lib/mdc/dist/mdc.form-field.css-entry

@@ -1,83 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-/******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 9);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 9:
-/***/ (function(module, exports) {
-
-// removed by extract-text-webpack-plugin
-
-/***/ })
-
-/******/ });

+ 0 - 666
support/client/lib/vwf/view/lib/mdc/dist/mdc.formField.js

@@ -1,666 +0,0 @@
-/*!
- Material Components for the web
- Copyright (c) 2017 Google Inc.
- License: Apache-2.0
-*/
-(function webpackUniversalModuleDefinition(root, factory) {
-	if(typeof exports === 'object' && typeof module === 'object')
-		module.exports = factory();
-	else if(typeof define === 'function' && define.amd)
-		define([], factory);
-	else if(typeof exports === 'object')
-		exports["formField"] = factory();
-	else
-		root["mdc"] = root["mdc"] || {}, root["mdc"]["formField"] = factory();
-})(this, function() {
-return /******/ (function(modules) { // webpackBootstrap
-/******/ 	// The module cache
-/******/ 	var installedModules = {};
-/******/
-/******/ 	// The require function
-/******/ 	function __webpack_require__(moduleId) {
-/******/
-/******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
-/******/ 			return installedModules[moduleId].exports;
-/******/ 		}
-/******/ 		// Create a new module (and put it into the cache)
-/******/ 		var module = installedModules[moduleId] = {
-/******/ 			i: moduleId,
-/******/ 			l: false,
-/******/ 			exports: {}
-/******/ 		};
-/******/
-/******/ 		// Execute the module function
-/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/ 		// Flag the module as loaded
-/******/ 		module.l = true;
-/******/
-/******/ 		// Return the exports of the module
-/******/ 		return module.exports;
-/******/ 	}
-/******/
-/******/
-/******/ 	// expose the modules object (__webpack_modules__)
-/******/ 	__webpack_require__.m = modules;
-/******/
-/******/ 	// expose the module cache
-/******/ 	__webpack_require__.c = installedModules;
-/******/
-/******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
-/******/
-/******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
-/******/ 			Object.defineProperty(exports, name, {
-/******/ 				configurable: false,
-/******/ 				enumerable: true,
-/******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
-/******/
-/******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
-/******/ 		var getter = module && module.__esModule ?
-/******/ 			function getDefault() { return module['default']; } :
-/******/ 			function getModuleExports() { return module; };
-/******/ 		__webpack_require__.d(getter, 'a', getter);
-/******/ 		return getter;
-/******/ 	};
-/******/
-/******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/ 	// __webpack_public_path__
-/******/ 	__webpack_require__.p = "/assets/";
-/******/
-/******/ 	// Load entry module and return exports
-/******/ 	return __webpack_require__(__webpack_require__.s = 87);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 0:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @template A
- */
-var MDCFoundation = function () {
-  _createClass(MDCFoundation, null, [{
-    key: "cssClasses",
-
-    /** @return enum{cssClasses} */
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports every
-      // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'}
-      return {};
-    }
-
-    /** @return enum{strings} */
-
-  }, {
-    key: "strings",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'}
-      return {};
-    }
-
-    /** @return enum{numbers} */
-
-  }, {
-    key: "numbers",
-    get: function get() {
-      // Classes extending MDCFoundation should implement this method to return an object which exports all
-      // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350}
-      return {};
-    }
-
-    /** @return {!Object} */
-
-  }, {
-    key: "defaultAdapter",
-    get: function get() {
-      // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient
-      // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter
-      // validation.
-      return {};
-    }
-
-    /**
-     * @param {A=} adapter
-     */
-
-  }]);
-
-  function MDCFoundation() {
-    var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
-
-    _classCallCheck(this, MDCFoundation);
-
-    /** @protected {!A} */
-    this.adapter_ = adapter;
-  }
-
-  _createClass(MDCFoundation, [{
-    key: "init",
-    value: function init() {
-      // Subclasses should override this method to perform initialization routines (registering events, etc.)
-    }
-  }, {
-    key: "destroy",
-    value: function destroy() {
-      // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.)
-    }
-  }]);
-
-  return MDCFoundation;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFoundation);
-
-/***/ }),
-
-/***/ 1:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-/**
- * @template F
- */
-
-var MDCComponent = function () {
-  _createClass(MDCComponent, null, [{
-    key: 'attachTo',
-
-    /**
-     * @param {!Element} root
-     * @return {!MDCComponent}
-     */
-    value: function attachTo(root) {
-      // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and
-      // returns an instantiated component with its root set to that element. Also note that in the cases of
-      // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized
-      // from getDefaultFoundation().
-      return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]());
-    }
-
-    /**
-     * @param {!Element} root
-     * @param {F=} foundation
-     * @param {...?} args
-     */
-
-  }]);
-
-  function MDCComponent(root) {
-    var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-
-    _classCallCheck(this, MDCComponent);
-
-    /** @protected {!Element} */
-    this.root_ = root;
-
-    for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
-      args[_key - 2] = arguments[_key];
-    }
-
-    this.initialize.apply(this, args);
-    // Note that we initialize foundation here and not within the constructor's default param so that
-    // this.root_ is defined and can be used within the foundation class.
-    /** @protected {!F} */
-    this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation;
-    this.foundation_.init();
-    this.initialSyncWithDOM();
-  }
-
-  _createClass(MDCComponent, [{
-    key: 'initialize',
-    value: function initialize() /* ...args */{}
-    // Subclasses can override this to do any additional setup work that would be considered part of a
-    // "constructor". Essentially, it is a hook into the parent constructor before the foundation is
-    // initialized. Any additional arguments besides root and foundation will be passed in here.
-
-
-    /**
-     * @return {!F} foundation
-     */
-
-  }, {
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      // Subclasses must override this method to return a properly configured foundation class for the
-      // component.
-      throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class');
-    }
-  }, {
-    key: 'initialSyncWithDOM',
-    value: function initialSyncWithDOM() {
-      // Subclasses should override this method if they need to perform work to synchronize with a host DOM
-      // object. An example of this would be a form control wrapper that needs to synchronize its internal state
-      // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM
-      // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor.
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      // Subclasses may implement this method to release any resources / deregister any listeners they have
-      // attached. An example of this might be deregistering a resize event from the window object.
-      this.foundation_.destroy();
-    }
-
-    /**
-     * Wrapper method to add an event listener to the component's root element. This is most useful when
-     * listening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'listen',
-    value: function listen(evtType, handler) {
-      this.root_.addEventListener(evtType, handler);
-    }
-
-    /**
-     * Wrapper method to remove an event listener to the component's root element. This is most useful when
-     * unlistening for custom events.
-     * @param {string} evtType
-     * @param {!Function} handler
-     */
-
-  }, {
-    key: 'unlisten',
-    value: function unlisten(evtType, handler) {
-      this.root_.removeEventListener(evtType, handler);
-    }
-
-    /**
-     * Fires a cross-browser-compatible custom event from the component root of the given type,
-     * with the given data.
-     * @param {string} evtType
-     * @param {!Object} evtData
-     * @param {boolean=} shouldBubble
-     */
-
-  }, {
-    key: 'emit',
-    value: function emit(evtType, evtData) {
-      var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-      var evt = void 0;
-      if (typeof CustomEvent === 'function') {
-        evt = new CustomEvent(evtType, {
-          detail: evtData,
-          bubbles: shouldBubble
-        });
-      } else {
-        evt = document.createEvent('CustomEvent');
-        evt.initCustomEvent(evtType, shouldBubble, false, evtData);
-      }
-
-      this.root_.dispatchEvent(evt);
-    }
-  }]);
-
-  return MDCComponent;
-}();
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCComponent);
-
-/***/ }),
-
-/***/ 2:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__component__ = __webpack_require__(1);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__selection_control__ = __webpack_require__(3);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFoundation", function() { return __WEBPACK_IMPORTED_MODULE_0__foundation__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCComponent", function() { return __WEBPACK_IMPORTED_MODULE_1__component__["a"]; });
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "SelectionControlState", function() { return __WEBPACK_IMPORTED_MODULE_2__selection_control__["a"]; });
-/**
- * Copyright 2016 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-
-/***/ }),
-
-/***/ 27:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFormField", function() { return MDCFormField; });
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__foundation__ = __webpack_require__(53);
-/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCFormFieldFoundation", function() { return __WEBPACK_IMPORTED_MODULE_1__foundation__["a"]; });
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-
-
-var MDCFormField = function (_MDCComponent) {
-  _inherits(MDCFormField, _MDCComponent);
-
-  function MDCFormField() {
-    _classCallCheck(this, MDCFormField);
-
-    return _possibleConstructorReturn(this, (MDCFormField.__proto__ || Object.getPrototypeOf(MDCFormField)).apply(this, arguments));
-  }
-
-  _createClass(MDCFormField, [{
-    key: 'getDefaultFoundation',
-    value: function getDefaultFoundation() {
-      var _this2 = this;
-
-      return new __WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */]({
-        registerInteractionHandler: function registerInteractionHandler(type, handler) {
-          return _this2.label_.addEventListener(type, handler);
-        },
-        deregisterInteractionHandler: function deregisterInteractionHandler(type, handler) {
-          return _this2.label_.removeEventListener(type, handler);
-        },
-        activateInputRipple: function activateInputRipple() {
-          if (_this2.input_ && _this2.input_.ripple) {
-            _this2.input_.ripple.activate();
-          }
-        },
-        deactivateInputRipple: function deactivateInputRipple() {
-          if (_this2.input_ && _this2.input_.ripple) {
-            _this2.input_.ripple.deactivate();
-          }
-        }
-      });
-    }
-  }, {
-    key: 'input',
-    set: function set(input) {
-      this.input_ = input;
-    },
-    get: function get() {
-      return this.input_;
-    }
-  }, {
-    key: 'label_',
-    get: function get() {
-      return this.root_.querySelector(__WEBPACK_IMPORTED_MODULE_1__foundation__["a" /* default */].strings.LABEL_SELECTOR);
-    }
-  }], [{
-    key: 'attachTo',
-    value: function attachTo(root) {
-      return new MDCFormField(root);
-    }
-  }]);
-
-  return MDCFormField;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCComponent"]);
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SelectionControlState; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @typedef {!{
- *   checked: boolean,
- *   indeterminate: boolean,
- *   disabled: boolean,
- *   value: ?string
- * }}
- */
-var SelectionControlState = void 0;
-
-/***/ }),
-
-/***/ 52:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return cssClasses; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return strings; });
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var cssClasses = {
-  ROOT: 'mdc-form-field'
-};
-
-var strings = {
-  LABEL_SELECTOR: '.mdc-form-field > label'
-};
-
-/***/ }),
-
-/***/ 53:
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base__ = __webpack_require__(2);
-/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__constants__ = __webpack_require__(52);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
-
-/**
- * Copyright 2017 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-
-
-var MDCFormFieldFoundation = function (_MDCFoundation) {
-  _inherits(MDCFormFieldFoundation, _MDCFoundation);
-
-  _createClass(MDCFormFieldFoundation, null, [{
-    key: 'cssClasses',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["a" /* cssClasses */];
-    }
-  }, {
-    key: 'strings',
-    get: function get() {
-      return __WEBPACK_IMPORTED_MODULE_1__constants__["b" /* strings */];
-    }
-  }, {
-    key: 'defaultAdapter',
-    get: function get() {
-      return {
-        registerInteractionHandler: function registerInteractionHandler() /* type: string, handler: EventListener */{},
-        deregisterInteractionHandler: function deregisterInteractionHandler() /* type: string, handler: EventListener */{},
-        activateInputRipple: function activateInputRipple() {},
-        deactivateInputRipple: function deactivateInputRipple() {}
-      };
-    }
-  }]);
-
-  function MDCFormFieldFoundation(adapter) {
-    _classCallCheck(this, MDCFormFieldFoundation);
-
-    var _this = _possibleConstructorReturn(this, (MDCFormFieldFoundation.__proto__ || Object.getPrototypeOf(MDCFormFieldFoundation)).call(this, _extends(MDCFormFieldFoundation.defaultAdapter, adapter)));
-
-    _this.clickHandler_ = function (evt) {
-      return _this.handleClick_(evt);
-    };
-    return _this;
-  }
-
-  _createClass(MDCFormFieldFoundation, [{
-    key: 'init',
-    value: function init() {
-      this.adapter_.registerInteractionHandler('click', this.clickHandler_);
-    }
-  }, {
-    key: 'destroy',
-    value: function destroy() {
-      this.adapter_.deregisterInteractionHandler('click', this.clickHandler_);
-    }
-  }, {
-    key: 'handleClick_',
-    value: function handleClick_() {
-      var _this2 = this;
-
-      this.adapter_.activateInputRipple();
-      requestAnimationFrame(function () {
-        return _this2.adapter_.deactivateInputRipple();
-      });
-    }
-  }]);
-
-  return MDCFormFieldFoundation;
-}(__WEBPACK_IMPORTED_MODULE_0__material_base__["MDCFoundation"]);
-
-/* harmony default export */ __webpack_exports__["a"] = (MDCFormFieldFoundation);
-
-/***/ }),
-
-/***/ 87:
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__(27);
-
-
-/***/ })
-
-/******/ });
-});

Some files were not shown because too many files changed in this diff