silait commited on
Commit
7171c5f
1 Parent(s): b1db425

Upload 40 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ img/fig/browser-screenshot.png filter=lfs diff=lfs merge=lfs -text
37
+ img/gif/intermediate-render.gif filter=lfs diff=lfs merge=lfs -text
.nojekyll ADDED
File without changes
CNAME ADDED
@@ -0,0 +1 @@
 
 
1
+ websd.mlc.ai
LICENSE ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
README.md CHANGED
@@ -1,11 +1,9 @@
1
- ---
2
- title: Web Stable Diffusion
3
- emoji: 🦀
4
- colorFrom: green
5
- colorTo: green
6
- sdk: static
7
- pinned: false
8
- license: mit
9
- ---
10
 
11
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
1
+ # Web Stable Diffusion
 
 
 
 
 
 
 
 
2
 
3
+ <img src="img/logo/mlc-logo-with-text-landscape.svg" alt="MLC" height="80"/>
4
+ <img src="img/logo/catalyst.svg" alt="Catalyst" height="80"/>
5
+ <img src="img/logo/octoml_logo_blue-1024x254.png" alt="OctoML" height="60"/>
6
+
7
+ [MLC logo] [Catalyst logo] [CMU logo] [OctoML logo]
8
+
9
+ This project brings stable diffusion models onto web browsers. Everything runs inside the browser with no server support. To our knowledge, this is the first OSS project that brings models of this scale to the web.
assets/css/group.css ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* CMU color scheme. */
2
+ .nav-pills .nav-link.active, .nav-pills .show > .nav-link {
3
+ color: #fff;
4
+ background-color: #c41230;
5
+ }
6
+
7
+ a {
8
+ color: #c41230;
9
+ }
10
+
11
+ .header > a {
12
+ color: #212529;
13
+ }
14
+
15
+ .header > a:hover {
16
+ text-decoration: none;
17
+ }
18
+
19
+ /* Space out content a bit */
20
+ body {
21
+ padding-top: 20px;
22
+ }
23
+
24
+ .header {
25
+ border-bottom: 1px solid #EEE;
26
+ padding-bottom: 10px;
27
+ margin-bottom: 20px;
28
+ text-align: center;
29
+ }
30
+
31
+ .footer {
32
+ /* padding-top: 19px; */
33
+ color: #999;
34
+ border-top: 1px solid #EEE;
35
+ text-align: center;
36
+ font-size: 0.8em;
37
+ }
38
+ .footer a:link, .footer a:visited {
39
+ color: #999;
40
+ }
41
+
42
+ #topbar {
43
+ padding-top: 10px;
44
+ }
45
+
46
+ .fa {
47
+ color: #999;
48
+ }
49
+
50
+ a > .fa {
51
+ display: inline;
52
+ }
53
+
54
+ /* /\* Customize container *\/ */
55
+ /* @media (min-width: 768px) { */
56
+ /* .container { */
57
+ /* max-width: 730px; */
58
+ /* } */
59
+ /* } */
60
+ /* Jumbotron */
61
+ .jumbotron {
62
+ text-align: justify;
63
+ padding-top: 1.5em;
64
+ padding-bottom: 0.5em;
65
+ font-size: 125%;
66
+ }
67
+
68
+ /* Group logo */
69
+ #logo {
70
+ margin-top: -15px;
71
+ margin-bottom: -10px;
72
+ }
73
+
74
+ /* Front page news. */
75
+ ul.news .date {
76
+ color: #999;
77
+ font-weight: bold;
78
+ }
79
+ ul.news > li {
80
+ margin-top: 1em;
81
+ }
82
+
83
+ @media (min-width: 576px) {
84
+ .project-people {
85
+ column-count: 2;
86
+ }
87
+ .card-columns {
88
+ column-count: 2;
89
+ }
90
+ }
91
+ @media (min-width: 768px) {
92
+ .role.grad {
93
+ column-count: 2;
94
+ }
95
+ .project-people {
96
+ column-count: 3;
97
+ }
98
+ .card-columns {
99
+ column-count: 3;
100
+ }
101
+ }
102
+ .title img {
103
+ max-width: 50%;
104
+ }
105
+
106
+ section {
107
+ margin-bottom: 2em;
108
+ }
109
+
110
+ .profile {
111
+ object-fit: cover;
112
+ }
113
+
114
+ .noprofile circle {
115
+ fill: #EEE;
116
+ }
117
+ .noprofile text {
118
+ font-weight: 700;
119
+ fill: white;
120
+ }
121
+
122
+ .card .profile {
123
+ height: 40px;
124
+ width: 40px;
125
+ margin: 3px;
126
+ }
127
+ .card .card-footer {
128
+ padding: 0.5em;
129
+ }
130
+
131
+ .person {
132
+ margin-bottom: 10px;
133
+ }
134
+ .person .profile {
135
+ height: 70px;
136
+ width: 70px;
137
+ }
138
+ .person .bio {
139
+ color: #999;
140
+ }
141
+ .person .person-name {
142
+ margin: 0;
143
+ }
144
+
145
+ .person-without-image {
146
+ margin: 0;
147
+ }
148
+ .person-without-image .bio {
149
+ margin-left: 1em;
150
+ }
151
+
152
+ svg {
153
+ vertical-align: middle;
154
+ }
155
+
156
+ /*# sourceMappingURL=group.css.map */
assets/css/group.css.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"sourceRoot":"","sources":["group.scss"],"names":[],"mappings":"AAGA;AAEA;EACI;EACA;;;AAGJ;EACI;;;AAIJ;EACI;;;AAIJ;EACI;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACI;EACA,OAtCG;EAuCH;EACA;EACA;;AAEA;EACI,OA5CD;;;AAgDP;EACI;;;AAIJ;EACI,OAtDG;;;AAwDP;EAEI;;;AAGJ;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EAII;EACA;;;AAGJ;AAGI;EACI,OAzFD;EA0FC;;AAGJ;EACI;;;AAIR;EACI;IAAkB;;EAClB;IAAkB;;;AAGtB;EACI;IAAkB;;EAClB;IAAkB;;EAClB;IAAkB;;;AAGtB;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAIA;EACI,MA1HK;;AA4HT;EACI;EACA;;;AAMJ;EACI;EACA;EACA;;AAGJ;EAAe;;;AAGnB;EAEI;;AAEA;EACI;EACA;;AAGJ;EACI,OAxJD;;AA2JH;EACI;;;AAIR;EACI;;AAEA;EACI;;;AAIR;EAEI","sourcesContent":["$gray: #999;\n$light-gray: #EEE;\n\n/* CMU color scheme. */\n\n.nav-pills .nav-link.active, .nav-pills .show>.nav-link {\n color: #fff;\n background-color: #c41230;\n}\n\na {\n color: #c41230;\n}\n\n\n.header > a {\n color: #212529;\n}\n\n\n.header > a:hover {\n text-decoration: none;\n}\n\n/* Space out content a bit */\nbody {\n padding-top: 20px;\n}\n\n.header {\n border-bottom: 1px solid $light-gray;\n padding-bottom: 10px;\n margin-bottom: 20px;\n text-align: center;\n}\n\n.footer {\n /* padding-top: 19px; */\n color: $gray;\n border-top: 1px solid $light-gray;\n text-align: center;\n font-size: 0.8em;\n\n a:link, a:visited {\n color: $gray;\n }\n}\n\n#topbar {\n padding-top: 10px;\n}\n\n\n.fa {\n color: $gray;\n}\na > .fa {\n // make sure that font-awesome icons are underlined in links\n display: inline;\n}\n\n/* /\\* Customize container *\\/ */\n/* @media (min-width: 768px) { */\n/* .container { */\n/* max-width: 730px; */\n/* } */\n/* } */\n\n/* Jumbotron */\n.jumbotron {\n text-align: justify;\n padding-top: 1.5em;\n padding-bottom: 0.5em;\n font-size: 125%\n}\n\n/* Group logo */\n#logo {\n // width: 154px;\n // height: 35px;\n // margin: 2px 0 8px 0;\n margin-top: -15px;\n margin-bottom: -10px;\n}\n\n/* Front page news. */\nul.news {\n\n .date {\n color: $gray;\n font-weight: bold;\n }\n\n > li {\n margin-top: 1em;\n }\n}\n\n@media (min-width: 576px) {\n .project-people { column-count: 2 }\n .card-columns { column-count: 2 }\n}\n\n@media (min-width: 768px) {\n .role.grad { column-count: 2 }\n .project-people { column-count: 3 }\n .card-columns { column-count: 3 }\n}\n\n.title img {\n max-width: 50%;\n}\n\nsection {\n margin-bottom: 2em;\n}\n\n.profile {\n object-fit: cover; // makes sure it's cropped\n}\n\n.noprofile {\n circle {\n fill: $light-gray;\n }\n text {\n font-weight: 700;\n fill: white;\n }\n}\n\n.card {\n\n .profile {\n height: 40px;\n width: 40px;\n margin: 3px;\n }\n\n .card-footer { padding: 0.5em }\n}\n\n.person {\n\n margin-bottom: 10px;\n\n .profile {\n height: 70px;\n width: 70px;\n }\n\n .bio {\n color: $gray;\n }\n\n .person-name {\n margin: 0;\n }\n}\n\n.person-without-image {\n margin: 0;\n\n .bio {\n margin-left: 1em;\n }\n}\n\nsvg {\n // make the alignment just like img from bootstrap's reboot.scss\n vertical-align: middle;\n}\n\n// a {\n// color: rgb(84, 92, 136);\n// }\n"],"file":"group.css"}
assets/css/main.css ADDED
@@ -0,0 +1,1818 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+ /******************************************************************************/
3
+ /******************************************************************************/
4
+ /* portfolio tinkering */
5
+ /* add on-palm to be consistent with other jekyll theme media queries */
6
+ @media screen and (min-width: 32em) {
7
+ html {
8
+ font-size: 16px;
9
+ }
10
+ h1,
11
+ .h1 {
12
+ font-size: 2.998rem;
13
+ }
14
+ .site-header {
15
+ text-align: left;
16
+ }
17
+ .site-nav {
18
+ margin-top: 0;
19
+ }
20
+ .site-header a {
21
+ font-size: 1rem;
22
+ }
23
+ .site-header .site-title {
24
+ font-size: 1.25rem;
25
+ float: left;
26
+ }
27
+ .site-header .site-nav {
28
+ float: right;
29
+ }
30
+ blockquote {
31
+ margin-left: 2rem;
32
+ padding: 2rem;
33
+ }
34
+ .social-icons-left {
35
+ text-align: left;
36
+ }
37
+ .social-icons-right {
38
+ text-align: right;
39
+ }
40
+ }
41
+ @media screen and (min-width: 48em) {
42
+ html {
43
+ font-size: 18px;
44
+ }
45
+ }
46
+ @media screen and (min-width: 64em) {
47
+ html {
48
+ font-size: 20px;
49
+ }
50
+ }
51
+ @media screen and (min-width: 78em) {
52
+ em img {
53
+ max-width: 56rem;
54
+ margin-left: -7em;
55
+ }
56
+ }
57
+ /*!
58
+
59
+ BASSCSS
60
+
61
+ Next-level CSS toolkit - basscss.com
62
+
63
+ Made with love by Jxnblk - ©2014 Brent Jackson
64
+ MIT License http://opensource.org/licenses/MIT
65
+
66
+ */
67
+ /* Basscss Base Buttons */
68
+ button,
69
+ .button {
70
+ font-family: Lato, Helvetica, sans-serif;
71
+ font-size: inherit;
72
+ font-weight: normal;
73
+ text-decoration: none;
74
+ cursor: pointer;
75
+ display: inline-block;
76
+ box-sizing: border-box;
77
+ line-height: 1.125rem;
78
+ padding: 0.5rem 1rem;
79
+ margin: 0;
80
+ height: auto;
81
+ border: 1px solid transparent;
82
+ vertical-align: middle;
83
+ -webkit-appearance: none;
84
+ }
85
+
86
+ ::-moz-focus-inner {
87
+ border: 0;
88
+ padding: 0;
89
+ }
90
+
91
+ .button:hover {
92
+ text-decoration: none;
93
+ }
94
+
95
+ /* Basscss Base Forms */
96
+ input,
97
+ select,
98
+ textarea,
99
+ fieldset {
100
+ font-size: 1rem;
101
+ margin-top: 0;
102
+ margin-bottom: 0.5rem;
103
+ }
104
+
105
+ input[type=text],
106
+ input[type=datetime],
107
+ input[type=datetime-local],
108
+ input[type=email],
109
+ input[type=month],
110
+ input[type=number],
111
+ input[type=password],
112
+ input[type=search],
113
+ input[type=tel],
114
+ input[type=time],
115
+ input[type=url],
116
+ input[type=week] {
117
+ box-sizing: border-box;
118
+ height: 2.25rem;
119
+ padding: 0.5rem 0.5rem;
120
+ vertical-align: middle;
121
+ -webkit-appearance: none;
122
+ }
123
+
124
+ select {
125
+ box-sizing: border-box;
126
+ line-height: 1.75;
127
+ padding: 0.5rem 0.5rem;
128
+ }
129
+
130
+ select:not([multiple]) {
131
+ height: 2.25rem;
132
+ vertical-align: middle;
133
+ }
134
+
135
+ textarea {
136
+ box-sizing: border-box;
137
+ line-height: 1.75;
138
+ padding: 0.5rem 0.5rem;
139
+ }
140
+
141
+ .fieldset-reset {
142
+ padding: 0;
143
+ margin-left: 0;
144
+ margin-right: 0;
145
+ border: 0;
146
+ }
147
+
148
+ .fieldset-reset legend {
149
+ padding: 0;
150
+ }
151
+
152
+ body,
153
+ button {
154
+ margin: 0;
155
+ }
156
+
157
+ button,
158
+ input,
159
+ select,
160
+ textarea {
161
+ font-family: inherit;
162
+ font-size: 100%;
163
+ }
164
+
165
+ img {
166
+ max-width: 100%;
167
+ }
168
+
169
+ svg {
170
+ max-height: 100%;
171
+ }
172
+
173
+ /* Basscss Base Typography */
174
+ body {
175
+ font-family: Lato, Helvetica, Arial, sans-serif;
176
+ line-height: 1.5;
177
+ font-size: 100%;
178
+ }
179
+
180
+ h1,
181
+ h2,
182
+ h3,
183
+ h4,
184
+ h5,
185
+ h6 {
186
+ font-family: Lato, Helvetica, sans-serif;
187
+ font-weight: 900;
188
+ line-height: 1.25;
189
+ margin-top: 1em;
190
+ margin-bottom: 0.5em;
191
+ }
192
+
193
+ p,
194
+ dl,
195
+ ol,
196
+ ul {
197
+ font-size: 1rem;
198
+ margin-top: 0;
199
+ margin-bottom: 1rem;
200
+ }
201
+
202
+ ol,
203
+ ul {
204
+ padding-left: 2rem;
205
+ }
206
+
207
+ pre,
208
+ code,
209
+ samp {
210
+ font-family: "Source Code Pro", Consolas, monospace;
211
+ font-size: inherit;
212
+ }
213
+
214
+ pre {
215
+ margin-top: 0;
216
+ margin-bottom: 1rem;
217
+ overflow-x: scroll;
218
+ }
219
+
220
+ hr {
221
+ margin-top: 2rem;
222
+ margin-bottom: 2rem;
223
+ }
224
+
225
+ blockquote {
226
+ margin-top: 2rem;
227
+ margin-bottom: 2rem;
228
+ margin-left: 0;
229
+ padding-left: 1rem;
230
+ padding-right: 1rem;
231
+ }
232
+
233
+ blockquote,
234
+ blockquote p {
235
+ font-size: 1.25rem;
236
+ font-style: italic;
237
+ }
238
+
239
+ h1,
240
+ .h1 {
241
+ font-size: 2.998rem;
242
+ }
243
+
244
+ h2,
245
+ .h2 {
246
+ font-size: 1.5rem;
247
+ }
248
+
249
+ h3,
250
+ .h3 {
251
+ font-size: 1.25rem;
252
+ }
253
+
254
+ h4,
255
+ .h4 {
256
+ font-size: 1rem;
257
+ }
258
+
259
+ h5,
260
+ .h5 {
261
+ font-size: 0.875rem;
262
+ }
263
+
264
+ h6,
265
+ .h6 {
266
+ font-size: 0.75rem;
267
+ }
268
+
269
+ .list-reset {
270
+ list-style: none;
271
+ padding-left: 0;
272
+ }
273
+
274
+ .button-blue {
275
+ color: white;
276
+ background-color: #2698BA;
277
+ border-radius: 3px;
278
+ transition-duration: 0.1s;
279
+ transition-timing-function: ease-out;
280
+ transition-property: box-shadow, background-color;
281
+ }
282
+
283
+ .button-blue:hover {
284
+ opacity: 0.875;
285
+ }
286
+
287
+ .button-blue:active,
288
+ .button-blue.is-active {
289
+ box-shadow: inset 0 0 0 32px rgba(0, 0, 0, 0.125), inset 0 2px 3px 0 rgba(0, 0, 0, 0.25);
290
+ }
291
+
292
+ .button-blue:focus {
293
+ outline: none;
294
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.5), 0 0 1px 4px rgba(38, 152, 186, 0.5);
295
+ }
296
+
297
+ .button-blue:disabled,
298
+ .button-blue.is-disabled {
299
+ opacity: 0.5;
300
+ }
301
+
302
+ .highlight {
303
+ -webkit-text-size-adjust: none;
304
+ }
305
+
306
+ .highlight .c,
307
+ .highlight .cs,
308
+ .highlight .cm,
309
+ .highlight .cp,
310
+ .highlight .c1 {
311
+ color: #666;
312
+ font-style: italic;
313
+ }
314
+
315
+ .highlight .k,
316
+ .highlight .kc,
317
+ .highlight .kd,
318
+ .highlight .kn,
319
+ .highlight .kr,
320
+ .highlight .kt,
321
+ .highlight .kp {
322
+ color: #00369f;
323
+ }
324
+
325
+ .highlight .na,
326
+ .highlight .nb,
327
+ .highlight .nc,
328
+ .highlight .no,
329
+ .highlight .nd,
330
+ .highlight .ni,
331
+ .highlight .ne,
332
+ .highlight .nf,
333
+ .highlight .nl,
334
+ .highlight .nn,
335
+ .highlight .nx {
336
+ color: #333;
337
+ }
338
+
339
+ .highlight .mi,
340
+ .highlight .il {
341
+ color: #009f06;
342
+ }
343
+
344
+ .highlight .s,
345
+ .highlight .sb,
346
+ .highlight .sc,
347
+ .highlight .sd,
348
+ .highlight .s2,
349
+ .highlight .s3,
350
+ .highlight .sh,
351
+ .highlight .si,
352
+ .highlight .sx,
353
+ .highlight .sr,
354
+ .highlight .ss,
355
+ .highlight .s1 {
356
+ color: #FF3636;
357
+ }
358
+
359
+ .hljs-title,
360
+ .hljs-id,
361
+ .scss .hljs-preprocessor {
362
+ color: #FF3636;
363
+ font-weight: bold;
364
+ }
365
+
366
+ .highlight .k {
367
+ font-weight: normal;
368
+ }
369
+
370
+ .highlight .nc,
371
+ .highlight .no {
372
+ color: #00369f;
373
+ }
374
+
375
+ .highlight .o {
376
+ color: #00369f;
377
+ font-weight: normal;
378
+ }
379
+
380
+ .highlight .nb {
381
+ color: #009f06;
382
+ }
383
+
384
+ .highlight .sr {
385
+ color: #009f06;
386
+ }
387
+
388
+ .highlight .ss {
389
+ color: #B509AC;
390
+ }
391
+
392
+ .hljs-built_in {
393
+ color: #00369f;
394
+ }
395
+
396
+ .hljs-preprocessor,
397
+ .hljs-pragma,
398
+ .hljs-pi,
399
+ .hljs-doctype,
400
+ .hljs-shebang,
401
+ .hljs-cdata {
402
+ color: #666;
403
+ font-weight: bold;
404
+ }
405
+
406
+ .hljs-deletion {
407
+ background: #ffdddd;
408
+ }
409
+
410
+ .hljs-addition {
411
+ background: #ddffdd;
412
+ }
413
+
414
+ .diff .hljs-change {
415
+ background: #00369f;
416
+ }
417
+
418
+ .hljs-chunk {
419
+ color: #ccc;
420
+ }
421
+
422
+ /* Basscss Color Base */
423
+ body {
424
+ color: #333;
425
+ background-color: white;
426
+ }
427
+
428
+ a {
429
+ color: #2698BA;
430
+ text-decoration: none;
431
+ }
432
+
433
+ a:hover {
434
+ text-decoration: underline;
435
+ }
436
+
437
+ pre,
438
+ code {
439
+ background-color: #eee;
440
+ border-radius: 3px;
441
+ }
442
+
443
+ hr {
444
+ border: 0;
445
+ border-bottom-style: solid;
446
+ border-bottom-width: 1px;
447
+ border-bottom-color: #ccc;
448
+ }
449
+
450
+ /* Basscss Colors */
451
+ .dark-gray {
452
+ color: #333;
453
+ }
454
+
455
+ .white {
456
+ color: white;
457
+ }
458
+
459
+ .blue {
460
+ color: #2698BA;
461
+ }
462
+
463
+ .mid-gray {
464
+ color: #666;
465
+ }
466
+
467
+ .light-gray {
468
+ color: #ccc;
469
+ }
470
+
471
+ .lighter-gray {
472
+ color: #eee;
473
+ }
474
+
475
+ .red {
476
+ color: #FF3636;
477
+ }
478
+
479
+ .green {
480
+ color: #00ab37;
481
+ }
482
+
483
+ .yellow {
484
+ color: #efcc00;
485
+ }
486
+
487
+ .orange {
488
+ color: #F29105;
489
+ }
490
+
491
+ .bg-dark-gray {
492
+ background-color: #333;
493
+ }
494
+
495
+ .bg-white {
496
+ background-color: white;
497
+ }
498
+
499
+ .bg-blue {
500
+ background-color: #2698BA;
501
+ }
502
+
503
+ .bg-mid-gray {
504
+ background-color: #666;
505
+ }
506
+
507
+ .bg-light-gray {
508
+ background-color: #ccc;
509
+ }
510
+
511
+ .bg-lighter-gray {
512
+ background-color: #eee;
513
+ }
514
+
515
+ .bg-red {
516
+ background-color: #FF3636;
517
+ }
518
+
519
+ .bg-green {
520
+ background-color: #00ab37;
521
+ }
522
+
523
+ .bg-yellow {
524
+ background-color: #efcc00;
525
+ }
526
+
527
+ .bg-orange {
528
+ background-color: #F29105;
529
+ }
530
+
531
+ .bg-darken-1 {
532
+ background-color: rgba(0, 0, 0, 0.0625);
533
+ }
534
+
535
+ .bg-darken-2 {
536
+ background-color: rgba(0, 0, 0, 0.125);
537
+ }
538
+
539
+ .bg-darken-3 {
540
+ background-color: rgba(0, 0, 0, 0.25);
541
+ }
542
+
543
+ .bg-darken-4 {
544
+ background-color: rgba(0, 0, 0, 0.5);
545
+ }
546
+
547
+ /* Basscss Utility Headings */
548
+ .h00 {
549
+ font-size: 4rem;
550
+ }
551
+
552
+ .h0 {
553
+ font-size: 3rem;
554
+ }
555
+
556
+ @media (min-width: 52em) {
557
+ .h00-responsive {
558
+ font-size: 8vw;
559
+ }
560
+ .h0-responsive {
561
+ font-size: 6vw;
562
+ }
563
+ .h1-responsive {
564
+ font-size: 4vw;
565
+ }
566
+ }
567
+ @media (min-width: 96em) {
568
+ .h00-responsive {
569
+ font-size: 7.68rem;
570
+ }
571
+ .h0-responsive {
572
+ font-size: 5.76rem;
573
+ }
574
+ .h1-responsive {
575
+ font-size: 3.84rem;
576
+ }
577
+ }
578
+ /* Basscss Utility Typography */
579
+ .bold {
580
+ font-weight: bold;
581
+ }
582
+
583
+ .regular {
584
+ font-weight: normal;
585
+ }
586
+
587
+ .italic {
588
+ font-style: italic;
589
+ }
590
+
591
+ .caps {
592
+ text-transform: uppercase;
593
+ letter-spacing: 0.2em;
594
+ }
595
+
596
+ .left-align {
597
+ text-align: left;
598
+ }
599
+
600
+ .center {
601
+ text-align: center;
602
+ }
603
+
604
+ .right-align {
605
+ text-align: right;
606
+ }
607
+
608
+ .justify {
609
+ text-align: justify;
610
+ }
611
+
612
+ .nowrap {
613
+ white-space: nowrap;
614
+ }
615
+
616
+ /* Basscss Utility White Space */
617
+ .m0 {
618
+ margin: 0;
619
+ }
620
+
621
+ .mt0 {
622
+ margin-top: 0;
623
+ }
624
+
625
+ .mr0 {
626
+ margin-right: 0;
627
+ }
628
+
629
+ .mb0 {
630
+ margin-bottom: 0;
631
+ }
632
+
633
+ .ml0 {
634
+ margin-left: 0;
635
+ }
636
+
637
+ .m1 {
638
+ margin: 0.5rem;
639
+ }
640
+
641
+ .mt1 {
642
+ margin-top: 0.5rem;
643
+ }
644
+
645
+ .mr1 {
646
+ margin-right: 0.5rem;
647
+ }
648
+
649
+ .mb1 {
650
+ margin-bottom: 0.5rem;
651
+ }
652
+
653
+ .ml1 {
654
+ margin-left: 0.5rem;
655
+ }
656
+
657
+ .m2 {
658
+ margin: 1rem;
659
+ }
660
+
661
+ .mt2 {
662
+ margin-top: 1rem;
663
+ }
664
+
665
+ .mr2 {
666
+ margin-right: 1rem;
667
+ }
668
+
669
+ .mb2 {
670
+ margin-bottom: 1rem;
671
+ }
672
+
673
+ .ml2 {
674
+ margin-left: 1rem;
675
+ }
676
+
677
+ .m3 {
678
+ margin: 2rem;
679
+ }
680
+
681
+ .mt3 {
682
+ margin-top: 2rem;
683
+ }
684
+
685
+ .mr3 {
686
+ margin-right: 2rem;
687
+ }
688
+
689
+ .mb3 {
690
+ margin-bottom: 2rem;
691
+ }
692
+
693
+ .ml3 {
694
+ margin-left: 2rem;
695
+ }
696
+
697
+ .m4 {
698
+ margin: 4rem;
699
+ }
700
+
701
+ .mt4 {
702
+ margin-top: 4rem;
703
+ }
704
+
705
+ .mr4 {
706
+ margin-right: 4rem;
707
+ }
708
+
709
+ .mb4 {
710
+ margin-bottom: 4rem;
711
+ }
712
+
713
+ .ml4 {
714
+ margin-left: 4rem;
715
+ }
716
+
717
+ .mxn1 {
718
+ margin-left: -0.5rem;
719
+ margin-right: -0.5rem;
720
+ }
721
+
722
+ .mxn2 {
723
+ margin-left: -1rem;
724
+ margin-right: -1rem;
725
+ }
726
+
727
+ .mxn3 {
728
+ margin-left: -2rem;
729
+ margin-right: -2rem;
730
+ }
731
+
732
+ .mxn4 {
733
+ margin-left: -4rem;
734
+ margin-right: -4rem;
735
+ }
736
+
737
+ .mx-auto {
738
+ margin-left: auto;
739
+ margin-right: auto;
740
+ }
741
+
742
+ .p1 {
743
+ padding: 0.5rem;
744
+ }
745
+
746
+ .py1 {
747
+ padding-top: 0.5rem;
748
+ padding-bottom: 0.5rem;
749
+ }
750
+
751
+ .px1 {
752
+ padding-left: 0.5rem;
753
+ padding-right: 0.5rem;
754
+ }
755
+
756
+ .p2 {
757
+ padding: 1rem;
758
+ }
759
+
760
+ .py2 {
761
+ padding-top: 1rem;
762
+ padding-bottom: 1rem;
763
+ }
764
+
765
+ .px2 {
766
+ padding-left: 1rem;
767
+ padding-right: 1rem;
768
+ }
769
+
770
+ .p3 {
771
+ padding: 2rem;
772
+ }
773
+
774
+ .py3 {
775
+ padding-top: 2rem;
776
+ padding-bottom: 2rem;
777
+ }
778
+
779
+ .px3 {
780
+ padding-left: 2rem;
781
+ padding-right: 2rem;
782
+ }
783
+
784
+ .p4 {
785
+ padding: 4rem;
786
+ }
787
+
788
+ .py4 {
789
+ padding-top: 4rem;
790
+ padding-bottom: 4rem;
791
+ }
792
+
793
+ .px4 {
794
+ padding-left: 4rem;
795
+ padding-right: 4rem;
796
+ }
797
+
798
+ html, body {
799
+ height: auto;
800
+ min-height: 100%;
801
+ -webkit-text-size-adjust: 100%;
802
+ }
803
+
804
+ img {
805
+ max-width: none;
806
+ }
807
+
808
+ em img {
809
+ max-width: 100%;
810
+ margin-left: 0;
811
+ }
812
+
813
+ body {
814
+ box-sizing: border-box;
815
+ -moz-box-sizing: border-box;
816
+ -webkit-box-sizing: border-box;
817
+ }
818
+
819
+ .wrapper {
820
+ max-width: -webkit-calc(900px - (30px));
821
+ max-width: calc(900px - (30px));
822
+ margin-right: auto;
823
+ margin-left: auto;
824
+ padding-right: 15px;
825
+ padding-left: 15px;
826
+ }
827
+ @media screen and (min-width: 768px) {
828
+ .wrapper {
829
+ max-width: -webkit-calc(900px - (30px * 2));
830
+ max-width: calc(900px - (30px * 2));
831
+ padding-right: 30px;
832
+ padding-left: 30px;
833
+ }
834
+ }
835
+
836
+ .clearfix:before, .footer-col-wrapper:before, .wrapper:before, .clearfix:after, .footer-col-wrapper:after, .wrapper:after {
837
+ content: " ";
838
+ display: table;
839
+ }
840
+
841
+ .clearfix:after, .footer-col-wrapper:after, .wrapper:after {
842
+ clear: both;
843
+ }
844
+
845
+ .left {
846
+ float: left;
847
+ }
848
+
849
+ .right {
850
+ float: right;
851
+ }
852
+
853
+ .site-header {
854
+ border-bottom: 1px solid #e8e8e8;
855
+ background-color: white;
856
+ opacity: 0.95;
857
+ position: fixed;
858
+ left: 0px;
859
+ top: 0px;
860
+ width: 100%;
861
+ z-index: 50;
862
+ }
863
+ .site-header a {
864
+ font-size: 16px;
865
+ }
866
+
867
+ .site-title a {
868
+ font-family: "Roboto", Helvetica;
869
+ font-size: 20px;
870
+ line-height: 56px;
871
+ margin-bottom: 0;
872
+ }
873
+
874
+ .site-nav {
875
+ float: right;
876
+ line-height: 56px;
877
+ }
878
+ .site-nav .nav-trigger {
879
+ display: none;
880
+ }
881
+ .site-nav .menu-icon {
882
+ display: none;
883
+ }
884
+ .site-nav .page-link {
885
+ line-height: 1.5;
886
+ }
887
+ .site-nav .page-link:not(:first-child) {
888
+ margin-left: 10px;
889
+ }
890
+ @media screen and (max-width: 600px) {
891
+ .site-nav {
892
+ position: absolute;
893
+ top: 9px;
894
+ right: 15px;
895
+ background-color: #fff;
896
+ border: 1px solid #e8e8e8;
897
+ border-radius: 5px;
898
+ text-align: right;
899
+ }
900
+ .site-nav label[for=nav-trigger] {
901
+ display: block;
902
+ float: right;
903
+ width: 36px;
904
+ height: 36px;
905
+ z-index: 2;
906
+ cursor: pointer;
907
+ }
908
+ .site-nav .menu-icon {
909
+ display: block;
910
+ float: right;
911
+ width: 36px;
912
+ height: 26px;
913
+ line-height: 0;
914
+ padding-top: 10px;
915
+ text-align: center;
916
+ }
917
+ .site-nav .menu-icon > svg path {
918
+ fill: #424242;
919
+ }
920
+ .site-nav input ~ .trigger {
921
+ clear: both;
922
+ display: none;
923
+ }
924
+ .site-nav input:checked ~ .trigger {
925
+ display: block;
926
+ padding-bottom: 5px;
927
+ }
928
+ .site-nav .page-link {
929
+ display: block;
930
+ padding: 5px 10px;
931
+ margin-left: 10px;
932
+ }
933
+ .site-nav .page-link:not(:last-child) {
934
+ margin-right: 0;
935
+ }
936
+ }
937
+
938
+ .header-bar {
939
+ border-bottom: 1px solid #ccc;
940
+ font-size: 20px;
941
+ display: block;
942
+ opacity: 0.75;
943
+ width: 100%;
944
+ text-align: center;
945
+ padding-top: 25px;
946
+ padding-bottom: 4rem;
947
+ line-height: 3em;
948
+ z-index: 25;
949
+ }
950
+ .header-bar h1 {
951
+ color: #2698BA;
952
+ font-size: 75px;
953
+ }
954
+ .header-bar h2 {
955
+ font-size: 25px;
956
+ }
957
+
958
+ .site-footer {
959
+ border-top: 1px solid #e8e8e8;
960
+ padding: 30px 0;
961
+ }
962
+ .site-footer a {
963
+ color: #2698BA;
964
+ }
965
+ .site-footer a i {
966
+ color: #333;
967
+ }
968
+ .site-footer a:hover {
969
+ text-decoration: underline;
970
+ }
971
+ .site-footer a:hover i {
972
+ color: #2698BA;
973
+ }
974
+ .site-footer ul {
975
+ padding-left: 0;
976
+ }
977
+
978
+ .footer-heading {
979
+ font-size: 1.125rem;
980
+ margin-bottom: -webkit-calc($vertical-spacing-unit / 2);
981
+ }
982
+
983
+ .contact-list,
984
+ .social-media-list {
985
+ list-style: none;
986
+ margin-left: 0;
987
+ }
988
+
989
+ .footer-col-wrapper {
990
+ color: #828282;
991
+ font-size: 0.9375;
992
+ margin-left: -webkit-calc(-$horizontal-spacing-unit / 2);
993
+ }
994
+
995
+ .footer-col {
996
+ width: -webkit-calc(100% - (30px / 2));
997
+ width: calc(100% - (30px / 2));
998
+ margin-bottom: 15px;
999
+ padding-left: 15px;
1000
+ }
1001
+
1002
+ .footer-col-1,
1003
+ .footer-col-2 {
1004
+ width: -webkit-calc(50% - (30px / 2));
1005
+ width: calc(50% - (30px / 2));
1006
+ }
1007
+
1008
+ .footer-col-3 {
1009
+ width: -webkit-calc(100% - (30px / 2));
1010
+ width: calc(100% - (30px / 2));
1011
+ }
1012
+
1013
+ @media screen and (min-width: 768px) {
1014
+ .footer-col-1 {
1015
+ width: -webkit-calc(35% - (30px / 2));
1016
+ width: calc(35% - (30px / 2));
1017
+ }
1018
+ .footer-col-2 {
1019
+ width: -webkit-calc(20% - (30px / 2));
1020
+ width: calc(20% - (30px / 2));
1021
+ }
1022
+ .footer-col-3 {
1023
+ width: -webkit-calc(45% - (30px / 2));
1024
+ width: calc(45% - (30px / 2));
1025
+ }
1026
+ }
1027
+ @media screen and (min-width: 600px) {
1028
+ .footer-col {
1029
+ float: left;
1030
+ }
1031
+ }
1032
+ .page-content {
1033
+ padding: 100px 0; /* VERTICAL PADDING FOR TITLE ON EVERY PAGE */
1034
+ }
1035
+
1036
+ .page-heading {
1037
+ font-size: 20px;
1038
+ }
1039
+
1040
+ .contacticon {
1041
+ display: block;
1042
+ font-size: 60px;
1043
+ margin: 10px;
1044
+ }
1045
+
1046
+ .center {
1047
+ text-align: center;
1048
+ }
1049
+
1050
+ span.event {
1051
+ color: #009f06;
1052
+ }
1053
+
1054
+ span.deadline {
1055
+ color: #FF3636;
1056
+ }
1057
+
1058
+ reading.important {
1059
+ color: #009f06;
1060
+ }
1061
+
1062
+ .post-header {
1063
+ margin-bottom: 30px;
1064
+ }
1065
+
1066
+ .post-list {
1067
+ margin: 0;
1068
+ padding: 0;
1069
+ list-style: none;
1070
+ }
1071
+ .post-list > li {
1072
+ border-bottom: 1px solid #e8e8e8;
1073
+ padding-bottom: 2rem;
1074
+ padding-top: 2rem;
1075
+ }
1076
+ .post-list > li h2 {
1077
+ margin-top: 0.2em;
1078
+ }
1079
+ .post-list > li p {
1080
+ margin-top: 0.1em;
1081
+ }
1082
+
1083
+ .post-title {
1084
+ font-size: 42px;
1085
+ letter-spacing: -1px;
1086
+ line-height: 1;
1087
+ margin-bottom: 10px;
1088
+ margin-top: 0;
1089
+ }
1090
+ .post-title b {
1091
+ color: #2698BA;
1092
+ }
1093
+
1094
+ .post-description {
1095
+ font-size: 20px;
1096
+ letter-spacing: -1px;
1097
+ line-height: 1;
1098
+ margin-bottom: 10px;
1099
+ margin-top: 0;
1100
+ }
1101
+
1102
+ .post-content h2 {
1103
+ font-size: 42px;
1104
+ }
1105
+ .post-content h3 {
1106
+ font-size: 30px;
1107
+ }
1108
+ .post-content h4 {
1109
+ font-size: 20px;
1110
+ }
1111
+
1112
+ .post-meta {
1113
+ color: #828282;
1114
+ font-size: 0.875rem;
1115
+ margin-bottom: 0px;
1116
+ }
1117
+
1118
+ .post-link {
1119
+ display: block;
1120
+ font-size: 42px;
1121
+ }
1122
+
1123
+ #markdown-toc {
1124
+ list-style: none;
1125
+ padding-left: 0;
1126
+ }
1127
+ #markdown-toc li > ul {
1128
+ margin-bottom: 0;
1129
+ }
1130
+
1131
+ .logo {
1132
+ float: left;
1133
+ margin-right: 20px;
1134
+ padding-bottom: 15px;
1135
+ width: 120px;
1136
+ }
1137
+
1138
+ .about .post-title {
1139
+ padding-top: 20px;
1140
+ }
1141
+ .about .post-description {
1142
+ font-size: 20px;
1143
+ }
1144
+
1145
+ .instructors {
1146
+ padding: 0 0 0 1%;
1147
+ }
1148
+
1149
+ .instructor-profile-three-col, .instructor-profile-two-col {
1150
+ display: block;
1151
+ float: left;
1152
+ height: 210px;
1153
+ }
1154
+ @media screen and (min-width: 676px) {
1155
+ .instructor-profile-three-col, .instructor-profile-two-col {
1156
+ height: 130px;
1157
+ }
1158
+ }
1159
+ .instructor-profile-three-col img, .instructor-profile-two-col img {
1160
+ border-radius: 50%;
1161
+ float: left;
1162
+ object-fit: cover;
1163
+ height: 100px;
1164
+ width: 100px;
1165
+ margin-right: 10px;
1166
+ }
1167
+ .instructor-profile-three-col ul.instructor-info, .instructor-profile-two-col ul.instructor-info {
1168
+ display: block;
1169
+ float: left;
1170
+ list-style-type: none;
1171
+ padding-left: 0;
1172
+ width: 65%;
1173
+ width: -webkit-calc(100% - 130px);
1174
+ width: calc(100% - 130px);
1175
+ min-width: 210px;
1176
+ }
1177
+ .instructor-profile-three-col ul.instructor-info a, .instructor-profile-two-col ul.instructor-info a {
1178
+ color: #2698BA;
1179
+ }
1180
+ .instructor-profile-three-col ul.instructor-info a:hover, .instructor-profile-two-col ul.instructor-info a:hover {
1181
+ text-decoration: underline;
1182
+ }
1183
+ .instructor-profile-three-col ul.instructor-info span, .instructor-profile-two-col ul.instructor-info span {
1184
+ font-weight: 400;
1185
+ }
1186
+
1187
+ .instructor-profile-two-col {
1188
+ width: 50%;
1189
+ }
1190
+
1191
+ .instructor-profile-three-col {
1192
+ width: 33%;
1193
+ }
1194
+
1195
+ .news {
1196
+ border-top: 1px solid #e8e8e8;
1197
+ margin-top: 30px;
1198
+ padding-top: 20px;
1199
+ }
1200
+ .news h2 {
1201
+ font-weight: bold;
1202
+ margin-top: 0;
1203
+ margin-bottom: 10px;
1204
+ }
1205
+ .news table {
1206
+ border-collapse: collapse;
1207
+ width: 100%;
1208
+ }
1209
+ .news table .date {
1210
+ width: 19%;
1211
+ }
1212
+ .news table .announcement {
1213
+ width: 81%;
1214
+ }
1215
+ .news table tr {
1216
+ text-align: left;
1217
+ }
1218
+ .news table td {
1219
+ padding: 6px 0;
1220
+ vertical-align: top;
1221
+ border: none;
1222
+ }
1223
+
1224
+ .pagination {
1225
+ font-size: 1rem;
1226
+ font-family: "Lato", "Helvetica Neue", Helvetica, sans-serif;
1227
+ font-weight: 400;
1228
+ text-align: center;
1229
+ }
1230
+
1231
+ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
1232
+ .pagination {
1233
+ font-weight: 100;
1234
+ }
1235
+ }
1236
+ .pagination a, .pagination .disabled {
1237
+ -webkit-transition: all 0.2s ease-in-out;
1238
+ -moz-transition: all 0.2s ease-in-out;
1239
+ transition: all 0.2s ease-in-out;
1240
+ background: #fafafa;
1241
+ border-radius: 0.1875em;
1242
+ border: 1px solid #f3f3f3;
1243
+ color: #333333;
1244
+ padding: 1em 1.5em;
1245
+ }
1246
+
1247
+ .pagination .disabled, .pagination .pagination-meta {
1248
+ opacity: 0.5;
1249
+ }
1250
+
1251
+ .pagination .pagination-meta {
1252
+ overflow: hidden;
1253
+ }
1254
+
1255
+ .pagination a:hover, .pagination a:focus {
1256
+ background: white;
1257
+ color: #2698BA;
1258
+ }
1259
+
1260
+ .pagination a:active {
1261
+ background: #f7f7f7;
1262
+ }
1263
+
1264
+ .pagination .button {
1265
+ font-size: 1rem;
1266
+ font-weight: 300;
1267
+ letter-spacing: 1px;
1268
+ }
1269
+
1270
+ .button-disabled {
1271
+ opacity: 0.55;
1272
+ background-color: #999;
1273
+ }
1274
+
1275
+ .button-disabled:hover,
1276
+ .button-disabled:active,
1277
+ .button-disabled:focus {
1278
+ cursor: not-allowed;
1279
+ background-color: #999;
1280
+ }
1281
+
1282
+ .publications h2 {
1283
+ color: #2698BA;
1284
+ font-size: 32px;
1285
+ margin-bottom: 30px;
1286
+ text-align: center;
1287
+ }
1288
+
1289
+ .year {
1290
+ border-top: 1px solid #ccc;
1291
+ color: #ccc;
1292
+ margin: 0 -3em -2.5ex -2em;
1293
+ padding-top: 1ex;
1294
+ text-align: right;
1295
+ }
1296
+
1297
+ .bibliography {
1298
+ margin-bottom: 50px;
1299
+ margin-top: 20px;
1300
+ list-style-type: circle;
1301
+ }
1302
+ .bibliography li {
1303
+ margin: 10px 0;
1304
+ position: relative;
1305
+ }
1306
+ .bibliography li span {
1307
+ display: block;
1308
+ }
1309
+ .bibliography li .title {
1310
+ font-weight: bolder;
1311
+ }
1312
+ .bibliography li .author a {
1313
+ border-bottom: 1px dashed #2698BA;
1314
+ }
1315
+ .bibliography li .author a:hover {
1316
+ border-bottom-style: solid;
1317
+ text-decoration: none;
1318
+ }
1319
+ .bibliography li .author > em {
1320
+ border-bottom: 1px solid;
1321
+ font-style: normal;
1322
+ }
1323
+ .bibliography li a.abstract, .bibliography li a.bibtex {
1324
+ cursor: pointer;
1325
+ }
1326
+ .bibliography li .hidden {
1327
+ font-size: 0.875rem;
1328
+ max-height: 0px;
1329
+ overflow: hidden;
1330
+ text-align: justify;
1331
+ -webkit-transition: 0.15s ease;
1332
+ -moz-transition: 0.15s ease;
1333
+ -ms-transition: 0.15s ease;
1334
+ -o-transition: 0.15s ease;
1335
+ transition: all 0.15s ease;
1336
+ }
1337
+ .bibliography li .hidden p {
1338
+ line-height: 1.4em;
1339
+ margin: 10px;
1340
+ }
1341
+ .bibliography li .hidden pre {
1342
+ font-size: 1em;
1343
+ line-height: 1.4em;
1344
+ padding: 10px;
1345
+ }
1346
+ .bibliography li .hidden.open {
1347
+ max-height: 100em;
1348
+ -webkit-transition: 0.15s ease;
1349
+ -moz-transition: 0.15s ease;
1350
+ -ms-transition: 0.15s ease;
1351
+ -o-transition: 0.15s ease;
1352
+ transition: all 0.15s ease;
1353
+ }
1354
+ .bibliography li span.abstract.hidden {
1355
+ border: dashed 1px #fff;
1356
+ }
1357
+ .bibliography li span.abstract.hidden.open {
1358
+ border-color: #828282;
1359
+ }
1360
+ .bibliography abbr {
1361
+ position: absolute;
1362
+ left: -7em;
1363
+ }
1364
+
1365
+ .star {
1366
+ color: #2698BA;
1367
+ font-style: normal;
1368
+ }
1369
+
1370
+ blockquote {
1371
+ border-left: 5px solid #7a7a7a;
1372
+ font-style: italic;
1373
+ margin-left: 0.5rem;
1374
+ padding: 0.5rem;
1375
+ }
1376
+ blockquote p {
1377
+ margin: 0;
1378
+ }
1379
+
1380
+ blockquote footer {
1381
+ background-color: #fff;
1382
+ border-color: transparent;
1383
+ color: #7a7a7a;
1384
+ font-size: 0.85rem;
1385
+ font-style: normal;
1386
+ text-align: left;
1387
+ padding: 0;
1388
+ }
1389
+
1390
+ pre,
1391
+ pre code {
1392
+ background-color: transparent;
1393
+ border-radius: 0;
1394
+ }
1395
+
1396
+ pre,
1397
+ code {
1398
+ font-family: "Source Code Pro", Consolas, monospace;
1399
+ }
1400
+
1401
+ code {
1402
+ color: #333;
1403
+ font-size: 85%;
1404
+ padding-bottom: 0.1em;
1405
+ padding-left: 0.2em;
1406
+ padding-right: 0.2em;
1407
+ padding-top: 0.1em;
1408
+ }
1409
+
1410
+ pre {
1411
+ padding: 1.125em;
1412
+ line-height: 1.11;
1413
+ overflow-x: scroll;
1414
+ margin-bottom: 0.88em;
1415
+ background-color: #fafafa;
1416
+ }
1417
+
1418
+ .highlight .p {
1419
+ font-size: 1.125rem;
1420
+ line-height: 1;
1421
+ }
1422
+
1423
+ pre {
1424
+ counter-reset: line-numbering;
1425
+ white-space: pre;
1426
+ overflow-x: auto;
1427
+ word-break: inherit;
1428
+ word-wrap: inherit;
1429
+ }
1430
+
1431
+ pre a {
1432
+ background-image: none;
1433
+ }
1434
+
1435
+ pre a::before {
1436
+ content: counter(line-numbering);
1437
+ counter-increment: line-numbering;
1438
+ padding-right: 1em; /* space after numbers */
1439
+ width: 25px;
1440
+ text-align: right;
1441
+ opacity: 0.7;
1442
+ display: inline-block;
1443
+ color: #ccc;
1444
+ margin-right: 16px;
1445
+ font-size: 13px;
1446
+ -webkit-touch-callout: none;
1447
+ -webkit-user-select: none;
1448
+ -khtml-user-select: none;
1449
+ -moz-user-select: none;
1450
+ -ms-user-select: none;
1451
+ user-select: none;
1452
+ }
1453
+
1454
+ pre a:first-of-type::before {
1455
+ padding-top: 10px;
1456
+ }
1457
+
1458
+ pre a:last-of-type::before {
1459
+ padding-bottom: 10px;
1460
+ }
1461
+
1462
+ pre a:only-of-type::before {
1463
+ padding: 10px;
1464
+ }
1465
+
1466
+ .row {
1467
+ display: flex;
1468
+ flex-direction: row;
1469
+ flex-wrap: wrap;
1470
+ align-items: flex-start;
1471
+ justify-content: center;
1472
+ }
1473
+
1474
+ .col {
1475
+ display: inline-block;
1476
+ width: 100%;
1477
+ height: 100%;
1478
+ object-fit: cover;
1479
+ box-sizing: border-box;
1480
+ padding: 5px;
1481
+ }
1482
+
1483
+ .one {
1484
+ width: 33%;
1485
+ }
1486
+
1487
+ .two {
1488
+ width: 66%;
1489
+ }
1490
+
1491
+ .three {
1492
+ width: 100%;
1493
+ }
1494
+
1495
+ figcaption {
1496
+ text-align: center;
1497
+ }
1498
+
1499
+ .gist,
1500
+ .gist .highlight .p {
1501
+ font-size: 0.75rem;
1502
+ }
1503
+
1504
+ .gist .lines {
1505
+ width: 100%;
1506
+ }
1507
+
1508
+ a {
1509
+ color: #333;
1510
+ text-decoration: none;
1511
+ }
1512
+ a:hover {
1513
+ color: #2698BA;
1514
+ text-decoration: none;
1515
+ }
1516
+
1517
+ article a, .news a {
1518
+ color: #2698BA;
1519
+ }
1520
+ article a:hover, .news a:hover {
1521
+ text-decoration: underline;
1522
+ }
1523
+
1524
+ .social a {
1525
+ color: #333;
1526
+ }
1527
+ .social a:hover {
1528
+ color: #2698BA;
1529
+ }
1530
+
1531
+ .measure {
1532
+ margin: 0 auto;
1533
+ max-width: 42rem;
1534
+ }
1535
+
1536
+ /*
1537
+ Table styles copied from Bootstrap
1538
+ Copyright (c) 2018 Twitter, Inc
1539
+ */
1540
+ table {
1541
+ background-color: transparent;
1542
+ }
1543
+ table col[class*=col-] {
1544
+ position: static;
1545
+ display: table-column;
1546
+ float: none;
1547
+ }
1548
+ table td[class*=col-],
1549
+ table th[class*=col-] {
1550
+ position: static;
1551
+ display: table-cell;
1552
+ float: none;
1553
+ }
1554
+
1555
+ caption {
1556
+ padding-top: 8px;
1557
+ padding-bottom: 8px;
1558
+ color: #ccc;
1559
+ text-align: left;
1560
+ }
1561
+
1562
+ th {
1563
+ text-align: left;
1564
+ }
1565
+
1566
+ .table {
1567
+ width: 100%;
1568
+ max-width: 100%;
1569
+ margin-bottom: 24px;
1570
+ border-collapse: collapse;
1571
+ }
1572
+ .table > thead > tr > th,
1573
+ .table > thead > tr > td,
1574
+ .table > tbody > tr > th,
1575
+ .table > tbody > tr > td,
1576
+ .table > tfoot > tr > th,
1577
+ .table > tfoot > tr > td {
1578
+ padding: 8px;
1579
+ line-height: 1.5;
1580
+ vertical-align: top;
1581
+ border-top: 1px solid #ddd;
1582
+ }
1583
+ .table > thead > tr > th {
1584
+ vertical-align: bottom;
1585
+ border-bottom: 2px solid #ddd;
1586
+ }
1587
+ .table > caption + thead > tr:first-child > th,
1588
+ .table > caption + thead > tr:first-child > td,
1589
+ .table > colgroup + thead > tr:first-child > th,
1590
+ .table > colgroup + thead > tr:first-child > td,
1591
+ .table > thead:first-child > tr:first-child > th,
1592
+ .table > thead:first-child > tr:first-child > td {
1593
+ border-top: 0;
1594
+ }
1595
+ .table > tbody + tbody {
1596
+ border-top: 2px solid #ddd;
1597
+ }
1598
+ .table .table {
1599
+ background-color: #fff;
1600
+ }
1601
+
1602
+ .table-condensed > thead > tr > th,
1603
+ .table-condensed > thead > tr > td,
1604
+ .table-condensed > tbody > tr > th,
1605
+ .table-condensed > tbody > tr > td,
1606
+ .table-condensed > tfoot > tr > th,
1607
+ .table-condensed > tfoot > tr > td {
1608
+ padding: 5px;
1609
+ }
1610
+
1611
+ .table-bordered {
1612
+ border: 1px solid #ddd;
1613
+ }
1614
+ .table-bordered > thead > tr > th,
1615
+ .table-bordered > thead > tr > td,
1616
+ .table-bordered > tbody > tr > th,
1617
+ .table-bordered > tbody > tr > td,
1618
+ .table-bordered > tfoot > tr > th,
1619
+ .table-bordered > tfoot > tr > td {
1620
+ border: 1px solid #ddd;
1621
+ }
1622
+ .table-bordered > thead > tr > th,
1623
+ .table-bordered > thead > tr > td {
1624
+ border-bottom-width: 2px;
1625
+ }
1626
+
1627
+ .table-striped > tbody > tr:nth-of-type(odd) {
1628
+ background-color: #f9f9f9;
1629
+ }
1630
+
1631
+ .table-hover > tbody > tr:hover {
1632
+ background-color: #f5f5f5;
1633
+ }
1634
+
1635
+ .table > thead > tr > td.active,
1636
+ .table > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th,
1637
+ .table > tbody > tr > td.active,
1638
+ .table > tbody > tr > th.active,
1639
+ .table > tbody > tr.active > td,
1640
+ .table > tbody > tr.active > th,
1641
+ .table > tfoot > tr > td.active,
1642
+ .table > tfoot > tr > th.active,
1643
+ .table > tfoot > tr.active > td,
1644
+ .table > tfoot > tr.active > th {
1645
+ background-color: #f5f5f5;
1646
+ }
1647
+
1648
+ .table-hover > tbody > tr > td.active:hover,
1649
+ .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th {
1650
+ background-color: #e8e8e8;
1651
+ }
1652
+
1653
+ .table > thead > tr > td.success,
1654
+ .table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th,
1655
+ .table > tbody > tr > td.success,
1656
+ .table > tbody > tr > th.success,
1657
+ .table > tbody > tr.success > td,
1658
+ .table > tbody > tr.success > th,
1659
+ .table > tfoot > tr > td.success,
1660
+ .table > tfoot > tr > th.success,
1661
+ .table > tfoot > tr.success > td,
1662
+ .table > tfoot > tr.success > th {
1663
+ background-color: #dff0d8;
1664
+ }
1665
+
1666
+ .table-hover > tbody > tr > td.success:hover,
1667
+ .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th {
1668
+ background-color: #d0e9c6;
1669
+ }
1670
+
1671
+ .table > thead > tr > td.info,
1672
+ .table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th,
1673
+ .table > tbody > tr > td.info,
1674
+ .table > tbody > tr > th.info,
1675
+ .table > tbody > tr.info > td,
1676
+ .table > tbody > tr.info > th,
1677
+ .table > tfoot > tr > td.info,
1678
+ .table > tfoot > tr > th.info,
1679
+ .table > tfoot > tr.info > td,
1680
+ .table > tfoot > tr.info > th {
1681
+ background-color: #d9edf7;
1682
+ }
1683
+
1684
+ .table-hover > tbody > tr > td.info:hover,
1685
+ .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th {
1686
+ background-color: #c4e3f3;
1687
+ }
1688
+
1689
+ .table > thead > tr > td.warning,
1690
+ .table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th,
1691
+ .table > tbody > tr > td.warning,
1692
+ .table > tbody > tr > th.warning,
1693
+ .table > tbody > tr.warning > td,
1694
+ .table > tbody > tr.warning > th,
1695
+ .table > tfoot > tr > td.warning,
1696
+ .table > tfoot > tr > th.warning,
1697
+ .table > tfoot > tr.warning > td,
1698
+ .table > tfoot > tr.warning > th {
1699
+ background-color: #fcf8e3;
1700
+ }
1701
+
1702
+ .table-hover > tbody > tr > td.warning:hover,
1703
+ .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th {
1704
+ background-color: #faf2cc;
1705
+ }
1706
+
1707
+ .table > thead > tr > td.danger,
1708
+ .table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th,
1709
+ .table > tbody > tr > td.danger,
1710
+ .table > tbody > tr > th.danger,
1711
+ .table > tbody > tr.danger > td,
1712
+ .table > tbody > tr.danger > th,
1713
+ .table > tfoot > tr > td.danger,
1714
+ .table > tfoot > tr > th.danger,
1715
+ .table > tfoot > tr.danger > td,
1716
+ .table > tfoot > tr.danger > th {
1717
+ background-color: #f2dede;
1718
+ }
1719
+
1720
+ .table-hover > tbody > tr > td.danger:hover,
1721
+ .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th {
1722
+ background-color: #ebcccc;
1723
+ }
1724
+
1725
+ .table-responsive {
1726
+ min-height: 0.01%;
1727
+ overflow-x: auto;
1728
+ }
1729
+ @media screen and (max-width: 767px) {
1730
+ .table-responsive {
1731
+ width: 100%;
1732
+ margin-bottom: 18px;
1733
+ overflow-y: hidden;
1734
+ -ms-overflow-style: -ms-autohiding-scrollbar;
1735
+ border: 1px solid #ddd;
1736
+ }
1737
+ .table-responsive > .table {
1738
+ margin-bottom: 0;
1739
+ }
1740
+ .table-responsive > .table > thead > tr > th,
1741
+ .table-responsive > .table > thead > tr > td,
1742
+ .table-responsive > .table > tbody > tr > th,
1743
+ .table-responsive > .table > tbody > tr > td,
1744
+ .table-responsive > .table > tfoot > tr > th,
1745
+ .table-responsive > .table > tfoot > tr > td {
1746
+ white-space: nowrap;
1747
+ }
1748
+ .table-responsive > .table-bordered {
1749
+ border: 0;
1750
+ }
1751
+ .table-responsive > .table-bordered > thead > tr > th:first-child,
1752
+ .table-responsive > .table-bordered > thead > tr > td:first-child,
1753
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
1754
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
1755
+ .table-responsive > .table-bordered > tfoot > tr > th:first-child,
1756
+ .table-responsive > .table-bordered > tfoot > tr > td:first-child {
1757
+ border-left: 0;
1758
+ }
1759
+ .table-responsive > .table-bordered > thead > tr > th:last-child,
1760
+ .table-responsive > .table-bordered > thead > tr > td:last-child,
1761
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
1762
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
1763
+ .table-responsive > .table-bordered > tfoot > tr > th:last-child,
1764
+ .table-responsive > .table-bordered > tfoot > tr > td:last-child {
1765
+ border-right: 0;
1766
+ }
1767
+ .table-responsive > .table-bordered > tbody > tr:last-child > th,
1768
+ .table-responsive > .table-bordered > tbody > tr:last-child > td,
1769
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
1770
+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {
1771
+ border-bottom: 0;
1772
+ }
1773
+ }
1774
+
1775
+ html {
1776
+ font-size: 16px;
1777
+ }
1778
+
1779
+ body {
1780
+ color: #333;
1781
+ }
1782
+
1783
+ abbr {
1784
+ border-bottom: 1px black dotted;
1785
+ cursor: help;
1786
+ }
1787
+
1788
+ p {
1789
+ color: #333;
1790
+ }
1791
+
1792
+ h1, h2, h3, h4, h5, h6 {
1793
+ font-weight: 400;
1794
+ }
1795
+
1796
+ small,
1797
+ .small {
1798
+ font-size: 0.707rem;
1799
+ }
1800
+
1801
+ sup {
1802
+ position: relative;
1803
+ vertical-align: middle;
1804
+ top: -0.9ex;
1805
+ }
1806
+
1807
+ div.equation {
1808
+ margin: 0.5rem 0;
1809
+ text-align: center;
1810
+ }
1811
+
1812
+ latex-js {
1813
+ display: block;
1814
+ margin-bottom: -webkit-calc(30px / 2);
1815
+ margin-bottom: calc(30px / 2);
1816
+ }
1817
+
1818
+ /*# sourceMappingURL=main.css.map */
assets/css/main.css.map ADDED
@@ -0,0 +1 @@
 
 
1
+ {"version":3,"sourceRoot":"","sources":["../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_variables.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_media-queries.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_basscss.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_base-buttons.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_base-forms.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_base-reset.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_base-typography.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_buttons-blue.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_syntax-highlighting.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_color-base.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_colors.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_utility-headings.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_utility-typography.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/basscss/_utility-white-space.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_base.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_clearfix.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_positions.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_header.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_footer.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_pages.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_posts.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_profile.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_pagination.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_publications.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_blockquotes.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_code.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_gallery.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_gists.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_links.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_measure.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_tables.scss","../../../../../../../private/var/folders/0k/ckmv_5b93fl26rqn3fx8v07w0000gp/T/jekyll-remote-theme-20230716-60517-9envzc/_sass/_typography.scss"],"names":[],"mappings":";AACA;AAkOA;AAGA;AAMA;ACtOA;EACE;IACE;;EAGF;AAAA;IAEE,WDCC;;ECEH;IACE;;EAGF;IACE;;EAGF;IACE,WDRC;;ECWH;IACE,WDbC;ICcD;;EAGF;IACE;;EAGF;IACE,aDkDM;ICjDN,SDiDM;;EC9CR;IACE;;EAGF;IACE;;;AAIJ;EACE;IACE;;;AAIJ;EACE;IACE;;;AAIJ;EACE;IACE;IACA;;;AClEJ;;AAAA;;AAAA;;AAAA;AAAA;;AAAA;ACAA;AAEA;AAAA;EAEE,aHMoB;EGLpB,WH2FiB;EG1FjB,aH2FmB;EG1FnB;EACA;EACA;EACA;EACA,aHuFmB;EGtFnB;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AC1BF;AAEA;AAAA;AAAA;AAAA;EAIE,WJ6GqB;EI5GrB;EACA,eJ8EQ;;;AI3EV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;EACA,QJ4FkB;EI3FlB;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE,QJ+EkB;EI9ElB;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AClBF;AAEA;EACE,aNIY;EMHZ,aNIY;EMHZ;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME,aNJoB;EMKpB,aNJoB;EMKpB,aNJoB;EMKpB;EACA;;;AAGF;AAAA;AAAA;AAAA;EAIE,WNRG;EMSH;EACA,eN4DQ;;;AMzDV;AAAA;EAEE,cNwDQ;;;AMrDV;AAAA;AAAA;EAGE,aNzBsB;EM0BtB;;;AAGF;EACE;EACA,eN2CQ;EM1CR;;;AAGF;EACE,YNuCQ;EMtCR,eNsCQ;;;AMnCV;EACE,YNkCQ;EMjCR,eNiCQ;EMhCR;EACA,cN8BQ;EM7BR,eN6BQ;;;AM1BV;AAAA;EAEE,WN/CG;EMgDH;;;AAGF;AAAA;EAEE,WNvDG;;;AM0DL;AAAA;EAEE,WN3DG;;;AM8DL;AAAA;EAEE,WN/DG;;;AMkEL;AAAA;EAEE,WNnEG;;;AMsEL;AAAA;EAEE,WNvEG;;;AM0EL;AAAA;EAEE,WN3EG;;;AM8EL;EACE;EACA;;;ACnGF;EACE;EACA,kBPyCkB;EOxClB,eP6Gc;EO5Gd;EACA;EACA;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;;;ACzBF;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE,ORkDkB;EQjDlB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE,ORyBkB;;;AQtBpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,ORwBkB;;;AQrBpB;AAAA;EAEE,ORUkB;;;AQPpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE,ORfkB;;;AQkBpB;AAAA;AAAA;EAGE,ORrBkB;EQsBlB;;;AAGF;EACE;;;AAGF;AAAA;EAEE,ORzBkB;;;AQ4BpB;EACE,OR7BkB;EQ8BlB;;;AAGF;EACE,OR9BkB;;;AQiCpB;EACE,ORlCkB;;;AQqCpB;EACE,ORnCkB;;;AQsCpB;EACE,OR9CkB;;;AQiDpB;AAAA;AAAA;AAAA;AAAA;AAAA;EAME,ORzCkB;EQ0ClB;;;AAGF;EACE,YRnDkB;;;AQsDpB;EACE,YR3DkB;;;AQ8DpB;EACE,YRpEkB;;;AQuEpB;EACE,ORzDkB;;;AS5DpB;AAEA;EACE,OTuDkB;EStDlB;;;AAGF;EACE,OTmCkB;ESlClB;;;AAGF;EACE;;;AAGF;AAAA;EAEE,kBT2CkB;ES1ClB,eT6Fc;;;AS1FhB;EACE;EACA;EACA,qBTsFa;ESrFb,qBTkCkB;;;AU5DpB;AAEA;EACE,OVuDkB;;;AUpDpB;EACE;;;AAGF;EACE,OVgCkB;;;AU7BpB;EACE,OV4CkB;;;AUzCpB;EACE,OVyCkB;;;AUtCpB;EACE,OVsCkB;;;AUnCpB;EACE,OVYkB;;;AUTpB;EACE,OVekB;;;AUZpB;EACE,OVoBkB;;;AUjBpB;EACE,OVEkB;;;AUCpB;EACE,kBVekB;;;AUZpB;EACE;;;AAGF;EACE,kBVRkB;;;AUWpB;EACE,kBVIkB;;;AUDpB;EACE,kBVCkB;;;AUEpB;EACE,kBVFkB;;;AUKpB;EACE,kBV5BkB;;;AU+BpB;EACE,kBVzBkB;;;AU4BpB;EACE,kBVpBkB;;;AUuBpB;EACE,kBVtCkB;;;AUyCpB;EACE,kBVhBkB;;;AUmBpB;EACE,kBVnBkB;;;AUsBpB;EACE,kBVtBkB;;;AUyBpB;EACE,kBVzBkB;;;AWtEpB;AAEA;EACE,WXiBI;;;AWdN;EACE,WXcG;;;AWXL;EACE;IACE,WXUa;;EWPf;IACE,WXOY;;EWJd;IACE,WXIY;;;AWAhB;EACE;IACE,WXDiB;;EWInB;IACE,WXJgB;;EWOlB;IACE,WXPgB;;;AY3BpB;AAEA;EACE,aZGiB;;;AYAnB;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACpCF;AAEA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,Qb+DQ;;;Aa5DV;EACE,Yb2DQ;;;AaxDV;EACE,cbuDQ;;;AapDV;EACE,ebmDQ;;;AahDV;EACE,ab+CQ;;;Aa5CV;EACE,Qb4CQ;;;AazCV;EACE,YbwCQ;;;AarCV;EACE,cboCQ;;;AajCV;EACE,ebgCQ;;;Aa7BV;EACE,ab4BQ;;;AazBV;EACE,QbyBQ;;;AatBV;EACE,YbqBQ;;;AalBV;EACE,cbiBQ;;;AadV;EACE,ebaQ;;;AaVV;EACE,abSQ;;;AaNV;EACE,QbMQ;;;AaHV;EACE,YbEQ;;;AaCV;EACE,cbFQ;;;AaKV;EACE,ebNQ;;;AaSV;EACE,abVQ;;;AaaV;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE,Sb1CQ;;;Aa6CV;EACE,ab9CQ;Ea+CR,gBb/CQ;;;AakDV;EACE,cbnDQ;EaoDR,ebpDQ;;;AauDV;EACE,SbvDQ;;;Aa0DV;EACE,ab3DQ;Ea4DR,gBb5DQ;;;Aa+DV;EACE,cbhEQ;EaiER,ebjEQ;;;AaoEV;EACE,SbpEQ;;;AauEV;EACE,abxEQ;EayER,gBbzEQ;;;Aa4EV;EACE,cb7EQ;Ea8ER,eb9EQ;;;AaiFV;EACE,SbjFQ;;;AaoFV;EACE,abrFQ;EasFR,gBbtFQ;;;AayFV;EACE,cb1FQ;Ea2FR,eb3FQ;;;AcvFV;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACU;EACL;EACH;;;AAGF;EACI;EACA;EACA;EACA;EACA;EACA;;AAGA;EATJ;IAUQ;IACA;IACA,edwDwB;IcvDxB,cduDwB;;;;Ae3FhC;EACE;EACA;;;AAGF;EACE;;;ACNF;EACE;;;AAGF;EACE;;;ACLF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA,ajB4HS;EiB1HT;;;AAEJ;EACI;EACA,ajBsHS;;AiBpHT;EACI;;AAGJ;EACI;;AAGJ;EACI,ajB3BM;;AiB6BN;EACI;;AhBrCR;EgBqBJ;IAqBQ;IACA;IACA;IACA,kBjBWY;IiBVZ;IACA;IACA;;EAEA;IACI;IACA;IACA;IACA;IACA;IACA;;EAGJ;IACI;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IACI,MjBLI;;EiBSZ;IACI;IACA;;EAGJ;IACI;IACA;;EAGJ;IACI;IACA;IAKA;;EAHA;IACI;;;;AAOhB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA,gBjBfM;EiBgBN;EACA;;AACA;EACI,OjBjEY;EiBkEZ;;AAEJ;EACI;;;AChHR;EACE;EACA;;AAEA;EACE,OlBsCgB;;AkBrChB;EAAI,OlBoDY;;AkBlDhB;EACE;;AACA;EAAI,OlBiCU;;AkB7BlB;EACE;;;AAIJ;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE,OlBgCkB;EkB/BlB;EACA;;;AAIF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAIJ;EACE;IACE;;;AC1EJ;EACI;;;AAEJ;EACI;;;AAEJ;EACI;EACA;EACA;;;AAEJ;EACI;;;AAOJ;EACI,OnB6BgB;;;AmB3BpB;EACI,OnBgBgB;;;AmBbpB;EACC,OnBsBmB;;;AoBjDpB;EACI,epB2F4B;;;AoBzFhC;EACI;EACA;EACA;;AAEA;EACI;EACA,gBpB8EE;EoB7EF,apB6EE;;AoB3EF;EACI;;AAEJ;EACI;;;AAIZ;EACI;EACA;EACA;EACA;EACA;;AAIA;EACI,OpBYY;;;AoBTpB;EACI;EACA;EACA;EACA;EACA;;;AAGA;EACI;;AAKJ;EACI;;AAKJ;EACI;;;AAMR;EACI,OpBCgB;EoBAhB,WpB1De;EoB2Df;;;AAEJ;EACI;EACA;;;AAEJ;EACI;EACA;;AACA;EACI;;;AC1ER;EACI;EACA;EACA;EACA;;;AAIA;EACI;;AAEJ;EACI;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;;AAEA;EALJ;IAMQ;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,OrBNQ;;AqBOR;EACI;;AAIR;EACI;;;AAIZ;EAEI;;;AAEJ;EAEI;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAEA;EAAQ;;AACR;EAAgB;;AAEhB;EAAK;;AACL;EACI;EACA;EACA;;;AC1FZ;EACE;EACA;EACA;EACA;;;AAGF;EAGI;IACI;;;AAIR;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA,OtBOkB;;;AsBJpB;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;AAAA;EAGE;EACA;;;ACzDE;EACI,OvByCY;EuBtCZ;EACA;EAEA;;;AAGR;EACI;EACA,OvB+CgB;EuB9ChB;EACA;EACA;;;AAEJ;EACI;EACA;EACA;;AAEA;EACI;EACA;;AAEA;EAAO;;AACP;EAAS;;AAEL;EACI;;AACA;EACI;EACA;;AAGR;EACI;EACA;;AAGR;EAAuB;;AACvB;EACI,WvBvCO;EuBwCP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAEJ;EACI;EACA;EACA;;AAGR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;;AAEJ;EACI,cvBbQ;;AuBgBhB;EACI;EACI;;;AAGZ;EACI,OvB1CgB;EuB2ChB;;;ACtFJ;EACE;EACA;EACA,axBmFQ;EwBlFR,SxBkFQ;;AwBhFR;EACE;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AClBF;AAAA;EAEE;EACA,ezBsHkB;;;AyBnHpB;AAAA;EAEE,azBKsB;;;AyBFxB;EACE,OzB8CkB;EyB7ClB;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA,kBzBiGqB;;;AyB9FvB;EACE;EACA;;;AAGF;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OzBOkB;EyBNlB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACzEF;EACI;EACA;EACA;EACA;EACA;;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA,S1B0NU;;;A0BvNd;EACI;;;AAEJ;EACI;;;AAEJ;EACI;;;AAGJ;EACI;;;AC3BJ;AAAA;EAEE;;;AAGF;EACE;;;ACNF;EACI,O5ByDgB;E4BxDhB;;AAEA;EACI,O5BsCY;E4BrCZ;;;AAIR;EACI,O5BgCgB;;A4B9BhB;EACI;;;AAIR;EACI,O5BuCgB;;A4BrChB;EAAU,O5BsBM;;;A6B3CpB;EACE;EACA,W7B6Bc;;;A8B/BhB;AAAA;AAAA;AAAA;AAKA;EACE,kB9ByJ8B;;A8BnJ9B;EACE;EACA;EACA;;AAKA;AAAA;EACE;EACA;EACA;;;AAKN;EACE,a9B6H8B;E8B5H9B,gB9B4H8B;E8B3H9B,O9B6BkB;E8B5BlB;;;AAGF;EACE;;;AAMF;EACE;EACA;EACA,e9BpCqB;E8BqCrB;;AAMI;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE,S9BoGwB;E8BnGxB,a9B/CM;E8BgDN;EACA;;AAKN;EACE;EACA;;AAOE;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;;AAIF;EACE,kB9B3BgB;;;A8BuCd;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE,S9B0DwB;;;A8BhDhC;EACE;;AAKI;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKJ;AAAA;EAEE;;;AAWJ;EACE,kB9B0B4B;;;A8BhB9B;EACE,kB9BiB4B;;;A8BD5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE,kB9BH0B;;;A8BU5B;AAAA;EAKE;;;AAhBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE,kB9BO2B;;;A8BA7B;AAAA;EAKE;;;AAhBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE,kB9BW2B;;;A8BJ7B;AAAA;EAKE;;;AAhBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE,kB9Be2B;;;A8BR7B;AAAA;EAKE;;;AAhBF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE,kB9BmB2B;;;A8BZ7B;AAAA;EAKE;;;AAoBN;EACE;EACA;;AAEA;EAJF;IAKI;IACA;IACA;IACA;IACA;;EAGA;IACE;;EAOI;AAAA;AAAA;AAAA;AAAA;AAAA;IAEE;;EAOR;IACE;;EAOI;AAAA;AAAA;AAAA;AAAA;AAAA;IAEE;;EAEF;AAAA;AAAA;AAAA;AAAA;AAAA;IAEE;;EAWF;AAAA;AAAA;AAAA;IAEE;;;;AC9PZ;EACI,W/BGa;;;A+BAjB;EACI,O/BqDgB;;;A+BlDpB;EACI,e/BmBiB;E+BlBjB;;;AAGJ;EACI;;;AAIJ;EACI;;;AAcJ;AAAA;EAEI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA","sourcesContent":["\n/******************************************************************************/\n\n// Typography\n$base-font-size: 16px !default;\n$small-font-size: 0.875rem !default;\n$bold-font-weight: bold !default;\n$font-family: Lato, Helvetica, Arial, sans-serif !default;\n$line-height: 1.5 !default;\n$line-height-computed: floor(($base-font-size * $line-height)) !default;\n$heading-font-family: Lato, Helvetica, sans-serif !default;\n$heading-font-weight: 900 !default;\n$heading-line-height: 1.25 !default;\n$monospace-font-family: 'Source Code Pro', Consolas, monospace !default;\n$h1: 2.998rem !default;\n$h2: 1.5rem !default;\n$h3: 1.25rem !default;\n$h4: 1rem !default;\n$h5: .875rem !default;\n$h6: .75rem !default;\n$h00: 4rem !default;\n$h0: 3rem !default;\n$h00-responsive: 8vw !default;\n$h0-responsive: 6vw !default;\n$h1-responsive: 4vw !default;\n$h00-responsive-max: 7.68rem !default;\n$h0-responsive-max: 5.76rem !default;\n$h1-responsive-max: 3.84rem !default;\n$abbr-border-bottom: 1px black dotted;\n\n// Page width\n$measure-width: 42rem !default;\n\n// Viewport widths\n$viewport-small: 32em;\n$viewport-medium: 48em;\n$viewport-large: 64em;\n\n// Colors\n$red: #FF3636 !default;\n$red-1: #f95020 !default;\n$orange: #F29105 !default;\n$orange-1: #ffcc22 !default;\n$blue: #2698BA !default;\n$blue-1: #0076df !default;\n$dark-blue: #00369f !default;\n$green: #00ab37 !default;\n$green-1: #11D68B !default;\n$green-2: #00cf26 !default;\n$dark-green: #009f06 !default;\n$light-green: #ddffdd !default;\n$lime_green: #B7D12A !default;\n$purple: #B509AC !default;\n$pink: #f92080 !default;\n$light-pink: #ffdddd !default;\n$yellow: #efcc00 !default;\n\n$white: #fff !default;\n$dark-gray: #333 !default;\n$mid-gray: #666 !default;\n$light-gray: #ccc !default;\n$lighter-gray: #eee !default;\n\n$grey-color: #828282;\n$grey-color-light: lighten($grey-color, 40%);\n$grey-color-dark: darken($grey-color, 25%);\n\n$darken-1: rgba(#000,.0625) !default;\n$darken-2: rgba(#000,.125) !default;\n$darken-3: rgba(#000,.25) !default;\n$darken-4: rgba(#000,.5) !default;\n\n$theme-color: $blue;\n$code-color: $dark-gray;\n$text-color: $dark-gray;\n$background-color: $white;\n\n// Links\n$link-color: $theme-color;\n$link-hover-color: darken($theme-color, 40%);\n\n// Breakpoints\n$breakpoint-md: '(min-width: 52em)';\n$breakpoint-xl: '(min-width: 96em)';\n\n// Whitespace\n$space-1: .5rem !default;\n$space-2: 1rem !default;\n$space-3: 2rem !default;\n$space-4: 4rem !default;\n\n$horizontal-spacing-unit: 30px;\n$vertical-spacing-unit: 30px;\n$nav-height: 56px;\n\n// Buttons\n$button-font-size: inherit !default;\n$button-font-weight: normal !default;\n$button-line-height: 1.125rem !default;\n$button-padding-y: .5rem !default;\n$button-padding-x: 1rem !default;\n$button-font-family: $heading-font-family;\n\n// Forms\n$form-field-font-size: 1rem !default;\n$form-field-height: 2.25rem !default;\n$form-field-padding-y: .5rem !default;\n$form-field-padding-x: .5rem !default;\n\n// Borders\n$border-color: $light-gray !default;\n$border-width: 1px !default;\n$border-radius: 3px !default;\n\n// Forms\n$form-field-font-size: 1rem;\n$form-field-height: 2.25rem;\n$form-field-padding-y: .5rem;\n$form-field-padding-x: .5rem;\n\n// Code\n$pre-border-radius: 0;\n$pre-background-color: #fafafa;\n$hljs-comment: $mid-gray;\n$hljs-keyword: $dark-blue;\n$hljs-name: $dark-gray;\n$hljs-number: $dark-green;\n$hljs-string: $red;\n$hljs-title: $red;\n$hljs-type: $dark-blue;\n$hljs-tag: $dark-blue;\n$hljs-attribute: $dark-green;\n$hljs-regexp: $dark-green;\n$hljs-symbol: $purple;\n$hljs-built-in: $dark-blue;\n$hljs-preprocessor: $mid-gray;\n$hljs-deletion: $light-pink;\n$hljs-addition: $light-green;\n$hljs-change: $dark-blue;\n$hljs-chunk: $light-gray;\n\n// Header\n$nav-height: 56px;\n\n// Footer\n$footer-border-top: thin solid $grey-color-dark;\n$footer-padding: $space-1;\n$footer-color: $light-gray;\n$footer-bg-color: $grey-color-dark;\n$footer-font-weight: 300;\n$footer-font-size: .75rem;\n\n// Tables\n//** Padding for `<th>`s and `<td>`s.\n$table-cell-padding: 8px !default;\n//** Padding for cells in `.table-condensed`.\n$table-condensed-cell-padding: 5px !default;\n\n//** Default background color used for all tables.\n$table-bg: transparent !default;\n//** Background color used for `.table-striped`.\n$table-bg-accent: #f9f9f9 !default;\n//** Background color used for `.table-hover`.\n$table-bg-hover: #f5f5f5 !default;\n$table-bg-active: $table-bg-hover !default;\n\n//** Border color for table and cell borders.\n$table-border-color: #ddd !default;\n\n// Form states and alerts\n//## Define colors for form feedback states and, by default, alerts.\n\n$state-success-text: #3c763d !default;\n$state-success-bg: #dff0d8 !default;\n$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%) !default;\n\n$state-info-text: #31708f !default;\n$state-info-bg: #d9edf7 !default;\n$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%) !default;\n\n$state-warning-text: #8a6d3b !default;\n$state-warning-bg: #fcf8e3 !default;\n$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%) !default;\n\n$state-danger-text: #a94442 !default;\n$state-danger-bg: #f2dede !default;\n$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%) !default;\n\n// Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `$screen-xs` as of v3.0.1\n$screen-xs: 480px !default;\n//** Deprecated `$screen-xs-min` as of v3.2.0\n$screen-xs-min: $screen-xs !default;\n//** Deprecated `$screen-phone` as of v3.0.1\n$screen-phone: $screen-xs-min !default;\n\n// Small screen / tablet\n//** Deprecated `$screen-sm` as of v3.0.1\n$screen-sm: 768px !default;\n$screen-sm-min: $screen-sm !default;\n//** Deprecated `$screen-tablet` as of v3.0.1\n$screen-tablet: $screen-sm-min !default;\n\n// Medium screen / desktop\n//** Deprecated `$screen-md` as of v3.0.1\n$screen-md: 992px !default;\n$screen-md-min: $screen-md !default;\n//** Deprecated `$screen-desktop` as of v3.0.1\n$screen-desktop: $screen-md-min !default;\n\n// Large screen / wide desktop\n//** Deprecated `$screen-lg` as of v3.0.1\n$screen-lg: 1200px !default;\n$screen-lg-min: $screen-lg !default;\n//** Deprecated `$screen-lg-desktop` as of v3.0.1\n$screen-lg-desktop: $screen-lg-min !default;\n\n// So media queries don't overlap when required, provide a maximum\n$screen-xs-max: ($screen-sm-min - 1) !default;\n$screen-sm-max: ($screen-md-min - 1) !default;\n$screen-md-max: ($screen-lg-min - 1) !default;\n\n\n/******************************************************************************/\n\n\n/* portfolio tinkering */\n$img_spacing: 5px;\n$img-height: 275px;\n$caption-font-size: 12px;\n$caption-color: #aaa;\n\n/* add on-palm to be consistent with other jekyll theme media queries */\n$content-width: 900px !default;\n\n$on-palm: 600px !default;\n$on-laptop: 768px !default;\n\n$on-medium: $on-palm !default;\n$on-large: $on-laptop !default;\n","@mixin media-query($device) {\n @media screen and (max-width: $device) {\n @content;\n }\n}\n\n@media screen and (min-width: $viewport-small) {\n html {\n font-size: 16px;\n }\n\n h1,\n .h1 {\n font-size: $h1;\n }\n\n .site-header {\n text-align: left;\n }\n\n .site-nav {\n margin-top: 0;\n }\n\n .site-header a {\n font-size: $h4;\n }\n\n .site-header .site-title {\n font-size: $h3;\n float: left;\n }\n\n .site-header .site-nav {\n float: right;\n }\n\n blockquote {\n margin-left: $space-3;\n padding: $space-3;\n }\n\n .social-icons-left {\n text-align: left;\n }\n\n .social-icons-right {\n text-align: right;\n }\n}\n\n@media screen and (min-width: $viewport-medium) {\n html {\n font-size: 18px;\n }\n}\n\n@media screen and (min-width: $viewport-large) {\n html {\n font-size: 20px;\n }\n}\n\n@media screen and (min-width: $viewport-large + 14) {\n em img {\n max-width: $measure-width + 14;\n margin-left: -7em;\n }\n}\n","/*!\n\n BASSCSS\n\n Next-level CSS toolkit - basscss.com\n\n Made with love by Jxnblk - ©2014 Brent Jackson\n MIT License http://opensource.org/licenses/MIT\n\n*/\n\n@import 'basscss/base-buttons';\n@import 'basscss/base-forms';\n@import 'basscss/base-reset';\n@import 'basscss/base-typography';\n\n@import 'basscss/buttons-blue';\n\n@import 'basscss/syntax-highlighting';\n@import 'basscss/color-base';\n@import 'basscss/colors';\n\n@import 'basscss/utility-headings';\n@import 'basscss/utility-typography';\n@import 'basscss/utility-white-space';\n","/* Basscss Base Buttons */\n\nbutton,\n.button {\n font-family: $button-font-family;\n font-size: $button-font-size;\n font-weight: $button-font-weight;\n text-decoration: none;\n cursor: pointer;\n display: inline-block;\n box-sizing: border-box;\n line-height: $button-line-height;\n padding: $button-padding-y $button-padding-x;\n margin: 0;\n height: auto;\n border: 1px solid transparent;\n vertical-align: middle;\n -webkit-appearance: none;\n}\n\n::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n.button:hover {\n text-decoration: none;\n}\n","/* Basscss Base Forms */\n\ninput,\nselect,\ntextarea,\nfieldset {\n font-size: $form-field-font-size;\n margin-top: 0;\n margin-bottom: $space-1;\n}\n\ninput[type=text],\ninput[type=datetime],\ninput[type=datetime-local],\ninput[type=email],\ninput[type=month],\ninput[type=number],\ninput[type=password],\ninput[type=search],\ninput[type=tel],\ninput[type=time],\ninput[type=url],\ninput[type=week] {\n box-sizing: border-box;\n height: $form-field-height;\n padding: $form-field-padding-y $form-field-padding-x;\n vertical-align: middle;\n -webkit-appearance: none;\n}\n\nselect {\n box-sizing: border-box;\n line-height: 1.75;\n padding: $form-field-padding-y $form-field-padding-x;\n}\n\nselect:not([multiple]) {\n height: $form-field-height;\n vertical-align: middle;\n}\n\ntextarea {\n box-sizing: border-box;\n line-height: 1.75;\n padding: $form-field-padding-y $form-field-padding-x;\n}\n\n.fieldset-reset {\n padding: 0;\n margin-left: 0;\n margin-right: 0;\n border: 0;\n}\n\n.fieldset-reset legend {\n padding: 0;\n}\n","body,\nbutton {\n margin: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n font-family: inherit;\n font-size: 100%;\n}\n\nimg {\n max-width: 100%;\n}\n\nsvg {\n max-height: 100%;\n}\n","/* Basscss Base Typography */\n\nbody {\n font-family: $font-family;\n line-height: $line-height;\n font-size: 100%;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-family: $heading-font-family;\n font-weight: $heading-font-weight;\n line-height: $heading-line-height;\n margin-top: 1em;\n margin-bottom: .5em;\n}\n\np,\ndl,\nol,\nul {\n font-size: $h4;\n margin-top: 0;\n margin-bottom: $space-2;\n}\n\nol,\nul {\n padding-left: $space-3;\n}\n\npre,\ncode,\nsamp {\n font-family: $monospace-font-family;\n font-size: inherit;\n}\n\npre {\n margin-top: 0;\n margin-bottom: $space-2;\n overflow-x: scroll;\n}\n\nhr {\n margin-top: $space-3;\n margin-bottom: $space-3;\n}\n\nblockquote {\n margin-top: $space-3;\n margin-bottom: $space-3;\n margin-left: 0;\n padding-left: $space-2;\n padding-right: $space-2;\n}\n\nblockquote,\nblockquote p {\n font-size: $h3;\n font-style: italic;\n}\n\nh1,\n.h1 {\n font-size: $h1;\n}\n\nh2,\n.h2 {\n font-size: $h2;\n}\n\nh3,\n.h3 {\n font-size: $h3;\n}\n\nh4,\n.h4 {\n font-size: $h4;\n}\n\nh5,\n.h5 {\n font-size: $h5;\n}\n\nh6,\n.h6 {\n font-size: $h6;\n}\n\n.list-reset {\n list-style: none;\n padding-left: 0;\n}\n",".button-blue {\n color: white;\n background-color: $theme-color;\n border-radius: $border-radius;\n transition-duration: .1s;\n transition-timing-function: ease-out;\n transition-property: box-shadow, background-color;\n}\n\n.button-blue:hover {\n opacity: .875;\n}\n\n.button-blue:active,\n.button-blue.is-active {\n box-shadow: inset 0 0 0 32px rgba(#000,.125), inset 0 2px 3px 0 rgba(#000,.25);\n}\n\n.button-blue:focus {\n outline: none;\n box-shadow: 0 0 0 2px rgba(white, .5), 0 0 1px 4px rgba($blue, .5);\n}\n\n.button-blue:disabled,\n.button-blue.is-disabled {\n opacity: .5;\n}\n",".highlight {\n -webkit-text-size-adjust: none;\n}\n\n.highlight .c,\n.highlight .cs,\n.highlight .cm,\n.highlight .cp,\n.highlight .c1 {\n color: $hljs-comment;\n font-style: italic;\n}\n\n.highlight .k,\n.highlight .kc,\n.highlight .kd,\n.highlight .kn,\n.highlight .kr,\n.highlight .kt,\n.highlight .kp {\n color: $hljs-keyword;\n}\n\n.highlight .na,\n.highlight .nb,\n.highlight .nc,\n.highlight .no,\n.highlight .nd,\n.highlight .ni,\n.highlight .ne,\n.highlight .nf,\n.highlight .nl,\n.highlight .nn,\n.highlight .nx {\n color: $hljs-name;\n}\n\n.highlight .mi,\n.highlight .il {\n color: $hljs-number;\n}\n\n.highlight .s,\n.highlight .sb,\n.highlight .sc,\n.highlight .sd,\n.highlight .s2,\n.highlight .s3,\n.highlight .sh,\n.highlight .si,\n.highlight .sx,\n.highlight .sr,\n.highlight .ss,\n.highlight .s1 {\n color: $hljs-string;\n}\n\n.hljs-title,\n.hljs-id,\n.scss .hljs-preprocessor {\n color: $hljs-title;\n font-weight: bold;\n}\n\n.highlight .k {\n font-weight: normal;\n}\n\n.highlight .nc,\n.highlight .no {\n color: $hljs-type;\n}\n\n.highlight .o {\n color: $hljs-tag;\n font-weight: normal;\n}\n\n.highlight .nb {\n color: $hljs-attribute;\n}\n\n.highlight .sr {\n color: $hljs-regexp;\n}\n\n.highlight .ss {\n color: $hljs-symbol;\n}\n\n.hljs-built_in {\n color: $hljs-built-in;\n}\n\n.hljs-preprocessor,\n.hljs-pragma,\n.hljs-pi,\n.hljs-doctype,\n.hljs-shebang,\n.hljs-cdata {\n color: $hljs-preprocessor;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: $hljs-deletion;\n}\n\n.hljs-addition {\n background: $hljs-addition;\n}\n\n.diff .hljs-change {\n background: $hljs-change;\n}\n\n.hljs-chunk {\n color: $hljs-chunk;\n}\n","/* Basscss Color Base */\n\nbody {\n color: $dark-gray;\n background-color: white;\n}\n\na {\n color: $theme-color;\n text-decoration: none;\n}\n\na:hover {\n text-decoration: underline;\n}\n\npre,\ncode {\n background-color: $lighter-gray;\n border-radius: $border-radius;\n}\n\nhr {\n border: 0;\n border-bottom-style: solid;\n border-bottom-width: $border-width;\n border-bottom-color: $border-color;\n}\n","/* Basscss Colors */\n\n.dark-gray {\n color: $dark-gray;\n}\n\n.white {\n color: white;\n}\n\n.blue {\n color: $blue;\n}\n\n.mid-gray {\n color: $mid-gray;\n}\n\n.light-gray {\n color: $light-gray;\n}\n\n.lighter-gray {\n color: $lighter-gray;\n}\n\n.red {\n color: $red;\n}\n\n.green {\n color: $green;\n}\n\n.yellow {\n color: $yellow;\n}\n\n.orange {\n color: $orange;\n}\n\n.bg-dark-gray {\n background-color: $dark-gray;\n}\n\n.bg-white {\n background-color: white;\n}\n\n.bg-blue {\n background-color: $blue;\n}\n\n.bg-mid-gray {\n background-color: $mid-gray;\n}\n\n.bg-light-gray {\n background-color: $light-gray;\n}\n\n.bg-lighter-gray {\n background-color: $lighter-gray;\n}\n\n.bg-red {\n background-color: $red;\n}\n\n.bg-green {\n background-color: $green;\n}\n\n.bg-yellow {\n background-color: $yellow;\n}\n\n.bg-orange {\n background-color: $orange;\n}\n\n.bg-darken-1 {\n background-color: $darken-1;\n}\n\n.bg-darken-2 {\n background-color: $darken-2;\n}\n\n.bg-darken-3 {\n background-color: $darken-3;\n}\n\n.bg-darken-4 {\n background-color: $darken-4;\n}\n","/* Basscss Utility Headings */\n\n.h00 {\n font-size: $h00;\n}\n\n.h0 {\n font-size: $h0;\n}\n\n@media #{$breakpoint-md} {\n .h00-responsive {\n font-size: $h00-responsive;\n }\n\n .h0-responsive {\n font-size: $h0-responsive;\n }\n\n .h1-responsive {\n font-size: $h1-responsive;\n }\n}\n\n@media #{$breakpoint-xl} {\n .h00-responsive {\n font-size: $h00-responsive-max;\n }\n\n .h0-responsive {\n font-size: $h0-responsive-max;\n }\n\n .h1-responsive {\n font-size: $h1-responsive-max;\n }\n}\n","/* Basscss Utility Typography */\n\n.bold {\n font-weight: $bold-font-weight;\n}\n\n.regular {\n font-weight: normal;\n}\n\n.italic {\n font-style: italic;\n}\n\n.caps {\n text-transform: uppercase;\n letter-spacing: .2em;\n}\n\n.left-align {\n text-align: left;\n}\n\n.center {\n text-align: center;\n}\n\n.right-align {\n text-align: right;\n}\n\n.justify {\n text-align: justify;\n}\n\n.nowrap {\n white-space: nowrap;\n}\n","/* Basscss Utility White Space */\n\n.m0 {\n margin: 0;\n}\n\n.mt0 {\n margin-top: 0;\n}\n\n.mr0 {\n margin-right: 0;\n}\n\n.mb0 {\n margin-bottom: 0;\n}\n\n.ml0 {\n margin-left: 0;\n}\n\n.m1 {\n margin: $space-1;\n}\n\n.mt1 {\n margin-top: $space-1;\n}\n\n.mr1 {\n margin-right: $space-1;\n}\n\n.mb1 {\n margin-bottom: $space-1;\n}\n\n.ml1 {\n margin-left: $space-1;\n}\n\n.m2 {\n margin: $space-2;\n}\n\n.mt2 {\n margin-top: $space-2;\n}\n\n.mr2 {\n margin-right: $space-2;\n}\n\n.mb2 {\n margin-bottom: $space-2;\n}\n\n.ml2 {\n margin-left: $space-2;\n}\n\n.m3 {\n margin: $space-3;\n}\n\n.mt3 {\n margin-top: $space-3;\n}\n\n.mr3 {\n margin-right: $space-3;\n}\n\n.mb3 {\n margin-bottom: $space-3;\n}\n\n.ml3 {\n margin-left: $space-3;\n}\n\n.m4 {\n margin: $space-4;\n}\n\n.mt4 {\n margin-top: $space-4;\n}\n\n.mr4 {\n margin-right: $space-4;\n}\n\n.mb4 {\n margin-bottom: $space-4;\n}\n\n.ml4 {\n margin-left: $space-4;\n}\n\n.mxn1 {\n margin-left: -$space-1;\n margin-right: -$space-1;\n}\n\n.mxn2 {\n margin-left: -$space-2;\n margin-right: -$space-2;\n}\n\n.mxn3 {\n margin-left: -$space-3;\n margin-right: -$space-3;\n}\n\n.mxn4 {\n margin-left: -$space-4;\n margin-right: -$space-4;\n}\n\n.mx-auto {\n margin-left: auto;\n margin-right: auto;\n}\n\n.p1 {\n padding: $space-1;\n}\n\n.py1 {\n padding-top: $space-1;\n padding-bottom: $space-1;\n}\n\n.px1 {\n padding-left: $space-1;\n padding-right: $space-1;\n}\n\n.p2 {\n padding: $space-2;\n}\n\n.py2 {\n padding-top: $space-2;\n padding-bottom: $space-2;\n}\n\n.px2 {\n padding-left: $space-2;\n padding-right: $space-2;\n}\n\n.p3 {\n padding: $space-3;\n}\n\n.py3 {\n padding-top: $space-3;\n padding-bottom: $space-3;\n}\n\n.px3 {\n padding-left: $space-3;\n padding-right: $space-3;\n}\n\n.p4 {\n padding: $space-4;\n}\n\n.py4 {\n padding-top: $space-4;\n padding-bottom: $space-4;\n}\n\n.px4 {\n padding-left: $space-4;\n padding-right: $space-4;\n}\n","@charset \"UTF-8\";\n\nhtml, body {\n height: auto;\n min-height: 100%;\n -webkit-text-size-adjust: 100%;\n}\n\nimg {\n max-width: none;\n}\n\nem img {\n max-width: 100%;\n margin-left: 0;\n}\n\nbody {\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n -webkit-box-sizing: border-box;\n}\n\n.wrapper {\n max-width: -webkit-calc(#{$content-width} - (#{$horizontal-spacing-unit}));\n max-width: calc(#{$content-width} - (#{$horizontal-spacing-unit}));\n margin-right: auto;\n margin-left: auto;\n padding-right: calc($horizontal-spacing-unit / 2);\n padding-left: calc($horizontal-spacing-unit / 2);\n @extend .clearfix;\n\n @media screen and (min-width: $on-large) {\n max-width: -webkit-calc(#{$content-width} - (#{$horizontal-spacing-unit} * 2));\n max-width: calc(#{$content-width} - (#{$horizontal-spacing-unit} * 2));\n padding-right: $horizontal-spacing-unit;\n padding-left: $horizontal-spacing-unit;\n }\n}\n",".clearfix:before, .clearfix:after {\n content: ' ';\n display: table;\n}\n\n.clearfix:after {\n clear: both;\n}\n",".left {\n float: left;\n}\n\n.right {\n float: right;\n}\n",".site-header {\n border-bottom: 1px solid $grey-color-light;\n background-color: white;\n opacity: 0.95;\n position:fixed;\n left:0px;\n top:0px;\n width:100%;\n z-index: 50;\n\n a {\n font-size: 16px;\n }\n}\n\n.site-title a {\n font-family: \"Roboto\", Helvetica;\n font-size: 20px;\n line-height: $nav-height;\n // letter-spacing: -1px;\n margin-bottom: 0;\n}\n.site-nav {\n float: right;\n line-height: $nav-height;\n\n .nav-trigger {\n display: none;\n }\n\n .menu-icon {\n display: none;\n }\n\n .page-link{\n line-height: $line-height;\n // Gaps between nav items, but not on the first one\n &:not(:first-child) {\n margin-left: 10px;\n }\n }\n // added for hamburger\n @include media-query($on-palm) {\n position: absolute;\n top: 9px;\n right: calc($horizontal-spacing-unit / 2);\n background-color: $background-color;\n border: 1px solid $grey-color-light;\n border-radius: 5px;\n text-align: right;\n\n label[for=\"nav-trigger\"] {\n display: block;\n float: right;\n width: 36px;\n height: 36px;\n z-index: 2;\n cursor: pointer;\n }\n\n .menu-icon {\n display: block;\n float: right;\n width: 36px;\n height: 26px;\n line-height: 0;\n padding-top: 10px;\n text-align: center;\n\n > svg path {\n fill: $grey-color-dark;\n }\n }\n\n input ~ .trigger {\n clear: both;\n display: none;\n }\n\n input:checked ~ .trigger {\n display: block;\n padding-bottom: 5px;\n }\n\n .page-link {\n display: block;\n padding: 5px 10px;\n\n &:not(:last-child) {\n margin-right: 0;\n }\n margin-left: 10px;\n }\n }\n}\n\n.header-bar {\n border-bottom: 1px solid $light-gray;\n font-size: 20px;\n display: block;\n opacity: 0.75;\n width: 100%;\n text-align: center;\n padding-top: 25px;\n padding-bottom: $space-4;\n line-height: 3em;\n z-index: 25;\n h1{\n color: $theme-color;\n font-size:75px;\n }\n h2{\n font-size:25px;\n }\n}\n",".site-footer {\n border-top: 1px solid $grey-color-light;\n padding: $vertical-spacing-unit 0;\n\n a {\n color: $theme-color;\n i { color: $text-color; }\n\n &:hover {\n text-decoration: underline;\n i { color: $theme-color; }\n }\n }\n\n ul {\n padding-left: 0;\n }\n}\n\n.footer-heading {\n font-size: 1.125rem;\n margin-bottom: -webkit-calc($vertical-spacing-unit / 2);\n}\n\n.contact-list,\n.social-media-list {\n list-style: none;\n margin-left: 0;\n}\n\n.footer-col-wrapper {\n color: $grey-color;\n font-size: 0.9375;\n margin-left: -webkit-calc(-$horizontal-spacing-unit / 2);\n @extend .clearfix;\n}\n\n.footer-col {\n width: -webkit-calc(100% - (#{$horizontal-spacing-unit} / 2));\n width: calc(100% - (#{$horizontal-spacing-unit} / 2));\n margin-bottom: calc($vertical-spacing-unit / 2);\n padding-left: calc($horizontal-spacing-unit / 2);\n}\n\n.footer-col-1,\n.footer-col-2 {\n width: -webkit-calc(50% - (#{$horizontal-spacing-unit} / 2));\n width: calc(50% - (#{$horizontal-spacing-unit} / 2));\n}\n\n.footer-col-3 {\n width: -webkit-calc(100% - (#{$horizontal-spacing-unit} / 2));\n width: calc(100% - (#{$horizontal-spacing-unit} / 2));\n}\n\n@media screen and (min-width: $on-large) {\n .footer-col-1 {\n width: -webkit-calc(35% - (#{$horizontal-spacing-unit} / 2));\n width: calc(35% - (#{$horizontal-spacing-unit} / 2));\n }\n\n .footer-col-2 {\n width: -webkit-calc(20% - (#{$horizontal-spacing-unit} / 2));\n width: calc(20% - (#{$horizontal-spacing-unit} / 2));\n }\n\n .footer-col-3 {\n width: -webkit-calc(45% - (#{$horizontal-spacing-unit} / 2));\n width: calc(45% - (#{$horizontal-spacing-unit} / 2));\n }\n}\n\n@media screen and (min-width: $on-medium) {\n .footer-col {\n float: left;\n }\n}\n",".page-content {\n padding: 100px 0; /* VERTICAL PADDING FOR TITLE ON EVERY PAGE */\n}\n.page-heading {\n font-size: 20px;\n}\n.contacticon {\n display: block;\n font-size: 60px;\n margin: 10px;\n}\n.center{\n text-align: center;\n}\n\n// Schedule.\ntr.past {\n// color: #999;\n}\nspan.event {\n color: $dark-green;\n}\nspan.deadline {\n color: $red;\n}\n\nreading.important {\n\tcolor: $dark-green;\n}\n",".post-header {\n margin-bottom: $vertical-spacing-unit;\n}\n.post-list {\n margin: 0;\n padding: 0;\n list-style: none;\n\n > li {\n border-bottom: 1px solid $grey-color-light;\n padding-bottom: $space-3;\n padding-top: $space-3;\n\n h2 {\n margin-top: 0.2em;\n }\n p {\n margin-top: 0.1em;\n }\n }\n}\n.post-title {\n font-size: 42px;\n letter-spacing: -1px;\n line-height: 1;\n margin-bottom: 10px;\n margin-top: 0;\n // @include media-query($on-laptop) {\n // font-size: 36px;\n // }\n b {\n color: $theme-color;\n }\n}\n.post-description {\n font-size: 20px;\n letter-spacing: -1px;\n line-height: 1;\n margin-bottom: 10px;\n margin-top: 0;\n}\n.post-content {\n h2 {\n font-size: 42px;\n // @include media-query($on-laptop) {\n // font-size: 28px;\n // }\n }\n h3 {\n font-size: 30px;\n // @include media-query($on-laptop) {\n // font-size: 22px;\n // }\n }\n h4 {\n font-size: 20px;\n // @include media-query($on-laptop) {\n // font-size: 18px;\n // }\n }\n}\n.post-meta {\n color: $grey-color;\n font-size: $small-font-size;\n margin-bottom: 0px;\n}\n.post-link {\n display: block;\n font-size: 42px;\n}\n#markdown-toc {\n list-style: none;\n padding-left: 0;\n li > ul {\n margin-bottom: 0;\n }\n}\n",".logo {\n float: left;\n margin-right: 20px;\n padding-bottom: 15px;\n width: 120px;\n}\n\n.about {\n .post-title {\n padding-top: 20px;\n }\n .post-description {\n font-size: 20px;\n }\n}\n\n.instructors {\n padding: 0 0 0 1%;\n}\n\n%instructor-profile {\n display: block;\n float: left;\n height: 210px;\n\n @media screen and (min-width: 676px) {\n height: 130px;\n }\n\n img {\n border-radius: 50%;\n float: left;\n object-fit: cover;\n height: 100px;\n width: 100px;\n margin-right: 10px;\n }\n\n ul.instructor-info {\n display: block;\n float: left;\n list-style-type: none;\n padding-left: 0;\n width: 65%;\n width: -webkit-calc(100% - 130px);\n width: calc(100% - 130px);\n min-width: 210px;\n\n a {\n color: $theme-color;\n &:hover {\n text-decoration: underline;\n }\n }\n\n span {\n font-weight: 400;\n }\n }\n}\n.instructor-profile-two-col {\n @extend %instructor-profile;\n width: 50%;\n}\n.instructor-profile-three-col {\n @extend %instructor-profile;\n width: 33%;\n}\n\n.news {\n border-top: 1px solid $grey-color-light;\n margin-top: 30px;\n padding-top: 20px;\n\n h2 {\n font-weight: bold;\n margin-top: 0;\n margin-bottom: 10px;\n }\n table {\n border-collapse: collapse;\n width: 100%;\n\n .date { width: 19%; }\n .announcement { width: 81%; }\n\n tr { text-align: left; }\n td {\n padding: 6px 0;\n vertical-align: top;\n border: none;\n }\n }\n}\n",".pagination {\n font-size: 1rem;\n font-family: 'Lato', 'Helvetica Neue', Helvetica, sans-serif;\n font-weight: 400;\n text-align: center;\n}\n\n@media\n(-webkit-min-device-pixel-ratio: 2),\n(min-resolution: 192dpi) {\n .pagination {\n font-weight: 100;\n }\n}\n\n.pagination a, .pagination .disabled {\n -webkit-transition: all 0.2s ease-in-out;\n -moz-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n background: #fafafa;\n border-radius: 0.1875em;\n border: 1px solid #f3f3f3;\n color: #333333;\n padding: 1em 1.5em;\n}\n\n.pagination .disabled, .pagination .pagination-meta {\n opacity: 0.5;\n}\n\n.pagination .pagination-meta {\n overflow: hidden;\n}\n\n.pagination a:hover, .pagination a:focus {\n background: white;\n color: $theme-color;\n}\n\n.pagination a:active {\n background: #f7f7f7;\n}\n\n.pagination .button {\n font-size: 1rem;\n font-weight: 300;\n letter-spacing: 1px;\n}\n\n.button-disabled {\n opacity: 0.55;\n background-color: #999;\n}\n\n.button-disabled:hover,\n.button-disabled:active,\n.button-disabled:focus {\n cursor: not-allowed;\n background-color: #999;\n}\n",".publications {\n h2 {\n color: $theme-color;\n // border-bottom: 1px solid $theme-color;\n // border-top: 1px solid $theme-color;\n font-size: 32px;\n margin-bottom: 30px;\n // padding: 20px 0;\n text-align: center;\n }\n}\n.year {\n border-top: 1px solid $light-gray;\n color: $light-gray;\n margin: 0 -3em -2.5ex -2em;\n padding-top: 1ex;\n text-align: right;\n}\n.bibliography {\n margin-bottom: 50px;\n margin-top: 20px;\n list-style-type: circle;\n\n li {\n margin: 10px 0;\n position: relative;\n\n span { display: block; }\n .title { font-weight: bolder; }\n .author {\n a {\n border-bottom: 1px dashed $theme-color;\n &:hover {\n border-bottom-style: solid;\n text-decoration: none;\n }\n }\n > em {\n border-bottom: 1px solid;\n font-style: normal;\n }\n }\n a.abstract, a.bibtex { cursor: pointer; }\n .hidden {\n font-size: $small-font-size;\n max-height: 0px;\n overflow: hidden;\n text-align: justify;\n -webkit-transition: 0.15s ease;\n -moz-transition: 0.15s ease;\n -ms-transition: 0.15s ease;\n -o-transition: 0.15s ease;\n transition: all 0.15s ease;\n\n p {\n line-height: 1.4em;\n margin: 10px;\n }\n pre {\n font-size: 1em;\n line-height: 1.4em;\n padding: 10px;\n }\n }\n .hidden.open {\n max-height: 100em;\n -webkit-transition: 0.15s ease;\n -moz-transition: 0.15s ease;\n -ms-transition: 0.15s ease;\n -o-transition: 0.15s ease;\n transition: all 0.15s ease;\n }\n span.abstract.hidden {\n border: dashed 1px $background-color;\n }\n span.abstract.hidden.open {\n border-color: $grey-color;\n }\n }\n abbr {\n position: absolute;\n left: -7em;\n }\n }\n.star {\n color: $theme-color;\n font-style: normal;\n}\n","blockquote {\n border-left: 5px solid #7a7a7a;\n font-style: italic;\n margin-left: $space-1;\n padding: $space-1;\n\n p {\n margin: 0;\n }\n}\n\nblockquote footer {\n background-color: #fff;\n border-color: transparent;\n color: #7a7a7a;\n font-size: .85rem;\n font-style: normal;\n text-align: left;\n padding: 0;\n}\n","pre,\npre code {\n background-color: transparent;\n border-radius: $pre-border-radius;\n}\n\npre,\ncode {\n font-family: $monospace-font-family;\n}\n\ncode {\n color: $code-color;\n font-size: 85%;\n padding-bottom: 0.1em;\n padding-left: 0.2em;\n padding-right: 0.2em;\n padding-top: 0.1em;\n}\n\npre {\n padding: 1.125em;\n line-height: 1.11;\n overflow-x: scroll;\n margin-bottom: 0.88em;\n background-color: $pre-background-color;\n}\n\n.highlight .p {\n font-size: 1.125rem;\n line-height: 1;\n}\n\npre {\n counter-reset: line-numbering;\n white-space: pre;\n overflow-x: auto;\n word-break: inherit;\n word-wrap: inherit;\n}\n\npre a {\n background-image: none;\n}\n\npre a::before {\n content: counter(line-numbering);\n counter-increment: line-numbering;\n padding-right: 1em; /* space after numbers */\n width: 25px;\n text-align: right;\n opacity: 0.7;\n display: inline-block;\n color: $light-gray;\n margin-right: 16px;\n font-size: 13px;\n -webkit-touch-callout: none;\n -webkit-user-select: none;\n -khtml-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\npre a:first-of-type::before {\n padding-top: 10px;\n}\n\npre a:last-of-type::before {\n padding-bottom: 10px;\n}\n\npre a:only-of-type::before {\n padding: 10px;\n}\n",".row {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: center;\n}\n.col {\n display: inline-block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n box-sizing:border-box;\n padding: $img-spacing;\n}\n\n.one {\n width:33%;\n}\n.two {\n width: 66%;\n}\n.three {\n width: 100%;\n}\n\nfigcaption {\n text-align: center;\n}\n",".gist,\n.gist .highlight .p {\n font-size: .75rem;\n}\n\n.gist .lines {\n width: 100%;\n}\n","a {\n color: $text-color;\n text-decoration: none;\n\n &:hover {\n color: $theme-color;\n text-decoration: none;\n }\n}\n\narticle a, .news a {\n color: $theme-color;\n\n &:hover {\n text-decoration: underline;\n }\n}\n\n.social a {\n color: $text-color;\n\n &:hover { color: $theme-color; }\n}\n\n\n// a {\n// color: $link-color;\n// background-image: linear-gradient(to top,\n// rgba(0,0,0,0) 13%,\n// rgba($link-color,.8) 13%,\n// rgba($link-color,.8) 18%,\n// rgba(0,0,0,0) 17%\n// );\n// text-shadow: white 1px 0px 0px, white -1px 0px 0px;\n// }\n//\n// a:hover,\n// a:focus,\n// a:active {\n// border: 0;\n// color: $link-hover-color;\n// text-decoration: none;\n// background-image: linear-gradient(to top,\n// rgba(0,0,0,0) 13%,\n// rgba($link-hover-color,.8) 13%,\n// rgba($link-hover-color,.8) 17%,\n// rgba(0,0,0,0) 17%\n// );\n// text-shadow: white 1px 0px 0px, white -1px 0px 0px;\n// }\n//\n// // Correct issues with buttons\n// button,\n// .button {\n// text-shadow: none;\n// background-image: none;\n// }\n//\n// .button:hover,\n// .button:focus,\n// .button:active {\n// color: white;\n// text-shadow: none;\n// background-image: none;\n// }\n//\n// .anchorjs-link {\n// text-shadow: none;\n// background-image: none;\n// }\n// .anchorjs-link:hover,\n// .anchorjs-link:focus,\n// .anchorjs-link:active{\n// border: 0;\n// color: $link-hover-color;\n// text-shadow: none;\n// background-image: none;\n// }\n",".measure {\n margin: 0 auto;\n max-width: $measure-width;\n}\n","/*\n Table styles copied from Bootstrap\n Copyright (c) 2018 Twitter, Inc\n*/\n\ntable {\n background-color: $table-bg;\n\n // Table cell sizing\n //\n // Reset default table behavior\n\n col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-column;\n float: none;\n }\n\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n display: table-cell;\n float: none;\n }\n }\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $light-gray;\n text-align: left;\n}\n\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: $line-height-computed;\n border-collapse: collapse;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-cell-padding;\n line-height: $line-height;\n vertical-align: top;\n border-top: 1px solid $table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid $table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid $table-border-color;\n }\n\n // Nesting\n .table {\n background-color: $background-color;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: $table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid $table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid $table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: $table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: $table-bg-hover;\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n@mixin table-row-variant($state, $background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.#{$state},\n > th.#{$state},\n &.#{$state} > td,\n &.#{$state} > th {\n background-color: $background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.#{$state}:hover,\n > th.#{$state}:hover,\n &.#{$state}:hover > td,\n &:hover > .#{$state},\n &.#{$state}:hover > th {\n background-color: darken($background, 5%);\n }\n }\n}\n\n\n// Generate the contextual variants\n@include table-row-variant('active', $table-bg-active);\n@include table-row-variant('success', $state-success-bg);\n@include table-row-variant('info', $state-info-bg);\n@include table-row-variant('warning', $state-warning-bg);\n@include table-row-variant('danger', $state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n overflow-x: auto;\n\n @media screen and (max-width: $screen-xs-max) {\n width: 100%;\n margin-bottom: ($line-height-computed * .75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid $table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","html {\n font-size: $base-font-size;\n}\n\nbody {\n color: $text-color;\n}\n\nabbr {\n border-bottom: $abbr-border-bottom;\n cursor: help;\n}\n\np {\n color: #333;\n // line-height: 1.5;\n}\n\nh1, h2, h3, h4, h5, h6 {\n font-weight: 400;\n}\n\n@media\n(-webkit-min-device-pixel-ratio: 2),\n(min-resolution: 192dpi) {\n body {\n // font-weight: 100;\n }\n h1, h2, h3, h4, h5, h6 {\n // font-weight: 100;\n }\n}\n\nsmall,\n.small {\n font-size: 0.707rem;\n}\n\nsup {\n position: relative;\n vertical-align: middle;\n top: -0.9ex;\n}\n\ndiv.equation {\n margin: $space-1 0;\n text-align: center;\n}\n\nlatex-js {\n display: block;\n margin-bottom: -webkit-calc(#{$vertical-spacing-unit} / 2);\n margin-bottom: calc(#{$vertical-spacing-unit} / 2);\n}\n"],"file":"main.css"}
assets/css/print.css ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .container {
2
+ -moz-column-count: 2;
3
+ -webkit-column-count: 2;
4
+ column-count: 2;
5
+
6
+ font-size: 0.8em;
7
+ }
8
+
9
+ .header {
10
+ display: none;
11
+ }
12
+
13
+ h2 {
14
+ font-size: 1.3em;
15
+ margin: 0;
16
+ }
17
+ h3 {
18
+ font-size: 1.2em;
19
+ margin-top: 0;
20
+ }
21
+
22
+ .noprint {
23
+ display: none;
24
+ }
25
+
26
+ body {
27
+ padding: -2em 0 0 0;
28
+ }
29
+
30
+ /* Disable Bootstrap's link display. */
31
+ @media print {
32
+ a:link:after,
33
+ a:visited:after {
34
+ content: "" !important;
35
+ }
36
+ }
assets/css/profile.scss ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .logo {
2
+ float: left;
3
+ margin-right: 20px;
4
+ padding-bottom: 15px;
5
+ width: 120px;
6
+ }
7
+
8
+ .about {
9
+ .post-title {
10
+ padding-top: 20px;
11
+ }
12
+ .post-description {
13
+ font-size: 20px;
14
+ }
15
+ }
16
+
17
+ .instructors {
18
+ padding: 0 0 0 1%;
19
+ }
20
+
21
+ %instructor-profile {
22
+ display: block;
23
+ float: left;
24
+ height: 210px;
25
+
26
+ @media screen and (min-width: 676px) {
27
+ height: 130px;
28
+ }
29
+
30
+ img {
31
+ border-radius: 50%;
32
+ float: left;
33
+ object-fit: cover;
34
+ height: 100px;
35
+ width: 100px;
36
+ margin-right: 10px;
37
+ }
38
+
39
+ ul.instructor-info {
40
+ display: block;
41
+ float: left;
42
+ list-style-type: none;
43
+ padding-left: 0;
44
+ width: 65%;
45
+ width: -webkit-calc(100% - 130px);
46
+ width: calc(100% - 130px);
47
+ min-width: 210px;
48
+
49
+ a {
50
+ color: $theme-color;
51
+ &:hover {
52
+ text-decoration: underline;
53
+ }
54
+ }
55
+
56
+ span {
57
+ font-weight: 400;
58
+ }
59
+ }
60
+ }
61
+ .instructor-profile-two-col {
62
+ @extend %instructor-profile;
63
+ width: 50%;
64
+ }
65
+ .instructor-profile-three-col {
66
+ @extend %instructor-profile;
67
+ width: 33%;
68
+ }
69
+
70
+ .news {
71
+ border-top: 1px solid $grey-color-light;
72
+ margin-top: 30px;
73
+ padding-top: 20px;
74
+
75
+ h2 {
76
+ font-weight: bold;
77
+ margin-top: 0;
78
+ margin-bottom: 10px;
79
+ }
80
+ table {
81
+ border-collapse: collapse;
82
+ width: 100%;
83
+
84
+ .date { width: 19%; }
85
+ .announcement { width: 81%; }
86
+
87
+ tr { text-align: left; }
88
+ td {
89
+ padding: 6px 0;
90
+ vertical-align: top;
91
+ border: none;
92
+ }
93
+ }
94
+ }
assets/img/logo/catalyst.svg ADDED
assets/img/logo/mlc-favicon.png ADDED
assets/img/logo/mlc-favicon.svg ADDED
assets/img/logo/mlc-logo-with-text-landscape.svg ADDED
assets/img/logo/mlc-logo-with-text-potrait.svg ADDED
assets/img/logo/mlc-logo.svg ADDED
assets/js/srcset-polyfill.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function(window, document) {
2
+ // Test if it already supports srcset
3
+ if ('srcset' in document.createElement('img'))
4
+ return true;
5
+
6
+ // We want to get the device pixel ratio
7
+ var maxWidth = (window.innerWidth > 0) ? window.innerWidth : screen.width,
8
+ maxHeight = (window.innerHeight > 0) ? window.innerHeight : screen.height,
9
+ maxDensity = window.devicePixelRatio || 1;
10
+
11
+ // Implement srcset
12
+ function srcset(image) {
13
+ if (!image.attributes['srcset']) return false;
14
+
15
+ var candidates = image.attributes['srcset'].nodeValue.split(',');
16
+
17
+ for (var i = 0; i < candidates.length; i++) {
18
+ // The following regular expression was created based on the rules
19
+ // in the srcset W3C specification available at:
20
+ // http://www.w3.org/html/wg/drafts/srcset/w3c-srcset/
21
+
22
+ var descriptors = candidates[i].match(
23
+ /^\s*([^\s]+)\s*(\s(\d+)w)?\s*(\s(\d+)h)?\s*(\s(\d+)x)?\s*$/
24
+ ),
25
+ filename = descriptors[1],
26
+ width = descriptors[3] || false,
27
+ height = descriptors[5] || false,
28
+ density = descriptors[7] || 1;
29
+
30
+ if (width && width > maxWidth) {
31
+ continue;
32
+ }
33
+
34
+ if (height && height > maxHeight) {
35
+ continue;
36
+ }
37
+
38
+ if (density && density > maxDensity) {
39
+ continue;
40
+ }
41
+
42
+ image.src = filename;
43
+ }
44
+ }
45
+
46
+
47
+ var images = document.getElementsByTagName('img');
48
+
49
+ for (var i=0; i < images.length; i++) {
50
+ srcset(images[i]);
51
+ }
52
+ })(window, document);
dist/scheduler_dpm_solver_multistep_consts.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"num_steps": 20, "timesteps": [999, 949, 899, 849, 799, 749, 699, 649, 599, 549, 500, 450, 400, 350, 300, 250, 200, 150, 100, 50], "alpha": [0.06826484948396683, 0.09132416546344757, 0.11957696825265884, 0.15337182581424713, 0.19285990297794342, 0.23795674741268158, 0.2883196771144867, 0.3433447778224945, 0.40218454599380493, 0.4637857675552368, 0.5256734490394592, 0.5891048908233643, 0.6515234112739563, 0.7116790413856506, 0.7684406638145447, 0.8208486437797546, 0.8681542873382568, 0.9098414778709412, 0.9456337690353394, 0.9754879474639893], "sigma": [0.9976672530174255, 0.9958212375640869, 0.992824912071228, 0.9881685376167297, 0.9812262654304504, 0.9712757468223572, 0.9575341939926147, 0.9392094016075134, 0.9155586361885071, 0.8859473466873169, 0.8506864309310913, 0.8080565929412842, 0.7586284875869751, 0.7025047540664673, 0.6399210095405579, 0.5711457133293152, 0.49629440903663635, 0.4149560332298279, 0.32523342967033386, 0.2200527936220169], "c0": [0.9981496930122375, 0.9969910979270935, 0.9953099489212036, 0.992974579334259, 0.9898591041564941, 0.985852062702179, 0.9808624982833862, 0.9748184084892273, 0.9676576852798462, 0.960199773311615, 0.9498876929283142, 0.9388309121131897, 0.9260194897651672, 0.9109134078025818, 0.892525315284729, 0.8689453601837158, 0.8361086249351501, 0.7837780714035034, 0.6765995621681213, 0.13249154388904572], "c1": [-0.02318562626614895, -0.028527581224710996, -0.03435566942226309, -0.04056558166872115, -0.04705262132118193, -0.05372950258841769, -0.06054283402426108, -0.06748573151588033, -0.07460878137091953, -0.08034647749542145, -0.08977411756092124, -0.0984535236048174, -0.10835567344451746, -0.12016265751299215, -0.1349958900521564, -0.1548817088268919, -0.18397015967046215, -0.23251993488717204, -0.33567261104184354, -0.8703310286580503], "c2": [-0.0, -0.013274425785712704, -0.015983379825509483, -0.01888663056503964, -0.021949103373245574, -0.02514693453537283, -0.02847455178372373, -0.03194980659311115, -0.035620436092675394, -0.03799332564902366, -0.04474203453918037, -0.04877819872352441, -0.054622536837881146, -0.06185278299586472, -0.07132133634917931, -0.08469463851628699, -0.10574352838590163, -0.14524374399328674, -0.25082478296787, -2.1106579070603653]}
dist/scheduler_pndm_consts.json ADDED
@@ -0,0 +1 @@
 
 
1
+ {"num_steps": 51, "timesteps": [981, 961, 961, 941, 921, 901, 881, 861, 841, 821, 801, 781, 761, 741, 721, 701, 681, 661, 641, 621, 601, 581, 561, 541, 521, 501, 481, 461, 441, 421, 401, 381, 361, 341, 321, 301, 281, 261, 241, 221, 201, 181, 161, 141, 121, 101, 81, 61, 41, 21, 1], "sample_coeff": [1.1228517047631834, 1.1228517047631834, 1.1189641097639456, 1.115149713566296, 1.1114078754577807, 1.107737716496504, 1.1041387098599826, 1.1006100913429304, 1.09715112758965, 1.0937614985270305, 1.0904402109028133, 1.0871868493850396, 1.0840008158768684, 1.0808814925731884, 1.077828297354115, 1.0748405182994067, 1.0719178127268951, 1.069059710773575, 1.0662655580376135, 1.063534793713238, 1.060866952160141, 1.0582618333788902, 1.055718433769081, 1.0532366911298305, 1.050816248200995, 1.0484564493800603, 1.0461566795013, 1.0439169927169045, 1.0417366894392754, 1.039615397955806, 1.0375529631918665, 1.0355488158747077, 1.0336026030584455, 1.031714074879461, 1.0298827384197773, 1.0281083195501388, 1.026390823106631, 1.0247294883117681, 1.0231242392041378, 1.0215749317531844, 1.0200811781088532, 1.0186425205006113, 1.0172589583134881, 1.015930129945295, 1.0146558979777156, 1.0134359978339171, 1.0122702726490174, 1.0111584971634284, 1.0101000824054638, 1.0090955506857704, 1.0004276314965599], "alpha_diff": [0.001506224274635315, 0.001506224274635315, 0.001835579052567482, 0.0022205980494618416, 0.0026669828221201897, 0.0031802672892808914, 0.003765646368265152, 0.004427792504429817, 0.00517064705491066, 0.005997246131300926, 0.00690947100520134, 0.00790790468454361, 0.00899164006114006, 0.010158117860555649, 0.011403024196624756, 0.012720189988613129, 0.014101624488830566, 0.015537485480308533, 0.017016135156154633, 0.018524274230003357, 0.0200471431016922, 0.021568894386291504, 0.023072347044944763, 0.024540066719055176, 0.025954142212867737, 0.027296632528305054, 0.028549939393997192, 0.029697567224502563, 0.030723780393600464, 0.031614452600479126, 0.032357245683670044, 0.03294166922569275, 0.03335946798324585, 0.03360486030578613, 0.03367418050765991, 0.03356659412384033, 0.033284008502960205, 0.03282970190048218, 0.03221023082733154, 0.031433939933776855, 0.030511140823364258, 0.029453277587890625, 0.028274118900299072, 0.026988089084625244, 0.02561044692993164, 0.024157404899597168, 0.022645115852355957, 0.02109009027481079, 0.01950782537460327, 0.017915308475494385, 0.0008539557456970215], "model_output_denom_coeff": [0.01222068621450562, 0.01222068621450562, 0.015366698260035033, 0.019186150992539036, 0.023787599758147353, 0.02928872336253457, 0.03581519603230656, 0.04349904773681176, 0.052476468617807304, 0.06288502640175442, 0.0748603172043994, 0.08853199617649707, 0.10401935532102247, 0.12142643369767858, 0.14083679517302078, 0.16230814546308842, 0.1858669474467074, 0.21150331407016146, 0.23916624809193998, 0.2687595144315127, 0.30013840592168145, 0.3331076625073596, 0.3674206423419132, 0.4027794894608956, 0.438837549425542, 0.47520260258787916, 0.511441700162118, 0.5470874666760965, 0.5816458225740595, 0.614604047076579, 0.6454400185429159, 0.6736316097995951, 0.6986659052244942, 0.7200481238275692, 0.7373097062338558, 0.7500147924046985, 0.7577652215212829, 0.7602032565167969, 0.7570105668279064, 0.7479043101265495, 0.7326274097678189, 0.7109320500233581, 0.6825514704719151, 0.6471538154118119, 0.604262198801889, 0.5531050959646842, 0.4923031682609385, 0.4190828645859549, 0.3265742316873764, 0.1790392127075935, 0.07033200031579206]}
dist/stable_diffusion.js ADDED
@@ -0,0 +1,615 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Wrapper to handle PNDM scheduler
3
+ */
4
+ class TVMPNDMScheduler {
5
+ constructor(schedulerConsts, latentShape, tvm, device, vm) {
6
+ this.timestep = [];
7
+ this.sampleCoeff = [];
8
+ this.alphaDiff = [];
9
+ this.modelOutputDenomCoeff = [];
10
+ this.ets = [];
11
+ this.schedulerFunc = [];
12
+ this.currSample = undefined;
13
+ this.tvm = tvm;
14
+
15
+ // prebuild constants
16
+ // principle: always detach for class members
17
+ // to avoid recycling output scope.
18
+ function loadConsts(output, dtype, input) {
19
+ for (let t = 0; t < input.length; ++t) {
20
+ output.push(
21
+ tvm.detachFromCurrentScope(
22
+ tvm.empty([], dtype, device).copyFrom([input[t]])
23
+ )
24
+ );
25
+ }
26
+ }
27
+ loadConsts(this.timestep, "int32", schedulerConsts["timesteps"]);
28
+ loadConsts(this.sampleCoeff, "float32", schedulerConsts["sample_coeff"]);
29
+ loadConsts(this.alphaDiff, "float32", schedulerConsts["alpha_diff"]);
30
+ loadConsts(
31
+ this.modelOutputDenomCoeff, "float32",
32
+ schedulerConsts["model_output_denom_coeff"]);
33
+
34
+ for (let i = 0; i < 4; ++i) {
35
+ this.ets.push(
36
+ this.tvm.detachFromCurrentScope(
37
+ this.tvm.empty(latentShape, "float32", device)
38
+ )
39
+ );
40
+ }
41
+
42
+ for (let i = 0; i < 5; ++i) {
43
+ this.schedulerFunc.push(
44
+ tvm.detachFromCurrentScope(
45
+ vm.getFunction("pndm_scheduler_step_" + i.toString())
46
+ )
47
+ );
48
+ }
49
+ }
50
+
51
+ dispose() {
52
+ for (let t = 0; t < this.timestep.length; ++t) {
53
+ this.timestep[t].dispose();
54
+ this.sampleCoeff[t].dispose();
55
+ this.alphaDiff[t].dispose();
56
+ this.modelOutputDenomCoeff[t].dispose();
57
+ }
58
+
59
+ for (let i = 0; i < this.schedulerFunc.length; ++i) {
60
+ this.schedulerFunc[i].dispose();
61
+ }
62
+
63
+ if (this.currSample) {
64
+ this.currSample.dispose();
65
+ }
66
+ for (let i = 0; i < this.ets.length; ++i) {
67
+ this.ets[i].dispose();
68
+ }
69
+ }
70
+
71
+ step(modelOutput, sample, counter) {
72
+ // keep running history of last four inputs
73
+ if (counter != 1) {
74
+ this.ets.shift();
75
+ this.ets.push(this.tvm.detachFromCurrentScope(
76
+ modelOutput
77
+ ));
78
+ }
79
+ if (counter == 0) {
80
+ this.currSample = this.tvm.detachFromCurrentScope(
81
+ sample
82
+ );
83
+ } else if (counter == 1) {
84
+ sample = this.tvm.attachToCurrentScope(this.currSample);
85
+ this.currSample = undefined;
86
+ }
87
+
88
+ const findex = counter < 4 ? counter : 4;
89
+ const prevLatents = this.schedulerFunc[findex](
90
+ sample,
91
+ modelOutput,
92
+ this.sampleCoeff[counter],
93
+ this.alphaDiff[counter],
94
+ this.modelOutputDenomCoeff[counter],
95
+ this.ets[0],
96
+ this.ets[1],
97
+ this.ets[2],
98
+ this.ets[3]
99
+ );
100
+ return prevLatents;
101
+ }
102
+ }
103
+
104
+ /**
105
+ * Wrapper to handle multistep DPM-solver scheduler
106
+ */
107
+ class TVMDPMSolverMultistepScheduler {
108
+ constructor(schedulerConsts, latentShape, tvm, device, vm) {
109
+ this.timestep = [];
110
+ this.alpha = [];
111
+ this.sigma = [];
112
+ this.c0 = [];
113
+ this.c1 = [];
114
+ this.c2 = [];
115
+ this.lastModelOutput = undefined;
116
+ this.convertModelOutputFunc = undefined;
117
+ this.stepFunc = undefined;
118
+ this.tvm = tvm;
119
+
120
+ // prebuild constants
121
+ // principle: always detach for class members
122
+ // to avoid recycling output scope.
123
+ function loadConsts(output, dtype, input) {
124
+ for (let t = 0; t < input.length; ++t) {
125
+ output.push(
126
+ tvm.detachFromCurrentScope(
127
+ tvm.empty([], dtype, device).copyFrom([input[t]])
128
+ )
129
+ );
130
+ }
131
+ }
132
+ loadConsts(this.timestep, "int32", schedulerConsts["timesteps"]);
133
+ loadConsts(this.alpha, "float32", schedulerConsts["alpha"]);
134
+ loadConsts(this.sigma, "float32", schedulerConsts["sigma"]);
135
+ loadConsts(this.c0, "float32", schedulerConsts["c0"]);
136
+ loadConsts(this.c1, "float32", schedulerConsts["c1"]);
137
+ loadConsts(this.c2, "float32", schedulerConsts["c2"]);
138
+
139
+ this.lastModelOutput = this.tvm.detachFromCurrentScope(
140
+ this.tvm.empty(latentShape, "float32", device)
141
+ )
142
+ this.convertModelOutputFunc = tvm.detachFromCurrentScope(
143
+ vm.getFunction("dpm_solver_multistep_scheduler_convert_model_output")
144
+ )
145
+ this.stepFunc = tvm.detachFromCurrentScope(
146
+ vm.getFunction("dpm_solver_multistep_scheduler_step")
147
+ )
148
+ }
149
+
150
+ dispose() {
151
+ for (let t = 0; t < this.timestep.length; ++t) {
152
+ this.timestep[t].dispose();
153
+ this.alpha[t].dispose();
154
+ this.sigma[t].dispose();
155
+ this.c0[t].dispose();
156
+ this.c1[t].dispose();
157
+ this.c2[t].dispose();
158
+ }
159
+
160
+ this.lastModelOutput.dispose();
161
+ this.convertModelOutputFunc.dispose();
162
+ this.stepFunc.dispose();
163
+ }
164
+
165
+ step(modelOutput, sample, counter) {
166
+ modelOutput = this.convertModelOutputFunc(sample, modelOutput, this.alpha[counter], this.sigma[counter])
167
+ const prevLatents = this.stepFunc(
168
+ sample,
169
+ modelOutput,
170
+ this.lastModelOutput,
171
+ this.c0[counter],
172
+ this.c1[counter],
173
+ this.c2[counter],
174
+ );
175
+ this.lastModelOutput = this.tvm.detachFromCurrentScope(
176
+ modelOutput
177
+ );
178
+
179
+ return prevLatents;
180
+ }
181
+ }
182
+
183
+ class StableDiffusionPipeline {
184
+ constructor(tvm, tokenizer, schedulerConsts, cacheMetadata) {
185
+ if (cacheMetadata == undefined) {
186
+ throw Error("Expect cacheMetadata");
187
+ }
188
+ this.tvm = tvm;
189
+ this.tokenizer = tokenizer;
190
+ this.maxTokenLength = 77;
191
+
192
+ this.device = this.tvm.webgpu();
193
+ this.tvm.bindCanvas(document.getElementById("canvas"));
194
+ // VM functions
195
+ this.vm = this.tvm.detachFromCurrentScope(
196
+ this.tvm.createVirtualMachine(this.device)
197
+ );
198
+
199
+ this.schedulerConsts = schedulerConsts;
200
+ this.clipToTextEmbeddings = this.tvm.detachFromCurrentScope(
201
+ this.vm.getFunction("clip")
202
+ );
203
+ this.clipParams = this.tvm.detachFromCurrentScope(
204
+ this.tvm.getParamsFromCache("clip", cacheMetadata.clipParamSize)
205
+ );
206
+ this.unetLatentsToNoisePred = this.tvm.detachFromCurrentScope(
207
+ this.vm.getFunction("unet")
208
+ );
209
+ this.unetParams = this.tvm.detachFromCurrentScope(
210
+ this.tvm.getParamsFromCache("unet", cacheMetadata.unetParamSize)
211
+ );
212
+ this.vaeToImage = this.tvm.detachFromCurrentScope(
213
+ this.vm.getFunction("vae")
214
+ );
215
+ this.vaeParams = this.tvm.detachFromCurrentScope(
216
+ this.tvm.getParamsFromCache("vae", cacheMetadata.vaeParamSize)
217
+ );
218
+ this.imageToRGBA = this.tvm.detachFromCurrentScope(
219
+ this.vm.getFunction("image_to_rgba")
220
+ );
221
+ this.concatEmbeddings = this.tvm.detachFromCurrentScope(
222
+ this.vm.getFunction("concat_embeddings")
223
+ );
224
+ }
225
+
226
+ dispose() {
227
+ // note: tvm instance is not owned by this class
228
+ this.concatEmbeddings.dispose();
229
+ this.imageToRGBA.dispose()
230
+ this.vaeParams.dispose();
231
+ this.vaeToImage.dispose();
232
+ this.unetParams.dispose();
233
+ this.unetLatentsToNoisePred.dispose();
234
+ this.clipParams.dispose();
235
+ this.clipToTextEmbeddings.dispose();
236
+ this.vm.dispose();
237
+ }
238
+
239
+ /**
240
+ * Tokenize the prompt to TVMNDArray.
241
+ * @param prompt Input prompt
242
+ * @returns The text id NDArray.
243
+ */
244
+ tokenize(prompt) {
245
+ const encoded = this.tokenizer.encode(prompt, true).input_ids;
246
+ const inputIDs = new Int32Array(this.maxTokenLength);
247
+
248
+ if (encoded.length < this.maxTokenLength) {
249
+ inputIDs.set(encoded);
250
+ const lastTok = encoded[encoded.length - 1];
251
+ inputIDs.fill(lastTok, encoded.length, inputIDs.length);
252
+ } else {
253
+ inputIDs.set(encoded.slice(0, this.maxTokenLength));
254
+ }
255
+ return this.tvm.empty([1, this.maxTokenLength], "int32", this.device).copyFrom(inputIDs);
256
+ }
257
+
258
+ /**
259
+ * async preload webgpu pipelines when possible.
260
+ */
261
+ async asyncLoadWebGPUPiplines() {
262
+ await this.tvm.asyncLoadWebGPUPiplines(this.vm.getInternalModule());
263
+ }
264
+
265
+ /**
266
+ * Run generation pipeline.
267
+ *
268
+ * @param prompt Input prompt.
269
+ * @param negPrompt Input negative prompt.
270
+ * @param progressCallback Callback to check progress.
271
+ * @param schedulerId The integer ID of the scheduler to use.
272
+ * - 0 for multi-step DPM solver,
273
+ * - 1 for PNDM solver.
274
+ * @param vaeCycle optionally draw VAE result every cycle iterations.
275
+ * @param beginRenderVae Begin rendering VAE after skipping these warmup runs.
276
+ */
277
+ async generate(
278
+ prompt,
279
+ negPrompt = "",
280
+ progressCallback = undefined,
281
+ schedulerId = 0,
282
+ vaeCycle = -1,
283
+ beginRenderVae = 10
284
+ ) {
285
+ // Principle: beginScope/endScope in synchronized blocks,
286
+ // this helps to recycle intermediate memories
287
+ // detach states that needs to go across async boundaries.
288
+ //--------------------------
289
+ // Stage 0: CLIP
290
+ //--------------------------
291
+ this.tvm.beginScope();
292
+ // get latents
293
+ const latentShape = [1, 4, 64, 64];
294
+
295
+ var unetNumSteps;
296
+ if (schedulerId == 0) {
297
+ scheduler = new TVMDPMSolverMultistepScheduler(
298
+ this.schedulerConsts[0], latentShape, this.tvm, this.device, this.vm);
299
+ unetNumSteps = this.schedulerConsts[0]["num_steps"];
300
+ } else {
301
+ scheduler = new TVMPNDMScheduler(
302
+ this.schedulerConsts[1], latentShape, this.tvm, this.device, this.vm);
303
+ unetNumSteps = this.schedulerConsts[1]["num_steps"];
304
+ }
305
+ const totalNumSteps = unetNumSteps + 2;
306
+
307
+ if (progressCallback !== undefined) {
308
+ progressCallback("clip", 0, 1, totalNumSteps);
309
+ }
310
+
311
+ const embeddings = this.tvm.withNewScope(() => {
312
+ let posInputIDs = this.tokenize(prompt);
313
+ let negInputIDs = this.tokenize(negPrompt);
314
+ const posEmbeddings = this.clipToTextEmbeddings(
315
+ posInputIDs, this.clipParams);
316
+ const negEmbeddings = this.clipToTextEmbeddings(
317
+ negInputIDs, this.clipParams);
318
+ // maintain new latents
319
+ return this.tvm.detachFromCurrentScope(
320
+ this.concatEmbeddings(negEmbeddings, posEmbeddings)
321
+ );
322
+ });
323
+ // use uniform distribution with same variance as normal(0, 1)
324
+ const scale = Math.sqrt(12) / 2;
325
+ let latents = this.tvm.detachFromCurrentScope(
326
+ this.tvm.uniform(latentShape, -scale, scale, this.tvm.webgpu())
327
+ );
328
+ this.tvm.endScope();
329
+ //---------------------------
330
+ // Stage 1: UNet + Scheduler
331
+ //---------------------------
332
+ if (vaeCycle != -1) {
333
+ // show first frame
334
+ this.tvm.withNewScope(() => {
335
+ const image = this.vaeToImage(latents, this.vaeParams);
336
+ this.tvm.showImage(this.imageToRGBA(image));
337
+ });
338
+ await this.device.sync();
339
+ }
340
+ vaeCycle = vaeCycle == -1 ? unetNumSteps : vaeCycle;
341
+ let lastSync = undefined;
342
+
343
+ for (let counter = 0; counter < unetNumSteps; ++counter) {
344
+ if (progressCallback !== undefined) {
345
+ progressCallback("unet", counter, unetNumSteps, totalNumSteps);
346
+ }
347
+ const timestep = scheduler.timestep[counter];
348
+ // recycle noisePred, track latents manually
349
+ const newLatents = this.tvm.withNewScope(() => {
350
+ this.tvm.attachToCurrentScope(latents);
351
+ const noisePred = this.unetLatentsToNoisePred(
352
+ latents, timestep, embeddings, this.unetParams);
353
+ // maintain new latents
354
+ return this.tvm.detachFromCurrentScope(
355
+ scheduler.step(noisePred, latents, counter)
356
+ );
357
+ });
358
+ latents = newLatents;
359
+ // use skip one sync, although likely not as useful.
360
+ if (lastSync !== undefined) {
361
+ await lastSync;
362
+ }
363
+ // async event checker
364
+ lastSync = this.device.sync();
365
+
366
+ // Optionally, we can draw intermediate result of VAE.
367
+ if ((counter + 1) % vaeCycle == 0 &&
368
+ (counter + 1) != unetNumSteps &&
369
+ counter >= beginRenderVae) {
370
+ this.tvm.withNewScope(() => {
371
+ const image = this.vaeToImage(latents, this.vaeParams);
372
+ this.tvm.showImage(this.imageToRGBA(image));
373
+ });
374
+ await this.device.sync();
375
+ }
376
+ }
377
+ scheduler.dispose();
378
+ embeddings.dispose();
379
+ //-----------------------------
380
+ // Stage 2: VAE and draw image
381
+ //-----------------------------
382
+ if (progressCallback !== undefined) {
383
+ progressCallback("vae", 0, 1, totalNumSteps);
384
+ }
385
+ this.tvm.withNewScope(() => {
386
+ const image = this.vaeToImage(latents, this.vaeParams);
387
+ this.tvm.showImage(this.imageToRGBA(image));
388
+ });
389
+ latents.dispose();
390
+ await this.device.sync();
391
+ if (progressCallback !== undefined) {
392
+ progressCallback("vae", 1, 1, totalNumSteps);
393
+ }
394
+ }
395
+
396
+ clearCanvas() {
397
+ this.tvm.clearCanvas();
398
+ }
399
+ };
400
+
401
+ /**
402
+ * A instance that can be used to facilitate deployment.
403
+ */
404
+ class StableDiffusionInstance {
405
+ constructor() {
406
+ this.tvm = undefined;
407
+ this.pipeline = undefined;
408
+ this.config = undefined;
409
+ this.generateInProgress = false;
410
+ this.logger = console.log;
411
+ }
412
+ /**
413
+ * Initialize TVM
414
+ * @param wasmUrl URL to wasm source.
415
+ * @param cacheUrl URL to NDArray cache.
416
+ * @param logger Custom logger.
417
+ */
418
+ async #asyncInitTVM(wasmUrl, cacheUrl) {
419
+ if (this.tvm !== undefined) {
420
+ return;
421
+ }
422
+
423
+ if (document.getElementById("log") !== undefined) {
424
+ this.logger = function (message) {
425
+ console.log(message);
426
+ const d = document.createElement("div");
427
+ d.innerHTML = message;
428
+ document.getElementById("log").appendChild(d);
429
+ };
430
+ }
431
+
432
+ const wasmSource = await (
433
+ await fetch(wasmUrl)
434
+ ).arrayBuffer();
435
+ const tvm = await tvmjs.instantiate(
436
+ new Uint8Array(wasmSource),
437
+ new EmccWASI(),
438
+ this.logger
439
+ );
440
+ // initialize WebGPU
441
+ try {
442
+ const output = await tvmjs.detectGPUDevice();
443
+ if (output !== undefined) {
444
+ var label = "WebGPU";
445
+ if (output.adapterInfo.description.length != 0) {
446
+ label += " - " + output.adapterInfo.description;
447
+ } else {
448
+ label += " - " + output.adapterInfo.vendor;
449
+ }
450
+ document.getElementById(
451
+ "gpu-tracker-label").innerHTML = ("Initialize GPU device: " + label);
452
+ tvm.initWebGPU(output.device);
453
+ } else {
454
+ document.getElementById(
455
+ "gpu-tracker-label").innerHTML = "This browser env do not support WebGPU";
456
+ this.reset();
457
+ throw Error("This browser env do not support WebGPU");
458
+ }
459
+ } catch (err) {
460
+ document.getElementById("gpu-tracker-label").innerHTML = (
461
+ "Find an error initializing the WebGPU device " + err.toString()
462
+ );
463
+ console.log(err.stack);
464
+ this.reset();
465
+ throw Error("Find an error initializing WebGPU: " + err.toString());
466
+ }
467
+
468
+ this.tvm = tvm;
469
+ function initProgressCallback(report) {
470
+ document.getElementById("progress-tracker-label").innerHTML = report.text;
471
+ document.getElementById("progress-tracker-progress").value = report.progress * 100;
472
+ }
473
+ tvm.registerInitProgressCallback(initProgressCallback);
474
+ if (!cacheUrl.startsWith("http")) {
475
+ cacheUrl = new URL(cacheUrl, document.URL).href;
476
+ }
477
+ await tvm.fetchNDArrayCache(cacheUrl, tvm.webgpu());
478
+ }
479
+
480
+ /**
481
+ * Initialize the pipeline
482
+ *
483
+ * @param schedulerConstUrl The scheduler constant.
484
+ * @param tokenizerName The name of the tokenizer.
485
+ */
486
+ async #asyncInitPipeline(schedulerConstUrl, tokenizerName) {
487
+ if (this.tvm == undefined) {
488
+ throw Error("asyncInitTVM is not called");
489
+ }
490
+ if (this.pipeline !== undefined) return;
491
+ var schedulerConst = []
492
+ for (let i = 0; i < schedulerConstUrl.length; ++i) {
493
+ schedulerConst.push(await (await fetch(schedulerConstUrl[i])).json())
494
+ }
495
+ const tokenizer = await tvmjsGlobalEnv.getTokenizer(tokenizerName);
496
+ this.pipeline = this.tvm.withNewScope(() => {
497
+ return new StableDiffusionPipeline(this.tvm, tokenizer, schedulerConst, this.tvm.cacheMetadata);
498
+ });
499
+ await this.pipeline.asyncLoadWebGPUPiplines();
500
+ }
501
+
502
+ /**
503
+ * Async initialize config
504
+ */
505
+ async #asyncInitConfig() {
506
+ if (this.config !== undefined) return;
507
+ this.config = await (await fetch("stable-diffusion-config.json")).json();
508
+ }
509
+
510
+ /**
511
+ * Function to create progress callback tracker.
512
+ * @returns A progress callback tracker.
513
+ */
514
+ #getProgressCallback() {
515
+ const tstart = performance.now();
516
+ function progressCallback(stage, counter, numSteps, totalNumSteps) {
517
+ const timeElapsed = (performance.now() - tstart) / 1000;
518
+ let text = "Generating ... at stage " + stage;
519
+ if (stage == "unet") {
520
+ counter += 1;
521
+ text += " step [" + counter + "/" + numSteps + "]"
522
+ }
523
+ if (stage == "vae") {
524
+ counter = totalNumSteps;
525
+ }
526
+ text += ", " + Math.ceil(timeElapsed) + " secs elapsed.";
527
+ document.getElementById("progress-tracker-label").innerHTML = text;
528
+ document.getElementById("progress-tracker-progress").value = (counter / totalNumSteps) * 100;
529
+ }
530
+ return progressCallback;
531
+ }
532
+
533
+ /**
534
+ * Async initialize instance.
535
+ */
536
+ async asyncInit() {
537
+ if (this.pipeline !== undefined) return;
538
+ await this.#asyncInitConfig();
539
+ await this.#asyncInitTVM(this.config.wasmUrl, this.config.cacheUrl);
540
+ await this.#asyncInitPipeline(this.config.schedulerConstUrl, this.config.tokenizer);
541
+ }
542
+
543
+ /**
544
+ * Async initialize
545
+ *
546
+ * @param tvm The tvm instance.
547
+ */
548
+ async asyncInitOnRPCServerLoad(tvmInstance) {
549
+ if (this.tvm !== undefined) {
550
+ throw Error("Cannot reuse a loaded instance for rpc");
551
+ }
552
+ this.tvm = tvmInstance;
553
+
554
+ this.tvm.beginScope();
555
+ this.tvm.registerAsyncServerFunc("generate", async (prompt, schedulerId, vaeCycle) => {
556
+ document.getElementById("inputPrompt").value = prompt;
557
+ const negPrompt = "";
558
+ document.getElementById("negativePrompt").value = "";
559
+ await this.pipeline.generate(prompt, negPrompt, this.#getProgressCallback(), schedulerId, vaeCycle);
560
+ });
561
+ this.tvm.registerAsyncServerFunc("clearCanvas", async () => {
562
+ this.tvm.clearCanvas();
563
+ });
564
+ this.tvm.registerAsyncServerFunc("showImage", async (data) => {
565
+ this.tvm.showImage(data);
566
+ });
567
+ this.tvm.endScope();
568
+ }
569
+
570
+ /**
571
+ * Run generate
572
+ */
573
+ async generate() {
574
+ if (this.requestInProgress) {
575
+ this.logger("Request in progress, generate request ignored");
576
+ return;
577
+ }
578
+ this.requestInProgress = true;
579
+ try {
580
+ await this.asyncInit();
581
+ const prompt = document.getElementById("inputPrompt").value;
582
+ const negPrompt = document.getElementById("negativePrompt").value;
583
+ const schedulerId = document.getElementById("schedulerId").value;
584
+ const vaeCycle = document.getElementById("vaeCycle").value;
585
+ await this.pipeline.generate(prompt, negPrompt, this.#getProgressCallback(), schedulerId, vaeCycle);
586
+ } catch (err) {
587
+ this.logger("Generate error, " + err.toString());
588
+ console.log(err.stack);
589
+ this.reset();
590
+ }
591
+ this.requestInProgress = false;
592
+ }
593
+
594
+ /**
595
+ * Reset the instance;
596
+ */
597
+ reset() {
598
+ this.tvm = undefined;
599
+ if (this.pipeline !== undefined) {
600
+ this.pipeline.dispose();
601
+ }
602
+ this.pipeline = undefined;
603
+ }
604
+ }
605
+
606
+ localStableDiffusionInst = new StableDiffusionInstance();
607
+
608
+ tvmjsGlobalEnv.asyncOnGenerate = async function () {
609
+ await localStableDiffusionInst.generate();
610
+ };
611
+
612
+ tvmjsGlobalEnv.asyncOnRPCServerLoad = async function (tvm) {
613
+ const inst = new StableDiffusionInstance();
614
+ await inst.asyncInitOnRPCServerLoad(tvm);
615
+ };
dist/stable_diffusion_webgpu.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:96701349271283b892162ca05f6c9d6344f2d9b1097c7ec123f081a694200730
3
+ size 8921143
dist/tokenizers-wasm/README.md ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ # tokenizers-wasm
2
+
3
+ Bindings of huggingface tokenizers for web assembly.
4
+
5
+ - in development
6
+ - unstable
7
+ - potentially non-compliant with huggingface/tokenizers
8
+
9
+ try the example out !
dist/tokenizers-wasm/package.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "tokenizers-wasm",
3
+ "collaborators": [
4
+ "Matthias Brunel <matthias.brunel@mithrilsecurity.io>"
5
+ ],
6
+ "version": "0.1.0",
7
+ "files": [
8
+ "tokenizers_wasm_bg.wasm",
9
+ "tokenizers_wasm.js",
10
+ "tokenizers_wasm.d.ts"
11
+ ],
12
+ "module": "tokenizers_wasm.js",
13
+ "types": "tokenizers_wasm.d.ts",
14
+ "sideEffects": false
15
+ }
dist/tokenizers-wasm/tokenizers_wasm.d.ts ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /**
4
+ */
5
+ export class EncodingWasm {
6
+ free(): void;
7
+ /**
8
+ */
9
+ readonly input_ids: Uint32Array;
10
+ /**
11
+ */
12
+ readonly tokens: Array<any>;
13
+ }
14
+ /**
15
+ */
16
+ export class TokenizerWasm {
17
+ free(): void;
18
+ /**
19
+ * @param {string} json
20
+ */
21
+ constructor(json: string);
22
+ /**
23
+ * @param {string} text
24
+ * @param {boolean} add_special_tokens
25
+ * @returns {EncodingWasm}
26
+ */
27
+ encode(text: string, add_special_tokens: boolean): EncodingWasm;
28
+ }
29
+
30
+ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;
31
+
32
+ export interface InitOutput {
33
+ readonly memory: WebAssembly.Memory;
34
+ readonly __wbg_tokenizerwasm_free: (a: number) => void;
35
+ readonly tokenizerwasm_from_buffer: (a: number, b: number) => number;
36
+ readonly tokenizerwasm_encode: (a: number, b: number, c: number, d: number) => number;
37
+ readonly __wbg_encodingwasm_free: (a: number) => void;
38
+ readonly encodingwasm_get_ids: (a: number) => number;
39
+ readonly encodingwasm_get_tokens: (a: number) => number;
40
+ readonly __wbindgen_malloc: (a: number) => number;
41
+ readonly __wbindgen_realloc: (a: number, b: number, c: number) => number;
42
+ readonly __wbindgen_exn_store: (a: number) => void;
43
+ }
44
+
45
+ export type SyncInitInput = BufferSource | WebAssembly.Module;
46
+ /**
47
+ * Instantiates the given `module`, which can either be bytes or
48
+ * a precompiled `WebAssembly.Module`.
49
+ *
50
+ * @param {SyncInitInput} module
51
+ *
52
+ * @returns {InitOutput}
53
+ */
54
+ export function initSync(module: SyncInitInput): InitOutput;
55
+
56
+ /**
57
+ * If `module_or_path` is {RequestInfo} or {URL}, makes a request and
58
+ * for everything else, calls `WebAssembly.instantiate` directly.
59
+ *
60
+ * @param {InitInput | Promise<InitInput>} module_or_path
61
+ *
62
+ * @returns {Promise<InitOutput>}
63
+ */
64
+ export default function init (module_or_path?: InitInput | Promise<InitInput>): Promise<InitOutput>;
dist/tokenizers-wasm/tokenizers_wasm.js ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ let wasm;
2
+
3
+ const heap = new Array(128).fill(undefined);
4
+
5
+ heap.push(undefined, null, true, false);
6
+
7
+ function getObject(idx) { return heap[idx]; }
8
+
9
+ let heap_next = heap.length;
10
+
11
+ function dropObject(idx) {
12
+ if (idx < 132) return;
13
+ heap[idx] = heap_next;
14
+ heap_next = idx;
15
+ }
16
+
17
+ function takeObject(idx) {
18
+ const ret = getObject(idx);
19
+ dropObject(idx);
20
+ return ret;
21
+ }
22
+
23
+ const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
24
+
25
+ cachedTextDecoder.decode();
26
+
27
+ let cachedUint8Memory0 = null;
28
+
29
+ function getUint8Memory0() {
30
+ if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {
31
+ cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
32
+ }
33
+ return cachedUint8Memory0;
34
+ }
35
+
36
+ function getStringFromWasm0(ptr, len) {
37
+ return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
38
+ }
39
+
40
+ function addHeapObject(obj) {
41
+ if (heap_next === heap.length) heap.push(heap.length + 1);
42
+ const idx = heap_next;
43
+ heap_next = heap[idx];
44
+
45
+ heap[idx] = obj;
46
+ return idx;
47
+ }
48
+
49
+ let WASM_VECTOR_LEN = 0;
50
+
51
+ const cachedTextEncoder = new TextEncoder('utf-8');
52
+
53
+ const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
54
+ ? function (arg, view) {
55
+ return cachedTextEncoder.encodeInto(arg, view);
56
+ }
57
+ : function (arg, view) {
58
+ const buf = cachedTextEncoder.encode(arg);
59
+ view.set(buf);
60
+ return {
61
+ read: arg.length,
62
+ written: buf.length
63
+ };
64
+ });
65
+
66
+ function passStringToWasm0(arg, malloc, realloc) {
67
+
68
+ if (realloc === undefined) {
69
+ const buf = cachedTextEncoder.encode(arg);
70
+ const ptr = malloc(buf.length);
71
+ getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
72
+ WASM_VECTOR_LEN = buf.length;
73
+ return ptr;
74
+ }
75
+
76
+ let len = arg.length;
77
+ let ptr = malloc(len);
78
+
79
+ const mem = getUint8Memory0();
80
+
81
+ let offset = 0;
82
+
83
+ for (; offset < len; offset++) {
84
+ const code = arg.charCodeAt(offset);
85
+ if (code > 0x7F) break;
86
+ mem[ptr + offset] = code;
87
+ }
88
+
89
+ if (offset !== len) {
90
+ if (offset !== 0) {
91
+ arg = arg.slice(offset);
92
+ }
93
+ ptr = realloc(ptr, len, len = offset + arg.length * 3);
94
+ const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
95
+ const ret = encodeString(arg, view);
96
+
97
+ offset += ret.written;
98
+ }
99
+
100
+ WASM_VECTOR_LEN = offset;
101
+ return ptr;
102
+ }
103
+
104
+ function handleError(f, args) {
105
+ try {
106
+ return f.apply(this, args);
107
+ } catch (e) {
108
+ wasm.__wbindgen_exn_store(addHeapObject(e));
109
+ }
110
+ }
111
+
112
+ function getArrayU8FromWasm0(ptr, len) {
113
+ return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len);
114
+ }
115
+ /**
116
+ */
117
+ export class EncodingWasm {
118
+
119
+ static __wrap(ptr) {
120
+ const obj = Object.create(EncodingWasm.prototype);
121
+ obj.ptr = ptr;
122
+
123
+ return obj;
124
+ }
125
+
126
+ __destroy_into_raw() {
127
+ const ptr = this.ptr;
128
+ this.ptr = 0;
129
+
130
+ return ptr;
131
+ }
132
+
133
+ free() {
134
+ const ptr = this.__destroy_into_raw();
135
+ wasm.__wbg_encodingwasm_free(ptr);
136
+ }
137
+ /**
138
+ * @returns {Uint32Array}
139
+ */
140
+ get input_ids() {
141
+ const ret = wasm.encodingwasm_get_ids(this.ptr);
142
+ return takeObject(ret);
143
+ }
144
+ /**
145
+ * @returns {Array<any>}
146
+ */
147
+ get tokens() {
148
+ const ret = wasm.encodingwasm_get_tokens(this.ptr);
149
+ return takeObject(ret);
150
+ }
151
+ }
152
+ /**
153
+ */
154
+ export class TokenizerWasm {
155
+
156
+ static __wrap(ptr) {
157
+ const obj = Object.create(TokenizerWasm.prototype);
158
+ obj.ptr = ptr;
159
+
160
+ return obj;
161
+ }
162
+
163
+ __destroy_into_raw() {
164
+ const ptr = this.ptr;
165
+ this.ptr = 0;
166
+
167
+ return ptr;
168
+ }
169
+
170
+ free() {
171
+ const ptr = this.__destroy_into_raw();
172
+ wasm.__wbg_tokenizerwasm_free(ptr);
173
+ }
174
+ /**
175
+ * @param {string} json
176
+ */
177
+ constructor(json) {
178
+ const ptr0 = passStringToWasm0(json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
179
+ const len0 = WASM_VECTOR_LEN;
180
+ const ret = wasm.tokenizerwasm_from_buffer(ptr0, len0);
181
+ return TokenizerWasm.__wrap(ret);
182
+ }
183
+ /**
184
+ * @param {string} text
185
+ * @param {boolean} add_special_tokens
186
+ * @returns {EncodingWasm}
187
+ */
188
+ encode(text, add_special_tokens) {
189
+ const ptr0 = passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
190
+ const len0 = WASM_VECTOR_LEN;
191
+ const ret = wasm.tokenizerwasm_encode(this.ptr, ptr0, len0, add_special_tokens);
192
+ return EncodingWasm.__wrap(ret);
193
+ }
194
+ }
195
+
196
+ async function load(module, imports) {
197
+ if (typeof Response === 'function' && module instanceof Response) {
198
+ if (typeof WebAssembly.instantiateStreaming === 'function') {
199
+ try {
200
+ return await WebAssembly.instantiateStreaming(module, imports);
201
+
202
+ } catch (e) {
203
+ if (module.headers.get('Content-Type') != 'application/wasm') {
204
+ console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
205
+
206
+ } else {
207
+ throw e;
208
+ }
209
+ }
210
+ }
211
+
212
+ const bytes = await module.arrayBuffer();
213
+ return await WebAssembly.instantiate(bytes, imports);
214
+
215
+ } else {
216
+ const instance = await WebAssembly.instantiate(module, imports);
217
+
218
+ if (instance instanceof WebAssembly.Instance) {
219
+ return { instance, module };
220
+
221
+ } else {
222
+ return instance;
223
+ }
224
+ }
225
+ }
226
+
227
+ function getImports() {
228
+ const imports = {};
229
+ imports.wbg = {};
230
+ imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
231
+ takeObject(arg0);
232
+ };
233
+ imports.wbg.__wbg_crypto_e1d53a1d73fb10b8 = function(arg0) {
234
+ const ret = getObject(arg0).crypto;
235
+ return addHeapObject(ret);
236
+ };
237
+ imports.wbg.__wbindgen_is_object = function(arg0) {
238
+ const val = getObject(arg0);
239
+ const ret = typeof(val) === 'object' && val !== null;
240
+ return ret;
241
+ };
242
+ imports.wbg.__wbg_process_038c26bf42b093f8 = function(arg0) {
243
+ const ret = getObject(arg0).process;
244
+ return addHeapObject(ret);
245
+ };
246
+ imports.wbg.__wbg_versions_ab37218d2f0b24a8 = function(arg0) {
247
+ const ret = getObject(arg0).versions;
248
+ return addHeapObject(ret);
249
+ };
250
+ imports.wbg.__wbg_node_080f4b19d15bc1fe = function(arg0) {
251
+ const ret = getObject(arg0).node;
252
+ return addHeapObject(ret);
253
+ };
254
+ imports.wbg.__wbindgen_is_string = function(arg0) {
255
+ const ret = typeof(getObject(arg0)) === 'string';
256
+ return ret;
257
+ };
258
+ imports.wbg.__wbg_require_78a3dcfbdba9cbce = function() { return handleError(function () {
259
+ const ret = module.require;
260
+ return addHeapObject(ret);
261
+ }, arguments) };
262
+ imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
263
+ const ret = getStringFromWasm0(arg0, arg1);
264
+ return addHeapObject(ret);
265
+ };
266
+ imports.wbg.__wbg_msCrypto_6e7d3e1f92610cbb = function(arg0) {
267
+ const ret = getObject(arg0).msCrypto;
268
+ return addHeapObject(ret);
269
+ };
270
+ imports.wbg.__wbg_getRandomValues_805f1c3d65988a5a = function() { return handleError(function (arg0, arg1) {
271
+ getObject(arg0).getRandomValues(getObject(arg1));
272
+ }, arguments) };
273
+ imports.wbg.__wbg_randomFillSync_6894564c2c334c42 = function() { return handleError(function (arg0, arg1, arg2) {
274
+ getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2));
275
+ }, arguments) };
276
+ imports.wbg.__wbg_new_b525de17f44a8943 = function() {
277
+ const ret = new Array();
278
+ return addHeapObject(ret);
279
+ };
280
+ imports.wbg.__wbindgen_is_function = function(arg0) {
281
+ const ret = typeof(getObject(arg0)) === 'function';
282
+ return ret;
283
+ };
284
+ imports.wbg.__wbg_newnoargs_2b8b6bd7753c76ba = function(arg0, arg1) {
285
+ const ret = new Function(getStringFromWasm0(arg0, arg1));
286
+ return addHeapObject(ret);
287
+ };
288
+ imports.wbg.__wbg_call_95d1ea488d03e4e8 = function() { return handleError(function (arg0, arg1) {
289
+ const ret = getObject(arg0).call(getObject(arg1));
290
+ return addHeapObject(ret);
291
+ }, arguments) };
292
+ imports.wbg.__wbg_self_e7c1f827057f6584 = function() { return handleError(function () {
293
+ const ret = self.self;
294
+ return addHeapObject(ret);
295
+ }, arguments) };
296
+ imports.wbg.__wbg_window_a09ec664e14b1b81 = function() { return handleError(function () {
297
+ const ret = window.window;
298
+ return addHeapObject(ret);
299
+ }, arguments) };
300
+ imports.wbg.__wbg_globalThis_87cbb8506fecf3a9 = function() { return handleError(function () {
301
+ const ret = globalThis.globalThis;
302
+ return addHeapObject(ret);
303
+ }, arguments) };
304
+ imports.wbg.__wbg_global_c85a9259e621f3db = function() { return handleError(function () {
305
+ const ret = global.global;
306
+ return addHeapObject(ret);
307
+ }, arguments) };
308
+ imports.wbg.__wbindgen_is_undefined = function(arg0) {
309
+ const ret = getObject(arg0) === undefined;
310
+ return ret;
311
+ };
312
+ imports.wbg.__wbg_push_49c286f04dd3bf59 = function(arg0, arg1) {
313
+ const ret = getObject(arg0).push(getObject(arg1));
314
+ return ret;
315
+ };
316
+ imports.wbg.__wbg_call_9495de66fdbe016b = function() { return handleError(function (arg0, arg1, arg2) {
317
+ const ret = getObject(arg0).call(getObject(arg1), getObject(arg2));
318
+ return addHeapObject(ret);
319
+ }, arguments) };
320
+ imports.wbg.__wbg_buffer_cf65c07de34b9a08 = function(arg0) {
321
+ const ret = getObject(arg0).buffer;
322
+ return addHeapObject(ret);
323
+ };
324
+ imports.wbg.__wbg_new_537b7341ce90bb31 = function(arg0) {
325
+ const ret = new Uint8Array(getObject(arg0));
326
+ return addHeapObject(ret);
327
+ };
328
+ imports.wbg.__wbg_set_17499e8aa4003ebd = function(arg0, arg1, arg2) {
329
+ getObject(arg0).set(getObject(arg1), arg2 >>> 0);
330
+ };
331
+ imports.wbg.__wbg_length_27a2afe8ab42b09f = function(arg0) {
332
+ const ret = getObject(arg0).length;
333
+ return ret;
334
+ };
335
+ imports.wbg.__wbg_newwithbyteoffsetandlength_5c5a6e21987c3bee = function(arg0, arg1, arg2) {
336
+ const ret = new Uint32Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
337
+ return addHeapObject(ret);
338
+ };
339
+ imports.wbg.__wbg_new_f0a82b8de89b00e8 = function(arg0) {
340
+ const ret = new Uint32Array(getObject(arg0));
341
+ return addHeapObject(ret);
342
+ };
343
+ imports.wbg.__wbg_newwithlength_b56c882b57805732 = function(arg0) {
344
+ const ret = new Uint8Array(arg0 >>> 0);
345
+ return addHeapObject(ret);
346
+ };
347
+ imports.wbg.__wbg_subarray_7526649b91a252a6 = function(arg0, arg1, arg2) {
348
+ const ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0);
349
+ return addHeapObject(ret);
350
+ };
351
+ imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
352
+ const ret = getObject(arg0);
353
+ return addHeapObject(ret);
354
+ };
355
+ imports.wbg.__wbindgen_throw = function(arg0, arg1) {
356
+ throw new Error(getStringFromWasm0(arg0, arg1));
357
+ };
358
+ imports.wbg.__wbindgen_memory = function() {
359
+ const ret = wasm.memory;
360
+ return addHeapObject(ret);
361
+ };
362
+
363
+ return imports;
364
+ }
365
+
366
+ function initMemory(imports, maybe_memory) {
367
+
368
+ }
369
+
370
+ function finalizeInit(instance, module) {
371
+ wasm = instance.exports;
372
+ init.__wbindgen_wasm_module = module;
373
+ cachedUint8Memory0 = null;
374
+
375
+
376
+ return wasm;
377
+ }
378
+
379
+ function initSync(module) {
380
+ const imports = getImports();
381
+
382
+ initMemory(imports);
383
+
384
+ if (!(module instanceof WebAssembly.Module)) {
385
+ module = new WebAssembly.Module(module);
386
+ }
387
+
388
+ const instance = new WebAssembly.Instance(module, imports);
389
+
390
+ return finalizeInit(instance, module);
391
+ }
392
+
393
+ async function init(input) {
394
+ if (typeof input === 'undefined') {
395
+ input = new URL('tokenizers_wasm_bg.wasm', import.meta.url);
396
+ }
397
+ const imports = getImports();
398
+
399
+ if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
400
+ input = fetch(input);
401
+ }
402
+
403
+ initMemory(imports);
404
+
405
+ const { instance, module } = await load(await input, imports);
406
+
407
+ return finalizeInit(instance, module);
408
+ }
409
+
410
+ export { initSync }
411
+ export default init;
dist/tokenizers-wasm/tokenizers_wasm_bg.wasm ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3276c4e687b345041671482187a198318cd65091202472880c723ab342a094b6
3
+ size 1524065
dist/tokenizers-wasm/tokenizers_wasm_bg.wasm.d.ts ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ export const memory: WebAssembly.Memory;
4
+ export function __wbg_tokenizerwasm_free(a: number): void;
5
+ export function tokenizerwasm_from_buffer(a: number, b: number): number;
6
+ export function tokenizerwasm_encode(a: number, b: number, c: number, d: number): number;
7
+ export function __wbg_encodingwasm_free(a: number): void;
8
+ export function encodingwasm_get_ids(a: number): number;
9
+ export function encodingwasm_get_tokens(a: number): number;
10
+ export function __wbindgen_malloc(a: number): number;
11
+ export function __wbindgen_realloc(a: number, b: number, c: number): number;
12
+ export function __wbindgen_exn_store(a: number): void;
dist/tvmjs.bundle.js ADDED
The diff for this file is too large to render. See raw diff
 
dist/tvmjs_runtime.wasi.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ function EmccWASI() {
3
+ var Module=typeof Module!="undefined"?Module:{};var __wasmLib={};function __wasmLibInstantiateWasm(imports,successCallback){__wasmLib.imports=imports;__wasmLib.successCallback=successCallback}function __wasmLibStart(wasmInstance){__wasmLib.successCallback(wasmInstance)}__wasmLib.start=__wasmLibStart;var Module={"instantiateWasm":__wasmLibInstantiateWasm,"wasmLibraryProvider":__wasmLib};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;if(e&&typeof e=="object"&&e.stack){toLog=[e,e.stack]}err("exiting due to exception: "+toLog)}if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}process.on("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});var nodeMajor=process.versions.node.split(".")[0];if(nodeMajor<15){process.on("unhandledRejection",function(reason){throw reason})}quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process.exitCode=status;throw toThrow}logExceptionOnExit(toThrow);process.exit(status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heapOrArray,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="tvmjs_runtime.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}catch(err){abort(err)}}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+binaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(binaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(binaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(binaryFile)})}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(function(binary){return WebAssembly.instantiate(binary,imports)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}else{return instantiateArrayBuffer(binaryFile,imports,callback)}}function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview1":wasmImports};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["memory"];updateMemoryViews();wasmTable=Module["asm"]["__indirect_function_table"];removeRunDependency("wasm-instantiate");return exports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){callbacks.shift()(Module)}}function _TVMWasmPackedCFunc(){err("missing function: TVMWasmPackedCFunc");abort(-1)}function _TVMWasmPackedCFuncFinalizer(){err("missing function: TVMWasmPackedCFuncFinalizer");abort(-1)}function __ZN3tvm7runtime9threading10NumThreadsEv(){err("missing function: _ZN3tvm7runtime9threading10NumThreadsEv");abort(-1)}function __ZN3tvm7runtime9threading15ResetThreadPoolEv(){err("missing function: _ZN3tvm7runtime9threading15ResetThreadPoolEv");abort(-1)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process.hrtime();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();var nowIsMonotonic=true;function checkWasiClock(clock_id){return clock_id==0||clock_id==1||clock_id==2||clock_id==3}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return()=>{crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return()=>crypto_module["randomBytes"](1)[0]}catch(e){}}return()=>abort("randomDevice")}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.fsync(stream.tty)},fsync:function(stream){stream.tty.ops.fsync(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;try{bytesRead=fs.readSync(process.stdin.fd,buf,0,BUFSIZE,-1)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};function asyncLoad(url,onload,onerror,noRunDep){var dep=!noRunDep?getUniqueRunDependency("al "+url):"";readAsync(url,arrayBuffer=>{assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}});if(dep)addRunDependency(dep)}var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get:function(){return this.shared.position},set:function(val){this.shared.position=val}}})}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:(path,mode,dev)=>{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.name="ErrnoError";this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},getMode:(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:(parent,name,input,output)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:(stream,buffer,offset,length,pos)=>{for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:obj=>{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size}stream_ops.read=(stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload=(()=>{}),onerror=(()=>{}))=>{var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAPU32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=atime%1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=mtime%1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];HEAPU32[buf+96>>2]=ctime%1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+104>>2]=tempI64[0],HEAP32[buf+108>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function _clock_time_get(clk_id,ignored_precision,ptime){if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=Date.now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP32[ptime>>2]=nsec>>>0;HEAP32[ptime+4>>2]=nsec/Math.pow(2,32)>>>0;return 0}function _emscripten_notify_memory_growth(memoryIndex){updateMemoryViews()}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var MAX_INT53=9007199254740992;var MIN_INT53=-9007199254740992;function bigintToI53Checked(num){return num<MIN_INT53||num>MAX_INT53?NaN:Number(num)}function _fd_seek(fd,offset,whence,newOffset){try{offset=bigintToI53Checked(offset);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAPU32[iov>>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!=="undefined"){offset+=curr}}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _proc_exit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}function exitJS(status,implicit){EXITSTATUS=status;_proc_exit(status)}function handleException(e){if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var wasmImports={"TVMWasmPackedCFunc":_TVMWasmPackedCFunc,"TVMWasmPackedCFuncFinalizer":_TVMWasmPackedCFuncFinalizer,"_ZN3tvm7runtime9threading10NumThreadsEv":__ZN3tvm7runtime9threading10NumThreadsEv,"_ZN3tvm7runtime9threading15ResetThreadPoolEv":__ZN3tvm7runtime9threading15ResetThreadPoolEv,"clock_time_get":_clock_time_get,"emscripten_notify_memory_growth":_emscripten_notify_memory_growth,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"proc_exit":_proc_exit};var asm=createWasm();var __ZN3tvm7runtime17GetCustomTypeNameEh=Module["__ZN3tvm7runtime17GetCustomTypeNameEh"]=function(){return(__ZN3tvm7runtime17GetCustomTypeNameEh=Module["__ZN3tvm7runtime17GetCustomTypeNameEh"]=Module["asm"]["_ZN3tvm7runtime17GetCustomTypeNameEh"]).apply(null,arguments)};var __ZN3tvm7runtime8Registry3GetERKNS0_6StringE=Module["__ZN3tvm7runtime8Registry3GetERKNS0_6StringE"]=function(){return(__ZN3tvm7runtime8Registry3GetERKNS0_6StringE=Module["__ZN3tvm7runtime8Registry3GetERKNS0_6StringE"]=Module["asm"]["_ZN3tvm7runtime8Registry3GetERKNS0_6StringE"]).apply(null,arguments)};var __ZN3tvm7runtime23GetCustomTypeRegisteredEh=Module["__ZN3tvm7runtime23GetCustomTypeRegisteredEh"]=function(){return(__ZN3tvm7runtime23GetCustomTypeRegisteredEh=Module["__ZN3tvm7runtime23GetCustomTypeRegisteredEh"]=Module["asm"]["_ZN3tvm7runtime23GetCustomTypeRegisteredEh"]).apply(null,arguments)};var __ZN3tvm7runtime19ParseCustomDatatypeERKNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPPKc=Module["__ZN3tvm7runtime19ParseCustomDatatypeERKNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPPKc"]=function(){return(__ZN3tvm7runtime19ParseCustomDatatypeERKNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPPKc=Module["__ZN3tvm7runtime19ParseCustomDatatypeERKNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPPKc"]=Module["asm"]["_ZN3tvm7runtime19ParseCustomDatatypeERKNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEPPKc"]).apply(null,arguments)};var _TVMGetLastError=Module["_TVMGetLastError"]=function(){return(_TVMGetLastError=Module["_TVMGetLastError"]=Module["asm"]["TVMGetLastError"]).apply(null,arguments)};var _TVMAPISetLastError=Module["_TVMAPISetLastError"]=function(){return(_TVMAPISetLastError=Module["_TVMAPISetLastError"]=Module["asm"]["TVMAPISetLastError"]).apply(null,arguments)};var _TVMModLoadFromFile=Module["_TVMModLoadFromFile"]=function(){return(_TVMModLoadFromFile=Module["_TVMModLoadFromFile"]=Module["asm"]["TVMModLoadFromFile"]).apply(null,arguments)};var __ZN3tvm7runtime6Module12LoadFromFileERKNS0_6StringES4_=Module["__ZN3tvm7runtime6Module12LoadFromFileERKNS0_6StringES4_"]=function(){return(__ZN3tvm7runtime6Module12LoadFromFileERKNS0_6StringES4_=Module["__ZN3tvm7runtime6Module12LoadFromFileERKNS0_6StringES4_"]=Module["asm"]["_ZN3tvm7runtime6Module12LoadFromFileERKNS0_6StringES4_"]).apply(null,arguments)};var _TVMModImport=Module["_TVMModImport"]=function(){return(_TVMModImport=Module["_TVMModImport"]=Module["asm"]["TVMModImport"]).apply(null,arguments)};var _TVMModGetFunction=Module["_TVMModGetFunction"]=function(){return(_TVMModGetFunction=Module["_TVMModGetFunction"]=Module["asm"]["TVMModGetFunction"]).apply(null,arguments)};var _TVMModFree=Module["_TVMModFree"]=function(){return(_TVMModFree=Module["_TVMModFree"]=Module["asm"]["TVMModFree"]).apply(null,arguments)};var _TVMObjectFree=Module["_TVMObjectFree"]=function(){return(_TVMObjectFree=Module["_TVMObjectFree"]=Module["asm"]["TVMObjectFree"]).apply(null,arguments)};var _TVMBackendGetFuncFromEnv=Module["_TVMBackendGetFuncFromEnv"]=function(){return(_TVMBackendGetFuncFromEnv=Module["_TVMBackendGetFuncFromEnv"]=Module["asm"]["TVMBackendGetFuncFromEnv"]).apply(null,arguments)};var _TVMBackendAllocWorkspace=Module["_TVMBackendAllocWorkspace"]=function(){return(_TVMBackendAllocWorkspace=Module["_TVMBackendAllocWorkspace"]=Module["asm"]["TVMBackendAllocWorkspace"]).apply(null,arguments)};var _TVMBackendFreeWorkspace=Module["_TVMBackendFreeWorkspace"]=function(){return(_TVMBackendFreeWorkspace=Module["_TVMBackendFreeWorkspace"]=Module["asm"]["TVMBackendFreeWorkspace"]).apply(null,arguments)};var _TVMBackendRunOnce=Module["_TVMBackendRunOnce"]=function(){return(_TVMBackendRunOnce=Module["_TVMBackendRunOnce"]=Module["asm"]["TVMBackendRunOnce"]).apply(null,arguments)};var _TVMFuncFree=Module["_TVMFuncFree"]=function(){return(_TVMFuncFree=Module["_TVMFuncFree"]=Module["asm"]["TVMFuncFree"]).apply(null,arguments)};var _TVMByteArrayFree=Module["_TVMByteArrayFree"]=function(){return(_TVMByteArrayFree=Module["_TVMByteArrayFree"]=Module["asm"]["TVMByteArrayFree"]).apply(null,arguments)};var _TVMFuncCall=Module["_TVMFuncCall"]=function(){return(_TVMFuncCall=Module["_TVMFuncCall"]=Module["asm"]["TVMFuncCall"]).apply(null,arguments)};var _TVMCFuncSetReturn=Module["_TVMCFuncSetReturn"]=function(){return(_TVMCFuncSetReturn=Module["_TVMCFuncSetReturn"]=Module["asm"]["TVMCFuncSetReturn"]).apply(null,arguments)};var _TVMFuncCreateFromCFunc=Module["_TVMFuncCreateFromCFunc"]=function(){return(_TVMFuncCreateFromCFunc=Module["_TVMFuncCreateFromCFunc"]=Module["asm"]["TVMFuncCreateFromCFunc"]).apply(null,arguments)};var _TVMStreamCreate=Module["_TVMStreamCreate"]=function(){return(_TVMStreamCreate=Module["_TVMStreamCreate"]=Module["asm"]["TVMStreamCreate"]).apply(null,arguments)};var _TVMStreamFree=Module["_TVMStreamFree"]=function(){return(_TVMStreamFree=Module["_TVMStreamFree"]=Module["asm"]["TVMStreamFree"]).apply(null,arguments)};var _TVMSetStream=Module["_TVMSetStream"]=function(){return(_TVMSetStream=Module["_TVMSetStream"]=Module["asm"]["TVMSetStream"]).apply(null,arguments)};var _TVMSynchronize=Module["_TVMSynchronize"]=function(){return(_TVMSynchronize=Module["_TVMSynchronize"]=Module["asm"]["TVMSynchronize"]).apply(null,arguments)};var _TVMStreamStreamSynchronize=Module["_TVMStreamStreamSynchronize"]=function(){return(_TVMStreamStreamSynchronize=Module["_TVMStreamStreamSynchronize"]=Module["asm"]["TVMStreamStreamSynchronize"]).apply(null,arguments)};var _TVMCbArgToReturn=Module["_TVMCbArgToReturn"]=function(){return(_TVMCbArgToReturn=Module["_TVMCbArgToReturn"]=Module["asm"]["TVMCbArgToReturn"]).apply(null,arguments)};var _TVMDeviceAllocDataSpace=Module["_TVMDeviceAllocDataSpace"]=function(){return(_TVMDeviceAllocDataSpace=Module["_TVMDeviceAllocDataSpace"]=Module["asm"]["TVMDeviceAllocDataSpace"]).apply(null,arguments)};var _TVMDeviceAllocDataSpaceWithScope=Module["_TVMDeviceAllocDataSpaceWithScope"]=function(){return(_TVMDeviceAllocDataSpaceWithScope=Module["_TVMDeviceAllocDataSpaceWithScope"]=Module["asm"]["TVMDeviceAllocDataSpaceWithScope"]).apply(null,arguments)};var _TVMDeviceFreeDataSpace=Module["_TVMDeviceFreeDataSpace"]=function(){return(_TVMDeviceFreeDataSpace=Module["_TVMDeviceFreeDataSpace"]=Module["asm"]["TVMDeviceFreeDataSpace"]).apply(null,arguments)};var _TVMDeviceCopyDataFromTo=Module["_TVMDeviceCopyDataFromTo"]=function(){return(_TVMDeviceCopyDataFromTo=Module["_TVMDeviceCopyDataFromTo"]=Module["asm"]["TVMDeviceCopyDataFromTo"]).apply(null,arguments)};var __ZN3tvm7runtime8Registry8RegisterERKNS0_6StringEb=Module["__ZN3tvm7runtime8Registry8RegisterERKNS0_6StringEb"]=function(){return(__ZN3tvm7runtime8Registry8RegisterERKNS0_6StringEb=Module["__ZN3tvm7runtime8Registry8RegisterERKNS0_6StringEb"]=Module["asm"]["_ZN3tvm7runtime8Registry8RegisterERKNS0_6StringEb"]).apply(null,arguments)};var _TVMBackendParallelLaunch=Module["_TVMBackendParallelLaunch"]=function(){return(_TVMBackendParallelLaunch=Module["_TVMBackendParallelLaunch"]=Module["asm"]["TVMBackendParallelLaunch"]).apply(null,arguments)};var _TVMBackendParallelBarrier=Module["_TVMBackendParallelBarrier"]=function(){return(_TVMBackendParallelBarrier=Module["_TVMBackendParallelBarrier"]=Module["asm"]["TVMBackendParallelBarrier"]).apply(null,arguments)};var __ZN3tvm7runtime8Registry9ListNamesEv=Module["__ZN3tvm7runtime8Registry9ListNamesEv"]=function(){return(__ZN3tvm7runtime8Registry9ListNamesEv=Module["__ZN3tvm7runtime8Registry9ListNamesEv"]=Module["asm"]["_ZN3tvm7runtime8Registry9ListNamesEv"]).apply(null,arguments)};var __ZN3tvm7runtime9BacktraceEv=Module["__ZN3tvm7runtime9BacktraceEv"]=function(){return(__ZN3tvm7runtime9BacktraceEv=Module["__ZN3tvm7runtime9BacktraceEv"]=Module["asm"]["_ZN3tvm7runtime9BacktraceEv"]).apply(null,arguments)};var __ZN3tvm7runtime14RuntimeEnabledERKNS0_6StringE=Module["__ZN3tvm7runtime14RuntimeEnabledERKNS0_6StringE"]=function(){return(__ZN3tvm7runtime14RuntimeEnabledERKNS0_6StringE=Module["__ZN3tvm7runtime14RuntimeEnabledERKNS0_6StringE"]=Module["asm"]["_ZN3tvm7runtime14RuntimeEnabledERKNS0_6StringE"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray10CreateViewENS0_10ShapeTupleE10DLDataType=Module["__ZN3tvm7runtime7NDArray10CreateViewENS0_10ShapeTupleE10DLDataType"]=function(){return(__ZN3tvm7runtime7NDArray10CreateViewENS0_10ShapeTupleE10DLDataType=Module["__ZN3tvm7runtime7NDArray10CreateViewENS0_10ShapeTupleE10DLDataType"]=Module["asm"]["_ZN3tvm7runtime7NDArray10CreateViewENS0_10ShapeTupleE10DLDataType"]).apply(null,arguments)};var __ZNK3tvm7runtime7NDArray8ToDLPackEv=Module["__ZNK3tvm7runtime7NDArray8ToDLPackEv"]=function(){return(__ZNK3tvm7runtime7NDArray8ToDLPackEv=Module["__ZNK3tvm7runtime7NDArray8ToDLPackEv"]=Module["asm"]["_ZNK3tvm7runtime7NDArray8ToDLPackEv"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray5EmptyENS0_10ShapeTupleE10DLDataType8DLDeviceNS0_8OptionalINS0_6StringEEE=Module["__ZN3tvm7runtime7NDArray5EmptyENS0_10ShapeTupleE10DLDataType8DLDeviceNS0_8OptionalINS0_6StringEEE"]=function(){return(__ZN3tvm7runtime7NDArray5EmptyENS0_10ShapeTupleE10DLDataType8DLDeviceNS0_8OptionalINS0_6StringEEE=Module["__ZN3tvm7runtime7NDArray5EmptyENS0_10ShapeTupleE10DLDataType8DLDeviceNS0_8OptionalINS0_6StringEEE"]=Module["asm"]["_ZN3tvm7runtime7NDArray5EmptyENS0_10ShapeTupleE10DLDataType8DLDeviceNS0_8OptionalINS0_6StringEEE"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray20FromExternalDLTensorERK8DLTensor=Module["__ZN3tvm7runtime7NDArray20FromExternalDLTensorERK8DLTensor"]=function(){return(__ZN3tvm7runtime7NDArray20FromExternalDLTensorERK8DLTensor=Module["__ZN3tvm7runtime7NDArray20FromExternalDLTensorERK8DLTensor"]=Module["asm"]["_ZN3tvm7runtime7NDArray20FromExternalDLTensorERK8DLTensor"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray9IsAlignedERK8DLTensor=Module["__ZN3tvm7runtime7NDArray9IsAlignedERK8DLTensor"]=function(){return(__ZN3tvm7runtime7NDArray9IsAlignedERK8DLTensor=Module["__ZN3tvm7runtime7NDArray9IsAlignedERK8DLTensor"]=Module["asm"]["_ZN3tvm7runtime7NDArray9IsAlignedERK8DLTensor"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray15NewFromDLTensorEP8DLTensorRK8DLDevice=Module["__ZN3tvm7runtime7NDArray15NewFromDLTensorEP8DLTensorRK8DLDevice"]=function(){return(__ZN3tvm7runtime7NDArray15NewFromDLTensorEP8DLTensorRK8DLDevice=Module["__ZN3tvm7runtime7NDArray15NewFromDLTensorEP8DLTensorRK8DLDevice"]=Module["asm"]["_ZN3tvm7runtime7NDArray15NewFromDLTensorEP8DLTensorRK8DLDevice"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray10FromDLPackEP15DLManagedTensor=Module["__ZN3tvm7runtime7NDArray10FromDLPackEP15DLManagedTensor"]=function(){return(__ZN3tvm7runtime7NDArray10FromDLPackEP15DLManagedTensor=Module["__ZN3tvm7runtime7NDArray10FromDLPackEP15DLManagedTensor"]=Module["asm"]["_ZN3tvm7runtime7NDArray10FromDLPackEP15DLManagedTensor"]).apply(null,arguments)};var __ZNK3tvm7runtime7NDArray11CopyToBytesEPvm=Module["__ZNK3tvm7runtime7NDArray11CopyToBytesEPvm"]=function(){return(__ZNK3tvm7runtime7NDArray11CopyToBytesEPvm=Module["__ZNK3tvm7runtime7NDArray11CopyToBytesEPvm"]=Module["asm"]["_ZNK3tvm7runtime7NDArray11CopyToBytesEPvm"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray13CopyFromBytesEPKvm=Module["__ZN3tvm7runtime7NDArray13CopyFromBytesEPKvm"]=function(){return(__ZN3tvm7runtime7NDArray13CopyFromBytesEPKvm=Module["__ZN3tvm7runtime7NDArray13CopyFromBytesEPKvm"]=Module["asm"]["_ZN3tvm7runtime7NDArray13CopyFromBytesEPKvm"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray10CopyFromToEPK8DLTensorPS2_Pv=Module["__ZN3tvm7runtime7NDArray10CopyFromToEPK8DLTensorPS2_Pv"]=function(){return(__ZN3tvm7runtime7NDArray10CopyFromToEPK8DLTensorPS2_Pv=Module["__ZN3tvm7runtime7NDArray10CopyFromToEPK8DLTensorPS2_Pv"]=Module["asm"]["_ZN3tvm7runtime7NDArray10CopyFromToEPK8DLTensorPS2_Pv"]).apply(null,arguments)};var __ZNK3tvm7runtime7NDArray5ShapeEv=Module["__ZNK3tvm7runtime7NDArray5ShapeEv"]=function(){return(__ZNK3tvm7runtime7NDArray5ShapeEv=Module["__ZNK3tvm7runtime7NDArray5ShapeEv"]=Module["asm"]["_ZNK3tvm7runtime7NDArray5ShapeEv"]).apply(null,arguments)};var __ZNK3tvm7runtime7NDArray8DataTypeEv=Module["__ZNK3tvm7runtime7NDArray8DataTypeEv"]=function(){return(__ZNK3tvm7runtime7NDArray8DataTypeEv=Module["__ZNK3tvm7runtime7NDArray8DataTypeEv"]=Module["asm"]["_ZNK3tvm7runtime7NDArray8DataTypeEv"]).apply(null,arguments)};var __ZN3tvm7runtime7NDArray28AbilityOfZeroCopyForDLTensorEP8DLTensorRK8DLDevice=Module["__ZN3tvm7runtime7NDArray28AbilityOfZeroCopyForDLTensorEP8DLTensorRK8DLDevice"]=function(){return(__ZN3tvm7runtime7NDArray28AbilityOfZeroCopyForDLTensorEP8DLTensorRK8DLDevice=Module["__ZN3tvm7runtime7NDArray28AbilityOfZeroCopyForDLTensorEP8DLTensorRK8DLDevice"]=Module["asm"]["_ZN3tvm7runtime7NDArray28AbilityOfZeroCopyForDLTensorEP8DLTensorRK8DLDevice"]).apply(null,arguments)};var _TVMArrayGetTypeIndex=Module["_TVMArrayGetTypeIndex"]=function(){return(_TVMArrayGetTypeIndex=Module["_TVMArrayGetTypeIndex"]=Module["asm"]["TVMArrayGetTypeIndex"]).apply(null,arguments)};var _TVMArrayAlloc=Module["_TVMArrayAlloc"]=function(){return(_TVMArrayAlloc=Module["_TVMArrayAlloc"]=Module["asm"]["TVMArrayAlloc"]).apply(null,arguments)};var _TVMArrayFree=Module["_TVMArrayFree"]=function(){return(_TVMArrayFree=Module["_TVMArrayFree"]=Module["asm"]["TVMArrayFree"]).apply(null,arguments)};var _TVMArrayCopyFromTo=Module["_TVMArrayCopyFromTo"]=function(){return(_TVMArrayCopyFromTo=Module["_TVMArrayCopyFromTo"]=Module["asm"]["TVMArrayCopyFromTo"]).apply(null,arguments)};var _TVMArrayFromDLPack=Module["_TVMArrayFromDLPack"]=function(){return(_TVMArrayFromDLPack=Module["_TVMArrayFromDLPack"]=Module["asm"]["TVMArrayFromDLPack"]).apply(null,arguments)};var _TVMArrayToDLPack=Module["_TVMArrayToDLPack"]=function(){return(_TVMArrayToDLPack=Module["_TVMArrayToDLPack"]=Module["asm"]["TVMArrayToDLPack"]).apply(null,arguments)};var _TVMDLManagedTensorCallDeleter=Module["_TVMDLManagedTensorCallDeleter"]=function(){return(_TVMDLManagedTensorCallDeleter=Module["_TVMDLManagedTensorCallDeleter"]=Module["asm"]["TVMDLManagedTensorCallDeleter"]).apply(null,arguments)};var _TVMArrayCopyFromBytes=Module["_TVMArrayCopyFromBytes"]=function(){return(_TVMArrayCopyFromBytes=Module["_TVMArrayCopyFromBytes"]=Module["asm"]["TVMArrayCopyFromBytes"]).apply(null,arguments)};var _TVMArrayCopyToBytes=Module["_TVMArrayCopyToBytes"]=function(){return(_TVMArrayCopyToBytes=Module["_TVMArrayCopyToBytes"]=Module["asm"]["TVMArrayCopyToBytes"]).apply(null,arguments)};var _TVMObjectGetTypeIndex=Module["_TVMObjectGetTypeIndex"]=function(){return(_TVMObjectGetTypeIndex=Module["_TVMObjectGetTypeIndex"]=Module["asm"]["TVMObjectGetTypeIndex"]).apply(null,arguments)};var _TVMObjectRetain=Module["_TVMObjectRetain"]=function(){return(_TVMObjectRetain=Module["_TVMObjectRetain"]=Module["asm"]["TVMObjectRetain"]).apply(null,arguments)};var _TVMObjectDerivedFrom=Module["_TVMObjectDerivedFrom"]=function(){return(_TVMObjectDerivedFrom=Module["_TVMObjectDerivedFrom"]=Module["asm"]["TVMObjectDerivedFrom"]).apply(null,arguments)};var _TVMObjectTypeKey2Index=Module["_TVMObjectTypeKey2Index"]=function(){return(_TVMObjectTypeKey2Index=Module["_TVMObjectTypeKey2Index"]=Module["asm"]["TVMObjectTypeKey2Index"]).apply(null,arguments)};var _TVMObjectTypeIndex2Key=Module["_TVMObjectTypeIndex2Key"]=function(){return(_TVMObjectTypeIndex2Key=Module["_TVMObjectTypeIndex2Key"]=Module["asm"]["TVMObjectTypeIndex2Key"]).apply(null,arguments)};var __ZN3tvm7runtime5Timer5StartE8DLDevice=Module["__ZN3tvm7runtime5Timer5StartE8DLDevice"]=function(){return(__ZN3tvm7runtime5Timer5StartE8DLDevice=Module["__ZN3tvm7runtime5Timer5StartE8DLDevice"]=Module["asm"]["_ZN3tvm7runtime5Timer5StartE8DLDevice"]).apply(null,arguments)};var __ZN3tvm7runtime8Registry8set_bodyENS0_10PackedFuncE=Module["__ZN3tvm7runtime8Registry8set_bodyENS0_10PackedFuncE"]=function(){return(__ZN3tvm7runtime8Registry8set_bodyENS0_10PackedFuncE=Module["__ZN3tvm7runtime8Registry8set_bodyENS0_10PackedFuncE"]=Module["asm"]["_ZN3tvm7runtime8Registry8set_bodyENS0_10PackedFuncE"]).apply(null,arguments)};var __ZN3tvm7runtime8Registry6RemoveERKNS0_6StringE=Module["__ZN3tvm7runtime8Registry6RemoveERKNS0_6StringE"]=function(){return(__ZN3tvm7runtime8Registry6RemoveERKNS0_6StringE=Module["__ZN3tvm7runtime8Registry6RemoveERKNS0_6StringE"]=Module["asm"]["_ZN3tvm7runtime8Registry6RemoveERKNS0_6StringE"]).apply(null,arguments)};var __ZN3tvm7runtime15EnvCheckSignalsEv=Module["__ZN3tvm7runtime15EnvCheckSignalsEv"]=function(){return(__ZN3tvm7runtime15EnvCheckSignalsEv=Module["__ZN3tvm7runtime15EnvCheckSignalsEv"]=Module["asm"]["_ZN3tvm7runtime15EnvCheckSignalsEv"]).apply(null,arguments)};var _TVMFuncRegisterGlobal=Module["_TVMFuncRegisterGlobal"]=function(){return(_TVMFuncRegisterGlobal=Module["_TVMFuncRegisterGlobal"]=Module["asm"]["TVMFuncRegisterGlobal"]).apply(null,arguments)};var _TVMFuncGetGlobal=Module["_TVMFuncGetGlobal"]=function(){return(_TVMFuncGetGlobal=Module["_TVMFuncGetGlobal"]=Module["asm"]["TVMFuncGetGlobal"]).apply(null,arguments)};var _TVMFuncListGlobalNames=Module["_TVMFuncListGlobalNames"]=function(){return(_TVMFuncListGlobalNames=Module["_TVMFuncListGlobalNames"]=Module["asm"]["TVMFuncListGlobalNames"]).apply(null,arguments)};var _TVMFuncRemoveGlobal=Module["_TVMFuncRemoveGlobal"]=function(){return(_TVMFuncRemoveGlobal=Module["_TVMFuncRemoveGlobal"]=Module["asm"]["TVMFuncRemoveGlobal"]).apply(null,arguments)};var _TVMBackendRegisterEnvCAPI=Module["_TVMBackendRegisterEnvCAPI"]=function(){return(_TVMBackendRegisterEnvCAPI=Module["_TVMBackendRegisterEnvCAPI"]=Module["asm"]["TVMBackendRegisterEnvCAPI"]).apply(null,arguments)};var _TVMBackendRegisterSystemLibSymbol=Module["_TVMBackendRegisterSystemLibSymbol"]=function(){return(_TVMBackendRegisterSystemLibSymbol=Module["_TVMBackendRegisterSystemLibSymbol"]=Module["asm"]["TVMBackendRegisterSystemLibSymbol"]).apply(null,arguments)};var _TVMBackendAnyListSetPackedArg=Module["_TVMBackendAnyListSetPackedArg"]=function(){return(_TVMBackendAnyListSetPackedArg=Module["_TVMBackendAnyListSetPackedArg"]=Module["asm"]["TVMBackendAnyListSetPackedArg"]).apply(null,arguments)};var _TVMBackendAnyListResetItem=Module["_TVMBackendAnyListResetItem"]=function(){return(_TVMBackendAnyListResetItem=Module["_TVMBackendAnyListResetItem"]=Module["asm"]["TVMBackendAnyListResetItem"]).apply(null,arguments)};var _TVMBackendAnyListMoveFromPackedReturn=Module["_TVMBackendAnyListMoveFromPackedReturn"]=function(){return(_TVMBackendAnyListMoveFromPackedReturn=Module["_TVMBackendAnyListMoveFromPackedReturn"]=Module["asm"]["TVMBackendAnyListMoveFromPackedReturn"]).apply(null,arguments)};var __ZN3tvm7runtime6detail12LogFatalImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiSA_=Module["__ZN3tvm7runtime6detail12LogFatalImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiSA_"]=function(){return(__ZN3tvm7runtime6detail12LogFatalImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiSA_=Module["__ZN3tvm7runtime6detail12LogFatalImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiSA_"]=Module["asm"]["_ZN3tvm7runtime6detail12LogFatalImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiSA_"]).apply(null,arguments)};var __ZN3tvm7runtime6detail14LogMessageImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiiSA_=Module["__ZN3tvm7runtime6detail14LogMessageImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiiSA_"]=function(){return(__ZN3tvm7runtime6detail14LogMessageImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiiSA_=Module["__ZN3tvm7runtime6detail14LogMessageImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiiSA_"]=Module["asm"]["_ZN3tvm7runtime6detail14LogMessageImplERKNSt3__212basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEiiSA_"]).apply(null,arguments)};var ___errno_location=function(){return(___errno_location=Module["asm"]["__errno_location"]).apply(null,arguments)};var _TVMWasmAllocSpace=Module["_TVMWasmAllocSpace"]=function(){return(_TVMWasmAllocSpace=Module["_TVMWasmAllocSpace"]=Module["asm"]["TVMWasmAllocSpace"]).apply(null,arguments)};var _TVMWasmFreeSpace=Module["_TVMWasmFreeSpace"]=function(){return(_TVMWasmFreeSpace=Module["_TVMWasmFreeSpace"]=Module["asm"]["TVMWasmFreeSpace"]).apply(null,arguments)};var _TVMWasmFuncCreateFromCFunc=Module["_TVMWasmFuncCreateFromCFunc"]=function(){return(_TVMWasmFuncCreateFromCFunc=Module["_TVMWasmFuncCreateFromCFunc"]=Module["asm"]["TVMWasmFuncCreateFromCFunc"]).apply(null,arguments)};var __initialize=Module["__initialize"]=function(){return(__initialize=Module["__initialize"]=Module["asm"]["_initialize"]).apply(null,arguments)};var ___cxa_is_pointer_type=function(){return(___cxa_is_pointer_type=Module["asm"]["__cxa_is_pointer_type"]).apply(null,arguments)};var calledRun;var mainArgs=undefined;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args=[]){var entryFunction=__initialize;mainArgs=[thisProgram].concat(args);try{entryFunction();var ret=0;exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(args=arguments_){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(shouldRunNow)callMain(args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();
4
+
5
+ this.Module = Module;
6
+ this.start = Module.wasmLibraryProvider.start;
7
+ this.imports = Module.wasmLibraryProvider.imports;
8
+ this.wasiImport = this.imports["wasi_snapshot_preview1"];
9
+ }
10
+
11
+ if (typeof module !== "undefined" && module.exports) {
12
+ module.exports = EmccWASI;
13
+ }
img/fig/browser-screenshot.png ADDED

Git LFS Details

  • SHA256: d3d95603429eda44ebdc7de45fc2e1c60e82d2955dd9c787072eba17a87ae942
  • Pointer size: 132 Bytes
  • Size of remote file: 2.03 MB
img/fig/pipeline.svg ADDED
img/fig/workflow.svg ADDED
img/gif/direct-run.gif ADDED
img/gif/intermediate-render.gif ADDED

Git LFS Details

  • SHA256: f61c66141824b5619bcc0b7d51c263fb7dec5158a4a8e5dc698c7d28d37c563e
  • Pointer size: 132 Bytes
  • Size of remote file: 4.13 MB
img/logo/catalyst.svg ADDED
img/logo/cmuscs.png ADDED
img/logo/mlc-logo-with-text-landscape.svg ADDED
img/logo/octoml.png ADDED
index.html CHANGED
@@ -1,19 +1,186 @@
1
- <!doctype html>
2
  <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
+ <!DOCTYPE html>
2
  <html>
3
+ <head>
4
+ <title>WebSD | Home</title>
5
+ <meta charset="utf-8">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7
+ <link rel="stylesheet"
8
+ href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css"
9
+ integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb"
10
+ crossorigin="anonymous">
11
+ <link rel="stylesheet"
12
+ href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
13
+ <link rel="stylesheet" href="/assets/css/main.css">
14
+ <link rel="stylesheet" href="/assets/css/group.css">
15
+ <!-- <link rel="stylesheet" href="/css/table.css"> -->
16
+ <link rel="shortcut icon" href="/assets/img/logo/mlc-favicon.png">
17
+ <meta http-equiv="origin-trial" content="Agx76XA0ITxMPF0Z8rbbcMllwuxsyp9qdtQaXlLqu1JUrdHB6FPonuyIKJ3CsBREUkeioJck4nn3KO0c0kkwqAMAAABJeyJvcmlnaW4iOiJodHRwOi8vbG9jYWxob3N0Ojg4ODgiLCJmZWF0dXJlIjoiV2ViR1BVIiwiZXhwaXJ5IjoxNjkxNzExOTk5fQ==">
18
+ <meta http-equiv="origin-trial" content="AnmwqQ1dtYDQTYkZ5iMtHdINCaxjE94uWQBKp2yOz1wPTcjSRtOHUGQG+r2BxsEuM0qhxTVnuTjyh31HgTeA8gsAAABZeyJvcmlnaW4iOiJodHRwczovL21sYy5haTo0NDMiLCJmZWF0dXJlIjoiV2ViR1BVIiwiZXhwaXJ5IjoxNjkxNzExOTk5LCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
19
+ <script src="dist/tvmjs_runtime.wasi.js"></script>
20
+ <script src="dist/tvmjs.bundle.js"></script>
21
+
22
+ </head>
23
+ <body>
24
+ <div class="container">
25
+ <!-- This is a bit nasty, but it basically says be a column first, and on larger screens be a spaced out row -->
26
+ <div class="header d-flex
27
+ flex-column
28
+ flex-md-row justify-content-md-between">
29
+ <a href="/" id="navtitle">
30
+ <img src="/assets/img/logo/mlc-logo-with-text-landscape.svg" height="70px"
31
+ alt="MLC" id="logo">
32
+ </a>
33
+ <ul id="topbar" class="nav nav-pills justify-content-center">
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+ <li class="nav-item">
44
+
45
+ <a class="nav-link active"
46
+ href="/">
47
+ Home
48
+ </a>
49
+
50
+ </li>
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+ <li class="nav-item">
61
+
62
+ <a class="nav-link "
63
+ href="https://github.com/mlc-ai/web-stable-diffusion">
64
+ Github
65
+ </a>
66
+
67
+ </li>
68
+
69
+
70
+
71
+ </ul>
72
+ </div>
73
+
74
+
75
+
76
+
77
+ <!-- Schedule -->
78
+
79
+ <h1 id="web-stable-diffusion">Web Stable Diffusion</h1>
80
+
81
+ <p>This project brings stable diffusion models to web browsers. <strong>Everything runs inside the browser with no need of server support.</strong> To our knowledge, this is the the world’s first stable diffusion completely running on the browser. Please check out our <a href="https://github.com/mlc-ai/web-stable-diffusion">GitHub repo</a> to see how we did it. There is also a <a href="#text-to-image-generation-demo">demo</a> which you can try out.</p>
82
+
83
+ <p><img src="img/fig/browser-screenshot.png" alt="Browser screenshot" width="100%" /></p>
84
+
85
+ <p>We have been seeing amazing progress through AI models recently. Thanks to the open-source effort, developers can now easily compose open-source models together to produce amazing tasks. Stable diffusion enables the automatic creation of photorealistic images as well as images in various styles based on text input. These models are usually big and compute-heavy, which means we have to pipe through all computation requests to (GPU) servers when developing web applications based on these models. Additionally, most of the workloads have to run on a specific type of GPUs where popular deep-learning frameworks are readily available.</p>
86
+
87
+ <p>This project takes a step to change that status quo and bring more diversity to the ecosystem. There are a lot of reasons to get some (or all) of the computation to the client side. There are many possible benefits, such as cost reduction on the service provider side, as well as an enhancement for personalization and privacy protection. The development of personal computers (even mobile devices) is going in the direction that enables such possibilities. The client side is getting pretty powerful. For example, the latest MacBook Pro can have up to 96GB of unified RAM that can be used to store the model weights and a reasonably powerful GPU to run many of the workloads.</p>
88
+
89
+ <p>Wouldn’t it be fun to directly bring the ML models to the client, have the user open a browser tab, and instantly run the stable diffusion models on the browser? This project provides the first affirmative answer to this question.</p>
90
+
91
+ <h2 id="text-to-image-generation-demo">Text to Image Generation Demo</h2>
92
+
93
+ <p>Because WebGPU is not yet fully stable, nor have there ever been such large-scale AI models running on top of WebGPU, so we are testing the limit here. It may not work in your environment. So far, we have only tested it on Mac with M1/M2 GPUs in Chrome Canary (a nightly build of Chrome) because WebGPU is quite new. We have tested on Windows and it does not work at this moment due to possible driver issues. We anticipate the support broadens as WebGPU matures. Please check out the <a href="#instructions">use instructions</a> and <a href="#notes">notes</a> below.</p>
94
+
95
+ <h3 id="instructions">Instructions</h3>
96
+
97
+ <p>If you have a Mac computer with Apple silicon, here are the instructions for you to run stable diffusion on your browser locally:</p>
98
+
99
+ <ul>
100
+ <li>Install <a href="https://www.google.com/chrome/canary/">Chrome Canary</a>, a developer version of Chrome that enables the use of WebGPU.</li>
101
+ <li>Launch Chrome Canary. <strong>You are recommended to launch from terminal with the following command:</strong>
102
+ <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/Applications/Google<span class="se">\ </span>Chrome<span class="se">\ </span>Canary.app/Contents/MacOS/Google<span class="se">\ </span>Chrome<span class="se">\ </span>Canary <span class="nt">--enable-dawn-features</span><span class="o">=</span>disable_robustness
103
+ </code></pre></div> </div>
104
+ <p>This command turns off the robustness check from Chrome Canary that slows down image generation to times. It is not necessary, but we strongly recommend you to start Chrome with this command.</p>
105
+ </li>
106
+ <li>Enter your prompt, click “Generate” – we are ready to go! The image generation will start after downloading and fetching the model parameters to local cache. The download may take a few minutes, only for the first run. The subsequent refreshes and runs will be faster.</li>
107
+ <li>Feel free to enter different prompts as well as negative prompts to generate the image you want.</li>
108
+ <li>We provide an option to render images for the intermediate steps of UNet stage. Select “Run VAE every two UNet steps after step 10” for “Render intermediate steps” and click “Generate” again, and you will see how an image gets generated along the process.</li>
109
+ </ul>
110
+
111
+ <h3 id="demo">Demo</h3>
112
+
113
+ <script>
114
+ var tvmjsGlobalEnv = tvmjsGlobalEnv || {};
115
+ </script>
116
+
117
+ <script type="module">
118
+ import init, { TokenizerWasm } from "./dist/tokenizers-wasm/tokenizers_wasm.js";
119
+
120
+ var initialized = false;
121
+ async function getTokenizer(name) {
122
+ if (!initialized) {
123
+ await init();
124
+ }
125
+ const jsonText = await (await fetch("https://huggingface.co/" + name + "/raw/main/tokenizer.json")).text();
126
+ return new TokenizerWasm(jsonText);
127
+ }
128
+
129
+ tvmjsGlobalEnv.getTokenizer = getTokenizer;
130
+ </script>
131
+
132
+ <script src="dist/stable_diffusion.js"></script>
133
+
134
+ <div>
135
+ Input prompt: <input name="inputPrompt" id="inputPrompt" type="text" value="A photo of an astronaut riding a horse on mars" size="77" /> <br />
136
+ Negative prompt (optional): <input name="negativePrompt" id="negativePrompt" type="text" value="" size="77" />
137
+ </div>
138
+
139
+ <div>
140
+ Select scheduler -
141
+ <select name="scheduler" id="schedulerId">
142
+ <option value="0">Multi-step DPM Solver (20 steps)</option>
143
+ <option value="1">PNDM (50 steps)</option>
144
+ </select>
145
+
146
+ <br />
147
+
148
+ Render intermediate steps (may slow down execution) -
149
+ <select name="vae-cycle" id="vaeCycle">
150
+ <option value="-1">No</option>
151
+ <option value="2">Run VAE every two UNet steps after step 10</option>
152
+ </select>
153
+
154
+ <div id="progress">
155
+ <label id="gpu-tracker-label"></label><br />
156
+ <label id="progress-tracker-label"></label><br />
157
+ <progress id="progress-tracker-progress" max="100" value="100"> </progress>
158
+ </div>
159
+ <button onclick="tvmjsGlobalEnv.asyncOnGenerate()">Generate</button>
160
+ </div>
161
+
162
+ <div>
163
+ <canvas id="canvas" width="512" height="512"></canvas>
164
+ </div>
165
+ <div id="log"></div>
166
+
167
+ <h3 id="notes">Notes</h3>
168
+
169
+ <ul>
170
+ <li>WebGPU spec does comes with FP16 support already, but the implementation does not yet support this feature at this moment. As a result, the memory consumption of running the demo is about 7GB. For Apple silicon Mac with only 8GB of unified memory, it may take longer (a few minutes) to generate an image. This demo may also work for Mac with AMD GPU.</li>
171
+ <li>Please check out our <a href="https://github.com/mlc-ai/web-stable-diffusion">GitHub repo</a> for running the same shader flow locally on your GPU device through the native driver. Right now, there are still gaps (e.g., without launching Chrome from command line, Chrome’s WebGPU implementation inserts bound clips for all array index access, such that <code class="language-plaintext highlighter-rouge">a[i]</code> becomes <code class="language-plaintext highlighter-rouge">a[min(i, a.size)]</code>, which are not optimized out by the downstream shader compilers), but we believe it is feasible to close such gaps as WebGPU dispatches to these native drivers.</li>
172
+ </ul>
173
+
174
+ <h2 id="disclaimer">Disclaimer</h2>
175
+
176
+ <p>This demo site is for research purposes only. Please conform to the <a href="https://huggingface.co/runwayml/stable-diffusion-v1-5#uses">uses of stable diffusion models</a>.</p>
177
+
178
+
179
+ </div> <!-- /container -->
180
+
181
+ <!-- Support retina images. -->
182
+ <script type="text/javascript"
183
+ src="/assets/js/srcset-polyfill.js"></script>
184
+ </body>
185
+
186
  </html>
stable-diffusion-config.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schedulerConstUrl": [
3
+ "dist/scheduler_dpm_solver_multistep_consts.json",
4
+ "dist/scheduler_pndm_consts.json"
5
+ ],
6
+ "wasmUrl": "dist/stable_diffusion_webgpu.wasm",
7
+ "cacheUrl": "https://huggingface.co/mlc-ai/web-sd/resolve/main/web-sd-shards-v1-5/",
8
+ "tokenizer": "openai/clip-vit-large-patch14"
9
+ }